Two ways to take CertReports data out of the browser: the public JSON API, which returns a vendor’s dated states with sources, and webhooks, which push change events for the vendors you follow into your own systems the moment they are published. Webhooks are part of Buyer Team; the API is available on every plan with limits by plan. This note documents both, with the payload shapes, the signature scheme, the retry policy and the vocabulary you must keep intact downstream.
- 100 / day
- Free API calls per IP
- No key required
- 1,000 / day
- Buyer Pro, per key
- Create keys on the account page
- 10,000 / day
- Buyer Team, per key
- Plus webhooks
The JSON API
| Endpoint | Auth | Returns |
|---|---|---|
| GET /api/v1/vendors/{slug} | Optional x-api-key | Vendor, every framework state with date, source and evidence URL, plus the disclaimer |
| GET /api/search?q= | None | Up to 8 matching vendors with their headline states |
The vendor endpoint is the same data the vendor page renders: one row per framework with the state, the as-of date, the source and the evidence URL, and the accuracy disclaimer in every response. Keys are created on the account page and carry the plan’s daily limit; the response includes the remaining calls for the day.
Example response
{ "vendor": { "slug": "datadog", "name": "Datadog" }, "states": [ { "framework": "soc-2", "state": "vendor_stated", "as_of": "2026-09-12", "source": "trust_center", "evidence_url": "https://..." }, { "framework": "fedramp", "state": "verified_registry", "as_of": "2026-09-17", "source": "fedramp_marketplace", "evidence_url": "https://..." } ], "disclaimer": "States describe public evidence, not certification." }
Webhook deliveries
CertReports POSTs a JSON body to each active https endpoint whenever a published change event touches a vendor on your watchlist. Deliveries run with the alert digest and retry up to five times on a non-2xx response or a ten-second timeout. Each delivery has a unique id for de-duplication and a signature computed with your endpoint secret, which is shown once when the endpoint is created.
| Header | Value |
|---|---|
| x-certreports-event | change_event or test |
| x-certreports-delivery | Unique delivery id; use it to de-duplicate |
| x-certreports-signature | t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" using your endpoint secret> |
| content-type | application/json |
| user-agent | CertReports-Webhooks/1.0 |
Verifying the signature
- Read the raw request body as bytes; do not re-serialise the JSON.
- Split the header on commas to get t and v1.
- Compute HMAC-SHA256 over the string "<t>.<raw body>" with the endpoint secret.
- Compare with v1 using a constant-time comparison, and reject timestamps older than five minutes.
Node example
const [t, v1] = header.split(",").map((p) => p.split("=")[1]); const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"); const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1)) && Math.abs(Date.now() / 1000 - Number(t)) < 300;
Payload
{ "id": "…", "type": "change_event", "created_at": "…", "data": { "event_id": "…", "kind": "attestation_expired", "title": "…", "summary": "…", "occurred_at": "…", "vendor": { "slug": "…", "name": "…", "url": "https://certreports.com/vendors/…/security" }, "framework": "iso-27001", "from_state": "vendor_stated", "to_state": "expired" } }
Retry and failure policy
| Condition | Behaviour |
|---|---|
| 2xx response | Delivered; recorded with the response status |
| Non-2xx or timeout (10 s) | Retried on the next run, up to five attempts |
| Five failures | Marked failed; visible on the account page |
| Endpoint deleted | Pending deliveries are dropped |
| Test delivery | Sent immediately from the account page with type "test" |
Event kinds you will see
- attestation_added: a new public evidence row for a framework.
- attestation_renewed: a newer date or period on an existing row.
- attestation_expired: a printed expiry, usage end date or twelve-month window passed.
- attestation_removed: the source no longer shows the row.
- legal_doc_changed: DPA, BAA, subprocessor list or security.txt changed.
Keep the vocabulary intact
States use the same vocabulary as the site: verified_registry, verified_auditor, vendor_stated, third_party, expired, no_public_evidence, not_applicable. Never map no_public_evidence to "non-compliant" in your own tooling; it means nothing public was found at the last check. Keep the as_of date with every state you store, because the state is only meaningful with it.
Setting up
Buyer Team subscribers add endpoints under Webhooks on the account page, copy the secret once, and send a test delivery. The account page shows delivered and failed counts per endpoint.
People also ask
Is there an API for vendor compliance status?
Yes. GET /api/v1/vendors/{slug} returns every framework state for a vendor with its date, source and evidence URL. Free use is limited by IP; keys on paid plans raise the daily limit.
How do CertReports webhooks work?
Buyer Team subscribers register https endpoints. When a published change event touches a followed vendor, CertReports POSTs a signed JSON payload, retrying up to five times on failure.
How do I verify a webhook signature?
Recompute HMAC-SHA256 over "<timestamp>.<raw body>" with your endpoint secret, compare it to the v1 value in the x-certreports-signature header using a constant-time comparison, and reject timestamps older than five minutes.
What are the API rate limits?
100 calls a day per IP without a key, 1,000 a day per key on Buyer Pro, 10,000 a day per key on Buyer Team. The response reports remaining calls.
Can I get alerts without webhooks?
Yes. Following a vendor on any plan sends an email digest of state changes. Webhooks add machine delivery for TPRM tools, ticketing and chat.
CertReports Research · Index and methodology
Notes from the team that runs the nightly registry syncs, the snapshot pipeline and the state resolver. Every figure quoted is reproducible from the index on the date given.
Read next on CertReports
You might also like
A 30-minute vendor security review using public evidence
Solomon Amos · 30 Aug 2026 · 11 min read
The state of public compliance evidence in 2026: what 3,000 vendors actually publish
CertReports Research · 18 Sep 2026 · 12 min read
Three quarters of the Visa registry is not a PCI DSS validation
CertReports Research · 17 Sep 2026 · 10 min read