Insights
How to Build an FDA CRL List for Biotech Research
Alphanume Team · August 20, 2026
A reproducible FDA CRL list needs one row per first public disclosure, a stable issuer and drug-program key, and the exact time the disclosure entered the market. Copying company names from news search results does not preserve those rules. It also makes follow-up filings easy to count as new letters.
The FDA Response Events dataset provides a structured starting point from US-listed company 8-K disclosures. It includes CRLs, clinical holds, Refuse-to-File letters, follow-up updates, and resolutions. Building a CRL list means filtering that wider contract, preserving the first-known date, and documenting which issuers or programs could not be classified.
Use a rule that produces one initial event
Filter event_type=crl and filing_role=initial_disclosure. The first condition excludes other FDA response types. The second prevents later updates and resolutions from inflating the event count. Keep accession_number as the unique filing key and (cik, asset_key) as the program-chain key. A ticker alone is less stable because companies rename, merge, and relist.
List column | Why keep it | Do not substitute |
|---|---|---|
filing_timestamp | Defines when the 8-K became public | A news article publication time |
cik | Stable issuer identifier | Current ticker alone |
asset_key | Normalized drug-program identifier | Unnormalized display name |
accession_number | Unique SEC filing key | Row number in an export |
event_letter_date and precision | Separates FDA action time from disclosure time | A normalized date without its precision |
filing_url | Primary-source audit trail | A summary without the underlying disclosure |
Date filters apply to disclosed_date, the EDGAR filing date. They do not apply to the extracted letter date. That makes them appropriate for reconstructing what entered the public record within a research window. For intraday event studies, use the full filing timestamp and define whether an after-close filing belongs to the same date or the next tradable session before loading returns.
Create the list through MCP
After connecting Alphanume to an MCP client, use a prompt that locks the filters and requests the evidence needed to audit the result. The tool is get_fda_response_events.
Use only Alphanume MCP tools.
Build an FDA CRL list for one date range available to my account.
1. Call get_fda_response_events with event_type="crl" and filing_role="initial_disclosure".
2. Keep disclosed_date, filing_timestamp, ticker, cik, company_name,
accession_number, drug_or_asset_name, asset_key, indication,
event_letter_date, event_letter_date_precision, severity,
resolved_flag, market_cap_at_filing, and filing_url.
3. Group duplicate checks by accession_number and by cik plus asset_key.
4. Preserve null values and report any row with non-day letter-date precision.
5. State the exact tool arguments, row count, truncation state, and access restrictions.
6. Do not predict approval or post-event returns.The MCP tool defaults to real classified events and omits the audited non-event corpus. Do not enable include_rejects for a production CRL list unless the research question is labeler audit. Every MCP data tool also has a 500-row assistant-facing cap, so use a bounded date range and inspect truncated_to_max_rows before treating the returned count as complete.
Join a classification without rewriting history
Ticker Classification can add alphanume_sector and alphanume_industry. For a biotech-focused view, join each event ticker to the current classification and retain matches such as healthcare and pharma_biotech. Keep unmatched FDA events in a separate table rather than deleting them. The classification documentation lists the accepted values.
For every distinct non-null ticker in the CRL list:
1. Call get_ticker_classification with the exact ticker.
2. Left join ticker, alphanume_sector, and alphanume_industry.
3. Keep unmatched tickers and report them separately.
4. Add classification_as_of as the retrieval date.
5. Label the classification current-state, not point-in-time.This join has an explicit limitation: ticker classification has no date dimension and represents the current mapping. It can support a current research view of historical CRLs, but it cannot prove how an issuer would have been classified on the disclosure date. The FDA row's own SIC fields remain useful contemporaneous filing metadata and should be retained beside the current mapping.
Preserve filing chains and later resolutions
An initial list answers which CRLs were disclosed, not what happened later. The response can link each initial row to a later resolution through resolution_accession_number, resolution_disclosed_date, and days_to_resolution. Those values can update months after the original filing. Save a snapshot for event-time research and refresh a separate lifecycle table with updated_since.
Do not interpret resolved_flag=0 as permanent failure. It means no linked resolution is currently present for that original row. Do not interpret a null flag as missing, either: null is used on rows that are themselves resolutions. The FDA Response Events field guide documents these row roles and linkage rules.
Audit the list before using returns
- Report filings, unique accession numbers, unique issuer-program chains, and duplicate counts separately.
- Keep null reasons, null market cap, and unstated indications visible.
- Check filing timestamps around the market close before assigning a return window.
- Treat severity rank as grading precedence, not predicted market impact.
- State that coverage depends on issuer 8-K disclosure and does not contain every private FDA communication.
Free access covers the trailing 20 trading sessions after a one-trading-session delay. Sparse FDA events can leave a valid recent query with few rows or none. Distinguish that from an authentication error, tier restriction, or over-specific filter before expanding the definition.
Export a list another researcher can rebuild
Save the raw response, exact query arguments, CRL-only table, current-classification join, unmatched-ticker table, and retrieval timestamp. Manually check five filing URLs and confirm that each row is an initial CRL disclosure. Only then attach one consistently timed outcome window. That bundle is a reproducible CRL list; a spreadsheet of headlines without filing keys and date rules is not.