Getting Started

API Overview

👋 Welcome to DeepEnrich API Documentation

API Documentation

What is DeepEnrich?

Unlike traditional data providers, we aggregate information from 15+ reliable sources to deliver the highest enrichment rate in the market.DeepEnrich ensures you never lose a potential lead by providing accurate emails and phone numbers for your B2B contacts. Plus, we prioritize compliance—DeepEnrich is fully GDPR and CCPA compliant, as we do not maintain a contact database. Experience seamless contact discovery with the industry’s most reliable API.

  • Get Started with DeepEnrich Sign up for a DeepEnrich account and try the API for free today!

How the API Works

For API users there are two interaction models, and the difference between them is the most important thing to understand up front.

Synchronous

POST /search and GET /enrich answer immediately from stored data. They never trigger enrichment and never consume credits.

Asynchronous

GET /details, POST /enrich and POST /bulk do not return data. They validate the request and return an enrichment id with status pending. You retrieve the result either by polling GET /enrich?id= or by supplying a webhookUrl.

  • This applies to single-profile requests too. POST /enrich takes one profile and is still asynchronous — it never returns data inline.
Charge on Delivery

Credits are checked when a request is submitted and deducted only when data is actually handed over. A profile that yields nothing costs nothing.

API Works

The Endpoints

All enrichment paths are relative to the API base:

https://app.deepenrich.com/api/v1/contact
  • POST /search
    Find profiles and see what data exists for them.
  • GET /details
    Retrieve full profile or company details. No email, no phone number.
  • POST /enrich
    Reveal email and/or mobile for one profile.
  • POST /bulk
    Reveal email and/or mobile for up to 10 profiles.
  • GET /enrich
    Poll an asynchronous request for its result.

Two account endpoints sit outside the enrichment base path:

  • GET /v1/account/profile/credit
    Retrieve your current credit balance.
  • GET /v1/account/profile/verify
    Validate an API key.

A Complete Integration

Step 1 — discover, and see what exists. Free, so start here.

POST /v1/contact/search
{ "params": { "title": "Chief Information Officer", "companyName": "Deepenrich" } }

→ data[0].contactId      = "715b96ed..."
  data[0].has_experience = true   ← /details would return experience
  data[0].has_education  = true   ← so the /details call will be billable

Step 2 — request only what is worth paying for.

POST /v1/contact/enrich
{ "params": {
    "profile": { "linkedinUrl": "linkedin.com/in/qwerty",
                 "enrichFields": { "email": true } },
    "custom": { "crmId": "A-1024" } } }

→ { "id": "8f10c2aa-...", "status": "pending" }

Step 3 — collect the result. Supplying a webhookUrl in step 2 replaces this step with a single inbound POST carrying the same body.

GET /v1/contact/enrich?id=8f10c2aa-...

→ { "status": "pending" }                        ... keep polling

→ { "status": "completed",
    "custom": { "crmId": "A-1024" },
    "data": [ { "linkedinUrl": "linkedin.com/in/qwerty",
                "status": "completed",
                "email": [ { "type": "work", "value": "..." } ] } ] }
Five Rules Worth Following
  • Branch on status, never on whether data exists.
  • Treat every field in a /details payload as optional; absent data means an absent key.
  • Read row-level status before reading values; a not_found row has no other keys.
  • Use custom for correlation rather than tracking request ids separately.
  • Check profile.invalid on every /bulk submission, and poll to reconcile even when using webhooks; an interrupted request sends none.

Getting Started

Ready to use the API? Here’s how to begin:

Get your DeepEnrich API key here.