Skip to content

Commit 9e9ddaa

Browse files
waleedlatif1claude
andauthored
feat(peopledatalabs): add People Data Labs integration (#4513)
* feat(peopledatalabs): add People Data Labs integration Add 11 PDL operations: person enrich/identify/search/bulk, company enrich/search/bulk/clean, location/school cleaners, and autocomplete. All endpoints, params, and response shapes verified against official PDL docs (scroll_token pagination, top-level likelihood on company enrich, per-item likelihood on bulk company, full autocomplete field enum). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(peopledatalabs): narrow conditions for fields not used by every operation - min_likelihood now only shows for pdl_person_enrich (Person Identify ignores it) - ticker, pdl_id, company_location now only show for pdl_company_enrich (Company Cleaner only accepts name/website/profile) Addresses Greptile P1 review on PR #4513. * fix(peopledatalabs): scope param renames to their operation Param renames (company_profile→profile, company_location→location, school_*→*, bulk_*_requests→requests, autocomplete_size→size, etc.) now run only when the matching operation is selected, and stale alternate-operation values are stripped from the request. This prevents values left over from a prior operation switch from leaking into the current API call (e.g. a company LinkedIn URL overwriting a person profile, or a stale search size overwriting autocomplete size). Addresses Cursor Bugbot review on PR #4513. * fix(peopledatalabs): use currentColor for icon fill The PeopleDataLabsIcon was hardcoded to white, leaving it invisible on light backgrounds when rendered outside its bgColor container (e.g., search results, menus, docs). Switch to currentColor so it inherits the surrounding text color. Addresses Cursor Bugbot review on PR #4513. * fix(peopledatalabs): scope shared fields (profile/location/name/website) per operation The block has subBlocks whose raw IDs collide with PDL API param names (profile, location for person; name, website for company). Their values persist across operation switches even though the UI hides them, so a person LinkedIn URL could leak into a Company Enrich request, etc. Reset these shared targets and repopulate them only from inputs that belong to the active operation. Addresses Greptile P1 review on PR #4513. * fix(peopledatalabs): scope `size` to search and autocomplete operations `size` is shared by the person/company search subBlock and the autocomplete_size alias. The previous logic still forwarded a stale search `size` to operations that don't accept it (e.g. enrich, clean, identify), and the autocomplete branch only cleared it when autocomplete_size was unset. Reset `size` up front and only repopulate it for the three operations that actually accept it. Found via final integration audit of PR #4513. * fix(peopledatalabs): restore `location` for Person Identify Person Identify's tool accepts `location`, and the subBlock is shown for both Enrich and Identify, but the prior reset only repopulated `result.location` for Enrich — so any value entered on Identify was silently dropped before reaching the API. Addresses Greptile P1 review on PR #4513. * fix(peopledatalabs): align endpoints + outputs with PDL API - person_identify: short-circuit on PDL 404 (no-match), matching the person_enrich pattern - company_search: drop unsupported `dataset` param (PDL company search docs do not list it) - block: expose `min_likelihood` for `pdl_company_enrich` (PDL Company Enrichment supports min_likelihood) - location_clean: surface `subregion`; drop phantom `latitude`/ `longitude` (PDL only returns `geo` as a "lat,lon" string) - school_clean: surface `domain` and `location_continent` from the nested `location` object - docs icon: switch fill to `currentColor` so the icon renders on light backgrounds * fix(peopledatalabs): restore `name` for Person Enrich / Identify The shared `name` reset at the top of `tools.config.params` was only repopulated for the company-side operations, so any programmatic `name` input to `pdl_person_enrich` or `pdl_person_identify` was silently dropped. Both PDL endpoints accept `name` as a full-name match parameter. * fix(peopledatalabs): restore `name` for Person Enrich Add the `name` parameter to `PdlPersonEnrichParams`, the tool's params definition, and the URL builder. PDL Person Enrichment accepts `name` as a full-name match alternative to first_name + last_name; without it, programmatic `name` input was silently dropped before reaching the API. * fix(peopledatalabs): isolate company `name` UI from person ops Rename Company Name subBlock id from `name` to `company_name` so a stale company value can't leak into Person Enrich/Identify when the user switches operations. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(peopledatalabs): honor programmatic inputs for clean_location/school `pdl_clean_location` and `pdl_clean_school` were only restoring values from UI subBlock IDs (`clean_location_input`, `school_*`). Programmatic callers using the declared `location`/`name`/`website`/`profile` inputs had their values dropped after the shared-field reset. Add fallbacks so both UI and programmatic inputs flow through. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(peopledatalabs): programmatic input fallbacks + required autocomplete text - Company Enrich and Clean Company now fall back to programmatic `params.profile` / `params.location` when the UI-scoped `company_profile` / `company_location` are absent. Mirrors the fallback pattern already used for `name`. - Autocomplete `text` subBlock is now required when operation is autocomplete — PDL requires it for nearly all field values. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 57f00e2 commit 9e9ddaa

24 files changed

Lines changed: 2750 additions & 0 deletions

apps/docs/components/icons.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,24 @@ export function YouTubeIcon(props: React.SVGProps<SVGSVGElement>) {
895895
)
896896
}
897897

