Skip to main content

Overview

Since all Enrow endpoints are asynchronous, webhooks are the recommended way to receive results. Instead of polling the GET endpoint, Enrow sends the results directly to your server the second a search completes.

How It Works

  1. You POST a search request with a webhook URL in the settings
  2. Enrow returns a search ID immediately
  3. Enrow processes the search in the background
  4. When complete, Enrow POSTs results to your webhook URL

Setup

You can set up webhooks in two ways:
  1. Per-request: Include a webhook URL in the settings object of any API call
  2. Global: Configure a default webhook from the integrations page on the dashboard
{
  "fullname": "Dwight Schrute",
  "company_domain": "dundermifflin.com",
  "settings": {
    "webhook": "https://your-app.com/webhooks/enrow"
  }
}
Your webhook URL must be a valid HTTPS endpoint that returns a 200 status code.

Webhook Events

Six types of events can trigger a webhook call:
EventDescription
single_search_finishedA single email search has finished
bulk_search_finishedA bulk email search has finished
verification_finishedA single email verification has finished
bulk_verification_finishedA bulk email verification has finished
single_phone_search_finishedA single phone search has finished
bulk_phone_search_finishedA bulk phone search has finished

Webhook Payloads

Email Finder — Single

For single searches, you receive the full result directly in the webhook notification. This removes the need to perform a GET request.
{
  "event": "single_search_finished",
  "id": "910f3e13-b2bf-442d-ab0b-4cf44dfrij84fjrt",
  "credits": {
    "cost": 1
  },
  "result": {
    "email": "dwight.schrute@dundermifflin.com",
    "qualification": "valid",
    "custom": "your_custom_data",
    "info": {
      "company_domain": "dundermifflin.com",
      "fullname": "Dwight Schrute",
      "firstname": "Dwight",
      "lastname": "Schrute"
    }
  }
}

Email Finder — Bulk

For bulk searches, you receive a notification that the batch is finished. Then call the GET /email/find/bulk endpoint with the id to retrieve results.
{
  "event": "bulk_search_finished",
  "id": "910f3e13-b2bf-442d-ab0b-4cf44dfrij84fjrt",
  "credits": {
    "cost": 2284
  }
}

Email Verifier — Single

Full result included directly — no GET request needed.
{
  "event": "verification_finished",
  "id": "910f3e13-b2bf-442d-ab0b-4cf44dfrij84fjrt",
  "email": "pam.beesly@dundermifflin.com",
  "qualification": "valid",
  "custom": "your_custom_data"
}

Email Verifier — Bulk

Notification only. Call GET /email/verify/bulk with the id to retrieve results.
{
  "event": "bulk_verification_finished",
  "id": "910f3e13-b2bf-442d-ab0b-4cf44dfrij84fjrt",
  "credits": {
    "cost": 386.25
  }
}

Phone Finder — Single

Full result included directly — no GET request needed.
{
  "event": "single_phone_search_finished",
  "id": "910f3e13-b2bf-442d-ab0b-4cf44dfrij84fjrt",
  "credits": {
    "cost": 50
  },
  "result": {
    "number": "+15705551234",
    "params": {
      "linkedin_url": "https://www.linkedin.com/in/michael-scott"
    },
    "qualification": "found"
  }
}

Phone Finder — Bulk

Notification only. Call GET /phone/bulk with the id to retrieve results.
{
  "event": "bulk_phone_search_finished",
  "id": "910f3e13-b2bf-442d-ab0b-4cf44dfrij84fjrt"
}

Single vs Bulk Behavior

TypeSingle searchesBulk searches
PayloadFull result includedNotification only (ID + credits)
GET needed?NoYes — use the GET endpoint with the id
For single searches, the webhook contains everything you need. For bulk searches, the webhook tells you the batch is done — then you fetch the results.

Best Practices

Process webhook payloads asynchronously. Return a 200 immediately, then handle the data in a background job.
Always use HTTPS endpoints. HTTP webhooks will be rejected.
In rare cases, webhooks may be delivered more than once. Use the id field to deduplicate.
Pass custom data in your requests to identify which record a webhook result belongs to:
{
  "company_domain": "dundermifflin.com",
  "first_name": "Dwight",
  "last_name": "Schrute",
  "custom": { "crm_id": "lead_001" }
}
The custom field is returned as-is in the webhook payload.

Webhooks vs Polling

WebhooksPolling (GET)
LatencyReal-timeDepends on poll interval
API calls0 (Enrow calls you)Multiple calls per search
Rate limit impactNoneConsumes quota
ComplexityRequires endpoint setupSimpler to implement
We recommend webhooks for production use. Use polling only for quick prototyping or debugging.