Skip to main content
POST
/
contacts
/
single_enrich
Enrich a single contact
curl --request POST \
  --url https://app.pipecorn.com/api/v2/contacts/single_enrich \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: <api-key>' \
  --data '
{
  "firstname": "Mathieu",
  "lastname": "Brun-Picard",
  "domain": "pipecorn.com",
  "company_name": "Pipecorn",
  "linkedin_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
  "webhook_url": "https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8",
  "enrichment_type": [
    "phone"
  ],
  "custom": {
    "hubspot_id": "4447901"
  }
}
'
import requests

url = "https://app.pipecorn.com/api/v2/contacts/single_enrich"

payload = {
"firstname": "Mathieu",
"lastname": "Brun-Picard",
"domain": "pipecorn.com",
"company_name": "Pipecorn",
"linkedin_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"webhook_url": "https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8",
"enrichment_type": ["phone"],
"custom": { "hubspot_id": "4447901" }
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstname: 'Mathieu',
lastname: 'Brun-Picard',
domain: 'pipecorn.com',
company_name: 'Pipecorn',
linkedin_url: 'https://www.linkedin.com/in/mathieu-brun-picard/',
webhook_url: 'https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8',
enrichment_type: ['phone'],
custom: {hubspot_id: '4447901'}
})
};

