Loading the front page.
API · Bulk export
Catalyst is an evidence graph for human biochemistry: 25,302 entities and 319 graded findings, each one carrying the sentence it was read from, the paper it came from, and a grade computed from the study design rather than asserted by whoever wrote it. The API serves that to your product. The export hands you the whole of it.
Keys open when checkout does. The public endpoint needs neither — it answers the query above in your browser, right now, with no account.
The rows are the cheap part. Anyone can scrape abstracts and call the result a knowledge graph. What takes the years is everything that decides whether a row is allowed to exist — and none of it is visible in the output, which is why it is the part that gets skipped and the part that makes a graph unusable at the second question.
178 papers have been read to the point where a claim could be anchored to a verbatim sentence in them. Not a citation next to a summary — the quoted span, stored on the row, rendered beside it, and returned in the response. A claim whose quote does not support it on its own is rejected, which is a rule that costs findings rather than one that produces them.
Reading rate is the bottleneck, and it cannot be bought back with a bigger model.
Extraction is span-anchored, then run twice independently, then put through deterministic validators, then attacked by a refuter that has not seen the extraction, then sampled for audit with an automatic tripwire. A claim that fails any layer goes to a human. No confidence score bypasses any of it, because a model's self-reported certainty is not evidence about the world.
This is four pipelines, not one prompt, and each one exists because the version without it shipped something wrong.
Study design sets a ceiling. Weaknesses in the row — small n, a mismatched population, an undisclosed conflict, a missing interval — drop it. One narrow bonus can raise it. No author sets their own grade, no customer can move one, and two people running the same rows get the same grades.
An editorial grade cannot be recomputed, audited, or defended line by line. This one can.
18 predicates, and the 19th requires a written decision with an argument in it. A schema that grows to fit whatever arrived cannot be queried consistently, which is exactly why most extracted graphs answer the first question well and the second one not at all.
Closing a vocabulary is cheap on day one and impossible on day four hundred.
A connection assembled through shared biology is labelled a hypothesis in the data, not merely in the rendering. You can ask for one, the other, or both, and you can never be handed an inference wearing a report's clothes. The distinction survives into your database because it is a column, not a stylesheet.
Retrofitting this onto a corpus that merged them means re-reading everything.
Every upstream source was read for its terms before a row entered, not audited at download. A source whose licence does not permit redistribution is not in a table that implies it does. Every row you receive carries its database, its record, its release and its licence.
A graph assembled first and licensed later is a graph you cannot ship.
A search that found nothing is recorded as having found nothing, and a trial that found no effect is stored at the same weight as one that did. That is different from a question nobody asked, and the difference is queryable. Most sources cannot express it at all.
Null results are the first thing a pipeline optimised for volume throws away.
Ask what the graph states about one node. Findings and hypotheses come back in separate arrays, each row with its provenance attached and nothing inferred about which is which.
Request
curl "https://catalystproject.ai/api/v1/relations?node=CHEBI:16919&class=both"Response
{
"node": {
"id": "CHEBI:16919",
"label": "creatine",
"type": "compound",
"href": "/compounds/creatine"
},
"class": "both",
"tier": "core",
"findings": [
{
"id": "01M0ZHEHEYE7FRV5ZDY4D0BDCB",
"assertion_class": "documented",
"predicate": "affects",
"direction": "increases",
"grade": "A",
"subject": {
"id": "CHEBI:16919",
"label": "creatine",
"type": "compound",
"href": "/compounds/creatine"
},
"object": {
"id": "CAT:outcome/countermovement-jump-height",
"label": "Countermovement jump height",
"type": "outcome",
"href": "/outcomes/countermovement-jump-height"
},
"sentence": "creatine increases Countermovement jump height",
"evidence_type": "rct",
"n": 23,
"population": "amateur male soccer players aged 18-35; secondary outcome",
"dose_regimen": "3 g/day creatine monohydrate, five days per week",
"duration_days": 98,
"effect_size": null,
"effect_metric": null,
"ci_low": null,
"ci_high": null,
"replication_count": 0,
"contradiction_count": 0,
"curated_at": "2026-08-26T17:21:24.944413+00:00",
"source": {
"id": "PMID:41704196",
"title": "Effectiveness of a soccer injury prevention program based on creatine supplementation and internal load monitoring: a randomized controlled pilot study.",
"url": "https://doi.org/10.1080/15502783.2026.2633251",
"year": 2026,
"retracted": false,
"quote": "CMJ height also increased significantly in the creatine group (p = 0.005)."
}
}
],
"relations": [
{
"id": "01M0DBCYMYNNH2W88V0PB5XNSE",
"assertion_class": "inferred",
"predicate": "transported_by",
"direction": "modulates",
"subject": {
"id": "CHEBI:16919",
"label": "creatine",
"type": "compound",
"href": null
},
"object": {
"id": "UNIPROT:Q6ZSM3",
"label": "SLC16A12",
"type": "protein",
"href": "/proteins/slc16a12"
},
"sentence": "creatine is transported by SLC16A12",
"source": {
"database": "rhea",
"name": "Rhea",
"record": "RHEA:73043",
"url": "https://www.rhea-db.org/rhea/73043",
"release": "2026-08-19",
"license": "CC BY 4.0"
}
}
],
"page": {
"limit": 50,
"offset": 0,
"total_relations": 23,
"total_findings": 15
},
"withheld": {
"relations": 0,
"sources": []
}
}Read from the graph when this page was built, through the same mappers the endpoint uses. Trimmed to one row of each kind — the real response carries 15 findings and 23 reference statements for this node, and page above reports both. Fetch it untrimmed.
Nothing on this site is served from a different store than the API reads. The first finding in that response renders as this, at an addressable URL, with the same grade and the same quote:
creatine increases Countermovement jump height · grade A
“CMJ height also increased significantly in the creatine group (p = 0.005).”
One response shape across every route: entities with their identifiers, findings with their grade and their quote, hypotheses labelled in the data, and a withheld block that says what the release tier left out.
The relations endpoint is unauthenticated and rate-limited at sixty requests a minute, and it stays that way after checkout opens: the public tier is not a trial.
The same graph as tools an assistant can call, so a model answers from graded rows with citations attached instead of from a confident sentence assembled out of search results.
Every row that entered, moved grade, gained a contradiction or was retracted, with the reason. A cached answer that silently went stale is worse than no answer.
Database, record, release and licence on every reference row. Your compliance review reads the response rather than trusting a page on our site.
A plan buys throughput and delivery. It does not buy different evidence, and it cannot buy a different grade — every tier is served the same rows, under the same licences, at the same grades.
Freeforever
Every reader, every crawler, every agent. No key, no account, no card.
$49per month
One product, one team, one key. The plan most people need.
$399per month
A product with traffic, or a group that needs the graph in more than one system.
Custompriced per engagement
The whole graph, inside your own infrastructure, under terms that permit redistribution.
Prices are in US dollars and exclude tax. Metered by call, counted on a 200 — a 429 and a 503 are ours, not yours, and are never billed.
Every plan serves the same rows at the same grades. A tier changes your quota and your delivery, never what the graph says. A vendor whose premium tier knows more than its free one is telling you the free one is incomplete on purpose.
Grade is computed from fields on the row — study design, sample size, replication, interval, conflict of interest — by a published function. No customer, no author and no model sets one. There is no commercial conversation that moves a letter.
There is no cheaper feed with the quotes and the citations stripped out. The quoted sentence is the column that makes every other column checkable, and shipping it is not an upsell.
We will not tell you a compound is covered before it is read. The API returns what has been curated and says plainly when that is nothing, because a confident empty answer is the failure mode this whole platform is built against.
The whole graph as a file rather than a request at a time: 319 graded findings and the 25,302 entities they connect, with every provenance column intact. An export that dropped those columns would be the thing this platform exists to be distinguishable from.
Curated findings are this project’s own work; the reference layer travels under its upstream licences. They ship separately with separate notices rather than merged into one file under one, because merging them is how an attribution obligation gets lost.
Where a source is excluded, the manifest says which and why. A bounded release that does not declare its bounds reads as the whole graph, and that is the mistake that ends up in someone’s product.
Column types, enumerations and the closed predicate vocabulary ship with the file, so a load is a load rather than an afternoon of inference.
Every upstream source and the terms it carries are listed on the attribution page, which is the authority rather than this summary of it. The full description of the export is at /export.
Nothing on this page waits on curation, on a licence review, or on a schema decision. The endpoint answers today, unauthenticated, and everything a key adds is throughput, delivery and the routes beside it. Checkout is the last part.
Parameters, filters, paging and the response shape, in full.
Every ceiling and every penalty, with the distribution it has actually produced.
What the reference layer is built from, and the terms each part carries into your product.