IntegrationsUpdated 2026-07-17

Dashboard Webhooks: Get Notified When Jobs Finish

Set an account-level completion webhook, understand the payload, verify signatures, and test deliveries.

The default account webhook sends an HTTP POST to a URL you choose the moment any bulk trace job finishes — including jobs you start from the dashboard, not just API jobs. Instead of refreshing the jobs page or polling the API, your CRM, automation tool, or server gets the result pushed to it, complete with a signed download link.

Setting it up

  1. Go to Dashboard → Webhooks.
  2. Paste your endpoint into the Webhook URL field and click Save. The URL must be https — plain http, localhost, and raw IP addresses are rejected.
  3. Use the On/Off toggle to enable or pause deliveries without deleting the URL.
  4. Click Send test payload to fire a sample delivery at your endpoint and confirm it arrives.

Saving the webhook also generates a signing secret, shown on the same page — you will use it below to verify that deliveries really came from us.

The payload

Deliveries are a single flat JSON object — every field is top-level and scalar, so no-code tools can map fields without any transformation:

FieldDescription
eventjob.completed or job.failed
job_idThe job's unique ID.
statusFinal job status.
filenameThe name of the uploaded list.
total_rowsRows in the job.
matched_rowsRows that returned contact data.
credits_chargedCredits deducted for the job.
download_urlSigned link to the results CSV, valid for 24 hours.
results_urlAPI endpoint for fetching result rows as JSON (requires an API key).
completed_atISO timestamp of completion.
error_messagenull on success; set on job.failed.

Failed jobs send the same shape with event set to job.failed and error_message populated. Deliveries also carry an X-AcquiredData-Event header with the event name, so you can route without parsing the body.

Verifying the signature

Every delivery includes an X-AcquiredData-Signature header of the form sha256=<hmac> — an HMAC-SHA256 of the raw request body, keyed with your webhook signing secret. Verify it before trusting the payload:

verify-signature.js
const crypto = require("node:crypto");

// rawBody: the exact request body string, before any JSON parsing
// signature: the X-AcquiredData-Signature header, e.g. "sha256=ab12…"
// secret: your webhook signing secret from Dashboard -> Webhooks
function isValidSignature(rawBody, signature, secret) {
  const expected =
    "sha256=" +
    crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  return (
    signature.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
  );
}

Compute the HMAC over the raw body bytes, not a re-serialized version of the parsed JSON — re-serializing can change key order or whitespace and break the comparison.

Delivery behavior

  • Up to 3 attempts per event, with backoff between attempts.
  • Each attempt times out after 10 seconds — respond with a 2xx quickly and do heavy processing asynchronously.
  • Delivery is best-effort: an unreachable endpoint never affects the job itself, and your results are always available in the dashboard and via the API regardless.

Related setups

  • GoHighLevel users: point the webhook at a GHL Inbound Webhook trigger — full walkthrough in the GoHighLevel guide.
  • API users can also set a per-job callback_url when submitting a job, which takes precedence over the account default for that job and is signed differently — see the API webhook reference.
  • API keys are managed on the same Dashboard → Webhooks page — see getting started with the API.

Not receiving deliveries? Check the toggle is on, send a test payload, and if needed open a support ticket with the job ID.