API — Enrichment

Start Bulk Enrichment

Reveal email addresses and/or mobile numbers for several profiles in one request.

  • Endpoint:
    POST /v1/contact/bulk
  • Mode: Asynchronous — the call returns a request id with status pending, not the data.
  • Cost: 1–6 credits per profile, deducted only for what is actually delivered.
  • Batch size: The profiles array must be non-empty and hold at most 10 entries.
  • This is the same operation as /enrich, with one important behavioural difference: invalid entries do not fail the request. They are rejected individually and the rest of the batch proceeds.
Authorization

A valid API key is required in the request header.

  • Authorization: Bearer
    < your_api_key >
  • Content-Type:
    application/json
Request Body
  • profiles (object[]) [Required]
    Each element takes the same shape as params.profile on /enrich: a linkedinUrl plus an enrichFields object with at least one of email or mobile set to true.
  • profiles[].linkedinUrl (string) [Required]
    Mandatory on this endpoint.
    Example: linkedin.com/in/qwerty
  • profiles[].name (string) [Optional]
    A filter for better enrichment of a profile
    Example: "John Doe"
  • profiles[].industry (string) [Optional]
    A filter for better enrichment of a profile
    Example: "software"
  • profiles[].companyName (string) [Optional]
    A filter for better enrichment of a profile
    Example: "Deepenrich"
  • profiles[].companyIndustry (string) [Optional]
    A filter for better enrichment of a profile
    Example: "it services"
  • name (string) [Optional]
    Your own label for the batch, echoed back when polling.
    Example: "weekly-batch"
  • webhookUrl (string) [Optional]
    The result is delivered here on completion.
    Example: "https://your-app.example.com/hooks/deepenrich"
  • custom (object) [Optional]
    Opaque passthrough, stored and returned unchanged when polling.
    Example: { "batch": 42 }

Example Request:

{
  "params": {
    "profiles": [
      { "linkedinUrl": "linkedin.com/in/qwerty",
        "enrichFields": { "email": true, "mobile": true },
        "name": "John Doe",
        "industry": "software",
        "companyName": "Deepenrich",
        "companyIndustry": "it services" },
      { "linkedinUrl": "linkedin.com/in/qwerty-jane-roe",
        "enrichFields": { "mobile": true },
        "name": "Jane Roe",
        "companyName": "Deepenrich" },
      { "linkedinUrl": "linkedin.com/in/someProfile",
        "enrichFields": { "email": true } }
    ],
    "name": "weekly-batch",
    "webhookUrl": "https://your-app.example.com/hooks/deepenrich",
    "custom": { "batch": 42 }
  }
}
Response

200 OK – Request Accepted

  • id (string)
    – Retain it and poll GET /v1/contact/enrich?id= for the result.
  • name (string)
    – The label you supplied, echoed back.
  • status (string)
    pending until the worker fulfils the request.
  • profile (object)
    – How the submitted array was assessed: total, valid and invalid counts.

Example Response:

{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "pending",
  "profile": { "total": 3, "valid": 3, "invalid": 0 }
}

valid entries will be fulfilled; invalid ones were rejected individually and will never produce a result. Only valid entries are counted toward the credit check. This block is unique to bulk requests and, when polling, appears only while the request is still pending.

  • A partially invalid batch returns 200, not 422. Inspect profile.invalid after every submission — the count is the only signal that entries were dropped, and the per-entry rejection reasons are not currently exposed.
Retrieving the Result

Poll GET /v1/contact/enrich?id= with the returned id, or supply a webhookUrl and receive the finished result as a single inbound POST. Rows that yielded nothing are still returned with status not_found, so you can tell a profile that produced no data from one that was never submitted.

Errors
  • 422 Unprocessable
    "'profiles' is required and must be a non-empty array" — missing, not an array, or empty.
  • 422 Unprocessable
    "'profiles' can contain at most 10 requests"
  • 402 Payment Required
    "Insufficient Credits" — balance below the total cost of the valid entries.
  • 402 Payment Required
    "Api daily limit have been exhausted" — the batch size would exceed the daily allowance.

 

 

 

curl --request POST \
  --url 'https://app.deepenrich.com/api/v1/contact/bulk' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "params": {
    "profiles": [
      {
        "linkedinUrl": "linkedin.com/in/qwerty",
        "enrichFields": { "email": true, "mobile": true },
        "name": "John Doe",
        "industry": "software",
        "companyName": "Deepenrich",
        "companyIndustry": "it services"
      },
      {
        "linkedinUrl": "linkedin.com/in/qwerty-jane-roe",
        "enrichFields": { "mobile": true },
        "name": "Jane Roe",
        "companyName": "Deepenrich"
      },
      {
        "linkedinUrl": "linkedin.com/in/someProfile",
        "enrichFields": { "email": true }
      }
    ],
    "name": "weekly-batch",
    "webhookUrl": "https://your-app.example.com/hooks/deepenrich",
    "custom": { "batch": 42 }
  }
}'
import requests

url = "https://app.deepenrich.com/api/v1/contact/bulk"

