People Search
Find sales leads, source candidates, and discover industry experts with a natural-language people search. Describe your target audience and retrieve matching professional profiles.
#Use case
Use People Search to build a list of people from a natural-language description of your target audience. Search by professional criteria such as role, seniority, industry, company, and location, then retrieve matching profiles for your sales, recruiting, or research workflow.
- Build prospect lists for outbound sales. Find heads of marketing at SaaS companies in London or procurement leaders at US manufacturers. Use their role and company details to organize leads before enriching contact information or preparing outreach.
- Create candidate pools for recruiting. Source software engineers in Toronto, finance directors in New York, or product managers at fintech companies. Start with the professional profile you need and review the matches for your open role.
- Discover experts and professional communities. Find renewable-energy executives for an industry interview series, healthcare operations leaders for customer discovery, or design leaders for an event. Search for the roles and sectors relevant to your project.
When you need more people, continue a completed search with search_id to retrieve another non-overlapping page of results.
#Endpoint
POST https://api-public.clodo.ai/api/public/v1/search/Send your API key in the x-api-key header. See Authentication.
This endpoint returns
202 Accepted. Create a webhook signing secret and supply a public HTTPSwebhook_urlbefore making your first request. See Async Polling for retrieving results.
#Pricing
See Credits & Pricing for credit costs and charging behavior.
#Errors
For error responses and retry guidance, see Handling Errors.
POST /api/public/v1/search/ — async (returns 202 Accepted). 1 credit per lead returned.
Light people search. Evaluates a natural-language query and returns matching leads. Wall time ~1 minute. Results delivered via signed webhook POST. Polling fallback at GET /api/public/v1/search/{job_id}/. To fetch more non-overlapping leads for the same prompt, pass a completed job id back as search_id.
#Request
| Field | Type | Required | Notes |
|---|---|---|---|
query |
string | yes for new searches | Natural-language sourcing prompt. ≤500 chars. Omit when continuing with search_id. |
search_id |
string | no | dj_... id from a previous completed People Search. Continues that search and returns the next non-overlapping page. |
max_results |
int | yes | min 25 and max 100. Upper bound on lead count. |
webhook_url |
string | yes | HTTPS URL. Must resolve to a public IP. |
Pre-condition: an active webhook signing secret. See Webhook Signing Secrets.
Idempotency-Key header is supported. Same key returns the same job's current state.
#Response (202)
{
"id": "dj_a1b2c3d4...",
"status": "pending",
"created_at": "2026-05-01T12:00:00Z"
}Use the returned id as search_id to continue pagination after the job completes.
#Webhook events
search.completed:
{
"id": "dj_a1b2c3d4...",
"event_type": "search.completed",
"results": [
{
"first_name": "Patrick",
"last_name": "Collison",
"full_name": "Patrick Collison",
"current_job_title": "CEO",
"headline": "CEO at Stripe",
"location": "San Francisco, California, United States",
"professional_url": "linkedin.com/in/patrickcollison",
"company": {
"name": "Stripe",
"domain": "stripe.com",
"professional_url": "linkedin.com/company/stripe",
"industry": "Financial Services",
"employee_count": 8000
}
}
],
"total_returned": 1
}Person and company professional_url values come back in bare-host form (no scheme, no www., no trailing slash). Company professional_url is optional and may be null.
search.failed:
{
"id": "dj_a1b2c3d4...",
"event_type": "search.failed",
"error": {"code": "error", "message": "People search failed; please retry."}
}error.code |
error.message |
|---|---|
invalid_input |
Invalid search query. |
error |
People search failed; please retry. |
A 0-result outcome ships as search.completed with total_returned: 0.
#Billing
Charged per lead returned. max_results is the upper bound on credits. total_returned is the actual charge. A 0-result run charges nothing.
#Example
curl -X POST https://api-public.clodo.ai/api/public/v1/search/ \
-H "x-api-key: ck_live_..." \
-H "Content-Type: application/json" \
-d '{
"query": "VPs of Engineering at Series B SaaS in NYC",
"max_results": 50,
"webhook_url": "https://yourapp.com/webhooks/clodo"
}'Continue the same search:
curl -X POST https://api-public.clodo.ai/api/public/v1/search/ \
-H "x-api-key: ck_live_..." \
-H "Content-Type: application/json" \
-d '{
"search_id": "dj_a1b2c3d4...",
"max_results": 100,
"webhook_url": "https://yourapp.com/webhooks/clodo"
}'#Rate limit
POST /api/public/v1/search/:
| Limit | Value |
|---|---|
| Sustained rate | 6 requests / minute |
| Burst | 2 requests |
Polling GET /api/public/v1/search/{job_id}/:
| Limit | Value |
|---|---|
| Sustained rate | 3,600 requests / minute |
| Burst | 100 requests |
Exceeding any returns 429.