Skip to main content
Agents: the full documentation index is at /llms.txt.
A webhook endpoint is a URL of yours that Revcenter POSTs to when a search is queued, starts, completes or fails, and when a project’s shortlist changes. Your ATS, pipeline or job runner learns that results are ready without polling and without an agent running. Events carry ids, counts and links, never profiles or contact details. Read the people through the links, with an API key, as you would any other time.

Add an endpoint

The URL must be public https://. Private, loopback and link-local addresses (cloud metadata addresses included) are refused, and redirects are never followed. A workspace has up to 10 endpoints.
Settings → Usage → Webhooks (workspace admins). Add the URL, pick the events, and copy the signing secret from the dialog: it is shown once.
Omit events (or send ["*"]) to receive every event, including types added later.

Events

links on search events: search (GET /v1/searches/{id}), records and records_csv (every person the search returned), and shortlist and shortlist_csv (the project’s live shortlist).

The envelope

Every delivery is a POST with a JSON body:
With these headers: api_version changes only when an event’s shape changes in a way you would notice. New fields can appear in data at any time; ignore the ones you don’t use.

Verify the signature

v1 is the HMAC-SHA256, keyed by the whole secret (whsec_ included), of the timestamp, a ., and the raw request body, as hex. Compute it over the bytes you received, before parsing the JSON, compare in constant time, and refuse a timestamp more than five minutes from now.

Answer quickly, and retries

Answer 2xx within 10 seconds; do slow work after answering. Anything else (another status, a timeout, a redirect, a refused connection) is a failed attempt, retried after 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours and 24 hours. After the seventh failed attempt the delivery is abandoned. A test is sent once and not retried. An endpoint with 20 abandoned deliveries in a row is turned off, with the reason on the endpoint (disabled_reason). Fix it, send a test, and turn it back on (update_webhook with enabled: true, or the switch in the app); that clears the count. list_webhook_deliveries (GET /v1/webhooks/{id}/deliveries, Settings → Usage → Webhooks) shows every delivery: its status (pending, delivered, failed with the next retry, abandoned), attempts, and the status code your endpoint answered. redeliver_webhook sends one again now.

Deduplicate on the event id

Deliveries are at least once: a retry after a timeout your endpoint did in fact process, or a redelivery you asked for, arrives with the same id (and Revcenter-Event-Id). Record the ids you have handled and skip one you have seen. A search’s completion is one event however it is reported; a search that is completed again later (a new pass on the same search) is a new event with a new id. Events can arrive out of order. Use created_at, or read the current state through links, rather than relying on the order of arrival.