| name | chemical-space |
| description | Navigate make-on-demand catalogues — ZINC-22 through CartBlanche and Enamine REAL Space — to find compounds that can actually be ordered. Use this skill to look substances up by ZINC identifier or structure, understand tranche partitioning by heavy-atom count and logP, and choose between screening an enumerated subset and searching a combinatorial synthon space with a fragment-growing method such as V-SYNTHES. Also trigger on ZINC22, CartBlanche, Enamine REAL, make-on-demand, tangible library, synthon, tranche, giga-scale enumeration, or ultra-large virtual screening. |
| license | MIT |
| allowed-tools | Read Write Edit Bash |
| compatibility | Requires Python 3.10+ and outbound HTTPS access to cartblanche.docking.org. The bundled client uses only the Python standard library and needs no API key or account. Enamine REAL Space itself is a commercial catalogue — identifiers are public but bulk synthon files require a licence from Enamine. |
| metadata | {"version":"1.0","skill-author":"K-Dense Inc.","openclaw":{"emoji":"🌌","homepage":"https://cartblanche.docking.org"},"hermes":{"category":"research"}} |
Purchasable Chemical Space
Make-on-demand catalogues turned virtual screening from "the million compounds we own" into
"the tens of billions a vendor will synthesise". ZINC-22 holds about 54.9 billion 2D structures
drawn from Enamine, WuXi, and Mcule; Enamine REAL Space defines around 94 billion combinatorially.
This skill is about finding compounds in that space that can actually be ordered — and knowing
when the space is too large to enumerate at all.
Services: https://cartblanche.docking.org (per-substance JSON) ·
https://files.docking.org/zinc22 (bulk tranche tree). Both unauthenticated.
Checked against: the live services, August 2026.
Read references/zinc22-and-cartblanche.md before calling
the API or downloading a tranche,
references/combinatorial-spaces.md before assuming a space
can be enumerated, and
references/screening-strategy.md before designing a cascade —
that one is judgement, not syntax.
The two scripts
| Script | Answers |
|---|
cartblanche_lookup.py | What is this ZINC id, and can I buy it? |
space_plan.py | Which tranches do I need, and what will the screen cost? |
The API lies about its own responses
This is the thing to get right. CartBlanche answers unknown routes with HTTP 200, a
Content-Type: application/json header, and its React app's HTML:
| Route | Status | Content-Type | Body |
|---|
/substance/ZINC000000000053.json | 200 | application/json | JSON |
/substance.json?zinc_id=… | 200 | application/json | HTML shell |
/tranches.json | 200 | application/json | HTML shell |
Neither the status code nor the header can be trusted; only the body can. get_json() raises a
named error when a response begins with <. The one reliable JSON route is
/substance/<ZINC id>.json — treat CartBlanche as per-identifier lookup and use the file tree
for anything bulk.