Full-text search over filing content
const url = 'https://api.stockalloy.com/api/b2b/search/filings';const options = { method: 'POST', headers: {'X-API-Key': '<X-API-Key>', 'Content-Type': 'application/json'}, body: '{"query":"supply chain constraints","ticker":"AAPL","types":["risk","mda"],"after":"3y","limit":5}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.stockalloy.com/api/b2b/search/filings \ --header 'Content-Type: application/json' \ --header 'X-API-Key: <X-API-Key>' \ --data '{ "query": "supply chain constraints", "ticker": "AAPL", "types": [ "risk", "mda" ], "after": "3y", "limit": 5 }'BM25 full-text search over chunked SEC filing content (MD&A, notes, risk factors, tables, and more). Company-scoped by default; cross-company search requires at least 2 query terms and the cross-company entitlement on your key. Single-term company-scoped queries are automatically limited to the last 3 years unless you pass after.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Stock ticker, e.g. DECK.
Zero-padded 10-digit SEC CIK, e.g. 0001011570.
Company set (search endpoints only).
Company set (search endpoints only).
Restrict to specific filing section chunk types.
YYYY-MM-DD, a relative window (1y…50y), or all for no date floor.
YYYY-MM-DD.
Expand legal-domain phrases (going concern, material weakness, covenants, …) into the query.
Default recent for company-scoped search; cross-company search always sorts by relevance.
Max 50 company-scoped, max 25 cross-company.
Also return related metric series suggestions.
Minimum section-classification confidence. Cross-company search enforces at least 0.5.
Example
{ "query": "supply chain constraints", "ticker": "AAPL", "types": [ "risk", "mda" ], "after": "3y", "limit": 5}Responses
Section titled “Responses”Ranked filing chunks with snippets and viewer links.
object
Present when include_series: true and matches exist.
object
object
Why a date floor was applied, e.g. auto_one_term_recent_3y or explicit_relative_3y.
object
BM25 score — lower is better.
Opens the filing with the matched passage highlighted.
object
Example
{ "scope": "company", "sort": "recent", "results": [ { "rank_mode": "recent", "manual_review": { "status": "verified" } } ]}Headers
Section titled “Headers”Requests allowed per minute for this key.
Requests remaining in the current minute window.
Unix timestamp (seconds) when the window resets.
Invalid request — missing/invalid fields, malformed JSON, or an unsupported scope combination.
object
Human-readable error message.
Example
{ "error": "query is required"}Missing or invalid API key.
object
Human-readable error message.
Example
{ "error": "API key required"}Key revoked/disabled/expired, account disabled, key not entitled for this product, or cross-company search not enabled for this key.
object
Human-readable error message.
Example
{ "error": "API key has expired"}Company not found (unknown ticker or CIK).
object
Human-readable error message.
Example
{ "error": "Unknown ticker: ZZZZ"}Rate limit exceeded (per-minute) or quota exceeded (daily/monthly, account-level or per-key). Distinguish by body shape.
object
Seconds until the window resets.
Requests allowed per minute for this key.
object
daily quota exceeded or monthly quota exceeded.
account sums usage across all keys on the account; api_key is a per-key cap.
Examples
Per-minute rate limit
{ "error": "Rate limit exceeded", "retryAfter": 31, "limit": 60, "windowMs": 60000}Monthly quota
{ "error": "monthly quota exceeded", "quota": "monthly", "scope": "account", "limit": 5000, "used": 5000}Headers
Section titled “Headers”Requests allowed per minute for this key.
Requests remaining in the current minute window.
Unix timestamp (seconds) when the window resets.
Seconds to wait before retrying (429 only).
Unexpected server error.
object
Human-readable error message.
Example
{ "error": "Facts lookup failed"}The verified-facts backend is temporarily unavailable. Transient — retry with backoff. This is an infrastructure condition, not a data gap.
object
Human-readable error message.
Example
{ "error": "Facts backend unavailable"}