Setup
- Give Vort one public
https://URL on your server. Vort registers it for your partner account. - Vort sends you a webhook signing secret out of band. It is distinct from your partner API key. Keep it server-side, like the key.
- Deliveries are signed with
x-vort-signature. Verify every delivery before you parse it (see Signature verification code).
Events
Schemas: run_completed · run_failed · candidate_revealed
Envelope
Present on every event:string
required
Unique id of this event. Identical on every retry of the same event. Treat as opaque.
string
required
Event name. Ignore (but answer
2xx to) events you do not know.string (uuid)
required
The run the event belongs to.
string
required
Your
external_id for the customer, from the redeem call.string
required
Your job id.
string (date-time)
required
When the event happened at Vort.
Example delivery
Delivery rules
- Answer fast. Return
2xxas soon as the signature is verified and the event is queued; do the work asynchronously. Non-2xxresponses and timeouts (10 s) are retried by Vort with backoff: up to 8 attempts over about 8 hours (after 1 min, 2 min, 5 min, 15 min, 30 min, 1 h, 2 h, 4 h). After the last attempt the event is not sent again. - Answer at the registered URL itself. Vort never follows redirects. Any
3xx(including301,302,307,308) counts as a failed attempt and is retried like a5xx. If your endpoint moves, ask Vort to register the new URL. - Public HTTPS only. The webhook URL must be
https://on a public host. Vort does not send tolocalhost,*.localhost,*.internal, or an IP address in a private, loopback, link-local, carrier-grade NAT, multicast or reserved range (IPv4 or IPv6). Events for such a URL wait, unsent, until the URL is fixed. - Events wait at most 7 days. Webhooks for a customer are paused while that customer’s connection (or your whole partner account) is disabled, or while your webhook is not configured. They go out once it is enabled or configured again. An event still unsent 7 days after it happened is dropped. Use
GET /runs/{run_id}to catch up on anything you may have missed. - At-least-once. The same event can arrive more than once (retries). You SHOULD de-duplicate on
event_id: store the ids you have processed and skip a repeat. Do not de-duplicate on(run_id, event):candidate_revealedlegitimately repeats within a run, once per candidate. The signature carries no timestamp, soevent_idde-duplication is also your replay protection. - Webhooks are notifications, not state. On
run_completed/run_failed, fetchGET /runs/{run_id}for the authoritative candidates and notices. - Ignore unknown fields.
Signature verification code
Testing webhooks in the sandbox
Once Vort has registered your URL and secret,POST /sandbox/webhooks/test with {"event": "run_completed", "valid_signature": true} queues a test delivery of that event to your registered URL and answers 202 with its event_id.
curl
valid_signature to false to receive a delivery with a bad signature, which your handler MUST reject with 401 without processing it. Starting a run on the cert-webhook fixture queues that run’s run_completed event. Use both for certification items C-18 and C-19. See Test webhooks and Send a test webhook.