BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://www.ebi.ac.uk/chembl/api/data/molecule.json?limit=1'
JavaScript (fetch)
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);
Python (requests)
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())
Response — HTTP 200 (truncated)
{
  "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.7

Parameters

ParameterTypeRequiredDescription
formatextensionRequiredAppend `.json` to the resource name. Without it ChEMBL returns XML. json
limitqueryOptionalPage size, default 20 and maximum 1000. 1
offsetqueryOptionalPagination offset. The response `page_meta` block carries a ready-made `next` URL. 0
molecule_chembl_idqueryOptionalFilter by ChEMBL identifier. Django-style suffixes such as `__in` and `__gte` work on most fields. CHEMBL25
max_phasequeryOptionalFilter 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

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.