Accessing the Data
There are two ways in, and they share one base URL:
- Browse — plain, static JSON over HTTPS. No key, no auth, no rate-limit
handshake. Just
GETa URL. - Search — one
POSTendpoint that takes a query vector and returns ranked hits.
This chapter covers the conventions common to both. The next two chapters go deep on each.
Base URL
https://lmmol.com
Every browse path in this book is relative to that origin. All responses are JSON
(Content-Type: application/json) served over HTTPS through a CDN, so they are cacheable
and fast to fetch in bulk.
The browse layer (no auth)
Everything you can browse is a static file at a predictable path. The four shapes you will use most:
| Path | What you get |
|---|---|
index.json | the root: entity types, counts, navigation |
index/list/<type>/root.json | how a type's listing is sharded (count + shards) |
index/list/<type>/<n>.json | one shard: up to 1000 {id, name} entries |
nodes/<type>/<id>.json | a single entity (the node and its forward edges) |
And the cross-reference (backlink) indexes that make the graph two-way:
| Path | What you get |
|---|---|
index/disease/<MONDO_id>.json | {proteins, trials} pointing at a disease |
index/gene/<symbol>.json | {proteins} for a gene |
index/clinvar/gene/<symbol>.json | {diseases: [{id, name, significance}]} |
index/clinvar/disease/<MONDO_id>.json | {genes: [{symbol, significance}]} |
There is also a machine-oriented guide at llms.txt (see below).
<type> is one of protein, trial, disease, gene, go. Ids go in the path
exactly as written, except Mondo ids use an underscore (MONDO_0016419). URL-encode
ids that contain unusual characters (some gene symbols do).
Start at the root
curl https://lmmol.com/index.json
index.json reports each entity type with its count and where its listing lives.
Treat it as the entry point you crawl from — and the one file to re-read when you want
fresh counts.
The search endpoint
Semantic search is a single HTTP API:
POST https://rtxz9xxyz7.execute-api.us-east-1.amazonaws.com/search
It accepts a JSON body containing a query vector (you embed the text yourself — see Searching) and returns ranked results. It is metered and may be disabled for cost control; browse is always available. Because of that, prefer browse for anything you can address by id or path, and reach for search only when you actually need "what's semantically relevant?"
Conventions
- HTTP verbs — browse is
GET; search isPOST. Nothing else. - Missing records return
404. A successful browse fetch is always valid JSON. - Stable ids — ids are the durable contract. Paths are derived from ids, so once you have an id you can construct every URL for that entity yourself.
- Caching — browse files are static and CDN-cached. Fetch freely; cache locally
when you crawl at scale, and re-fetch
index.jsonto learn when counts have moved.
For LLM agents: llms.txt
curl https://lmmol.com/llms.txt
llms.txt is a short, link-free description of the data and these access patterns,
written for an agent to read once and then navigate on its own. It is deliberately
concise. An agent can read it, then walk index.json → listings → nodes → backlinks
without any further instructions. See Browsing the Index for why this
deterministic walk is a practical alternative to vector RAG.