Build with Ploid
Search, verify, enrich, and monitor people with one API. The stable base URL is https://api.ploid.com/v1.
Get an API key
Create a key in Workspace Settings. API access requires an active paid plan with a card on file. Need access help or a higher-volume plan? Email Manny.
Quickstart
Create a Set with a natural-language query. Ploid derives criteria, verifies candidates, and can enrich accepted people in the same workflow.
curl https://api.ploid.com/v1/sets \
-H "Authorization: Bearer $PLOID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"search": {
"query": "ML engineers at Google in San Francisco",
"count": 50
},
"enrichments": [
{ "description": "Work email", "format": "email" }
],
"webhook_url": "https://example.com/webhooks/ploid"
}'The 201 response includes the Set ID, item and event URLs, and a pricing estimate. Poll the Set, stream its events, or receive the idle event at your webhook.
curl https://api.ploid.com/v1/sets/set_123 \ -H "Authorization: Bearer $PLOID_API_KEY" curl "https://api.ploid.com/v1/sets/set_123/items?status=admitted" \ -H "Authorization: Bearer $PLOID_API_KEY"
Authentication
Send a ploid_live_… key as a Bearer token or in the x-api-key header. Secrets are shown only once and stored hashed by Ploid.
Authorization: Bearer $PLOID_API_KEY # Or x-api-key: $PLOID_API_KEY
Scopes
Give each key only the scopes its integration needs. Calling an endpoint without its required scope returns 403 insufficient_scope.
| Scope | Access |
|---|---|
people:search | Search, Sets, criteria, and monitors |
people:lookup | Lookup and identity resolution |
people:enrich | Enrichment, estimates, and Set enrichments |
linkedin:read | LinkedIn profiles, search, and posts |
batch:write | Create and read batch enrichment jobs |
webhooks:write | Create, list, and delete webhook registrations |
account:read | Credits, usage, budgets, and key revocation |
agent:chat | Stream agent chat turns |
agent:cancel | Cancel in-flight agent subagents |
Sets workflow
Use /v1/sets for production people discovery. It supports criteria verification, incremental items, enrichment columns, imports, recurring monitors, webhooks, SSE, and exports. Use /v1/search only when you need a synchronous list of up to 100 people.
Stream progress
Connect to the returned events_url. Resume after a disconnect with after_seq. Important events include set.item.created, set.item.enriched, set.search.completed, and set.idle.
curl -N "https://api.ploid.com/v1/sets/set_123/events?after_seq=-1" \ -H "Authorization: Bearer $PLOID_API_KEY"
Batch enrichment
Estimate first, then create an asynchronous job for up to 500 people. Set max_cost_usd to enforce a hard budget and webhook_url to receive batch.completed. Results can be paged while the job is still running.
curl https://api.ploid.com/v1/people/batch/enrich \
-H "Authorization: Bearer $PLOID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"people": [
{ "identifier": "https://www.linkedin.com/in/example" },
{ "identifier": "person@example.com" }
],
"fields": ["linkedin", "github", "work_email"],
"max_cost_usd": 25,
"webhook_url": "https://example.com/webhooks/ploid"
}'Endpoint reference
All routes below use https://api.ploid.com. Download the machine-readable OpenAPI 3.1 document for request and response schemas.
Sets
The primary API for discovering, verifying, enriching, monitoring, and exporting people.
- POST
/v1/setsCreate a Set.
Create a Set.
people:search - GET
/v1/setsList recent Sets.
List recent Sets.
people:search - GET
/v1/sets/:idGet status and counts.
Get status and counts.
people:search - GET
/v1/sets/:id/itemsPage admitted items.
Page admitted items.
people:search - GET
/v1/sets/:id/eventsStream progress over SSE.
Stream progress over SSE.
people:search - POST
/v1/sets/:id/searchesAppend another search.
Append another search.
people:search - POST
/v1/sets/:id/enrichmentsAdd enrichment columns.
Add enrichment columns.
people:enrich - POST
/v1/sets/:id/importsImport your own rows.
Import your own rows.
people:search - POST
/v1/sets/:id/monitorsCreate a recurring monitor.
Create a recurring monitor.
people:search - POST
/v1/sets/:id/share-linkCreate a share link.
Create a share link.
people:search - GET
/v1/sets/:id/exportExport JSON or CSV.
Export JSON or CSV.
people:search - POST
/v1/sets/:id/cancelCancel active searches.
Cancel active searches.
people:search
Search
Synchronous search and the legacy asynchronous People Sets surface.
- POST
/v1/searchRun a synchronous search.
Run a synchronous search.
people:search - POST
/v1/searchesCreate a legacy People Set.
Create a legacy People Set.
people:search - GET
/v1/searchesList People Sets.
List People Sets.
people:search - GET
/v1/searches/:idGet People Set status.
Get People Set status.
people:search - GET
/v1/searches/:id/itemsPage People Set items.
Page People Set items.
people:search - POST
/v1/searches/:id/refineRefine a People Set.
Refine a People Set.
people:search - POST
/v1/searches/:id/enrichmentsAdd enrichments.
Add enrichments.
people:enrich - POST
/v1/searches/:id/exportsExport results.
Export results.
people:search
People
Structured and natural-language search, lookup, enrichment, and asynchronous batch jobs.
- POST
/v1/people/searchSearch for people.
Search for people.
people:search - POST
/v1/people/search/criteriaStart criteria generation.
Start criteria generation.
people:search - GET
/v1/people/search/criteria/:idRead generated criteria.
Read generated criteria.
people:search - POST
/v1/people/lookupFind one person.
Find one person.
people:lookup - POST
/v1/people/resolveResolve an identity.
Resolve an identity.
people:lookup - POST
/v1/people/companySearch company people.
Search company people.
people:search - POST
/v1/people/enrichReveal requested fields.
Reveal requested fields.
people:enrich - POST
/v1/people/estimateEstimate enrichment cost.
Estimate enrichment cost.
people:enrich - POST
/v1/people/batch/enrichCreate a batch job.
Create a batch job.
batch:write - GET
/v1/people/batch/:idPoll batch status.
Poll batch status.
batch:write - GET
/v1/people/batch/:id/resultsPage batch results.
Page batch results.
batch:write
Read profiles, search people, and list recent posts without a separate account connection.
- GET
/v1/linkedin/profileFetch a profile.
Fetch a profile.
linkedin:read - POST
/v1/linkedin/searchSearch people.
Search people.
linkedin:read - GET
/v1/linkedin/postsList recent posts.
List recent posts.
linkedin:read
Webhooks and monitors
Register delivery targets and keep searches fresh on a schedule.
- POST
/v1/webhooksRegister a webhook.
Register a webhook.
webhooks:write - GET
/v1/webhooksList webhooks.
List webhooks.
webhooks:write - DELETE
/v1/webhooks/:idDelete a webhook.
Delete a webhook.
webhooks:write - POST
/v1/monitorsCreate a monitor.
Create a monitor.
people:search - GET
/v1/monitorsList monitors.
List monitors.
people:search - DELETE
/v1/monitors/:idDelete a monitor.
Delete a monitor.
people:search
Agent and account
Stream the Ploid agent and inspect the credits, usage, and budget attached to the current key.
- POST
/v1/agent/chatStream an agent turn.
Stream an agent turn.
agent:chat - POST
/v1/agent/chat/cancelCancel streamed subagents.
Cancel streamed subagents.
agent:cancel - GET
/v1/account/creditsRead credit balance.
Read credit balance.
account:read - GET
/v1/account/usageRead usage and budgets.
Read usage and budgets.
account:read - DELETE
/v1/account/keyRevoke the calling key.
Revoke the calling key.
account:read
Responses and errors
Successful JSON responses use a data object and may include meta for request IDs, warnings, pagination, usage, and cost. List endpoints use cursor-based pagination where noted.
{
"data": { "id": "set_123", "status": "running" },
"meta": { "request_id": "req_123" }
}Errors have a stable code, a readable message, and a request ID to include when contacting support.
{
"error": {
"code": "insufficient_credits",
"message": "Out of credits. Top up to continue.",
"request_id": "req_123"
}
}Common error codes
missing_api_key, invalid_api_key, paid_plan_required, insufficient_scope, insufficient_credits, daily_budget_exceeded, monthly_budget_exceeded, max_cost_exceeded, rate_limited, and queue_unavailable.
A 429 rate_limited response includes a Retry-After header. Retry idempotent requests after that delay with exponential backoff.
Pricing and limits
One credit is $0.10. Responses expose dollar amounts such as estimated_cost_usd, cost_usd, and remaining_balance_usd, so integrations do not need to convert credits. Clean not-found enrichment fields are not charged.
Search and enrichment pricing is returned with each request because the exact cost depends on the requested result count and fields. Use /v1/people/estimate before batch enrichment and set max_cost_usd on jobs.
| Plan | Requests / minute |
|---|---|
| Pay-as-you-go | 30 |
| Team | 300 |
| Enterprise | 1,000 by default; raisable |
Limits apply at the organization and key levels. Keys can also have daily and monthly budgets. Inspect the active limits and reset windows at GET /v1/account/usage.
Version policy
The /v1 response envelopes are stable. Ranking, providers, and cache strategy may evolve without a version change when field names and response semantics remain compatible.