Home / Docs

API reference

One key. One endpoint family. Signals out.

REST over HTTPS, JSON in and out. Every response carries a request_id. Base URL: https://beforepress.com

MACHINE-READABLE: openapi.json · llms.txt · llms-full.txt

Building with an AI agent? Point it at beforepress.com/llms-full.txt — everything it needs to write your integration is in that one file.

Authentication

Pass your key on every request. Keys start with sk_live_ and are shown exactly once at issue; lost keys are reset from your account or by support.

curl https://beforepress.com/v1/signals \ -H "Authorization: Bearer sk_live_..."

GET /v1/signals

Newest first, keyset pagination. Poll with published_after for a cheap firehose, or walk pages with cursor.

ParamTypeNotes
typestringfunding | exec_change
categorystringcompany_round | fund_close | crowdfunding (funding only)
occurred_afterISO 8601event date floor
published_afterISO 8601everything published since your last poll
has_domainbooleantrue = only companies with a resolved website
limitint1–100, default 25
cursorstringfrom next_cursor of the previous page
// 200 response shape { "data": [ { "signal_id": "c380b187-...", "signal_type": "funding", "status": "active", "occurred_at": "2026-08-04T14:32:07Z", "discovered_at": "2026-08-04T14:41:12Z", "company": { "name": "Acme Robotics", "domain": "acmerobotics.com", "country": "US" }, "payload": { "category": "company_round", "amount_raised": { "amount_usd": 4400000 } }, "receipt_url": "https://beforepress.com/s/c380b187-...", "confidence": 1.0, "version": 1 } ], "next_cursor": "MjAyNi0wOC0...", "request_id": "..." }

Recipes

The filters compose. The ones people actually use:

# Only startup funding rounds (excludes funds raising their own funds) GET /v1/signals?type=funding&category=company_round # Only executive changes GET /v1/signals?type=exec_change # Only crowdfunding raises (usually include the company website) GET /v1/signals?type=funding&category=crowdfunding # Only companies with a resolved website GET /v1/signals?type=funding&category=company_round&has_domain=true # History: a date window, paged with next_cursor GET /v1/signals?occurred_after=2026-01-01T00:00:00Z&limit=100 # Live sync: poll once a minute with your last-seen published_at GET /v1/signals?published_after=2026-08-05T09:00:00Z

Rate limits & fair use

300 requests/minute per IP, 120 per API key — a once-a-minute poll uses 1. History is included in unlimited; pulling more than 50,000 unique signals in a day reads as a database export and returns 429 fair_use_exceeded (resets midnight UTC). Genuinely need a bulk export? Email us — we arrange those properly instead of pretending they're API traffic.

GET /v1/signals/:id

One signal by id. Same shape, single object in data.

GET /v1/usage

Your plan, unique signals delivered this billing period, and request count for the last 30 days. Founding and standard plans are unlimited; usage is reported, never capped.

Errors

Machine-readable codes on a stable envelope: {"error":{"code","message"},"request_id"}. Codes: unauthorized, payment_required, account_blocked, invalid_cursor, not_found, rate_limited (429; global limit 300 requests/min).

Receipts

Every signal's receipt_url is a public BeforePress verification page you can paste straight into outreach. It shows the verified facts and our attestation; sourcing method stays proprietary.

Webhooks

Push delivery for new signals, signed so you can verify every payload. Register an HTTPS endpoint and you'll receive signal.created events within about 30 seconds of publication.

curl -X POST https://beforepress.com/v1/webhooks \ -H "Authorization: Bearer sk_live_..." \ -H "content-type: application/json" \ -d '{"url":"https://your-app.com/hooks/beforepress","signal_types":["funding","exec_change"]}'

The response includes your signing secret exactly once. Each delivery carries BeforePress-Signature: t=<ts>,v1=<sig> where sig = HMAC_SHA256(secret, ts + "." + body), plus an Idempotency-Key stable across retries. Failed deliveries retry with backoff (1m, 5m, 30m, 2h, 12h); endpoints failing 20 times in a row are disabled. GET /v1/webhooks lists yours, DELETE /v1/webhooks/:id removes one. HTTPS only, public hosts only.

Get a key

$99/month. Unlimited. Locked for life.

Lock in $99 for life

First 50 customers, then $349. Month to month, cancel anytime.