fetch('https://app.pipecorn.com/api/v2/contacts/single_enrich', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://app.pipecorn.com/api/v2/contacts/single_enrich",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'firstname' => 'Mathieu',
'lastname' => 'Brun-Picard',
'domain' => 'pipecorn.com',
'company_name' => 'Pipecorn',
'linkedin_url' => 'https://www.linkedin.com/in/mathieu-brun-picard/',
'webhook_url' => 'https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8',
'enrichment_type' => [
'phone'
],
'custom' => [
'hubspot_id' => '4447901'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <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"
"strings"
"net/http"
"io"
)

func main() {

url := "https://app.pipecorn.com/api/v2/contacts/single_enrich"

payload := strings.NewReader("{\n \"firstname\": \"Mathieu\",\n \"lastname\": \"Brun-Picard\",\n \"domain\": \"pipecorn.com\",\n \"company_name\": \"Pipecorn\",\n \"linkedin_url\": \"https://www.linkedin.com/in/mathieu-brun-picard/\",\n \"webhook_url\": \"https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8\",\n \"enrichment_type\": [\n \"phone\"\n ],\n \"custom\": {\n \"hubspot_id\": \"4447901\"\n }\n}")

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

req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")

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

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

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://app.pipecorn.com/api/v2/contacts/single_enrich")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"firstname\": \"Mathieu\",\n \"lastname\": \"Brun-Picard\",\n \"domain\": \"pipecorn.com\",\n \"company_name\": \"Pipecorn\",\n \"linkedin_url\": \"https://www.linkedin.com/in/mathieu-brun-picard/\",\n \"webhook_url\": \"https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8\",\n \"enrichment_type\": [\n \"phone\"\n ],\n \"custom\": {\n \"hubspot_id\": \"4447901\"\n }\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://app.pipecorn.com/api/v2/contacts/single_enrich")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstname\": \"Mathieu\",\n \"lastname\": \"Brun-Picard\",\n \"domain\": \"pipecorn.com\",\n \"company_name\": \"Pipecorn\",\n \"linkedin_url\": \"https://www.linkedin.com/in/mathieu-brun-picard/\",\n \"webhook_url\": \"https://webhook.site/8b53c96f-f2cd-4c24-bc09-b3c2176d7ea8\",\n \"enrichment_type\": [\n \"phone\"\n ],\n \"custom\": {\n \"hubspot_id\": \"4447901\"\n }\n}"

response = http.request(request)
puts response.read_body
{
  "enrichment_id": "123e4567-e89b-12d3-a456-426614174000",
  "first_name": "Mathieu",
  "last_name": "Brun-Picard",
  "status": "pending",
  "custom": {
    "hubspot_id": "4447901"
  }
}
Enqueue a single contact for waterfall enrichment. The endpoint returns immediately with an enrichment_id and status: "pending"; the waterfall runs asynchronously in the background.

When to use this endpoint

Use the async endpoint when:
  • You can accept results via webhook, or you can poll for them later.
  • You’re enriching at scale and don’t want to hold an HTTP connection per contact.
  • You want to retain the enrichment result on the contact record for later retrieval via GET /contacts/{id}.
If you need results inline (Chrome extension, interactive UI, real-time workflow), use the synchronous endpoint instead.

Enrichment Types

Pass enrichment_type as an array containing one of:
  • ["email"] — Find and validate the professional email
  • ["phone"] — Find phone numbers (requires linkedin_url)
  • ["personal_email"] — Find a personal email (requires linkedin_url and account-level consent — see below)
Requesting personal_email requires the authenticated user to have consented to personal email enrichment in their account settings. If consent is missing, the API responds with 422 Unprocessable Entity and the message "You can't use the personal email enrichment feature without consenting with our terms of use". This consent gate is required for GDPR compliance.

Required Fields

enrichment_type is always required. The other required fields depend on its value (the Body section below shows this per type):
enrichment_typeAdditional required fields
["email"]firstname, lastname, and one of linkedin_url, domain, or company_name
["phone"]linkedin_url
["personal_email"]linkedin_url
Email enrichment needs the contact’s name plus at least one identifier — a linkedin_url on its own is enough, or company context (domain or company_name). Phone and personal email enrichment run off the linkedin_url alone, so firstname/lastname are not required for them.

Receiving results

You have two options:
  1. Webhook — pass webhook_url in the request. We POST the final result to that URL once the waterfall completes.
  2. Polling — call GET /contacts/{id} with the returned enrichment_id. While the waterfall is running the status is pending; once it has completed (with or without data) the status flips to finished.

Custom Fields

Pass custom: { ... } in the request to attach arbitrary correlation data (e.g. your CRM record ID). The same payload is echoed back on GET /contacts/{id} and on the webhook callback.

Pricing

Each enrichment consumes credits based on the requested enrichment_type and the providers used. Check your account credits via the Account Credits endpoint.

Authorizations

X-API-KEY
string
header
required

Your API key

Body

application/json

Contact information for enrichment

Requires firstname, lastname, and at least one identifier: linkedin_url, domain, or company_name.

enrichment_type
enum<string>[]
required

Set to ["email"] to find and validate the professional email.

Maximum array length: 1
Available options:
email
firstname
string
required

First name of the contact.

lastname
string
required

Last name of the contact.

linkedin_url
string<uri>
required

LinkedIn profile URL of the contact.

Example:

"https://www.linkedin.com/in/mathieu-brun-picard/"

domain
string

Company domain.

Example:

"pipecorn.com"

company_name
string

Company name.

Example:

"Pipecorn"

webhook_url
string<uri>

Webhook URL to receive enrichment results

phone_country_codes
string[]

Optional. Restrict phone enrichment to phone numbers from these countries. When omitted, the user's account-level default phone country codes are applied.

ISO 3166-1 alpha-2 country code (e.g. "US", "FR", "GB")

custom
object

Custom fields to include with the enrichment that will be returned in the webhook (like crm id, etc.)

Response

Enrichment request accepted. The waterfall runs asynchronously; poll GET /contacts/{id} (using the returned enrichment_id) or wait for the webhook_url callback to retrieve final results.

enrichment_id
string<uuid>

The ID of the enrichment request. Use it to poll GET /contacts/{id}.

first_name
string

The contact's first name

last_name
string

The contact's last name

status
enum<string>

Always pending on creation; the waterfall runs asynchronously.

Available options:
pending
custom
object

Custom fields passed in the request