Apollo Web Service API

The Apollo web service API is fully JSON based, to easily interact with JavaScript. Both the request and response JSON are feature information are based on the Chado schema.

Login

To properly setup an user's editing session, the user needs to login to the web service. This is to prevent an user from just loading a page directly and making a request without prior authentication.

Request

The URL for login is:

http://$server:$port/ApolloWeb/Login
where Rserver is the server name and $port is the server port.

For example:

curl -b cookies.txt -c cookies.txt -e "http://localhost:8080" \ -H "Content-Type:application/json" -d "{'username': 'demo', 'password': 'demo'}" "http://localhost:8080/apollo/Login?operation=login"

Login expects two parameters: username and password. There currently isn't any real user authentication implemented, so username and password should be set to foo and bar respectively.

Response

Login will return a JSON containing the session-id for the user. This is needed if the user's browser does not support cookies (or is turned off), in which case the session-id should be appended to all subsequent requests as jsessionid=session-id as an URL parameter.

{"session-id":"43FBA5B967595D260A1C0E6B7052C7A1"}

Feature Object

Most requests and responses will contain an array of feature JSON objects named features. The feature object is based on the Chado feature, featureloc, cv, and cvterm tables.

{ "residues": "$residues", "type": { "cv": {"name": "$cv_name"}, "name": "$cv_term" }, "location": { "fmax": $rightmost_intrabase_coordinate_of_feature, "fmin": $leftmost_intrabase_coordinate_of_feature, "strand": $strand }, "uniquename": "$feature_unique_name" "children": [ $array_of_child_features ] "properties": [ $array_of_properties ] }
where: Note that different operations will require different fields to be set (which will be elaborated upon in each operation section).

Operations

All JSON requests need to contain a operation field, which defines the operation being requested. If an error has occurred, a proper HTTP error code (most likely 400) and an error message is returned, in JSON format:

{ "error": "mergeExons(): Exons must be in the same strand" }

set_organism

Set the organism to be associated with this session. Returns the organism just set.

Request:

{ "operation": "set_organism", "organism": { "genus": "Foomus", "species": "barius" } }

Response:

{ "genus": "Foomus", "species": "barius" }

get_organism

Get the organism associated with this session.

Request:

{ "operation": "set_organism", "organism": { "genus": "Foomus", "species": "barius" } }

Response:

{ "genus": "Foomus", "species": "barius" }

set_source_feature

Set the source feature to be associated with this session. Returns the source feature just set.

Request:

{ "features": [{ "residues": "ATATCTTTTCTCACAATCGTTG...", "type": { "cv": {"name": "SO"}, "name": "chromosome" }, "uniquename": "chromosome" }], "operation": "set_source_feature" }

Response:

{"features": [{ "residues": "ATATCTTTTCTCACAATCGTTG...", "type": { "cv": {"name": "SO"}, "name": "chromosome" }, "uniquename": "chromosome" }]}

get_source_feature

Get the source feature associated with this session.

Request:

{ "operation": "get_source_feature" }

Response:

{"features": [{ "residues": "ATATCTTTTCTCACAATCGTTG...", "type": { "cv": {"name": "SO"}, "name": "chromosome" }, "uniquename": "chromosome" }]}

add_feature

Add a top level feature. Returns feature just added.

Request:

{ "features": [{ "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }], "operation": "add_feature" }

Response:

{"features": [{ "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

delete_feature

Delete feature(s) from the session. Each feature only requires uniquename to be set. Returns an empty features array.

Request:

{ "features": [{"uniquename": "gene"}], "operation": "delete_feature" }

Response:

{"features": []}

get_features

Get all top level features.

Request:

{ "operation": "get_features" }

Response:

{"features": [{ "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

add_transcript

Add transcript(s) to a gene. The first element of the features array should be the gene to add the transcript(s) to, with each subsequent feature being a transcript to be added. The gene feature only requires the uniquename field to be set. Returns the gene which the transcript was added to.

Request:

{ "features": [ {"uniquename": "gene"}, { "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" } ], "operation": "add_transcript" }

Response:

{"features": [{ "children": [{ "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

duplicate_transcript

Duplicate a transcript. Only the first transcript in the features array is processed. The transcript feature only requires uniquename to be set. Returns the parent gene of the transcript.

Request:

{ "features": [{"uniquename": "transcript"}], "operation": "duplicate_transcript" }

Response:

{"features": [{ "children": [ { "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript-copy" }, { "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" } ], "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

merge_transcripts

Merge two transcripts together. Only the transcripts in the first and second positions in the features array are processed. The transcript features only requires uniquename to be set. If the two transcripts belong to different genes, the parent genes are merged as well. Returns the parent gene of the merged transcripts.

Request:

{ "features": [ {"uniquename": "transcript1"}, {"uniquename": "transcript2"} ], "operation": "merge_transcripts" }

Response:

{"features": [{ "children": [ { "children": [ { "location": { "fmax": 2400, "fmin": 2000, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_1" }, { "location": { "fmax": 700, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_1" }, { "location": { "fmax": 1500, "fmin": 1000, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_2" }, { "location": { "fmax": 2700, "fmin": 2500, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_2" } ], "location": { "fmax": 2700, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript1" } ], "location": { "fmax": 2700, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene1" }]}

set_translation_start

Set the CDS start and end in a transcript. The transcript feature only needs to have the uniquename field set. The JSON transcript must contain a CDS feature, which will contain the new CDS boundaries. Other children of the transcript will be ignored. Returns the parent gene of the transcript.

Request:

{ "features": [{ "children": [{ "location": { "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "cds" }], "uniquename": "transcript1" }], "operation": "set_translation_start" }

Response:

{"features": [{ "children": [{ "children": [ { "location": { "fmax": 700, "fmin": 500, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_1" }, { "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_1" }, { "location": { "fmin": 100, "fmin": 1400, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "transcript1-CDS" }, { "location": { "fmax": 1400, "fmin": 1200, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_3" }, { "location": { "fmax": 1000, "fmin": 800, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_2" } ], "location": { "fmax": 1400, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript1" }], "location": { "fmax": 1500, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

set_translation_end

Set the CDS end in a transcript. The transcript feature only needs to have the uniquename field set. The JSON transcript must contain a CDS feature, which will contain the new CDS boundaries. Other children of the transcript will be ignored. Returns the parent gene of the transcript.

Request:

{ "features": [{ "children": [{ "location": { "fmax": 1300, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "cds" }], "uniquename": "transcript1" }], "operation": "set_translation_end" }

Response:

{"features": [{ "children": [{ "children": [ { "location": { "fmax": 700, "fmin": 500, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_1" }, { "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_1" }, { "location": { "fmax": 1300, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "transcript1-CDS" }, { "location": { "fmax": 1400, "fmin": 1200, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_3" }, { "location": { "fmax": 1000, "fmin": 800, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_2" } ], "location": { "fmax": 1400, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript1" }], "location": { "fmax": 1500, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

set_translation_ends

Set the CDS start and end in a transcript. The transcript feature only needs to have the uniquename field set. The JSON transcript must contain a CDS feature, which will contain the new CDS boundaries. Other children of the transcript will be ignored. Returns the parent gene of the transcript.

Request:

{ "features": [{ "children": [{ "location": { "fmax": 1400, "fmin": 200, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "cds" }], "uniquename": "transcript1" }], "operation": "set_translation_ends" }

Response:

{"features": [{ "children": [{ "children": [ { "location": { "fmax": 700, "fmin": 500, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_1" }, { "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_1" }, { "location": { "fmax": 1400, "fmin": 200, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "transcript1-CDS" }, { "location": { "fmax": 1400, "fmin": 1200, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2_3" }, { "location": { "fmax": 1000, "fmin": 800, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1_2" } ], "location": { "fmax": 1400, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript1" }], "location": { "fmax": 1500, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

set_longest_orf

Calculate the longest ORF for a transcript. The only element in the features array should be the transcript to process. Only the uniquename field needs to be set for the transcript. Returns the transcript's parent gene.

Request:

{ "features": [{"uniquename": "transcript"}], "operation": "set_longest_orf" }

Response:

Response for operation: set_longest_orf {"features": [{ "children": [{ "children": [ { "location": { "fmax": 693, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1" }, { "location": { "fmax": 2628, "fmin": 2392, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon3" }, { "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "transcript-CDS" }, { "location": { "fmax": 2223, "fmin": 849, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2" } ], "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

add_exon

Add exon(s) to a transcript. The first element of the features array should be the transcript to which the exon(s) will be added to. Each subsequent feature will be an exon. Merges overlapping exons. Returns the parent gene of the transcript.

Request:

{ "features": [ {"uniquename": "transcript"}, { "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1" }, { "location": { "fmax": 600, "fmin": 400, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2" }, { "location": { "fmax": 1000, "fmin": 500, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon3" } ], "operation": "add_exon" }

Response:

{"features": [{ "children": [{ "children": [ { "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1" }, { "location": { "fmax": 1000, "fmin": 400, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2" } ], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

delete_exon

Delete an exon from a transcript. If there are no exons left on the transcript, the transcript is deleted from the parent gene. The first element of the features array should be the transcript to which the exon(s) will be deleted from. Each subsequent feature will be an exon. Returns the parent gene of the transcript.

Request:

}{ "features": [ {"uniquename": "transcript"}, {"uniquename": "exon1"} ], "operation": "delete_exon" }

Response:

{"features": [{ "children": [{ "children": [{ "location": { "fmax": 1000, "fmin": 400, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2" }], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

merge_exons

Merge exons. The features array should contain two exons. Each exon only requires uniquename to be set. Returns the parent gene.

Request:

{ "features": [ {"uniquename": "exon1"}, {"uniquename": "exon2"} ], "operation": "merge_exons" }

Response:

{"features": [{ "children": [{ "children": [{ "location": { "fmax": 500, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1" }], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

split_exon

Splits the exon, creating two exons, the left one ends at at the new fmax and the right one starts at the new fmin. There should only be one element in the features array, the exon to be split. The exon must have uniquename, location.fmin, and location.fmax set. Returns the parent gene.

Request:

{ "features": [{ "location": { "fmax": 200, "fmin": 300 }, "uniquename": "exon1" }], "operation": "split_exon" }

Response:

{"features": [{ "children": [{ "children": [ { "location": { "fmax": 500, "fmin": 300, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1-right" }, { "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1-left" } ], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

split_transcript

Split a transcript between the two exons. One transcript will contain all exons from the leftmost exon up to leftExon and the other will contain all exons from rightExon to the rightmost exon. The features array should contain two features, the first one for the left exon and the xecond one for the right exon. Exon's only need to have their uniquename fields set. Returns the parent gene.

Request:

{ "features": [ {"uniquename": "exon1-left"}, {"uniquename": "exon1-right"} ], "operation": "split_transcript" }

Response:

{"features": [{ "children": [ { "children": [{ "location": { "fmax": 500, "fmin": 300, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1-right" }], "location": { "fmax": 1000, "fmin": 300, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript-split" }, { "children": [{ "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1-left" }], "location": { "fmax": 200, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" } ], "location": { "fmax": 1000, "fmin": 100, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

add_sequence_alteration

Add sequence alteration(s). Each element of the features array should be an alteration feature (e.g. substitution, insertion, deletion). Each alteration needs to have location, type, uniquename, and residues set. Returns the newly added sequence alteration features.

Request:

{ "features": [{ "location": { "fmax": 642, "fmin": 641, "strand": 1 }, "residues": "T", "type": { "cv": {"name": "SO"}, "name": "substitution" }, "uniquename": "substitution1" }], "operation": "add_sequence_alteration" }

Response:

{"features": [{ "location": { "fmax": 642, "fmin": 641, "strand": 1 }, "residues": "T", "type": { "cv": {"name": "SO"}, "name": "substitution" }, "uniquename": "substitution1" }]}

delete_sequence_alteration

Delete sequence alteration(s). Each feature only requires uniquename to be set. Returns an empty features array.

Request:

{ "features": [ {"uniquename": "substitution1"}, {"uniquename": "substitution2"} ], "operation": "delete_sequence_alteration" }

Response:

{"features": []}

get_sequence_alterations

Get all sequence alterations. Returns an array of alterations.

Request:

{ "operation": "get_sequence_alterations" }

Response:

{"features": [ { "location": { "fmax": 701, "fmin": 644, "strand": 1 }, "residues": "ATT", "type": { "cv": {"name": "SO"}, "name": "insertion" }, "uniquename": "insertion1" }, { "location": { "fmax": 2301, "fmin": 2300, "strand": 1 }, "residues": "CCC", "type": { "cv": {"name": "SO"}, "name": "insertion" }, "uniquename": "insertion2" }, { "location": { "fmax": 639, "fmin": 638, "strand": 1 }, "residues": "C", "type": { "cv": {"name": "SO"}, "name": "substitution" }, "uniquename": "substitution3" } ]}

get_residues_with_alterations

Get the residues for feature(s) with any alterations. Only uniquename needs to be set for each feature. Returns the requested feature(s), stripped down to only their uniquename and residues.

Request:

{ "features": [{"uniquename": "transcript-CDS"}], "operation": "get_residues_with_alterations" }

Response:

{"features": [{ "residues": "ATGTATCAGTACGGAAGA...", "uniquename": "transcript-CDS" }]}

add_frameshift

Add a frameshift to the transcript. The transcript must be the first element in the features array and it must contain a properties array, with each element being a frameshift. Returns the transcript's parent gene.

Request:

{ "features": [{ "properties": [{ "type": { "cv": {"name": "SO"}, "name": "plus_1_frameshift" }, "value": "100" }], "uniquename": "transcript" }], "operation": "add_frameshift" }

Response:

{"features": [{ "children": [{ "children": [ { "location": { "fmax": 693, "fmin": 638, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon1" }, { "location": { "fmax": 2628, "fmin": 2392, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon3" }, { "location": { "fmax": 2628, "fmin": 890, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "CDS" }, "uniquename": "transcript-CDS" }, { "location": { "fmax": 2223, "fmin": 849, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "exon" }, "uniquename": "exon2" } ], "location": { "fmax": 2628, "fmin": 638, "strand": 1 }, "properties": [{ "type": { "cv": {"name": "SO"}, "name": "plus_1_frameshift" }, "value": "100" }], "type": { "cv": {"name": "SO"}, "name": "transcript" }, "uniquename": "transcript" }], "location": { "fmax": 2735, "fmin": 0, "strand": 1 }, "type": { "cv": {"name": "SO"}, "name": "gene" }, "uniquename": "gene" }]}

get_residues_with_frameshifts

Get the residues for feature(s) with any frameshifts. Only applicable to CDS features. Other features will return unmodified residues. Only uniquename needs to be set for each feature. Returns the requested feature(s), stripped down to only their uniquename and residues.

Request:

{ "features": [{"uniquename": "transcript-CDS"}], "operation": "get_residues_with_frameshifts" }

Response:

{"features": [{ "residues": "ATGTATCAGTACGGAAGA...", "uniquename": "transcript-CDS" }]}

get_residues_with_alterations_and_frameshifts

Get the residues for feature(s) with any alteration and frameshifts. Only uniquename needs to be set for each feature. Returns the requested feature(s), stripped down to only their uniquename and residues.

Request:

{ "features": [{"uniquename": "transcript-CDS"}], "operation": "get_residues_with_alterations_and_frameshifts" }

Response:

{"features": [{ "residues": "ATGTATCAGTACGGAAGA...", "uniquename": "transcript-CDS" }]}

IO Service

All JSON requests need to define: operation field, which defines the operation being

requested (read or write) is returned according to the options and the adapter chosen.

Example:

curl -b cookies.txt -c cookies.txt -e "http://$hostname:$port" -H "Content-Type:application/json" -d "{'username': '$username', 'password': '$password'}" "http://$hostname:$port/apollo/Login?operation=login"
curl -b cookies.txt -c cookies.txt -e "http://$hostname:$port" --data '{ operation: "write", adapter: "GFF3", tracks: ["Annotations-scf1117875582023"], options: "output=file&format=gzip" }' http://$hostname:$port:8080/apollo/IOService

User Manager Service

All JSON requests need to define: operation field, which defines the operation being

requested (read or write) is returned according to the options and the adapter chosen.

Example:

{ "operation": "set_permissions", "permissions",{"names":[{"user1":3},{"user2":5}]} }
{ "operation": "add_user", "user":"johndoe", "password":"abc123", "encrypted":true }
{ "operation": "delete_user", "user":"johndoe" }