API base url: https://ultimateapp.mcule.com/api/v1/
Do not call this base URL directly, it will result in a 404 Not Found response for now. You can find in the examples below the full URLs you have to use.
Examples are demonstrated with HTTPie.
Only the most important request/response headers are shown in the examples below.
For anonymous (not authenticated) users:
For authenticated users (access token required, see below):
Authentication is currently a token based authentication. If you would like to get an access token, please drop us an email at support@mcule.com including a brief summary on why and how you would like to use the API. We'll review your request, and if accepted, we'll provide you with an access token which you can use to call the API as an authenticated user and enjoy the less strict limits.
Once you have a valid token you have to send it in the Authorization header:
Authorization: Token <your_token>
Example:
Authorization: Token 905050288b9e786a4d60gc2fe2e5007000b7f17c
The supported query types are currently: SMILES, InChIKey, Molfile or SDF string (V2000), IUPAC name, CAS number, Std InChI, ZINC ID, CHEMBL ID.
We recommend to send your queries in SMILES format. Example SMILES query:
C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1
InChIKey support is limited to the case where the query compound is part of the Ultimate database. Example InChIKey query:
IHHITLNORGKBTP-UHFFFAOYSA-N
Example Molfile string query:
\n -INDIGO-04112011472D\n\n 30 33 0 0 0 0 0 0 0 0999 V2000\n -11.0851 4.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -11.0851 3.2000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -12.4708 2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -12.4708 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -11.0851 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -9.6995 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -9.6995 2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -8.3138 3.2000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n -6.9282 2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -6.9282 0.8000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n -5.5426 3.2000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -4.1569 2.4000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n -4.1569 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -2.7713 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -1.3856 0.8000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n -1.3856 2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -2.7713 3.2000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1.3856 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.7713 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 4.1569 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 4.1569 2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.7713 3.2000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1.3856 2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.0000 -1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -1.3856 -2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -1.3856 -4.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.0000 -4.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1.3856 -4.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1.3856 -2.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1 2 1 0 0 0 0\n 2 3 1 0 0 0 0\n 3 4 2 0 0 0 0\n 4 5 1 0 0 0 0\n 5 6 2 0 0 0 0\n 6 7 1 0 0 0 0\n 7 2 2 0 0 0 0\n 7 8 1 0 0 0 0\n 8 9 1 0 0 0 0\n 9 10 2 0 0 0 0\n 9 11 1 0 0 0 0\n 11 12 1 0 0 0 0\n 12 13 1 0 0 0 0\n 13 14 1 0 0 0 0\n 14 15 1 0 0 0 0\n 15 16 1 0 0 0 0\n 16 17 1 0 0 0 0\n 17 12 1 0 0 0 0\n 15 18 1 0 0 0 0\n 18 19 1 0 0 0 0\n 19 20 1 0 0 0 0\n 20 21 2 0 0 0 0\n 21 22 1 0 0 0 0\n 22 23 2 0 0 0 0\n 23 24 1 0 0 0 0\n 24 19 2 0 0 0 0\n 18 25 1 0 0 0 0\n 25 26 1 0 0 0 0\n 26 27 2 0 0 0 0\n 27 28 1 0 0 0 0\n 28 29 2 0 0 0 0\n 29 30 1 0 0 0 0\n 30 25 2 0 0 0 0\nM END\n
IUPAC name resolution don't always work. Example IUPAC name query:
1-(2-aminoethyl)-N-(2-methoxyethyl)-6-(methylsulfanyl)-1H-pyrazolo[3,4-d]pyrimidin-4-amine
Resolving CAS numbers happens via an external service and don't always work or might be unstable. Example CAS number query:
64-17-5
Example Std InChI query:
InChI=1S/C24H32N4O5/c1-18(15-26-11-13-32-14-12-26)22(29)28-21(17-25(2)24(28)31)23(30)33-20-9-6-10-27(16-20)19-7-4-3-5-8-19/h3-5,7-8,20-21H,1,6,9-17H2,2H3
Resolving ZINC IDs happens via http://zinc.docking.org and might be unstable. Example ZINC ID query:
ZINC3589203
Resolving CHEMBL IDs happens via https://www.ebi.ac.uk/chembl/ and might be unstable. Example CHEMBL ID query:
CHEMBL2165209
Exact searches allow you to specify multiple queries. Check the supported query types.
The maximum number of allowed queries is 10000 in a single API call. If you have more queries you have to slice them into multiple chunks and send them as separate API calls. Be aware of the rate limits in this case.
echo '{"query": {"type": "exact", "queries": ["C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "O(C1=CN(N=C1)C)CC1C=CC2C=CC=CC=2C=1", "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C1CC2=CC=CC(OC)=C2SC1"]}}' | http https://ultimateapp.mcule.com/api/v1/searches/ --print HBhb
You have to use the value exact in the type parameter.
POST /api/v1/searches/ HTTP/1.1 Content-Type: application/json { "query": { "type": "exact", "queries": [ "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "O(C1=CN(N=C1)C)CC1C=CC2C=CC=CC=2C=1", "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C1CC2=CC=CC(OC)=C2SC1" ] } }
HTTP/1.1 200 OK Content-Type: application/json { "results": [ { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "inchi_key": "IHHITLNORGKBTP-UHFFFAOYSA-N", "archived_at": null }, "query": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "idx": 1 }, { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C1CC2=CC=CC(OC)=C2SC1", "inchi_key": "CTQJGCXDDNMNMJ-UHFFFAOYSA-N", "archived_at": null }, "query": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C1CC2=CC=CC(OC)=C2SC1", "idx": 3 } ], "count": 2 }
The idx value in the response corresponds to the index of the query in the queries list. As you can see from the above response, the first and the third query resulted in a hit, while the second query did not give any hits.
Similarity and substructure searches allow you to specify only one query at a time for now. Check the supported query types.
If you have more queries you have to send them separately. Be aware of the rate limits in this case. Also note that similarity and substructure searches can take more time and the response time can depend on many things.
echo '{"query": {"type": "sim", "query": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "limit": 5}}' | http https://ultimateapp.mcule.com/api/v1/searches/ --print HBhb
You have to use the value sim in the type parameter.
You can limit the number of hits with the limit parameter. In this example we fetched the 5 most similar hits. The maximum allowed number of limit is 1000.
POST /api/v1/searches/ HTTP/1.1 Content-Type: application/json { "query": { "type": "sim", "query": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "limit": 5 } }
HTTP/1.1 200 OK Content-Type: application/json { "results": [ { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "inchi_key": "IHHITLNORGKBTP-UHFFFAOYSA-N", "archived_at": null }, "tan": 1.0 }, { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)CCN1CCOCC1", "inchi_key": "HADABMIDSQYLHL-UHFFFAOYSA-N", "archived_at": null }, "tan": 0.9384858044164038 }, { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)CCN1CCN(C)CC1", "inchi_key": "SLXHLSHIUZZOAD-UHFFFAOYSA-N", "archived_at": null }, "tan": 0.9024767801857585 }, { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(C)=CC", "inchi_key": "CLFNXMQIKUMINQ-UHFFFAOYSA-N", "archived_at": null }, "tan": 0.8996913580246914 }, { "compound": { "smiles": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(C)CN1CCOCC1", "inchi_key": "YQTFCLLDUKSEQA-UHFFFAOYSA-N", "archived_at": null }, "tan": 0.8974358974358975 } ], "count": 5 }
In case of similarity searches the tan value the response contains the similarity value.
In case of similarity searches you can control the minimum similarity with the sim_threshold param. Its default value is 0.7. Its minimum value is also 0.7 unless you are allowed to use a lower value. For example:
{ "query": { "type": "sim", "query": "C(N1C(C(OC2CCCN(C3=CC=CC=C3)C2)=O)CN(C)C1=O)(=O)C(=C)CN1CCOCC1", "limit": 5, "sim_threshold": 0.8 } }
Similarity and substructure searches allow you to specify only one query at a time for now. Check the supported query types.
If you have more queries you have to send them separately. Be aware of the rate limits in this case. Also note that similarity and substructure searches can take more time and the response time can depend on many things.
echo '{"query": {"type": "sss", "query": "C1=CC2=C(C=C1)C=NC=C2", "limit": 5}}' | http https://ultimateapp.mcule.com/api/v1/searches/ --print HBhb
You have to use the value sss in the type parameter.
You can limit the number of hits with the limit parameter. In this example we fetched maximum 5 hits. The maximum allowed number of limit is 1000.
POST /api/v1/searches/ HTTP/1.1 Content-Type: application/json { "query": { "type": "sss", "query": "C1=CC2=C(C=C1)C=NC=C2", "limit": 5 } }
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 756 { "results": [ { "compound": { "smiles": "N1(CC2C3=C(C=CC=C3)C3C(=CC=CC=3)N=2)CCCN(C(=O)C2=CC=CC(F)=C2)CC1", "inchi_key": "YTIUNGFRKPDPPS-UHFFFAOYSA-N", "archived_at": null } }, { "compound": { "smiles": "N1(CC2C3=C(C=CC=C3)C3C(=CC=CC=3)N=2)C(C)C2=C(C=CC=C2)OCC1", "inchi_key": "SSEIGWFVYLDHEH-UHFFFAOYSA-N", "archived_at": null } }, { "compound": { "smiles": "C(N1CCN(C2=C(C)C=CC(Cl)=C2)CC1)(=O)C1C2C(=CC=CC=2)C=CN=1", "inchi_key": "BFPRURCGOWXZHV-UHFFFAOYSA-N", "archived_at": null } }, { "compound": { "smiles": "N1(CC2C3=C(C=CC=C3)C3C(=CC=CC=3)N=2)CCN(CC2=CC=C3C(OCO3)=C2)CC1", "inchi_key": "IBHAWHNMRZUDAW-UHFFFAOYSA-N", "archived_at": null } }, { "compound": { "smiles": "C1(C2N=C(C3C4C(=CC=CC=4)C=CN=3)ON=2)C=C(OC)C=C(OC)C=1", "inchi_key": "ZMXORVYVGMNALO-UHFFFAOYSA-N", "archived_at": null } } ], "count": 5 }
For example for the compound identified by the InChIKey PKGBDLPHSYFAFJ-UHFFFAOYSA-N you can get the detail response the following way:
http https://ultimateapp.mcule.com/api/v1/compounds/PKGBDLPHSYFAFJ-UHFFFAOYSA-N/ --print HBhb
GET /api/v1/compounds/PKGBDLPHSYFAFJ-UHFFFAOYSA-N/ HTTP/1.1
HTTP/1.1 200 OK Content-Type: application/json { "archived_at": null, "inchi_key": "PKGBDLPHSYFAFJ-UHFFFAOYSA-N", "mol": "\n -INDIGO-05252114022D\n\n 31 35 0 0 0 0 0 0 0 0999 V2000\n -4.4450 -1.7960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -4.2778 -0.2047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -5.5722 0.7357 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n -7.0339 0.0849 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -7.2011 -1.5063 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -8.6628 -2.1571 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -9.9572 -1.2166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -9.7900 0.3746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -8.3283 1.0254 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -11.4189 -1.8674 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n -12.7133 -0.9270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -14.1750 -1.5777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -14.3423 -3.1690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -15.8039 -3.8198 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -17.0983 -2.8793 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -16.9311 -1.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -15.4694 -0.6373 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -2.8161 0.4460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n -2.6489 2.0373 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n -1.5217 -0.4944 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n -1.5217 -2.0944 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.0000 -2.5889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.9405 -1.2944 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.9405 1.2944 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 2.4621 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 3.8478 1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.2334 0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.2334 -0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 3.8478 -1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.4621 -0.8000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1 2 1 0 0 0 0\n 2 3 1 0 0 0 0\n 3 4 1 0 0 0 0\n 4 5 1 0 0 0 0\n 5 6 2 0 0 0 0\n 6 7 1 0 0 0 0\n 7 8 2 0 0 0 0\n 8 9 1 0 0 0 0\n 9 4 2 0 0 0 0\n 7 10 1 0 0 0 0\n 10 11 1 0 0 0 0\n 11 12 1 0 0 0 0\n 12 13 1 0 0 0 0\n 13 14 2 0 0 0 0\n 14 15 1 0 0 0 0\n 15 16 2 0 0 0 0\n 16 17 1 0 0 0 0\n 17 12 2 0 0 0 0\n 2 18 1 0 0 0 0\n 18 19 2 0 0 0 0\n 18 20 1 0 0 0 0\n 20 21 1 0 0 0 0\n 21 22 1 0 0 0 0\n 22 23 1 0 0 0 0\n 23 24 1 0 0 0 0\n 24 20 1 0 0 0 0\n 24 25 2 0 0 0 0\n 25 26 1 0 0 0 0\n 26 27 1 0 0 0 0\n 27 28 2 0 0 0 0\n 28 29 1 0 0 0 0\n 29 30 2 0 0 0 0\n 30 31 1 0 0 0 0\n 31 23 1 0 0 0 0\n 31 26 2 0 0 0 0\nM END\n", "properties": { "OandN_atom_count": 6, "acidic_and_basic_group_count": 0, "acidic_group_count": 0, "aliphatic_rings": 1, "aromatic_rings": 4, "basic_group_count": 0, "c_atom_count": 25, "chiral_centers": 1, "cis/trans_stereo_double_bonds": 0, "formula": "C25H23N3O3", "fsp3": 0.2, "h_atom_count": 23, "h_bond_acceptors": 6, "h_bond_donors": 0, "halogen_atom_count": 0, "heavy_atom_count": 31, "hetero_atom_count": 6, "heteroatom_ratio": 0.24, "logp": 4.494400000000002, "mol_mass": 413.46718999999996, "non-organic_atom_count": 0, "non_cyclic_amide_count": 0, "nso_atom_count": 6, "psa": 56.59, "rings": 5, "ro3_violations": 4, "ro5_violations": 0, "rotatable_bonds": 7, "stereo_double_bonds": 0, "undefined_stereo_double_bonds": 0, "unknown_stereo_double_bonds": 0 }, "smiles": "C(N1CCN2C3=C(N=C12)C=CC=C3)(=O)C(C)OC1=CC=C(OCC2=CC=CC=C2)C=C1" }
If you have a set of identifiers you can export the corresponding compounds into SMILES or SDF files.
The HTTP response contains a Content-Disposition attachment; filename=“<filename>” header indicating that it should be downloaded.
The maximum number of compounds you can export with a single API call is 1000.
Invalid identifiers will be excluded from the response.
echo '{"export_type": "sdf", "compounds": ["YTIUNGFRKPDPPS-UHFFFAOYSA-N", "SSEIGWFVYLDHEH-UHFFFAOYSA-N"]}' | http https://ultimateapp.mcule.com/api/v1/compounds/export/ --print HBhb
POST /api/v1/compounds/export/ HTTP/1.1 Content-Type: application/json { "compounds": [ "YTIUNGFRKPDPPS-UHFFFAOYSA-N", "SSEIGWFVYLDHEH-UHFFFAOYSA-N" ], "export_type": "sdf" }
HTTP/1.1 200 OK Content-Type: chemical/x-mdl-sdfile Content-Disposition: attachment; filename="mcule_ultimate_export.sdf"
echo '{"export_type": "smi", "compounds": ["YTIUNGFRKPDPPS-UHFFFAOYSA-N", "SSEIGWFVYLDHEH-UHFFFAOYSA-N"]}' | http https://ultimateapp.mcule.com/api/v1/compounds/export/ --print HBhb
POST /api/v1/compounds/export/ HTTP/1.1 Content-Type: application/json { "compounds": [ "YTIUNGFRKPDPPS-UHFFFAOYSA-N", "SSEIGWFVYLDHEH-UHFFFAOYSA-N" ], "export_type": "smi" }
HTTP/1.1 200 OK Content-Type: chemical/x-daylight-smiles Content-Disposition: attachment; filename="mcule_ultimate_export.smi"
You can use the following fields in the API call:
{"compounds": ["VKCCTPSYCYARFI-UHFFFAOYSA-N", "DVPXLZBGJCHMEO-UHFFFAOYSA-N"]}
{"compounds": [{"inchi_key": "VKCCTPSYCYARFI-UHFFFAOYSA-N", "amount": 1}, {"inchi_key": "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "amount": 5}]}
echo '{"compounds": ["VKCCTPSYCYARFI-UHFFFAOYSA-N", "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "XKJIOIJSLLCDOZ-UHFFFAOYSA-N", "XVWBPPRZAKJXSY-UHFFFAOYSA-N", "ZNOWNQHKOHUYLP-UHFFFAOYSA-N", "IEJBADVRNXRNLB-UHFFFAOYSA-N", "LZRUMHHZJMDZLR-UHFFFAOYSA-N", "PTKVKZOBUQFOJX-UHFFFAOYSA-N", "LFHNTOJEMXUDKP-UHFFFAOYSA-N", "SICGQCSMIMRHLF-UHFFFAOYSA-N", "YGLRUSPDEQEHKM-UHFFFAOYSA-N"], "amount": 1, "currency":"USD", "individual": true}' | http https://ultimateapp.mcule.com/api/v1/pricing/ --print HBhb
POST /api/v1/pricing/ HTTP/1.1 Content-Type: application/json { "compounds": [ "VKCCTPSYCYARFI-UHFFFAOYSA-N", "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "XKJIOIJSLLCDOZ-UHFFFAOYSA-N", "XVWBPPRZAKJXSY-UHFFFAOYSA-N", "ZNOWNQHKOHUYLP-UHFFFAOYSA-N", "IEJBADVRNXRNLB-UHFFFAOYSA-N", "LZRUMHHZJMDZLR-UHFFFAOYSA-N", "PTKVKZOBUQFOJX-UHFFFAOYSA-N", "LFHNTOJEMXUDKP-UHFFFAOYSA-N", "SICGQCSMIMRHLF-UHFFFAOYSA-N", "YGLRUSPDEQEHKM-UHFFFAOYSA-N" ], "amount": 1, "currency": "USD", "individual": true }
HTTP/1.1 200 OK Content-Type: application/json { "results": [ { "compound": { "smiles": "O(C(=O)CCCC1C(C)=NN(C)C=1C)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "VKCCTPSYCYARFI-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1C=CC=C(C#N)C=1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)COC1=CC=C(OC)C=C1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "XKJIOIJSLLCDOZ-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=C(NS(C2=CC=C(OC)C=C2)(=O)=O)C=CS1)CC1C(C2=CC=CC=C2)=NN2C=CN(CC(NC3C=C(OC)C(OC)=C(OC)C=3)=O)C(=O)C=12", "inchi_key": "XVWBPPRZAKJXSY-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1N=NN(CC2=CC=C(OC)C=C2)C=1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "ZNOWNQHKOHUYLP-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=C(NS(C2=CC=C(OC)C=C2)(=O)=O)C=CS1)CC1C(C2=CC=CC=C2)=NN2C=CN(CC(NC3C=C(C)C=CC=3OC)=O)C(=O)C=12", "inchi_key": "IEJBADVRNXRNLB-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)CCN1CCN(C)CC1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "LZRUMHHZJMDZLR-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=C(NS(C2=CC=C(OC)C=C2)(=O)=O)C=CS1)CC1=C2N(C=CN(C2=O)CC(NC2=CC=C3C(OCCO3)=C2)=O)N=C1C1=CC=CC=C1", "inchi_key": "PTKVKZOBUQFOJX-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)CN1C(=O)CCC1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "LFHNTOJEMXUDKP-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=CC=C(C)C=C1C)CC(OC)C1=C(I)C=CC=C1", "inchi_key": "SICGQCSMIMRHLF-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=CN(C2=NC=CC=C2)N=C1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "YGLRUSPDEQEHKM-UHFFFAOYSA-N", "archived_at": null }, "price": 176.63972004034355, "currency": "USD", "amount": 1 } ] }
Let's see the above example request with
"indvididual": false
echo '{"compounds": ["VKCCTPSYCYARFI-UHFFFAOYSA-N", "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "XKJIOIJSLLCDOZ-UHFFFAOYSA-N", "XVWBPPRZAKJXSY-UHFFFAOYSA-N", "ZNOWNQHKOHUYLP-UHFFFAOYSA-N", "IEJBADVRNXRNLB-UHFFFAOYSA-N", "LZRUMHHZJMDZLR-UHFFFAOYSA-N", "PTKVKZOBUQFOJX-UHFFFAOYSA-N", "LFHNTOJEMXUDKP-UHFFFAOYSA-N", "SICGQCSMIMRHLF-UHFFFAOYSA-N", "YGLRUSPDEQEHKM-UHFFFAOYSA-N"], "amount":1, "individual": false}' | http https://ultimateapp.mcule.com/api/v1/pricing/ --print HBhb
POST /api/v1/pricing/ HTTP/1.1 Content-Type: application/json { "compounds": [ "VKCCTPSYCYARFI-UHFFFAOYSA-N", "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "XKJIOIJSLLCDOZ-UHFFFAOYSA-N", "XVWBPPRZAKJXSY-UHFFFAOYSA-N", "ZNOWNQHKOHUYLP-UHFFFAOYSA-N", "IEJBADVRNXRNLB-UHFFFAOYSA-N", "LZRUMHHZJMDZLR-UHFFFAOYSA-N", "PTKVKZOBUQFOJX-UHFFFAOYSA-N", "LFHNTOJEMXUDKP-UHFFFAOYSA-N", "SICGQCSMIMRHLF-UHFFFAOYSA-N", "YGLRUSPDEQEHKM-UHFFFAOYSA-N" ], "amount": 1, "currency": "USD", "individual": false }
HTTP/1.1 200 OK Content-Type: application/json { "results": [ { "compound": { "smiles": "O(C(=O)CCCC1C(C)=NN(C)C=1C)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "VKCCTPSYCYARFI-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1C=CC=C(C#N)C=1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)COC1=CC=C(OC)C=C1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "XKJIOIJSLLCDOZ-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=C(NS(C2=CC=C(OC)C=C2)(=O)=O)C=CS1)CC1C(C2=CC=CC=C2)=NN2C=CN(CC(NC3C=C(OC)C(OC)=C(OC)C=3)=O)C(=O)C=12", "inchi_key": "XVWBPPRZAKJXSY-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1N=NN(CC2=CC=C(OC)C=C2)C=1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "ZNOWNQHKOHUYLP-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=C(NS(C2=CC=C(OC)C=C2)(=O)=O)C=CS1)CC1C(C2=CC=CC=C2)=NN2C=CN(CC(NC3C=C(C)C=CC=3OC)=O)C(=O)C=12", "inchi_key": "IEJBADVRNXRNLB-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)CCN1CCN(C)CC1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "LZRUMHHZJMDZLR-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=C(NS(C2=CC=C(OC)C=C2)(=O)=O)C=CS1)CC1=C2N(C=CN(C2=O)CC(NC2=CC=C3C(OCCO3)=C2)=O)N=C1C1=CC=CC=C1", "inchi_key": "PTKVKZOBUQFOJX-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)CN1C(=O)CCC1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "LFHNTOJEMXUDKP-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=CC=C(C)C=C1C)CC(OC)C1=C(I)C=CC=C1", "inchi_key": "SICGQCSMIMRHLF-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 }, { "compound": { "smiles": "O(C(=O)C1=CN(C2=NC=CC=C2)N=C1)C(CN1N=NC(C(OCC)=O)=C1)C1=CC=CC(Cl)=C1", "inchi_key": "YGLRUSPDEQEHKM-UHFFFAOYSA-N", "archived_at": null }, "price": 145.55112931324305, "currency": "USD", "amount": 1 } ] }
You can notice that you get lower prices but those prices are only valid in the context where you order the compounds together.
/iquote-queries/
echo '{"compounds": ["RAQLVHPPDXCQDS-UHFFFAOYSA-N", "QWPFQODIGUYSLE-UHFFFAOYSA-N"], "amount": 1, "customer_name": "John Doe", "delivery_country": "US"}' | http https://ultimateapp.mcule.com/api/v1/iquote-queries/ "Authorization: Token <your_token>" --print HBhb
Mandatory fields:
{"compounds": ["VKCCTPSYCYARFI-UHFFFAOYSA-N", "DVPXLZBGJCHMEO-UHFFFAOYSA-N"]}
{"compounds": [{"inchi_key": "VKCCTPSYCYARFI-UHFFFAOYSA-N", "amount": 1}, {"inchi_key": "DVPXLZBGJCHMEO-UHFFFAOYSA-N", "amount": 5}]}
Optional fields:
POST /api/v1/iquote-queries/ HTTP/1.1 Accept: application/json, */* Accept-Encoding: gzip, deflate Authorization: Token <your_token> Content-Type: application/json { "amount": 1, "customer_name": "John Doe", "delivery_country": "US", "compounds": [ "RAQLVHPPDXCQDS-UHFFFAOYSA-N", "QWPFQODIGUYSLE-UHFFFAOYSA-N" ] }
HTTP/1.1 201 CREATED Allow: GET, POST, HEAD, OPTIONS Content-Type: application/json { "amount": 1, "api_url": "https://ultimateapp.mcule.com/api/v1/iquote-queries/9/", "created_at": "2020-07-20T14:01:30.412763Z", "currency": "USD", "customer_email": "foo@bar.com", "customer_name": "John Doe", "delivery_country": { "code": "US", "name": "United States of America" }, "delivery_format": 0, "delivery_format_display": "Dry powder/film in supplier vial", "ended_at": null, "extra_amount": null, "id": 9, "notes": "", "purity": null, "scheme": 1, "started_at": null, "state": 10, "state_display": "Pending", "target_cc": null, "target_volume": null, "user": 2 }
Since processing a quote request and generating suitable quotes can take some time it is an asynchronous process. You can query the status of a quote request by calling the detail API endpoint of the quote request. It is returned in the api_url field when you create the quote request. You can also use the id field to construct the url of the API call. You can check the state field of the response whether the async quote request processing is finished.
States:
Following the above example where the ID of the quote request is 9 we query the status of the quote request:
http https://ultimateapp.mcule.com/api/v1/iquote-queries/9/ "Authorization: Token <your_token>" --print HBhb
GET /api/v1/iquote-queries/9/ HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Authorization: Token <your_token>
HTTP/1.1 200 OK Allow: GET, HEAD, OPTIONS Connection: keep-alive Content-Encoding: gzip Content-Type: application/json { "amount": 1, "api_url": "https://ultimateapp.mcule.com/api/v1/iquote-queries/9/", "created_at": "2020-07-20T14:01:30.412763Z", "currency": "USD", "customer_email": "foo@bar.com", "customer_name": "John Doe", "delivery_country": { "code": "US", "name": "United States of America" }, "delivery_format": 0, "delivery_format_display": "Dry powder/film in supplier vial", "ended_at": "2020-07-20T14:01:30.514096Z", "extra_amount": null, "id": 9, "notes": "", "purity": null, "quotes": [ { "additional_document_notes": "", "api_url": "https://ultimateapp.mcule.com/api/v1/iquotes/9/", "avg_product_price": "667.74", "avg_product_price_currency": "USD", "coverage_percent": 100, "created_at": "2020-07-20T14:01:30.506962Z", "id": 9, "modified_at": "2020-07-20T14:01:30.506997Z", "product_discount_price": null, "product_discount_price_currency": "USD", "products_price": 1335.48, "products_price_currency": "USD", "query": 9, "reference_id_full": "UI-9", "reformatting_price": null, "reformatting_price_currency": "USD", "selection_criteria": 10, "selection_criteria_display": "Best price", "shipping_price": 51.09, "shipping_price_currency": "USD", "state": 10, "state_display": "Displayed", "total_discount_price": null, "total_discount_price_currency": "USD", "total_price": 1386.57, "total_price_currency": "USD", "valid_until": "2020-08-19T14:01:30.506962Z" } ], "scheme": 1, "started_at": "2020-07-20T14:01:30.464496Z", "state": 30, "state_display": "Done", "target_cc": null, "target_volume": null, "user": 2 }
Check for the quotes field. If it is there and contains some items in the list, we could generate some quotes for your quote query. As you can see from the above result, we could generate 1 quote for the quote query. A “Best price” quote.
In order to get the detailed data of an individual quote, you can call the detail API endpoint of a quote, for example for the quote with ID 9:
http https://ultimateapp.mcule.com/api/v1/iquotes/9/ "Authorization: Token <your_token>" --print HBhb
GET /api/v1/iquotes/9/ HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Authorization: Token <your_token>
HTTP/1.1 200 OK Allow: GET, HEAD, OPTIONS Content-Encoding: gzip Content-Type: application/json { "additional_document_notes": "", "api_url": "https://ultimateapp.mcule.com/api/v1/iquotes/9/", "avg_product_price": "667.74", "avg_product_price_currency": "USD", "coverage_percent": 100, "created_at": "2020-07-20T14:01:30.506962Z", "id": 9, "items": [ { "amount": 1, "compound": { "archived_at": null, "inchi_key": "RAQLVHPPDXCQDS-UHFFFAOYSA-N", "smiles": "C(NC1=C(C#N)C=C(C#N)C=N1)(=O)C1N=C(N2CCN(C3=CC=CC=C3)CC2)SC=1" }, "product_price": 637.27, "product_price_currency": "USD", "purity_percent": 90 }, { "amount": 1, "compound": { "archived_at": null, "inchi_key": "QWPFQODIGUYSLE-UHFFFAOYSA-N", "smiles": "C(N(C(CSCC1OC=CC=1)=O)C1=C(C(F)(F)F)C=CC=C1)(=O)CCC1=NOC=C1" }, "product_price": 698.21, "product_price_currency": "USD", "purity_percent": 90 } ], "payment_due_days": 30, "price_items": [ { "attr": "products_price", "name": "Products price", "price": 1335.48, "price_currency": "USD" }, { "attr": "product_discount", "name": "Product discount (0%)", "price": 0.0, "price_currency": "USD" }, { "attr": "shipping_price", "name": "Shipping & package consolidation", "price": 51.09, "price_currency": "USD" }, { "attr": "reformatting_price", "name": "Reformatting", "price": 0.0, "price_currency": "USD" }, { "attr": "total_discount_price", "name": "Total discount (0%)", "price": 0.0, "price_currency": "USD" } ], "product_discount_price": null, "product_discount_price_currency": "USD", "products_price": 1335.48, "products_price_currency": "USD", "query": { "amount": 1, "api_url": "https://ultimateapp.mcule.com/api/v1/iquote-queries/9/", "created_at": "2020-07-20T14:01:30.412763Z", "currency": "USD", "customer_email": "foo@bar.com", "customer_name": "John Doe", "delivery_country": { "code": "US", "name": "United States of America" }, "delivery_format": 0, "delivery_format_display": "Dry powder/film in supplier vial", "ended_at": "2020-07-20T14:01:30.514096Z", "extra_amount": null, "id": 9, "notes": "", "purity": null, "scheme": 1, "started_at": "2020-07-20T14:01:30.464496Z", "state": 30, "state_display": "Done", "target_cc": null, "target_volume": null, "user": 2 }, "reference_id_full": "UI-9", "reformatting_price": null, "reformatting_price_currency": "USD", "selection_criteria": 10, "selection_criteria_display": "Best price", "shipping_price": 51.09, "shipping_price_currency": "USD", "state": 10, "state_display": "Displayed", "total_discount_price": null, "total_discount_price_currency": "USD", "total_price": 1386.57, "total_price_currency": "USD", "valid_until": "2020-08-19T14:01:30.506962Z" }
You can download a quote as a PDF file. Please note that the PDF file generation can take some time, the more item it contains the more time it will take to generate the file.
The HTTP response contains a Content-Disposition attachment; filename=“<filename>” header indicating that it should be downloaded.
http https://ultimateapp.mcule.com/api/v1/iquotes/9/download-pdf/ "Authorization: Token <your_token>" --download
You can download a quote as an Excel file. Please note that the file generation can take some time, the more item it contains the more time it will take to generate the file.
The HTTP response contains a Content-Disposition attachment; filename=“<filename>” header indicating that it should be downloaded.
http https://ultimateapp.mcule.com/api/v1/iquotes/9/download-excel/ "Authorization: Token <your_token>" --download