898+
export function PeopleDataLabsIcon(props: SVGProps<SVGSVGElement>) {
899+
return (
900+
<svg
901+
width='1em'
902+
height='1em'
903+
viewBox='0 0 99.92 90.06'
904+
xmlns='http://www.w3.org/2000/svg'
905+
{...props}
906+
>
907+
<path
908+
fill='currentColor'
909+
fillRule='evenodd'
910+
d='M99.91,57.77l-3.2-24.4c0-.7-.4-1.3-.8-1.8l-20-21.3c-.5-.5-1.1-.8-1.8-1L29.21.07c-1.1-.2-2.2,0-2.9.8L1.01,24.07c-.9.8-1.2,2-.9,3.1l6,23.4c.3,1.2,1.3,2.1,2.5,2.4l9.9,2,11.3,6.6h0l11.9,6.5,14.9,20.6c.8,1.1,2.2,1.6,3.5,1.3l8.1-1.9c1.4-.3,2.5-1.6,2.5-3l.3-6.8,27.4-17.4c1.1-.7,1.6-1.9,1.5-3.1ZM90.31,35.17l2.1,16.3-40.2-26.8,20.4-8.4,17.7,18.8v.1ZM31.11,7.17l31.2,6.3-18.4,7.5h0l-16.8,7.3s4-21.1,4-21.1ZM12.01,47.07l-5-19.6,16.5-15.1-3.9,20.7c-.3,1.4.4,2.7,1.6,3.4l30.1,16.6-31-4.4-8.3-1.7v.1ZM60.81,83.17l-14-19.4c-.3-.4-.7-.7-1.1-1l-9.8-5.4,29,4.1-.4,14.7-.2,6-3.5.8v.2ZM83.01,62.97l-11.7,7.4.3-11.5c0-1.2-.6-2.3-1.7-2.9l-39.8-21.9,14.8-6.4,45.7,30.4-7.7,4.9h.1Z'
911+
/>
912+
</svg>
913+
)
914+
}
915+
898916
export function PerplexityIcon(props: SVGProps<SVGSVGElement>) {
899917
return (
900918
<svg width='1em' height='1em' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' {...props}>

apps/docs/components/ui/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ import {
135135
PackageSearchIcon,
136136
PagerDutyIcon,
137137
ParallelIcon,
138+
PeopleDataLabsIcon,
138139
PerplexityIcon,
139140
PineconeIcon,
140141
PipedriveIcon,
@@ -351,6 +352,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
351352
outlook: OutlookIcon,
352353
pagerduty: PagerDutyIcon,
353354
parallel_ai: ParallelIcon,
355+
peopledatalabs: PeopleDataLabsIcon,
354356
perplexity: PerplexityIcon,
355357
pinecone: PineconeIcon,
356358
pipedrive: PipedriveIcon,

apps/docs/content/docs/en/tools/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
"outlook",
132132
"pagerduty",
133133
"parallel_ai",
134+
"peopledatalabs",
134135
"perplexity",
135136
"pinecone",
136137
"pipedrive",
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
---
2+
title: People Data Labs
3+
description: Enrich and search people and companies
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="peopledatalabs"
10+
color="#4831C3"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
## Description
15+
16+
[People Data Labs](https://www.peopledatalabs.com/) is a person and company data provider with a global dataset of 3B+ person profiles and 25M+ company records. The Sim block exposes the core REST endpoints so agents can enrich a single contact, look up a company, or run dataset-wide search queries.
17+
18+
Use this block to:
19+
- **Person Enrich** — resolve a single person by email, phone, LinkedIn URL, or name + company/location, and pull back their work history, contact info, and skills.
20+
- **Person Search** — run SQL or Elasticsearch DSL queries against the person dataset to build prospect lists or audience segments.
21+
- **Company Enrich** — resolve a single company by name, website, ticker, LinkedIn URL, or PDL ID, and pull back firmographics.
22+
- **Company Search** — query the company dataset with SQL or Elasticsearch DSL.
23+
- **Autocomplete** — get suggested values for fields like `title`, `skill`, `industry`, or `location` to build well-formed search queries.
24+
25+
Authentication uses an API key passed as the `X-Api-Key` header. Get a key from the [PDL dashboard](https://dashboard.peopledatalabs.com/).
26+
{/* MANUAL-CONTENT-END */}
27+
28+
29+
## Usage Instructions
30+
31+
Enrich a single person or company with People Data Labs, or search the global person and company datasets with SQL or Elasticsearch DSL. Useful for sales enrichment, contact lookup, and CRM hygiene.
32+
33+
34+
35+
## Tools
36+
37+
### `pdl_person_enrich`
38+
39+
40+
### `pdl_person_identify`
41+
42+
43+
### `pdl_person_search`
44+
45+
46+
### `pdl_bulk_person_enrich`
47+
48+
49+
### `pdl_company_enrich`
50+
51+
52+
### `pdl_company_search`
53+
54+
55+
### `pdl_bulk_company_enrich`
56+
57+
58+
### `pdl_clean_company`
59+
60+
61+
### `pdl_clean_location`
62+
63+
64+
### `pdl_clean_school`
65+
66+
67+
### `pdl_autocomplete`
68+
69+
70+

apps/sim/app/(landing)/integrations/data/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ import {
135135
PackageSearchIcon,
136136
PagerDutyIcon,
137137
ParallelIcon,
138+
PeopleDataLabsIcon,
138139
PerplexityIcon,
139140
PineconeIcon,
140141
PipedriveIcon,
@@ -335,6 +336,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
335336
outlook: OutlookIcon,
336337
pagerduty: PagerDutyIcon,
337338
parallel_ai: ParallelIcon,
339+
peopledatalabs: PeopleDataLabsIcon,
338340
perplexity: PerplexityIcon,
339341
pinecone: PineconeIcon,
340342
pipedrive: PipedriveIcon,

apps/sim/app/(landing)/integrations/data/integrations.json

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9715,6 +9715,69 @@
97159715
"integrationTypes": ["search", "ai"],
97169716
"tags": ["web-scraping", "llm", "agentic"]
97179717
},
9718+
{
9719+
"type": "peopledatalabs",
9720+
"slug": "people-data-labs",
9721+
"name": "People Data Labs",
9722+
"description": "Enrich and search people and companies",
9723+
"longDescription": "Enrich a single person or company with People Data Labs, or search the global person and company datasets with SQL or Elasticsearch DSL. Useful for sales enrichment, contact lookup, and CRM hygiene.",
9724+
"bgColor": "#4831C3",
9725+
"iconName": "PeopleDataLabsIcon",
9726+
"docsUrl": "https://docs.sim.ai/tools/peopledatalabs",
9727+
"operations": [
9728+
{
9729+
"name": "Person Enrich",
9730+
"description": "Enrich a single person profile using People Data Labs. Match by email, phone, LinkedIn URL, or name + company/location. Returns work history, contact details, location, and skills."
9731+
},
9732+
{
9733+
"name": "Person Identify",
9734+
"description": "Return up to 20 candidate person matches with confidence scores. Useful when you want to see all plausible matches rather than the single best one. Reference: https://docs.peopledatalabs.com/docs/identify-api-quickstart"
9735+
},
9736+
{
9737+
"name": "Person Search",
9738+
"description": "Search the People Data Labs person dataset using SQL or Elasticsearch DSL. Returns up to 100 matching records per call."
9739+
},
9740+
{
9741+
"name": "Bulk Person Enrich",
9742+
"description": "Enrich up to 100 person records in a single call. Provide a JSON array of request objects, each with a `params` object (and optional `metadata` echoed back). Reference: https://docs.peopledatalabs.com/docs/bulk-person-enrichment-api"
9743+
},
9744+
{
9745+
"name": "Company Enrich",
9746+
"description": "Enrich a single company using People Data Labs. Match by name, website, LinkedIn URL, ticker, or PDL ID."
9747+
},
9748+
{
9749+
"name": "Company Search",
9750+
"description": "Search the People Data Labs company dataset using SQL or Elasticsearch DSL. Returns up to 100 matching companies per call."
9751+
},
9752+
{
9753+
"name": "Bulk Company Enrich",
9754+
"description": "Enrich up to 100 companies in a single call. Provide a JSON array of request objects, each with a `params` object. Reference: https://docs.peopledatalabs.com/docs/bulk-company-enrichment-api"
9755+
},
9756+
{
9757+
"name": "Company Cleaner",
9758+
"description": "Normalize a company string into a canonical company record. Provide at least one of name, website, or profile (LinkedIn URL)."
9759+
},
9760+
{
9761+
"name": "Location Cleaner",
9762+
"description": "Normalize a freeform location string into a structured locality/region/country record with coordinates."
9763+
},
9764+
{
9765+
"name": "School Cleaner",
9766+
"description": "Normalize a school string into a canonical school record. Provide at least one of name, website, or profile (LinkedIn URL)."
9767+
},
9768+
{
9769+
"name": "Autocomplete",
9770+
"description": "Get autocomplete suggestions for a PDL field (title, skill, company, industry, location, school, major, role, sub_role)."
9771+
}
9772+
],
9773+
"operationCount": 11,
9774+
"triggers": [],
9775+
"triggerCount": 0,
9776+
"authType": "api-key",
9777+
"category": "tools",
9778+
"integrationTypes": ["sales"],
9779+
"tags": ["enrichment"]
9780+
},
97189781
{
97199782
"type": "perplexity",
97209783
"slug": "perplexity",

0 commit comments

Comments
 (0)