Endpoints
GET /v1/delivery/eventsGET /v1/delivery/events/export
/v1/delivery/events namespace for delivery history so it does not collide with SEC event APIs such as enforcement, auditor-change, and voting-result routes.
Filtered event inspection
kindtyperequestIdsincelimit
Export JSON
Export NDJSON
CLI
Job-completion webhooks (no polling)
Async jobs announce their terminal state as webhook events, so you no longer have to poll:intelligence.query.completed/intelligence.query.failed— an async/v1/intelligence/queryjob finished.export.completed/export.failed— an async bulk export finished and a signed download URL is available.
subscribedEventTypes (see webhook-stream-workflows). Sample export.completed payload:
Verifying webhook signatures
Outbound webhooks are signed exactly like Stripe: an HMAC-SHA256 over${timestamp}.${rawBody} using your endpoint’s signing secret, delivered in the signature header. Recompute the HMAC over the raw request body and compare in constant time before trusting a payload.
Bulk export → signed URL
For datasets too large to inline in a tool result, materialize them once to a short-lived signed download URL.- MCP tool
exports.create— e.g.{ "dataset": "company_overview", "tickers": ["AAPL","MSFT",…], "format": "csv", "idempotency_key": "portfolio-A" }returns anexport_jobwith thedownloadUrl(valid ~15 min) directly in the response, and also emitsexport.completed(for webhook subscribers / audit). Reusing the sameidempotency_keyreturns the same file instead of regenerating. Bills per entity, likecompanies.overview. - MCP tool
exports.get— re-sign the URL later with{ "jobId": "exp_…", "format": "csv" }. Returns not-found for an unknown or expired job.
Operational notes
- exports are tenant-scoped
- request correlation is driven by
Request-Id - support should prefer exports over direct database access for tenant-scoped delivery history
- stream polling uses per-subscription delivery records, so re-reading the same cursor window does not create new billable delivery units
- when Postgres is configured and the durable ledger cannot be read, the API returns
delivery_ledger_unavailablewith HTTP 503 rather than returning an empty history

