Skip to main content

Index notes

Webhooks and the JSON API: get vendor state changes into your own tools

How Buyer Team webhooks are signed and retried, how to read vendor states through the public JSON API, rate limits by plan, and worked examples for verifying a delivery.

CertReports ResearchPublished 28 Aug 2026Updated 18 Sep 20269 min read

Code on a laptop screen
Photo by Ilya Pavlov on Unsplash

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

EndpointAuthReturns
GET /api/v1/vendors/{slug}Optional x-api-keyVendor, every framework state with date, source and evidence URL, plus the disclaimer
GET /api/search?q=NoneUp 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." }

Servers in a data centre
Deliveries run alongside the nightly digest, so a state change published overnight reaches your endpoint the same morning. · Photo by Taylor Vick on Unsplash

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.

HeaderValue
x-certreports-eventchange_event or test
x-certreports-deliveryUnique delivery id; use it to de-duplicate
x-certreports-signaturet=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" using your endpoint secret>
content-typeapplication/json
user-agentCertReports-Webhooks/1.0

Verifying the signature

  1. Read the raw request body as bytes; do not re-serialise the JSON.
  2. Split the header on commas to get t and v1.
  3. Compute HMAC-SHA256 over the string "<t>.<raw body>" with the endpoint secret.
  4. 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

ConditionBehaviour
2xx responseDelivered; recorded with the response status
Non-2xx or timeout (10 s)Retried on the next run, up to five attempts
Five failuresMarked failed; visible on the account page
Endpoint deletedPending deliveries are dropped
Test deliverySent 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.

APIwebhooksintegrationTPRMdevelopers
C

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