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 publichttps://. Private, loopback and link-local addresses (cloud metadata addresses
included) are refused, and redirects are never followed. A workspace has up to 10 endpoints.
- App
- API
- CLI
- MCP
Settings → Usage → Webhooks (workspace admins). Add the URL, pick the events, and copy the signing secret
from the dialog: it is shown once.
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 aPOST with a JSON body:
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.
- Node
- Python
Answer quickly, and retries
Answer2xx 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 sameid (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.