Contact Profile Refresh Request completed (webhook)
When a refresh request completes, Dealsignal POSTs the results to
the webhook URL you supplied at creation as JSON
(Content-Type: application/json, 60-second timeout). The payload is a
bare JSON array of profile objects, each
{ "custom_columns": {...}, "contact_data": {...} } — exactly the
structure returned by request_status.
A create response that reads status: completed is the final result for
every profile. POSTs for such a request can still arrive, even before the
create response (the request completed during the create call); treat
them as duplicates.
Up to two POSTs are sent, one after the other. Profiles that were already
completed in a synchronous create response, with or without a matched
contact, are normally not sent again: read them from the create response.
- Refreshed profiles — profiles that completed with a matched contact. Skipped when there is nothing to report.
- Not-found profiles — profiles that ended
not_foundwithout a matched contact (contact_datacarries only the status fields). Always sent; with nothing to report the body is empty (not[]).
The webhook does not carry every profile of every request;
request_status always returns all of them.
Correlation
The payload has no envelope: it carries neither the request’s id
nor its unique_identifier. Correlate each profile through
custom_columns, which echoes the profile object you submitted — put a
key of your own in metadata if you need one.
Delivery
Build an idempotent receiver:
- Deliveries can repeat. If a delivery fails (non-2xx, timeout,
connection error), it is sent again the next time you call
request_status— if your endpoint was down, call it to receive the results. You may also receive additional deliveries with an empty body. Deduplicate on your own key incustom_columns.metadata. - Accept an empty body. Acknowledge each POST with a 2xx status right away, and process it after responding.
- Webhook requests are not signed. Use a hard-to-guess URL (for example with a secret token in it) and act only on profiles you can match to your own records.
Payload
The enriched contact. Always carries the same fixed set of 33 keys,
whatever you sent in requested_attributes. Contact details — email,
phone, mobile_number, direct_phone, corporate_phone — are never
included here, even when requested.
Every contact-derived field is null until a contact is matched, except
current_company_and_title ({}) and previous_companies_and_titles
([]). search_status, match_status, remark, enrichment_status,
enriched_by and the two booleans are always present.