Skip to main content
Vort sends webhooks to the HTTPS URL you register with Vort. They tell your server when a run finishes or fails and when a contact is revealed, so you do not need to poll runs that no recruiter is watching. RFC 2119 keywords apply.

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

Verify first. x-vort-signature is sha256= followed by the lowercase hex HMAC-SHA256 of the raw request body bytes, keyed with your webhook secret. You MUST compute it over the raw bytes exactly as received (before any JSON parsing, re-encoding, or whitespace/Unicode normalization), compare in constant time, and reject a mismatch with 401 without processing it. Certification sends one request with a bad signature; it must be rejected.
  • Answer fast. Return 2xx as soon as the signature is verified and the event is queued; do the work asynchronously. Non-2xx responses 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 (including 301, 302, 307, 308) counts as a failed attempt and is retried like a 5xx. 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 to localhost, *.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_revealed legitimately repeats within a run, once per candidate. The signature carries no timestamp, so event_id de-duplication is also your replay protection.
  • Webhooks are notifications, not state. On run_completed / run_failed, fetch GET /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
Set 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.