payload = {
  "params": {
    "profiles": [
      {
        "linkedinUrl": "linkedin.com/in/qwerty",
        "enrichFields": { "email": True, "mobile": True },
        "name": "John Doe",
        "industry": "software",
        "companyName": "Deepenrich",
        "companyIndustry": "it services"
      },
      {
        "linkedinUrl": "linkedin.com/in/qwerty-jane-roe",
        "enrichFields": { "mobile": True },
        "name": "Jane Roe",
        "companyName": "Deepenrich"
      },
      {
        "linkedinUrl": "linkedin.com/in/someProfile",
        "enrichFields": { "email": True }
      }
    ],
    "name": "weekly-batch",
    "webhookUrl": "https://your-app.example.com/hooks/deepenrich",
    "custom": { "batch": 42 }
  }
}

headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},
  body: '{"params":{"profiles":[{"linkedinUrl":"linkedin.com/in/qwerty","enrichFields":{"email":true,"mobile":true},"name":"John Doe","industry":"software","companyName":"Deepenrich","companyIndustry":"it services"},{"linkedinUrl":"linkedin.com/in/qwerty-jane-roe","enrichFields":{"mobile":true},"name":"Jane Roe","companyName":"Deepenrich"},{"linkedinUrl":"linkedin.com/in/someProfile","enrichFields":{"email":true}}],"name":"weekly-batch","webhookUrl":"https://your-app.example.com/hooks/deepenrich","custom":{"batch":42}}}'
};

fetch('https://app.deepenrich.com/api/v1/contact/bulk', 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/bulk",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\n  \"params\": {\n    \"profiles\": [\n      {\n        \"linkedinUrl\": \"linkedin.com/in/qwerty\",\n        \"enrichFields\": { \"email\": true, \"mobile\": true },\n        \"name\": \"John Doe\",\n        \"industry\": \"software\",\n        \"companyName\": \"Deepenrich\",\n        \"companyIndustry\": \"it services\"\n      },\n      {\n        \"linkedinUrl\": \"linkedin.com/in/qwerty-jane-roe\",\n        \"enrichFields\": { \"mobile\": true },\n        \"name\": \"Jane Roe\",\n        \"companyName\": \"Deepenrich\"\n      },\n      {\n        \"linkedinUrl\": \"linkedin.com/in/someProfile\",\n        \"enrichFields\": { \"email\": true }\n      }\n    ],\n    \"name\": \"weekly-batch\",\n    \"webhookUrl\": \"https://your-app.example.com/hooks/deepenrich\",\n    \"custom\": { \"batch\": 42 }\n  }\n}",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer YOUR_API_KEY",
    "Content-Type: application/json"
  ],
]);

$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"
	"strings"
)

func main() {

	url := "https://app.deepenrich.com/api/v1/contact/bulk"

	payload := strings.NewReader("{\n  \"params\": {\n    \"profiles\": [\n      {\n        \"linkedinUrl\": \"linkedin.com/in/qwerty\",\n        \"enrichFields\": { \"email\": true, \"mobile\": true },\n        \"name\": \"John Doe\",\n        \"industry\": \"software\",\n        \"companyName\": \"Deepenrich\",\n        \"companyIndustry\": \"it services\"\n      },\n      {\n        \"linkedinUrl\": \"linkedin.com/in/qwerty-jane-roe\",\n        \"enrichFields\": { \"mobile\": true },\n        \"name\": \"Jane Roe\",\n        \"companyName\": \"Deepenrich\"\n      },\n      {\n        \"linkedinUrl\": \"linkedin.com/in/someProfile\",\n        \"enrichFields\": { \"email\": true }\n      }\n    ],\n    \"name\": \"weekly-batch\",\n    \"webhookUrl\": \"https://your-app.example.com/hooks/deepenrich\",\n    \"custom\": { \"batch\": 42 }\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer YOUR_API_KEY")
	req.Header.Add("Content-Type", "application/json")

	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.post("https://app.deepenrich.com/api/v1/contact/bulk")
  .header("Authorization", "Bearer YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("{\n  \"params\": {\n    \"profiles\": [\n      {\n        \"linkedinUrl\": \"linkedin.com/in/qwerty\",\n        \"enrichFields\": { \"email\": true, \"mobile\": true },\n        \"name\": \"John Doe\",\n        \"industry\": \"software\",\n        \"companyName\": \"Deepenrich\",\n        \"companyIndustry\": \"it services\"\n      },\n      {\n        \"linkedinUrl\": \"linkedin.com/in/qwerty-jane-roe\",\n        \"enrichFields\": { \"mobile\": true },\n        \"name\": \"Jane Roe\",\n        \"companyName\": \"Deepenrich\"\n      },\n      {\n        \"linkedinUrl\": \"linkedin.com/in/someProfile\",\n        \"enrichFields\": { \"email\": true }\n      }\n    ],\n    \"name\": \"weekly-batch\",\n    \"webhookUrl\": \"https://your-app.example.com/hooks/deepenrich\",\n    \"custom\": { \"batch\": 42 }\n  }\n}")
  .asString();
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "pending",
  "profile": { "total": 3, "valid": 3, "invalid": 0 }
}
{
  "message": "success",
  "id": "4fb3e13e-13c6-4f03-86aa-9ed2c651876e",
  "name": "weekly-batch",
  "status": "pending",
  "profile": { "total": 3, "valid": 2, "invalid": 1 }
}
{
  "message": "'profiles' is required and must be a non-empty array"
}
{
  "message": "'profiles' can contain at most 10 requests"
}
{
  "message": "Insufficient Credits"
}
{
  "message": "Api daily limit have been exhausted"
}
{
  "message": "Please provide valid api key"
}
{
  "message": "User not found"
}