epitaxy

US federal drug shortages and recalls joined to the federal contracts that buy those drugs. One call, no signup.

What we claim and what we do not. We claim: this government supplier has an active FDA shortage or recall. We do NOT claim that a given contract delivers a given drug. Federal contract descriptions average 47 characters and almost never name the drug.

Try it right now

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.

Read confidence every time

valuewhat it means
exactmatch on a shared identifier, for us an NDC inside FDA
probablenormalised company name, or a token match on the drug name
weaksofter 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.

Free tier

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.

Paid tier

planpricewhat you get
Starter29 USD/month10 000 callscoming soon
Pro99 USD/month100 000 calls plus the daily delta feedcoming soon
x4020.004 USD per callUSDC on Base, no signupno signup, just call
Bulk dump199 USDone off, Stripe onlycoming 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.

MCP

Remote: https://drugs.crossgrain.xyz/v1/mcp. Local: uvx epitaxy-mcp or pip install epitaxy-mcp. Five tools, and they work without a key.

Addressing

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.

Paths

Sources and licences

openFDA, 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.