search_chembl_id_lookup
Resolve a name or keyword to ChEMBL IDs across compounds, targets, cell lines, tissues, and assays in one call.
Instructions
Resolve a name to ChEMBL IDs across several entity kinds in one call.
Cross-entity convenience wrapper over the ChEMBL RDF graph. Two matching regimes, because the entity kinds carry different searchable text:
• EXACT (case-insensitive) NAME match — COMPOUND (skos:altLabel: brands,
generics, synonyms), TARGET (its own rdfs:label OR its component's
skos:altLabel — gene symbols and protein names), CELL_LINE and TISSUE
(rdfs:label, e.g. "Liver", "CCRF S-180"). Not fuzzy/substring — fix typos
before calling, or use search_chembl_target, which falls back to a
substring pass. Prefer the entity-specific tools
(search_chembl_molecule / search_chembl_target) when you know the kind;
they carry extra fields (organism/type).
• KEYWORD-IN-DESCRIPTION — ASSAY. Assays have no name; their searchable text is a free-text dcterms:description, so ASSAY does a keyword (token) match on that description, NOT an exact match, e.g. entity_type="ASSAY", query="acetylcholinesterase" → every assay whose description mentions it. ASSAY results are relevance-ranked (best description match first).
Default (no entity_type) searches the four EXACT-name kinds and UNIONs them.
ASSAY is opt-in via entity_type="ASSAY" — its keyword semantics and high hit
counts would otherwise swamp a name lookup. (DOCUMENT is not supported; query
SPARQL directly for it.)
The search string can be passed as any of: query (canonical), search,
term, keyword, keywords, search_term, or name.
RETURNS a dict {'total_count', 'has_more', 'results'}. total_count is the
number of rows RETURNED (capped by limit), NOT the full match count; check
has_more (true = more results exist beyond this page — relevant mainly for
ASSAY, whose keyword search can have many hits). ⚠️ On a default (cross-kind)
search, has_more=true can also mean an entire entity_type is missing from
the page: the kinds are UNIONed and the limit is applied to the whole, so
e.g. "Liver" at limit=5 returns 5 TARGET rows and no TISSUE row, though both
exist. Do NOT conclude a kind is absent from a truncated page — raise limit
or re-run with entity_type set. Each result carries
'chembl_id', 'entity_type', and 'organism' (null for COMPOUND / where absent —
use it to tell e.g. human from mouse targets). Name kinds also carry 'name'
(rdfs:label); ASSAY rows instead carry 'description' (the free-text assay
description, name=null) and a relevance 'score' (higher = better match).
An EMPTY 'results' additionally carries 'hint'. Read it: an empty result is NOT an endpoint failure, and must not be reported as one. On a real endpoint failure this tool does NOT raise — it returns a dict with a single 'error' key instead; CHECK FOR 'error' BEFORE READING 'results'.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| term | No | ||
| limit | No | The maximum number of results to return. | |
| query | No | The query string to search for. | |
| search | No | ||
| keyword | No | ||
| keywords | No | ||
| entity_type | No | Optional: COMPOUND, TARGET, CELL_LINE, TISSUE, or ASSAY. Omit to search the four name kinds together. ASSAY (keyword match on the assay description) is opt-in only. | |
| search_term | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||