API — Enrichment

Get Enrichment Result

The single endpoint for retrieving the outcome of any asynchronous request, whichever endpoint created it.

  • Endpoint:
    GET /v1/contact/enrich?id=< enrichment_id >
  • Mode: Synchronous — it answers immediately from stored data.
  • Cost: Free, and not counted against any daily allowance, so it is safe to poll.
  • If you supplied a webhookUrl there is no need to call this endpoint for the happy path — the webhook delivers the same body. Poll to reconcile anyway, because an interrupted request sends no webhook.
Authorization

A valid API key is required in the request header.

  • Authorization: Bearer
    < your_api_key >
Query Parameters
  • id (string) [Required]
    – The request id returned by /details, /enrich or /bulk.
While the Request Is Pending
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "pending",
  "custom": { "batch": 42 },
  "profile": { "total": 3, "valid": 3, "invalid": 0 }
}

No data key is present. Branch on status, never on whether data exists.

Once the Request Is Finished
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "completed",
  "custom": { "batch": 42 },
  "data": [
    { "linkedinUrl": "linkedin.com/in/qwerty",
      "status": "completed",
      "email": [ { "type": "work", "value": "example@deepenrich.com" } ],
      "mobile": [ { "type": "personal", "value": "+1..." } ] },
    { "linkedinUrl": "linkedin.com/in/someProfile",
      "status": "completed",
      "email": [ { "type": "work", "value": "johndoe@deepenrich.com" } ] },
    { "linkedinUrl": "linkedin.com/in/qwerty-jane-roe",
      "status": "not_found" }
  ]
}
  • The profile block is gone. Submission-time counts are replaced by per-row status once the request is terminal, so the two never appear together.
  • email and mobile are arrays, present only when that field was requested and delivered.
  • Rows that yielded nothing are still returned, so you can distinguish a profile that produced no data from one that was never submitted.
Row Shapes by Originating Endpoint
  • POST /enrich, POST /bulk
    linkedinUrl, status, plus email and/or mobile arrays.
  • GET /details (person)
    contactId, linkedinUrl, status, plus the profile record's own fields.
  • GET /details (company)
    linkedinUrl, status and the organization block.
  • Any — nothing delivered
    linkedinUrl (or contactId) and status: "not_found", nothing else. Read row-level status before reading values.

When a request was made by contactId, the row is keyed by contactId rather than linkedinUrl.

Errors
  • 406 Not Acceptable
    "'id' is required" — no id query parameter.
  • 404 Not Found
    "Enrich request not found" — unknown id, or an id belonging to another account. Ids are not enumerable across accounts, so a request you do not own is reported as not found rather than forbidden.

Webhook Delivery

Supplying webhookUrl on any asynchronous request removes the need to poll.

  • Delivered once, after the whole request finishes — not once per profile.
  • The body is byte-for-byte what GET /v1/contact/enrich?id= would return at that moment, so one parser serves both integration styles.
  • Failed deliveries are retried up to 5 times, 2 seconds apart. After that the result is still retrievable by polling — nothing is lost.
  • No webhook is sent when a request ends interrupted through credit exhaustion. If you rely only on webhooks you will see silence, so reconcile with a poll.

Status Reference

Request-Level — the Top-Level status
  • pending (not terminal)
    Accepted, not yet fulfilled. No data key.
  • completed (terminal)
    Finished, and at least one profile produced data.
  • not_found (terminal)
    Finished, and no profile produced any data.
  • interrupted (terminal)
    Stopped early, Covers credit exhaustion mid-request, a missing account, a missing purchase permission, and internal failure.
Row-Level — status Inside Each data Entry
  • completed
    At least one requested field was delivered for this profile.
  • not_found
    Nothing requested could be delivered. No credit was charged.
  • A request can be completed while individual rows are not_found. That is the normal outcome for a mixed batch, not a partial failure.

 

 

 

curl --request GET \
  --url 'https://app.deepenrich.com/api/v1/contact/enrich?id=4fb3e13e-13c6-4f03-86aa-9ed2c651876e' \
  --header 'Authorization: Bearer YOUR_API_KEY'
import requests

url = "https://app.deepenrich.com/api/v1/contact/enrich?id=4fb3e13e-13c6-4f03-86aa-9ed2c651876e"

headers = {"Authorization": "Bearer YOUR_API_KEY"}

response = requests.request("GET", url, headers=headers)

print(response.text)
const options = {
  method: 'GET',
  headers: {Authorization: 'Bearer YOUR_API_KEY'}
};

fetch('https://app.deepenrich.com/api/v1/contact/enrich?id=4fb3e13e-13c6-4f03-86aa-9ed2c651876e', options)
  .then(response => response.json())
  .then(response => console.log(response))
  .catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://app.deepenrich.com/api/v1/contact/enrich?id=4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer YOUR_API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {

	url := "https://app.deepenrich.com/api/v1/contact/enrich?id=4fb3e13e-13c6-4f03-86aa-9ed2c651876e"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer YOUR_API_KEY")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://app.deepenrich.com/api/v1/contact/enrich?id=4fb3e13e-13c6-4f03-86aa-9ed2c651876e")
  .header("Authorization", "Bearer YOUR_API_KEY")
  .asString();
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "pending",
  "custom": { "batch": 42 },
  "profile": { "total": 3, "valid": 3, "invalid": 0 }
}
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "completed",
  "custom": { "batch": 42 },
  "data": [
    {
      "linkedinUrl": "linkedin.com/in/qwerty",
      "status": "completed",
      "email": [ { "type": "work", "value": "example@deepenrich.com" } ],
      "mobile": [ { "type": "personal", "value": "+1..." } ]
    },
    {
      "linkedinUrl": "linkedin.com/in/someProfile",
      "status": "completed",
      "email": [ { "type": "work", "value": "johndoe@deepenrich.com" } ]
    },
    {
      "linkedinUrl": "linkedin.com/in/qwerty-jane-roe",
      "status": "not_found"
    }
  ]
}
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "interrupted",
  "reason": "no purchase permission"
}
{
  "message": "'id' is required"
}
{
  "message": "Enrich request not found"
}
{
  "message": "User not found"
}
{
  "message": "Please provide valid api key"
}