Skip to navigation

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.

  1. Refreshed profiles — profiles that completed with a matched contact. Skipped when there is nothing to report.
  2. Not-found profiles — profiles that ended not_found without a matched contact (contact_data carries 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 in custom_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 payload of this webhook request is a list of objects.
custom_columnsmap from strings to anyOptional
The profile object you submitted, echoed back verbatim.
contact_dataobjectOptional

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.

Response

200
Any 2xx status acknowledges receipt.