Register a webhook endpoint
Open the Webhook endpoints Page from a V3 MCP host to add and manage a public HTTPS endpoint. The Page is for external buyer agents and customer systems. Hosted Adclaw uses an internal subscriber on the same event catalogue, not a public endpoint.- Enter the public HTTPS URL you control.
- Copy the signing secret when the Page displays it. It is shown once and is never returned by endpoint lists or later reads.
- Select Verify. Apostra sends a control challenge to the URL. A failed challenge keeps the endpoint pending so you can correct the receiver and retry it.
- Rotate a verified endpoint’s secret when needed. The previous key remains valid for 24 hours, so receivers can switch without dropping deliveries.
- Disable an endpoint to stop future delivery. Accounts can retain at most 25 endpoint records, including disabled records. Delete a disabled endpoint to recover capacity; deletion also retires its signing secret. You can then register that URL again as a new endpoint when you are ready to start over.
campaign.delivery.changed, will reference a
verified endpoint ID when subscriptions are available.
Do not use the older v2 X-Webhook-Signature contract for a V3 delivery. The
two formats are incompatible.
Verify a delivery
Every V3 delivery is an HTTPSPOST with these headers.
For version
v1, calculate the signature over the exact bytes below. Do not
parse or re-serialize the JSON before calculating it.
HEX_DIGEST in Apostra-Signature.
Treat a delivery as invalid when a required header occurs more than once, the
signature is not exactly the shape above, the key id is unknown, the HMAC does
not match in constant time, or the timestamp differs from your clock by more
than five minutes. Check the signature before parsing the body.
Keep the raw occurrences of each header until you verify the request. A server
adapter that flattens duplicate headers to one string cannot enforce this
requirement. The reference helper therefore accepts an array of raw values for
each required header, even when there is only one value.
Handle retries and replay
Apostra-Delivery-Id identifies one logical delivery. Its value and body stay
the same on every retry. The timestamp and signature can change because each
attempt is signed when Apostra sends it.
After signature verification, store the pair of your endpoint ID and delivery
ID in the same durable transaction that applies the event. Keep it for at least
30 days. If you receive the same pair again, return a 2xx response without
processing the event twice. A duplicate is normally a retry after Apostra did
not receive your earlier success response, not an error.
Do not use the delivery ID to order events. When order matters, follow the
event’s documented cursor or read the current resource.
Rotate a secret
The Webhook endpoints Page will show a newly created secret once. Store it before you leave the page. When you rotate it, Apostra begins signing new deliveries with the new key ID and keeps the previous key valid for exactly 24 hours. Your verifier must select the secret bykid and accept both keys for exactly
24 hours. Remove the old key after its expiry.
Never log a secret or return it from a webhook handler.
Retry and success policy
A2xx response is success. Apostra does not follow redirects. It retries
network failures, timeouts, 408, 429, and 5xx responses up to eight times
in 24 hours: the initial attempt, then approximately 1 minute, 5 minutes,
30 minutes, 2 hours, 6 hours, 12 hours, and 24 hours later. Each delay has
jitter. For 429, Apostra honours a valid Retry-After value when that still
fits inside the 24-hour window.
Other 4xx responses are final. A 410 Gone disables the endpoint immediately.
After the final failed attempt, Apostra marks the delivery as failed and exposes
it in endpoint health rather than silently dropping it.
Test vectors and helpers
The@scope3/agentic-contracts/webhooks reference TypeScript verifier and the
@scope3/agentic-contracts/webhooks/vectors language-neutral fixture ship
with the contracts package. The vectors cover a valid current key, a valid previous key during rotation,
body tampering, unknown keys, each duplicate required header, a stale timestamp,
missing or malformed required headers, an expired rotated key, and a retry with
the same delivery ID. SDKs should run these exact vectors before shipping a
verifier.
See the V3 quickstart for the API-key connection flow that
precedes endpoint registration.
First event
The first standing subscription event will becampaign.delivery.changed. It
is an invalidation, not a complete delivery report. On receipt, read the
campaign’s delivery through the V3 delivery operation before deciding what to
do. Endpoint registration is available in the Webhook endpoints Page.
Subscription setup will be documented here when it is available.