API and MCP
The same data the app shows, for your own code or your own agent: FDA actions, SEC filings and ClinicalTrials.gov records for life-science companies, cleaned, linked to one company id and classified. One key works for the REST API and the MCP server. Informational only; every record links to its public source.
Get a key on your profile page (any account, free plan included). Agent-readable copy of this page: /developers.md.
Why this and not openFDA
The records are free. What costs weeks is the wiring: six openFDA endpoints, the FDA Data Dashboard behind an issued key, four FDA HTML tables with no feed, the Federal Register, the eCFR versioner, EDGAR full-text search plus XBRL frames plus the Form D data sets, the ClinicalTrials.gov API, a Purple Book CSV, a DECRS zip and a device-registration bulk export, each on its own schedule and its own idea of a company name. We poll all of it, put every record in one shape, resolve the company once (FDA name, SEC filer, trial sponsor, FEI numbers), classify it, map every CFR citation to its GxP area, and say when each source was last read.
- Supplier and site vetting in your own system. One call for a CDMO or CRO: every registered site, every inspection outcome, 483, letter, recall and import alert, with the agency's record linked.
- Sales triggers. A nightly job over your account list: who was just inspected, cited, funded or cleared. Your CRM gets the row; your rep gets the reason.
- Research by an agent. “Which of these forty companies has an OAI inspection, a CRL or a clinical hold since January, and what did FDA cite?” is one conversation with the MCP server, not a week of tabs.
- Diligence and screening. Trials, runway, raises, licensed products and the compliance record on one company id, so a screen written once runs every morning.
Records, links and our classification, never a verdict. The conclusion stays yours.
Use it from your agent (MCP)
Remote MCP server at https://app.approvesuite.com/api/mcp, Streamable HTTP, bearer key. Claude Code:
claude mcp add --transport http approvesuite https://app.approvesuite.com/api/mcp \
--header "Authorization: Bearer $APPROVE_SUITE_KEY"Claude Desktop, ChatGPT and Cursor take the same URL as a custom connector or in their MCP settings:
{
"mcpServers": {
"approvesuite": {
"url": "https://app.approvesuite.com/api/mcp",
"headers": { "Authorization": "Bearer as_live_…" }
}
}
}Or paste this into your agent and let it do the setup:
Read https://approvesuite.com/developers.md, then help me set up the Approve Suite MCP server.Tools: search_events, get_event, count_events*, find_company, resolve_company, company_detail, explore_companies*, search_trials, analytics_rollup*, search_facilities, taxonomy, sources. * Pro and API plans.
Use it from code (REST)
Base URL https://app.approvesuite.com/api/v1. GET only, JSON in and out, the same filters as the MCP tools. OpenAPI 3.1.
curl -H "Authorization: Bearer $APPROVE_SUITE_KEY" \
"https://app.approvesuite.com/api/v1/events?event_types=warning_letter,inspection_classification&from=2026-10-01"GET /events | events by type, source, severity, GxP area, product type, modality, stage, company, text, date |
GET /events/{id} | one event: summary, why it matters, tags, CFR references with GxP area, confirmed companies, source link |
GET /events/facets | counts by type and severity, optionally per company |
GET /companies | screen companies by trials, stage, headquarters, cash, runway, recent raises |
GET /companies/resolve?name= | a name to a canonical company id, with the basis of the match |
GET /companies/search?name= | name or alias contains |
GET /companies/{id} | identity, trials since 2021, financials and runway, raises, licensed biologics, recent events |
GET /companies/{id}/events | /trials | /facilities | that company's records |
GET /trials | ClinicalTrials.gov mirror: status, phase, area, modality, dates |
GET /facilities | FDA-registered establishments by FEI, name, country, state, kind |
GET /analytics/{slice} | pre-aggregated counts: events-over-time, inspections, warning-letters-by-cfr, trials, recalls |
GET /taxonomy | every code the filters accept |
GET /sources | each source's schedule, health and last successful read |
Python
import requests
r = requests.get("https://app.approvesuite.com/api/v1/companies/resolve", params={"name": "Lonza"},
headers={"Authorization": f"Bearer {KEY}"})
company = r.json()["company"]
events = requests.get(f"https://app.approvesuite.com/api/v1/companies/{company['id']}/events",
headers={"Authorization": f"Bearer {KEY}"}).json()["events"]TypeScript
const headers = { Authorization: `Bearer ${process.env.APPROVE_SUITE_KEY}` };
const { company } = await fetch("https://app.approvesuite.com/api/v1/companies/resolve?name=Lonza", { headers }).then((r) => r.json());
const { events } = await fetch(`https://app.approvesuite.com/api/v1/companies/${company.id}/events`, { headers }).then((r) => r.json());What you get
- Events from every source the app reads (FDA warning letters, inspection outcomes and citations, Form 483s, recalls, drug shortages, safety communications, OPDP letters, debarments, import alerts, approvals, CRLs, 510(k)s and PMAs, Federal Register rules and guidance, eCFR amendments, ClinicalTrials.gov changes, SEC 8-Ks), each with a one-line summary, why it matters, severity, GxP area, product type, modality, stage, CFR references mapped to GxP area and citing guidances, and the companies confirmed as named in it.
- Companies: one id across FDA, SEC and ClinicalTrials.gov, with aliases, FEI numbers, CIK and ticker; trials since 2021; cash, burn and runway; Form D and public-offering raises; licensed biologics; FDA-registered establishments.
- Reference: the taxonomy, and each source's schedule and last successful read, so you know how fresh a row is.
Not in the API: candidate (unreviewed) company links, classifier internals, full source documents (links instead), anything a subscriber created.
Plans
| Plan | Requests a month | Per minute | Window | |
|---|---|---|---|---|
| Free key | 1,000 | 10 | last 7 days of events; the full company graph | Any account, no card. Core tools. |
| Included in Pro ($79/mo) | 10,000 | 60 | full archive | Every tool. For one person's own agent. |
| API plan ($99/mo, $990/yr) | 100,000 | 300 | full archive | Everything in Pro plus the quota. For systems and products: internal use, and display to your own users with attribution. |
Only successful calls count: errors, refusals and rate-limited requests do not. Past the quota the API answers 402 until the month resets. Redistribution, bulk snapshots or an OEM licence: email info@approvesuite.com.
Conventions
Authorization: Bearer as_live_…. Keys are created and revoked on your profile page; up to five at a time.- Errors are RFC 9457 problem documents:
401bad key,402quota or plan,429rate limit withRetry-After,400invalid parameters. - Lists accept comma-separated values (
event_types=recall,warning_letter); dates areYYYY-MM-DD;limitis at most 100. - Every response carries
as_ofand rate-limit headers. Ids never change. - Licence: use the data in your own products and systems; show the source and Approve Suite when you display it; do not re-serve the dataset as such or train models on our summaries without an agreement. Terms.
Start with a free key. No card.
Create an account