Public API

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.

ScopeAccess
people:searchSearch, Sets, criteria, and monitors
people:lookupLookup and identity resolution
people:enrichEnrichment, estimates, and Set enrichments
linkedin:readLinkedIn profiles, search, and posts
batch:writeCreate and read batch enrichment jobs
webhooks:writeCreate, list, and delete webhook registrations
account:readCredits, usage, budgets, and key revocation
agent:chatStream agent chat turns
agent:cancelCancel 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.

Download OpenAPI JSON

Sets

The primary API for discovering, verifying, enriching, monitoring, and exporting people.

  • POST
    /v1/sets

    Create a Set.

    Create a Set.

    people:search
  • GET
    /v1/sets

    List recent Sets.

    List recent Sets.

    people:search
  • GET
    /v1/sets/:id

    Get status and counts.

    Get status and counts.

    people:search
  • GET
    /v1/sets/:id/items

    Page admitted items.

    Page admitted items.

    people:search
  • GET
    /v1/sets/:id/events

    Stream progress over SSE.

    Stream progress over SSE.

    people:search
  • POST
    /v1/sets/:id/searches

    Append another search.

    Append another search.

    people:search
  • POST
    /v1/sets/:id/enrichments

    Add enrichment columns.

    Add enrichment columns.

    people:enrich
  • POST
    /v1/sets/:id/imports

    Import your own rows.

    Import your own rows.

    people:search
  • POST
    /v1/sets/:id/monitors

    Create a recurring monitor.

    Create a recurring monitor.

    people:search
  • POST
    /v1/sets/:id/share-link

    Create a share link.

    Create a share link.

    people:search
  • GET
    /v1/sets/:id/export

    Export JSON or CSV.

    Export JSON or CSV.

    people:search
  • POST
    /v1/sets/:id/cancel

    Cancel active searches.

    Cancel active searches.

    people:search

Search

Synchronous search and the legacy asynchronous People Sets surface.

  • POST
    /v1/search

    Run a synchronous search.

    Run a synchronous search.

    people:search
  • POST
    /v1/searches

    Create a legacy People Set.

    Create a legacy People Set.

    people:search
  • GET
    /v1/searches

    List People Sets.

    List People Sets.

    people:search
  • GET
    /v1/searches/:id

    Get People Set status.

    Get People Set status.

    people:search
  • GET
    /v1/searches/:id/items

    Page People Set items.

    Page People Set items.

    people:search
  • POST
    /v1/searches/:id/refine

    Refine a People Set.

    Refine a People Set.

    people:search
  • POST
    /v1/searches/:id/enrichments

    Add enrichments.

    Add enrichments.

    people:enrich
  • POST
    /v1/searches/:id/exports

    Export results.

    Export results.

    people:search

People

Structured and natural-language search, lookup, enrichment, and asynchronous batch jobs.

  • POST
    /v1/people/search

    Search for people.

    Search for people.

    people:search
  • POST
    /v1/people/search/criteria

    Start criteria generation.

    Start criteria generation.

    people:search
  • GET
    /v1/people/search/criteria/:id

    Read generated criteria.

    Read generated criteria.

    people:search
  • POST
    /v1/people/lookup

    Find one person.

    Find one person.

    people:lookup
  • POST
    /v1/people/resolve

    Resolve an identity.

    Resolve an identity.

    people:lookup
  • POST
    /v1/people/company

    Search company people.

    Search company people.

    people:search
  • POST
    /v1/people/enrich

    Reveal requested fields.

    Reveal requested fields.

    people:enrich
  • POST
    /v1/people/estimate

    Estimate enrichment cost.

    Estimate enrichment cost.

    people:enrich
  • POST
    /v1/people/batch/enrich

    Create a batch job.

    Create a batch job.

    batch:write
  • GET
    /v1/people/batch/:id

    Poll batch status.

    Poll batch status.

    batch:write
  • GET
    /v1/people/batch/:id/results

    Page batch results.

    Page batch results.

    batch:write

LinkedIn

Read profiles, search people, and list recent posts without a separate account connection.

  • GET
    /v1/linkedin/profile

    Fetch a profile.

    Fetch a profile.

    linkedin:read
  • POST
    /v1/linkedin/search

    Search people.

    Search people.

    linkedin:read
  • GET
    /v1/linkedin/posts

    List recent posts.

    List recent posts.

    linkedin:read

Webhooks and monitors

Register delivery targets and keep searches fresh on a schedule.

  • POST
    /v1/webhooks

    Register a webhook.

    Register a webhook.

    webhooks:write
  • GET
    /v1/webhooks

    List webhooks.

    List webhooks.

    webhooks:write
  • DELETE
    /v1/webhooks/:id

    Delete a webhook.

    Delete a webhook.

    webhooks:write
  • POST
    /v1/monitors

    Create a monitor.

    Create a monitor.

    people:search
  • GET
    /v1/monitors

    List monitors.

    List monitors.

    people:search
  • DELETE
    /v1/monitors/:id

    Delete 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/chat

    Stream an agent turn.

    Stream an agent turn.

    agent:chat
  • POST
    /v1/agent/chat/cancel

    Cancel streamed subagents.

    Cancel streamed subagents.

    agent:cancel
  • GET
    /v1/account/credits

    Read credit balance.

    Read credit balance.

    account:read
  • GET
    /v1/account/usage

    Read usage and budgets.

    Read usage and budgets.

    account:read
  • DELETE
    /v1/account/key

    Revoke 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.

PlanRequests / minute
Pay-as-you-go30
Team300
Enterprise1,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.