Enrich collected profiles
Enrich profiles collected from a LinkedIn post with available contact and company data. The enrichment adds the data to the same list, so you can continue working with the profiles in Woodpecker.
This request starts an asynchronous enrichment job. Use the returned action_uid with get enrichment status to check its progress.
Request
Each successfully enriched profile costs 1.5 credits. Credits are charged only for profiles where enrichment finds data.
The request processes all rows in the list. It creates or reuses these output columns: Email, First name, Last name, Company, Website, Industry, Title, Tags, Address, City, State, and Country. A column is populated only when enrichment finds the corresponding data. A profile is considered successfully enriched when it returns at least one value.
Endpoint
POST https://api.woodpecker.co/rest/v2/linkedin/post_profiles_collectors/enrichment_actions/enqueue
Headers
x-api-key: {YOUR_API_KEY}
Content-Type: application/json
For details on how to authenticate your requests, please see the authentication guide.
Body
Use the UUID of a list created by collecting profiles from posts.
{
"list_uid": "5f17c0d2-5100-4bb9-a312-fd17f27f94c1"
}
Body schema
| Field | Type | Required | Description |
|---|---|---|---|
list_uid | string | Yes | UUID of the list created by the LinkedIn post profile collection flow |
Request samples
Enrich all profiles in a collected list
- cURL
- Python
- Java
- Node.js
- PHP
curl --request POST \
--url "https://api.woodpecker.co/rest/v2/linkedin/post_profiles_collectors/enrichment_actions/enqueue" \
--header "x-api-key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--data '{
"list_uid": "5f17c0d2-5100-4bb9-a312-fd17f27f94c1"
}'
import requests
def enqueue_post_profile_enrichment():
url = "https://api.woodpecker.co/rest/v2/linkedin/post_profiles_collectors/enrichment_actions/enqueue"
headers = {
"x-api-key": "{YOUR_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"list_uid": "5f17c0d2-5100-4bb9-a312-fd17f27f94c1"
}
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 202:
return response.json()
raise Exception(f"POST request failed: {response.status_code}, {response.text}")
if __name__ == "__main__":
try:
print("POST response:", enqueue_post_profile_enrichment())
except Exception as error:
print("Error:", error)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class WoodpeckerApiClient {
public static void main(String[] args) {
try {
String url = "https://api.woodpecker.co/rest/v2/linkedin/post_profiles_collectors/enrichment_actions/enqueue";
String jsonData = """
{
"list_uid": "5f17c0d2-5100-4bb9-a312-fd17f27f94c1"
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(url))
.header("x-api-key", "{YOUR_API_KEY}")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 202) {
System.out.println("POST response: " + response.body());
} else {
throw new RuntimeException(
"POST request failed: " + response.statusCode() + ", " + response.body()
);
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
const axios = require("axios");
async function enqueuePostProfileEnrichment() {
const url = "https://api.woodpecker.co/rest/v2/linkedin/post_profiles_collectors/enrichment_actions/enqueue";
const headers = {
"x-api-key": "{YOUR_API_KEY}",
"Content-Type": "application/json"
};
const data = {
list_uid: "5f17c0d2-5100-4bb9-a312-fd17f27f94c1"
};
try {
const response = await axios.post(url, data, { headers });
console.log("POST response:", response.data);
} catch (error) {
console.error(
"POST request failed:",
error.response ? error.response.status : error.message
);
}
}
enqueuePostProfileEnrichment();
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$client = new Client([
'base_uri' => 'https://api.woodpecker.co/rest/v2/',
'headers' => [
'x-api-key' => getenv('WOODPECKER_API_KEY'),
'Content-Type' => 'application/json',
],
]);
try {
$response = $client->post('linkedin/post_profiles_collectors/enrichment_actions/enqueue', [
'json' => [
'list_uid' => '5f17c0d2-5100-4bb9-a312-fd17f27f94c1',
],
]);
echo $response->getStatusCode(), "\n";
echo $response->getBody(), "\n";
} catch (RequestException $e) {
echo "Error: ", $e->getMessage(), "\n";
if ($e->hasResponse()) {
echo $e->getResponse()->getBody(), "\n";
}
}
Response
Response examples
- 202
- 400
- 401
- 404
- 422
- 500
The enrichment action was accepted for processing.
Save the returned action_uid. You will need it to check the enrichment status.
{
"action_uid": "89cb9618-945f-40f2-a147-86fd508933c2"
}
Body schema
| Field | Type | Description |
|---|---|---|
action_uid | string | Enrichment action UUID to use when checking its status |
Returned when the request body is missing, is not valid JSON, does not include list_uid, or the list doesn't contain any entries. The following example shows a missing list_uid.
{
"type": "validation_error",
"code": "invalid_fields",
"message": "Invalid field(s)",
"request_id": "3a1ada93-b420-4373-8c23-92f48a326b10",
"fields": [
{
"field": "list_uid",
"issue": "required",
"value": null
}
]
}
Body schema
| Field | Type | Description |
|---|---|---|
type | string | Error type: validation_error |
code | string | Error code: invalid_fields/bad_request |
message | string | Human-readable error summary |
request_id | string/null | Request identifier, or null when unavailable |
fields | array[object]/null | Invalid or missing request fields |
└─ field | string/null | Field with a validation issue, such as body or list_uid |
└─ issue | string/null | Validation issue: required or invalid |
└─ value | any/null | Rejected value, or null when no value was supplied |
Authentication failed. Please review the authentication guide.
{
"title": "Unauthorized",
"status": 401,
"detail": "Invalid api key",
"timestamp": "2026-08-25 10:00:00"
}
Body schema
| Field | Type | Description |
|---|---|---|
title | string | A short title describing the error |
status | integer | HTTP status code |
detail | string | Detailed message explaining the error |
timestamp | string | Timestamp when the error occurred |
Some of the required input columns, like LinkedIn Profile URL, were deleted or modified.
{
"type": "validation_error",
"code": "not_found",
"message": "Some input columns were not found",
"request_id": "3a1ada93-b420-4373-8c23-92f48a326b10"
}
Body schema
| Field | Type | Description |
|---|---|---|
type | string | Error type: validation_error |
code | string | Error code: not_found |
message | string | Human-readable error summary |
request_id | string/null | Request identifier, or null when unavailable |
Returned when the list was not created by the LinkedIn post profile collection flow, or the enrichment cannot be enqueued. If your account does not have enough credits, review your billing, add credits, and submit a new request.
{
"type": "validation_error",
"code": "target_datasheet_collector_not_found",
"message": "No LinkedIn post profiles collector was found for the target list.",
"request_id": "3a1ada93-b420-4373-8c23-92f48a326b10"
}
Body schema
| Field | Type | Description |
|---|---|---|
type | string | Error type: validation_error |
code | string | Error code: target_datasheet_collector_not_found, target_datasheet_profile_url_column_not_found, target_datasheet_enrichment_failed, or insufficient_credits |
message | string | Human-readable error summary |
request_id | string/null | Request identifier, or null when unavailable |
Unexpected server error. Try the request again later.
{
"type": "internal_error",
"code": "internal_server_error",
"message": "An unexpected error occurred on the server.",
"request_id": "3a1ada93-b420-4373-8c23-92f48a326b10"
}
Body schema
| Field | Type | Description |
|---|---|---|
type | string | Error type: internal_error |
code | string | Error code: internal_server_error |
message | string | Human-readable error summary |
request_id | string/null | Request identifier, or null when unavailable |