{"openapi":"3.1.0","info":{"title":"Biotech Tracker company dossier preview","version":"biotech.company-dossier.v1","description":"Public developer preview of curated company records. No API key, no paid plan, and no freshness guarantee. The hosted deployment serves a reviewed seed. Study records, advisory-meeting titles, news, and market data are omitted. This document is a product description, not a legal opinion about upstream sources."},"servers":[{"url":"/","description":"The host that served this document."}],"paths":{"/api/v1/companies":{"get":{"operationId":"listCompanyDossiers","summary":"List curated company dossiers","description":"One ticker, an exact company name, a comma-separated list, and companies=all share this response. all is still paginated. A single company is companies[0], not a different schema.","parameters":[{"name":"companies","in":"query","required":true,"schema":{"type":"string","maxLength":8000},"description":"Ticker, exact company name, comma-separated list, or all. The whole value all pages every company. all inside a list is not a wildcard.","examples":{"ticker":{"value":"VRTX"},"list":{"value":"VRTX,MRNA"},"all":{"value":"all"}}},{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"One stored company tag, such as oncology. Unknown values return 400 with the live allow-list. companies=all filters silently. A list reports category_mismatch in unmatched.","example":"oncology"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":10000,"default":0},"description":"Company page start. Default 0."},{"name":"catalystOffset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":10000,"default":0},"description":"Shared start index for every company on this page. Each company returns at most 100 catalysts. Default 0. Walk one company with nextOffset until it is null. linkedNctIds covers the catalysts on that page only."}],"responses":{"200":{"description":"A page of company dossiers. An empty page is still 200.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyDossier"},"example":{"schema":"biotech.company-dossier.v1","preview":true,"service":"public-developer-preview","generatedAt":"2026-09-29T12:00:00.000Z","query":{"companies":"EXMP","category":null,"limit":20,"offset":0,"catalystOffset":0},"page":{"limit":20,"offset":0,"total":1,"returned":1,"nextOffset":null},"unmatched":[],"companies":[{"ticker":"EXMP","name":"Example Biologics, Inc.","categories":["oncology"],"inCuratedUniverse":true,"sec":{"cik":"0000000001","conformedName":"EXAMPLE BIOLOGICS INC","filingsUrl":"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000000001&owner=exclude&count=10"},"catalysts":[{"id":"exmp000000000001","type":"pdufa","title":"Fictional catalog label","drug":"Examplemab","indication":"Example condition","phase":"Phase 3","date":"2026-11-14","datePrecision":"day","dateStart":"2026-11-14","dateEnd":"2026-11-14","nctId":"NCT00000001","outcome":null,"confidence":null,"summary":"The FDA is due to decide by Nov 14, 2026 whether to approve Example Biologics’ Examplemab for Example condition. Approval clears it for sale in the US; a rejection usually arrives as a letter listing what has to be fixed first.","summaryBy":"template","summaryAt":null,"source":"curated","sourceUrl":"https://www.fda.gov/example","sourceClass":"regulator","verified":true,"verifiedAt":null},{"id":"exmp000000000002","type":"readout","title":"Fictional window label","drug":null,"indication":null,"phase":null,"date":"2026-11-15","datePrecision":"quarter","dateStart":"2026-10-01","dateEnd":"2026-12-31","nctId":null,"outcome":"positive","confidence":"medium","summary":"Stored research note about a fictional program.","summaryBy":"research","summaryAt":"2026-08-01T00:00:00.000Z","source":"research","sourceUrl":"https://example.test/investors","sourceClass":"company_or_other","verified":true,"verifiedAt":"2026-08-02T00:00:00.000Z"}],"catalystsTotal":2,"catalystsTruncated":false,"catalystsPage":{"limit":100,"offset":0,"total":2,"nextOffset":null},"clinicalTrials":{"records":null,"reason":"not_redistributed","snapshot":{"status":"snapshot","fetchedAt":"2026-01-15T00:00:00.000Z","ok":true,"storedStudyCount":2},"linkedNctIds":["NCT00000001"]}}],"freshness":{"responseGeneratedAt":"2026-09-29T12:00:00.000Z","sourceProcessedAt":null,"jobsEnabled":false,"hostedResearchSchedule":"off","database":"sqlite","tickerMapFetchedAt":"2026-01-15T00:00:00.000Z","fdaCalendarFetchedAt":null},"coverage":{"categories":["oncology"],"rateLimit":{"perMinute":120,"burst":40,"scope":"single_process_memory"},"cache":{"success":"public, s-maxage=300, stale-while-revalidate=900","errors":"no-store"},"secTickerMap":{"fetchedAt":"2026-01-15T00:00:00.000Z","ok":true},"fdaAdvisoryCalendar":{"redistributed":false,"fetchedAt":null,"ok":null}},"fdaAdvisoryMeetings":null,"nulls":{"sec.cik":"No CIK is stored for this company. The preview does not look one up during the request.","sec.conformedName":"Absent unless company_tickers.json has been synced into this database.","sec.filingsUrl":"Absent when cik is absent. The URL is an EDGAR search link, not a filing.","catalyst.confidence":"Null when the curated seed left confidence unset. The database loader stores high in that case; this API does not repeat that default.","catalyst.summary":"Null when no eligible admin or research note is stored and the field template cannot be built. The template is our two-sentence explanation of the published catalog fields. It is not a source body. A stored note over 400 characters, or one that contains a URL, is not eligible.","catalyst.summaryAt":"Null when summary is null, when summaryBy is template, when the sentence matches the seed file, or when no separate write time is stored. A template has no timestamp: response generation is not a source or editorial date. The seed loader stamps summary_at at startup, and the seed file has no authorship time, so that clock is not published. A research note or a later edit whose text is not the seed sentence keeps its stored time.","catalyst.summaryBy":"Null when summary is null. Otherwise admin, research, or template. template means this response generated the sentence from published fields.","catalyst.verifiedAt":"Null when no verification pass recorded a time. verified true on a curated row means the row was accepted into the seed, not that someone re-checked it on a known date.","catalyst.sourceUrl":"Null when the row has no http(s) link, or the only link is a Google News wrapper.","catalyst.sourceClass":"Null when sourceUrl is null. company_or_other is not a finding that the host is the company’s official site.","catalyst.nctId":"Null when the curated row does not name a ClinicalTrials.gov study.","catalyst.outcome":"Null when the row has no short outcome label, or the stored text is not one of the known labels.","catalyst.drug":"Null when the curated row does not name a drug.","catalyst.indication":"Null when the curated row does not name an indication.","catalyst.phase":"Null when the curated row does not name a phase.","catalyst.dateStart":"Null only when the row has no window start.","catalyst.dateEnd":"Null only when the row has no window end.","clinicalTrials.records":"Always null. Study records are not redistributed in this preview.","clinicalTrials.snapshot.fetchedAt":"Null when this database has no trials sync row for the company.","clinicalTrials.snapshot.storedStudyCount":"Null when studies were never synced here. A number is a row count, not a claim that the set is current.","clinicalTrials.linkedNctIds":"NCT ids on the catalysts in this page only. An empty array means this page has none. Other pages are not included.","fdaAdvisoryMeetings":"Always null. Advisory meetings are not matched to a company, and their titles are not copied.","freshness.sourceProcessedAt":"Always null. The seed has no single source-processing timestamp, and this response does not invent one."},"notices":["Public developer preview. No API key, no account, no paid plan, and no uptime or freshness guarantee.","The Vercel deployment serves the reviewed seed from disposable SQLite. It does not run the research schedule. Its cron checks the activity cache only.","jobsEnabled describes this process. True means a long-lived server may start jobs. It does not mean a research run succeeded or that sources are current.","ClinicalTrials.gov study text is not included. Posted terms expect current data and the date ClinicalTrials.gov processed it. This preview keeps neither.","FDA advisory-meeting titles are not included. The calendar feed does not name a sponsor in a way this app trusts.","SEC CIK is included only when this database already stores one, on the ticker map or the company row. The EDGAR conformed name comes only from the ticker map. Filing documents are not included.","summary is a stored admin or research note when one is eligible: at most 400 characters and no URL. Otherwise it is a template sentence from the published title, drug, indication, phase, date, precision, outcome, ticker, and company name. The template limit is 1600 characters and a longer sentence is omitted whole, not cut. summaryAt is null for a template. It is also null when a stored sentence matches the seed, because the loader clock is startup, not authorship. A missing confidence is null, not high.","sourceUrl points at a page. It is not permission to copy that page. Wire and secondary hosts are labeled.","Omitted on purpose: prices, market cap, returns, index weights, price reactions, congressional and other trade records, news headlines, and press-release or article bodies.","The rate limit is an in-memory bucket on one server process. Serverless isolates do not share it, so it is not a global quota."]}}}},"400":{"description":"Unknown, duplicate, or invalid parameter, or an unknown category.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"allowed":{"type":"array","items":{"type":"string"}},"minimum":{"type":"integer"},"maximum":{"type":"integer"}}},"example":{"error":"unknown_parameter","message":"Unknown parameter \"fields\".","param":"fields","allowed":["companies","category","limit","offset","catalystOffset"]}}}},"429":{"description":"In-memory per-process rate limit. Not a global quota. cache-control is no-store.","headers":{"retry-after":{"schema":{"type":"string"},"description":"Seconds to wait."}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"allowed":{"type":"array","items":{"type":"string"}},"minimum":{"type":"integer"},"maximum":{"type":"integer"}}},"example":{"error":"rate_limited","message":"Too many requests from this client. The bucket is one server process, not a shared quota."}}}},"500":{"description":"The dossier could not be built. The body is a fixed error and message. It does not include the exception, SQL, or file paths. cache-control is no-store.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"allowed":{"type":"array","items":{"type":"string"}},"minimum":{"type":"integer"},"maximum":{"type":"integer"}}},"example":{"error":"internal_error","message":"The dossier could not be built."}}}}}}}},"components":{"schemas":{"CompanyDossier":{"type":"object","additionalProperties":false,"required":["schema","preview","service","generatedAt","query","page","unmatched","companies","freshness","coverage","fdaAdvisoryMeetings","nulls","notices"],"properties":{"schema":{"const":"biotech.company-dossier.v1"},"preview":{"const":true},"service":{"const":"public-developer-preview"},"generatedAt":{"type":"string"},"query":{"type":"object","additionalProperties":false,"required":["companies","category","limit","offset","catalystOffset"],"properties":{"companies":{"type":"string"},"category":{"type":["string","null"]},"limit":{"type":"integer"},"offset":{"type":"integer"},"catalystOffset":{"type":"integer"}}},"page":{"type":"object","additionalProperties":false,"required":["limit","offset","total","returned","nextOffset"],"properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer"},"returned":{"type":"integer"},"nextOffset":{"type":["integer","null"]}}},"unmatched":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["input","reason"],"properties":{"input":{"type":"string"},"reason":{"type":"string","enum":["not_found","ambiguous","category_mismatch"]},"ticker":{"type":"string"},"name":{"type":"string"},"candidates":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["ticker","name"],"properties":{"ticker":{"type":"string"},"name":{"type":"string"}}}}}}},"companies":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["ticker","name","categories","inCuratedUniverse","sec","catalysts","catalystsTotal","catalystsTruncated","catalystsPage","clinicalTrials"],"properties":{"ticker":{"type":"string"},"name":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"inCuratedUniverse":{"type":"boolean"},"sec":{"type":"object","additionalProperties":false,"required":["cik","conformedName","filingsUrl"],"properties":{"cik":{"type":["string","null"]},"conformedName":{"type":["string","null"]},"filingsUrl":{"type":["string","null"]}}},"catalysts":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","type","title","drug","indication","phase","date","datePrecision","dateStart","dateEnd","nctId","outcome","confidence","summary","summaryBy","summaryAt","source","sourceUrl","sourceClass","verified","verifiedAt"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"title":{"type":"string"},"drug":{"type":["string","null"]},"indication":{"type":["string","null"]},"phase":{"type":["string","null"]},"date":{"type":"string"},"datePrecision":{"type":["string","null"],"enum":["day","month","quarter","half","year",null]},"dateStart":{"type":["string","null"]},"dateEnd":{"type":["string","null"]},"nctId":{"type":["string","null"]},"outcome":{"type":["string","null"],"enum":["approved","crl","positive","negative","mixed","other",null]},"confidence":{"type":["string","null"],"enum":["high","medium","low",null]},"summary":{"type":["string","null"],"description":"Stored admin or research note (at most 400 characters) or a field template (at most 1600). Null when neither is published."},"summaryBy":{"type":["string","null"],"enum":["admin","research","template",null],"description":"admin: stored editor note. research: stored research-pipeline note, including earlier AI-generated explanations. template: deterministic published-field explanation, not a model call. Null when no summary is published. API reads never trigger research or models."},"summaryAt":{"type":["string","null"],"description":"Stored write time for an admin or research note. Null for template summaries and for seed sentences."},"source":{"type":"string","enum":["curated","research"]},"sourceUrl":{"type":["string","null"]},"sourceClass":{"type":["string","null"],"enum":["regulator","wire","secondary","company_or_other",null]},"verified":{"type":"boolean"},"verifiedAt":{"type":["string","null"]}}}},"catalystsTotal":{"type":"integer","description":"Eligible catalysts for this company, before the page slice."},"catalystsTruncated":{"type":"boolean","description":"True when catalysts is not the full eligible set. Use catalystsPage.nextOffset."},"catalystsPage":{"type":"object","additionalProperties":false,"required":["limit","offset","total","nextOffset"],"properties":{"limit":{"const":100},"offset":{"type":"integer"},"total":{"type":"integer"},"nextOffset":{"type":["integer","null"]}}},"clinicalTrials":{"type":"object","additionalProperties":false,"required":["records","reason","snapshot","linkedNctIds"],"properties":{"records":{"type":"null"},"reason":{"const":"not_redistributed"},"snapshot":{"type":"object","additionalProperties":false,"required":["status","fetchedAt","ok","storedStudyCount"],"properties":{"status":{"type":"string","enum":["not_synced","snapshot","refresh_failed"]},"fetchedAt":{"type":["string","null"]},"ok":{"type":["boolean","null"]},"storedStudyCount":{"type":["integer","null"]}}},"linkedNctIds":{"type":"array","items":{"type":"string"},"description":"NCT ids on the catalysts in this page only. Other pages are omitted."}}}}}},"freshness":{"type":"object","additionalProperties":false,"required":["responseGeneratedAt","sourceProcessedAt","jobsEnabled","hostedResearchSchedule","database","tickerMapFetchedAt","fdaCalendarFetchedAt"],"properties":{"responseGeneratedAt":{"type":"string"},"sourceProcessedAt":{"type":"null"},"jobsEnabled":{"type":"boolean"},"hostedResearchSchedule":{"const":"off"},"database":{"const":"sqlite"},"tickerMapFetchedAt":{"type":["string","null"]},"fdaCalendarFetchedAt":{"type":["string","null"]}}},"coverage":{"type":"object","additionalProperties":false,"required":["categories","rateLimit","cache","secTickerMap","fdaAdvisoryCalendar"],"properties":{"categories":{"type":"array","items":{"type":"string"}},"rateLimit":{"type":"object","additionalProperties":false,"required":["perMinute","burst","scope"],"properties":{"perMinute":{"type":"integer"},"burst":{"type":"integer"},"scope":{"const":"single_process_memory"}}},"cache":{"type":"object","additionalProperties":false,"required":["success","errors"],"properties":{"success":{"type":"string"},"errors":{"const":"no-store"}}},"secTickerMap":{"type":"object","additionalProperties":false,"required":["fetchedAt","ok"],"properties":{"fetchedAt":{"type":["string","null"]},"ok":{"type":["boolean","null"]}}},"fdaAdvisoryCalendar":{"type":"object","additionalProperties":false,"required":["redistributed","fetchedAt","ok"],"properties":{"redistributed":{"const":false},"fetchedAt":{"type":["string","null"]},"ok":{"type":["boolean","null"]}}}}},"fdaAdvisoryMeetings":{"type":"null"},"nulls":{"type":"object","additionalProperties":{"type":"string"}},"notices":{"type":"array","items":{"type":"string"}}}},"Company":{"type":"object","additionalProperties":false,"required":["ticker","name","categories","inCuratedUniverse","sec","catalysts","catalystsTotal","catalystsTruncated","catalystsPage","clinicalTrials"],"properties":{"ticker":{"type":"string"},"name":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"inCuratedUniverse":{"type":"boolean"},"sec":{"type":"object","additionalProperties":false,"required":["cik","conformedName","filingsUrl"],"properties":{"cik":{"type":["string","null"]},"conformedName":{"type":["string","null"]},"filingsUrl":{"type":["string","null"]}}},"catalysts":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","type","title","drug","indication","phase","date","datePrecision","dateStart","dateEnd","nctId","outcome","confidence","summary","summaryBy","summaryAt","source","sourceUrl","sourceClass","verified","verifiedAt"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"title":{"type":"string"},"drug":{"type":["string","null"]},"indication":{"type":["string","null"]},"phase":{"type":["string","null"]},"date":{"type":"string"},"datePrecision":{"type":["string","null"],"enum":["day","month","quarter","half","year",null]},"dateStart":{"type":["string","null"]},"dateEnd":{"type":["string","null"]},"nctId":{"type":["string","null"]},"outcome":{"type":["string","null"],"enum":["approved","crl","positive","negative","mixed","other",null]},"confidence":{"type":["string","null"],"enum":["high","medium","low",null]},"summary":{"type":["string","null"],"description":"Stored admin or research note (at most 400 characters) or a field template (at most 1600). Null when neither is published."},"summaryBy":{"type":["string","null"],"enum":["admin","research","template",null],"description":"admin: stored editor note. research: stored research-pipeline note, including earlier AI-generated explanations. template: deterministic published-field explanation, not a model call. Null when no summary is published. API reads never trigger research or models."},"summaryAt":{"type":["string","null"],"description":"Stored write time for an admin or research note. Null for template summaries and for seed sentences."},"source":{"type":"string","enum":["curated","research"]},"sourceUrl":{"type":["string","null"]},"sourceClass":{"type":["string","null"],"enum":["regulator","wire","secondary","company_or_other",null]},"verified":{"type":"boolean"},"verifiedAt":{"type":["string","null"]}}}},"catalystsTotal":{"type":"integer","description":"Eligible catalysts for this company, before the page slice."},"catalystsTruncated":{"type":"boolean","description":"True when catalysts is not the full eligible set. Use catalystsPage.nextOffset."},"catalystsPage":{"type":"object","additionalProperties":false,"required":["limit","offset","total","nextOffset"],"properties":{"limit":{"const":100},"offset":{"type":"integer"},"total":{"type":"integer"},"nextOffset":{"type":["integer","null"]}}},"clinicalTrials":{"type":"object","additionalProperties":false,"required":["records","reason","snapshot","linkedNctIds"],"properties":{"records":{"type":"null"},"reason":{"const":"not_redistributed"},"snapshot":{"type":"object","additionalProperties":false,"required":["status","fetchedAt","ok","storedStudyCount"],"properties":{"status":{"type":"string","enum":["not_synced","snapshot","refresh_failed"]},"fetchedAt":{"type":["string","null"]},"ok":{"type":["boolean","null"]},"storedStudyCount":{"type":["integer","null"]}}},"linkedNctIds":{"type":"array","items":{"type":"string"},"description":"NCT ids on the catalysts in this page only. Other pages are omitted."}}}}},"Catalyst":{"type":"object","additionalProperties":false,"required":["id","type","title","drug","indication","phase","date","datePrecision","dateStart","dateEnd","nctId","outcome","confidence","summary","summaryBy","summaryAt","source","sourceUrl","sourceClass","verified","verifiedAt"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"title":{"type":"string"},"drug":{"type":["string","null"]},"indication":{"type":["string","null"]},"phase":{"type":["string","null"]},"date":{"type":"string"},"datePrecision":{"type":["string","null"],"enum":["day","month","quarter","half","year",null]},"dateStart":{"type":["string","null"]},"dateEnd":{"type":["string","null"]},"nctId":{"type":["string","null"]},"outcome":{"type":["string","null"],"enum":["approved","crl","positive","negative","mixed","other",null]},"confidence":{"type":["string","null"],"enum":["high","medium","low",null]},"summary":{"type":["string","null"],"description":"Stored admin or research note (at most 400 characters) or a field template (at most 1600). Null when neither is published."},"summaryBy":{"type":["string","null"],"enum":["admin","research","template",null],"description":"admin: stored editor note. research: stored research-pipeline note, including earlier AI-generated explanations. template: deterministic published-field explanation, not a model call. Null when no summary is published. API reads never trigger research or models."},"summaryAt":{"type":["string","null"],"description":"Stored write time for an admin or research note. Null for template summaries and for seed sentences."},"source":{"type":"string","enum":["curated","research"]},"sourceUrl":{"type":["string","null"]},"sourceClass":{"type":["string","null"],"enum":["regulator","wire","secondary","company_or_other",null]},"verified":{"type":"boolean"},"verifiedAt":{"type":["string","null"]}}}}}}