ChEMBL API
Free ChEMBL REST API with no key: 2.4 million drug-like compounds with structures, calculated properties, bioactivity measurements and clinical development phase. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the ChEMBL API?
The ChEMBL API is a free, key-free REST interface to EMBL-EBI's manually curated database of bioactive drug-like molecules. It provides compound structures, calculated physicochemical properties, bioactivity measurements against protein targets, and clinical development phase for approximately 2.4 million compounds.
ChEMBL is the open-data backbone of computational drug discovery. Its distinguishing feature is that the bioactivity data is manually extracted from the primary medicinal chemistry literature — real measured IC50, Ki and EC50 values tied to specific assays and publications, rather than predictions. That provenance is what makes it usable for training models and for serious target research.
The `molecule_properties` block deserves attention because it is computed consistently across the entire database: molecular weight, ALogP, hydrogen bond donors and acceptors, polar surface area, rotatable bonds and rule-of-five violations, all calculated the same way. Getting comparable descriptors across millions of compounds is otherwise a substantial pipeline of your own. Note the `.json` extension — ChEMBL defaults to XML without it, and `limit` defaults to 20, so always paginate deliberately.
Quick facts
- Base URL
https://www.ebi.ac.uk/chembl/api/data- Authentication
- No API key or account. ChEMBL is EMBL-EBI infrastructure and is free for any use, including commercial.
- Rate limit
- No hard published limit; EBI throttles abusive traffic. Use pagination rather than requesting huge pages.
- Pricing
- Free. Data released under CC BY-SA 3.0.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the ChEMBL API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch one molecule record with computed properties
GET https://www.ebi.ac.uk/chembl/api/data/molecule.json?limit=1
curl 'https://www.ebi.ac.uk/chembl/api/data/molecule.json?limit=1'const res = await fetch("https://www.ebi.ac.uk/chembl/api/data/molecule.json?limit=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://www.ebi.ac.uk/chembl/api/data/molecule.json?limit=1", timeout=20)
res.raise_for_status()
print(res.json()){
"molecules": [
{
"atc_classifications": [],
"availability_type": -1,
"biotherapeutic": null,
"black_box_warning": 0,
"chemical_probe": 0,
"chirality": -1,
"cross_references": [],
"dosed_ingredient": false,
"first_approval": null,
"first_in_class": -1,
"helm_notation": null,
"inorganic_flag": -1,
"max_phase": null,
"molecule_chembl_id": "CHEMBL6329",
"molecule_hierarchy": {
"active_chembl_id": "CHEMBL6329",
"molecule_chembl_id": "CHEMBL6329",
"parent_chembl_id": "CHEMBL6329"
},
"molecule_properties": {
"alogp": "2.11",
"aromatic_rings": 3,
"full_molformula": "C17H12ClN3O3",
"full_mwt": "341.75",
"hba": 5,
"hbd": 1,
"heavy_atoms": 24,
"mw_freebase": "341.75",
"np_likeness_score": "-1.56",
"num_ro5_violations": 0,
"psa": "84.82",
"qed_weighted": "0.74",
"ro3_pass": "N",
"rtb": 3
},
"molecule_structures": {
"canonical_smiles": "Cc1cc(-n2ncc(=O)[nH]c2=O)ccc1C(=O)c1ccccc1Cl",
"molfile": "\n RDKit 2D\n\n 24 26 0 0 0 0 0 0 0 0999 V2000\n 5.2792 -2.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.7917 -2.3500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 5.2792 -1.4500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 6.3125 -2.0500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 5.7875 -4.7417 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.7Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
format | extension | Required | Append `.json` to the resource name. Without it ChEMBL returns XML. json |
limit | query | Optional | Page size, default 20 and maximum 1000. 1 |
offset | query | Optional | Pagination offset. The response `page_meta` block carries a ready-made `next` URL. 0 |
molecule_chembl_id | query | Optional | Filter by ChEMBL identifier. Django-style suffixes such as `__in` and `__gte` work on most fields. CHEMBL25 |
max_phase | query | Optional | Filter by clinical development phase, where 4 means an approved drug. 4 |
Response fields
molecule_chembl_idstring- Stable ChEMBL identifier for the compound — the key you use everywhere else.
pref_namestring- Preferred name, typically the INN for approved drugs. Null for most research compounds.
max_phaseinteger- Highest clinical trial phase reached; 4 means approved. Null means it never entered clinical development.
molecule_propertiesobject- Consistently computed descriptors: `full_mwt`, `alogp`, `hba`, `hbd`, `psa`, `rtb`, `aromatic_rings`, `num_ro5_violations` and more.
molecule_structuresobject- Canonical SMILES, standard InChI and InChIKey for the compound.
molecule_hierarchyobject- Links salts and mixtures to their parent compound, so you can deduplicate to the active moiety.
black_box_warninginteger- Whether an approved drug carries a boxed safety warning.
atc_classificationsarray- WHO ATC therapeutic classification codes for approved drugs.
What you can build with the ChEMBL API
- Look up measured bioactivity of compounds against a protein target
- Filter compound libraries by Lipinski rule-of-five properties
- Build a training set of structure-activity data for a QSAR model
- Cross-reference approved drugs to their targets and ATC classes
Common errors and how to fix them
XML instead of JSON
The `.json` extension was omitted.
Fix: ChEMBL selects format by file extension: request `/molecule.json`, not `/molecule`.
400
Unknown filter field or malformed lookup suffix.
Fix: Filters follow Django ORM conventions — for example `molecule_properties__full_mwt__lte=500`. Check the field is filterable in the docs.
Only 20 results
Not an error — `limit` defaults to 20.
Fix: Set `limit` explicitly, up to 1000, and follow `page_meta.next` for subsequent pages.
ChEMBL API — frequently asked questions
Is the ChEMBL API free?
Yes, free with no API key and no registration, and the data is released under CC BY-SA 3.0 so commercial use is permitted with attribution. It is maintained by EMBL-EBI.
What is max_phase in ChEMBL?
The highest clinical trial phase a compound has reached. A value of 4 means an approved drug, 1 to 3 are the clinical phases, and null means it never entered clinical development — useful for filtering research compounds from marketed medicines.
How do I search ChEMBL by chemical structure?
The substructure and similarity endpoints accept a SMILES string or an InChIKey in the URL path, with similarity taking a Tanimoto cutoff percentage. These are separate resources from the plain molecule lookup.
Why does ChEMBL return XML?
Because format is chosen by file extension and XML is the default. Append `.json` to the resource name — for example `/molecule.json` — and you get JSON instead.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
Scientific Calculator
Free online scientific calculator with sin, cos, tan in degrees or radians, log, ln, powers, roots, π, e, parentheses, memory keys and keyboard support.
ChEMBL is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.