Skip to main content
Use this page for complete workflow examples that chain multiple Person API calls together. For individual endpoint examples, see the endpoint pages.

Endpoint examples

ExampleWhat it does
Name lookupFind a person by exact name
Title and regionSearch by job title and geographic region
Company with title exclusionsFind people at specific companies, excluding certain titles
Geographic radiusSearch within a radius of a location
Cursor paginationPaginate through large result sets

Enrich

ExampleWhat it does
LinkedIn URLEnrich a single profile by LinkedIn URL
Multiple LinkedIn URLsBatch enrich multiple profiles
Business emailReverse lookup a person by business email
LinkedIn join date and verificationsRequest specific LinkedIn metadata fields

Workflow 1: Autocomplete → Search → Enrich

Goal: Find VPs of Sales at mid-size software companies and get their full profiles. Why this workflow: You don’t know the exact title value the Search API expects. Autocomplete discovers it, Search finds matching people, and Enrich fills in the details.

Step 1: Discover valid title values

curl --request POST \
  --url https://api.crustdata.com/person/search/autocomplete \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{"field": "experience.employment_details.current.title", "query": "VP Sales", "limit": 3}'
Extract: Take suggestions[0].value"VP Sales". Use this exact string in your Search filter. If empty: Try a broader query (e.g., "VP" instead of "VP Sales").

Step 2: Search for matching people

curl --request POST \
  --url https://api.crustdata.com/person/search \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "filters": {
      "op": "and",
      "conditions": [
        {"field": "experience.employment_details.current.title", "type": "in", "value": ["VP Sales", "VP of Sales"]},
        {"field": "experience.employment_details.current.company_headcount_range", "type": "in", "value": ["51-200", "201-500"]}
      ]
    },
    "limit": 3,
    "fields": ["basic_profile.name", "experience.employment_details.current.title", "experience.employment_details.current.company_name", "social_handles.professional_network_identifier.profile_url"]
  }'
Extract: Take social_handles.professional_network_identifier.profile_url"https://www.linkedin.com/in/janesmith". Pass to Enrich. If empty: Broaden filters or check values with Autocomplete.

Step 3: Enrich the top match

curl --request POST \
  --url https://api.crustdata.com/person/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{"professional_network_profile_urls": ["https://www.linkedin.com/in/janesmith"]}'
Result: Full person profile with employment history, education, skills, contact info, and more.

Workflow 2: Business email → Identify → Enrich

Goal: An inbound lead submits a business email. Resolve the person and get their full profile.

Step 1: Identify the person

curl --request POST \
  --url https://api.crustdata.com/person/identify \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{"business_emails": ["abhilash@crustdata.com"]}'
Extract: If matches[0].confidence_score >= 0.8, the person is confirmed. Since Identify returns lightweight data, proceed to Enrich with the same email for the full profile. If no match: matches will be []. The email may not be in the database. Try a different identifier or check for typos.

Step 2: Enrich for full profile

curl --request POST \
  --url https://api.crustdata.com/person/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{"business_emails": ["abhilash@crustdata.com"]}'

Error handling patterns

Invalid request (400)

{
    "error": {
        "type": "invalid_request",
        "message": "Unsupported filter field: 'current_title'. Supported fields: ['basic_profile.name', 'basic_profile.headline', ...]",
        "metadata": []
    }
}
Action: Fix the request. Do not retry 400 errors.

Invalid API key (401)

{ "message": "Invalid API key in request" }
Action: Check your API key. The 401 response uses a simpler shape.

No match (Enrich)

[
    {
        "matched_on": "nonexistent@example.com",
        "match_type": "business_email",
        "matches": []
    }
]
Action: Try a different identifier or check for typos. Do not retry.

Retry decision table

StatusRetry?Action
400NoFix the request
401NoCheck API key
403NoCheck permissions or credits
404NoProfile not found
500YesExponential backoff (1s, 2s, 4s)