US federal drug shortages and recalls joined to the federal contracts that buy those drugs. One call, no signup.
curl https://drugs.crossgrain.xyz/v1/exposure?limit=5
No key, no account, no rate limit tied to you. A response looks like this, one row shortened:
{"tier": "free", "count": 5, "results": [
{"exposure_id": "0026624dec7b6d9f",
"award_id": "SPE2DP25F109W",
"company_id": "a4fdd4a7530f4962",
"company_name": "TEVA PHARMACEUTICALS USA, INC.",
"company_key": "teva pharmaceuticals usa",
"shortage_id": "022c478fb3af28c4",
"confidence": "probable",
"match_method": "company_name_normalized"}]}
company_name is the name as the source reports it.
company_key is the normalised form we match on, so you can
group rows without normalising them yourself.
| value | what it means |
|---|---|
| exact | match on a shared identifier, for us an NDC inside FDA |
| probable | normalised company name, or a token match on the drug name |
| weak | softer match, an indication only |
A match on the company AND on the drug at the same time is NOT promoted to exact. A cross source join is never exact, because FDA and USAspending share no identifier. Anyone claiming otherwise has a different source or is guessing.
Always on, no key and no signup. It returns at most 20 rows, without the evidence field, without weak matches, and from a data version 24 hours old. Nothing is stored: no counters, no IP addresses. If a version that old does not exist yet, you get the oldest one we have, so the free tier is never empty while data exists.
| plan | price | what you get | |
|---|---|---|---|
| Starter | 29 USD/month | 10 000 calls | coming soon |
| Pro | 99 USD/month | 100 000 calls plus the daily delta feed | coming soon |
| x402 | 0.004 USD per call | USDC on Base, no signup | no signup, just call |
| Bulk dump | 199 USD | one off, Stripe only | coming soon |
After payment the key is created automatically and shown once on the return page. Only its hash is stored, so nobody, us included, can read it a second time.
Remote: https://drugs.crossgrain.xyz/v1/mcp.
Local: uvx epitaxy-mcp or pip install epitaxy-mcp.
Five tools, and they work without a key.
Every segment has its own path. The first two addresses below are equivalent and both will work permanently:
https://drugs.crossgrain.xyz/v1/exposure https://drugs.crossgrain.xyz/drugs/v1/exposure
Further segments will arrive as /devices/v1/..., /food/v1/... and so on. A path whose segment is reserved but not live yet answers 404 with segment_not_live, it never returns another segment's data. An address that has once been published is never withdrawn.
/v1/meta data freshness, public and always free/v1/shortages, /v1/recalls, /v1/contracts/v1/exposure the join itself/v1/exposure/company/{company_id} every row for one company/v1/exposure/contract/{award_id} every row for one award/openapi.json, /llms.txtopenFDA, US public domain, CC0 1.0. USAspending, US public domain, code under CC0. The data is unverified and is not a basis for treatment decisions.