Bulk-enrich contacts (webhook delivery)
Enrich up to 50,000 LinkedIn profiles in a single call.
Bulk enrichment runs asynchronously: this call returns immediately with a batchId, and the results arrive when the batch completes.
Data freshness — you choose with freshness:
- live (default): a fresh scrape of every profile — most current data, 0.5 credits per match. Slower; very large batches can take a while.
- cached: served from our directory cache — 0.25 credits per match (half price) and much faster (typically ~1 min). Cached profiles are never more than 8 days old.
Delivery — you choose with deliveryMode:
- webhook (default): the full enriched batch is POSTed to your webhookUrl when it finishes. Simplest for small/medium batches.
- poll: results are held for you to fetch at GET /api/v1/enrichment/contacts/bulk/{batchId} (paginated). Nothing large is pushed; if you also pass a webhookUrl, you receive a small ready-notification (not the full payload) when the batch is done.
Recommended: use deliveryMode: poll for any request over 5,000 profiles. A completed 50,000-profile batch is a 50–150 MB payload; polling lets you pull it in pages instead of receiving one very large POST (which many servers reject or time out on).
Cost: per successfully enriched profile — 0.5 credits (freshness: live) or 0.25 credits (freshness: cached). No charge for profiles that can't be matched, and the same whether you poll or use a webhook.
Request: profiles (each a LinkedIn url + optional externalId you'll get back), deliveryMode, freshness, and a webhookUrl (required for webhook, optional for poll).
Immediate response (202):
{ "success": true, "data": { "batchId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "accepted": 2, "deliveryMode": "webhook", "freshness": "live", "pollUrl": null } }
For deliveryMode: poll, pollUrl is /api/v1/enrichment/contacts/bulk/{batchId}.
Webhook payload (POSTed to your webhookUrl when the batch finishes) — person is null when a profile can't be matched, otherwise a full profile:
{
"batchId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"total": 2,
"found": 1,
"results": [
{
"externalId": "crm-123",
"url": "https://www.linkedin.com/in/marie-dupont",
"person": {
"firstName": "Marie", "lastName": "Dupont", "name": "Marie Dupont",
"linkedInUrl": "https://www.linkedin.com/in/marie-dupont",
"linkedInId": "251749025", "linkedinSalesLink": "ACoAAB1a2b3c4D",
"headline": "Head of Sales at Lemlist",
"seniority": "director", "jobFunction": "sales", "subRole": "sales_management",
"industry": "Software Development",
"activeCompany": "Lemlist", "currentCompanyId": 12345678,
"location": "Paris, Île-de-France, France", "country": "FR", "region": "eu", "geoId": 105015875,
"photoUrl": "https://media.licdn.com/dms/image/abc123",
"followers": "4200", "followerCount": 4200, "connectionsCount": 500,
"linkedinSummary": "Helping outbound teams book more meetings.",
"skillsList": "Sales, SaaS, Team Leadership",
"skillsDetail": [ { "name": "Sales", "endorsements": 42 }, { "name": "SaaS", "endorsements": 17 } ],
"languages": "French, English",
"languagesDetail": [ { "name": "French", "proficiency": "native" }, { "name": "English", "proficiency": "professional" } ],
"currentCompanyDetail": [
{
"companyName": "Lemlist", "companyId": 12345678, "jobTitle": "Head of Sales",
"startTime": "2023-01-01", "endTime": "Present",
"companyUrl": "https://www.linkedin.com/company/lemlist",
"companyWebsite": "https://lemlist.com",
"companyIndustry": "Software Development", "companyStaffRange": "51-200",
"companyHqCity": "Paris", "companyCountryCode": "FR"
}
],
"pastCompaniesDetails": [
{ "companyName": "Acme", "jobTitle": "Account Executive", "startTime": "2020-01-01", "endTime": "2022-12-01" }
],
"formerCompaniesList": "Acme",
"education": {
"universitiesNamesList": "HEC Paris",
"educationDetails": [ { "universityName": "HEC Paris", "degree": "MBA", "fieldsOfStudy": ["Marketing"], "startedOn": { "year": "2016" }, "endedOn": { "year": "2018" } } ]
}
}
},
{ "externalId": "crm-456", "url": "https://www.linkedin.com/in/jean-martin", "person": null }
]
}
Each person returns: identity (firstName, lastName, name, linkedInUrl, linkedInId, linkedinSalesLink, photoUrl); role (headline, seniority, jobFunction, subRole, industry); location (location, country + countryName, region + regionName, geoId); reach (followers, followerCount, connectionsCount); linkedinSummary; skills (skillsList + skillsDetail with endorsement counts); languages (languages + languagesDetail with proficiency); current & past positions with tenure (yearsInRole, yearsInCompany) and company firmographics (currentCompanyDetail / pastCompaniesDetails — company industry, staff range, HQ, website, …); and education (with degrees). Any field is null when the profile doesn't have it. Best coverage comes from LinkedIn profile URLs.
Request
- Base URL: https://api.rodz.io (the document declares no server; this is the origin it was published from)
- URL: https://api.rodz.io/api/v1/enrichment/contacts/bulk
- Auth: HTTP bearer
Request body
Example request
{
"deliveryMode": "webhook",
"freshness": "live",
"profiles": [
{
"externalId": "crm-123",
"url": "https://www.linkedin.com/in/marie-dupont"
},
{
"externalId": "crm-456",
"url": "https://www.linkedin.com/in/jean-martin"
}
],
"webhookUrl": "https://your-server.com/webhooks/enrichment"
}Response
Successful Response
Example response
{
"data": {
"accepted": 2,
"batchId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"success": true
}Changes
No recorded changes to this operation across all 1 revision of this API.