Read the graph, citations included.
Everything the public surfaces render is available as JSON over the same routes they read from. No key, no versioning surprises: one version prefix, camelCase throughout, and provenance on anything derived from a filing.
Try it
curl -s localhost:3000/api/v1/health curl -s 'localhost:3000/api/v1/situations?status=live' curl -s 'localhost:3000/api/v1/tender-offers?price=41.80' curl -s 'localhost:3000/api/v1/companies?exchange=NYSE'
Every response carries its provenance
Anything derived from a filing goes out with the accession, the exact document URL, the sentence it was read from, how it was extracted and how confident that extraction is. A figure nobody can trace back to a document is a rumour with a decimal point.
Confidence is not decoration
Structured XML fields — Forms 3/4/5, newer Schedule 13D/G — are read at high confidence. Tender-offer terms live in prose and are extracted heuristically, at a confidence that says so. Treat anything below 0.6 as a prompt to open the filing, not as a fact.
Prices come from you
EDGAR publishes no quotes. Spreads are computed against a price passed in the request, and the annualised figure additionally assumes the deal closes on the stated date and pays in full. Both assumptions fail regularly and both are printed beside the number.
The SEC’s limits are the client’s problem
Automated access to EDGAR is capped at ten requests a second and requires a User-Agent carrying a real contact address. The ingester runs below that ceiling, archives the exact bytes it was served, and re-parses from that archive rather than re-fetching — so a parser fix costs the SEC nothing.
Situations
A situation is the unit of work: one deal, campaign or voluntary action, with the filings that built it, the terms as of the most recent one, and every change between them.
/api/v1/situationsLive mergers, tender and exchange offers, going-private deals, spin-offs, buybacks and activist campaigns.
- kind
- tender_offer · merger · exchange_offer · going_private · spinoff · buyback · activist_campaign
- status
- live (default) · pending_close · completed · terminated · any
- entity
- ticker, CIK or internal id
- expiringBefore
- ISO date
/api/v1/situations?kind=tender_offer&status=live
/api/v1/situations/{uid}One situation in full — conditions, deadlines, the whole filing chain, the change log and every citation.
/api/v1/situations/tender%3A0001900001%3Ameridian
/api/v1/tender-offersTender and exchange offers with economics. Pass a market price and the gross and annualised spread are computed against it — never against an invented quote.
- price
- the market price to price the spread against; EDGAR publishes none
- expiringBefore
- ISO date
/api/v1/tender-offers?price=41.80
/api/v1/calendarEvery live deadline in date order, each naming the filing it was read from.
- days
- window, 1–365, default 45
/api/v1/calendar?days=45
Events and filings
The normalised timeline, and the documents underneath it.
/api/v1/eventsThe unified timeline — material events, insider transactions, ownership crossings and situation stages.
- kind
- material_event · insider_transaction · ownership_stake · situation_event · periodic_report
- entity
- ticker, CIK or internal id
- materiality
- high · normal · low
- since / until
- ISO dates
/api/v1/events?materiality=high&limit=25
/api/v1/filingsDiscovered filings, filterable by form, family and date.
- form
- exact form type, e.g. SC TO-T
- group
- family: TENDER · 13D/G · OWNERSHIP · 8-K · PERIODIC
/api/v1/filings?group=TENDER
/api/v1/filings/{accession}One filing, its documents, the events parsed from it, and optionally its extracted text.
- text
- true to include the plain text, capped at 200,000 characters
/api/v1/filings/0001140361-26-033928
Ownership
Who owns what, who is buying, and who has said what they intend to do about it.
/api/v1/insidersForms 3, 4 and 5. Open-market purchases and sales only by default — grants, exercises and tax withholding are most of the volume and almost never the question.
- issuer / owner
- ticker, CIK or internal id
- openMarketOnly
- false to include every transaction code
- minValue
- minimum transaction value in dollars
/api/v1/insiders?openMarketOnly=true&minValue=1000000
/api/v1/activistsSchedule 13D and 13G positions, with the Item 4 intent flag.
- activist
- true for 13Ds stating an intent to engage
- schedule
- 13D · 13G
- minPercent
- minimum percentage of class
/api/v1/activists?activist=true
Entities
The graph node everything else hangs off. Around eight thousand companies are loaded before a single filing is parsed, so search and the directory work on a first run.
/api/v1/searchTicker match first, then name prefix, then contains.
- q
- required
/api/v1/search?q=AAPL
/api/v1/companiesThe directory: every listing, filterable by exchange and first letter, with filing and event counts.
- q
- ticker, name or CIK
- exchange
- Nasdaq · NYSE · OTC · CBOE · Unlisted
- letter
- a–z, or # for names starting with a digit
- withFilings
- true to show only filers with filings ingested
/api/v1/companies?exchange=NYSE&letter=a
/api/v1/companies/{id}One company: identity, live situations, timeline, recent filings, insiders and ownership.
/api/v1/companies/AAPL
/api/v1/companies/{id}/timelineEverything that happened to one company, grouped by day.
/api/v1/companies/AAPL/timeline
/api/v1/companies/{id}/insidersInsider activity with a ninety-day open-market net.
/api/v1/companies/AAPL/insiders
Watches
Following a deal is the hinge of the whole funnel, so it is modelled server-side from the start — and then deliberately switched off. Ownership here is an opaque key the caller supplies, which is a place to put a watch rather than an identity: anyone holding a key can read or delete that owner’s watches. Every route below therefore answers 503 until sign-in exists. The shape is documented because it is what sign-in will be bolted to, not because it is callable today.
/api/v1/watchesWatch a situation, company or query, with the conditions that should raise an alert.
- x-owner-key
- header — the opaque owner key
- targetKind
- situation · entity · security · query
- target
- a situation uid, a ticker, a CIK, or a query string
- conditions
- free-form JSON: the agent’s job description
POST /api/v1/watches {"targetKind":"situation","target":"tender:0001900001:meridian"}/api/v1/watchesList the watches for an owner key.
/api/v1/watches
/api/v1/watches?id=Deactivate a watch.
/api/v1/watches?id=1
Operations
Is the graph there, and how much of it.
/api/v1/healthRow counts per table, or the commands to build the graph if it does not exist yet.
/api/v1/health
The event shape this API already returns is the draft. The intention is to publish it as an open schema with SDKs, validation tooling and evaluation datasets, so brokers, custodians, agents, funds and AI systems can describe a securities event the same way. What stays closed is the normalised database behind it, the workflow history, the custodian mappings and the decision and reconciliation data — none of which is in any public source.
If other systems start describing a securities event with these identifiers, that is worth considerably more than any amount of traffic — which is the argument for opening the schema and keeping the graph.
Derived from public SEC EDGAR filings. Extraction from prose is heuristic and carries a confidence; every figure links to the document it was read from. Not investment, legal or tax advice.