API reference
Shared pool
Public professional profiles that belong to no workspace. The only unscoped read in the API — and it is safe precisely because the pool holds no contact information at all.
GET/pool/profilespool:read
| Parameter | Type | Notes |
|---|---|---|
country | string | Two-letter country code. |
company | string | Current employer. |
title | string | Current job title. |
updated_after | RFC 3339 | Filters on last_seen, not on when the profile was created. |
limit | integer | Default 25, max 100. |
cursor | string | From the previous page. |
{
"object": "list",
"data": [
{
"object": "pool_profile",
"id": "pool_4Qd7sKm2Xj8v",
"workspace_id": null,
"full_name": "Hana Suzuki",
"headline": "Machine Learning Engineer",
"job_title": "Senior Machine Learning Engineer",
"company_name": "Preferred Networks",
"company_industry": "Software",
"company_website": "https://preferred.jp",
"company_linkedin_url": "https://www.linkedin.com/company/preferred-networks",
"department": "Engineering",
"management_level": "individual_contributor",
"location_full": "Tokyo, Japan",
"location_country": "JP",
"linkedin_url": "https://www.linkedin.com/in/hana-suzuki-3k4l5m",
"github_url": "https://github.com/hsuzuki",
"photo_url": null,
"summary": "Research engineer working on distributed training ...",
"skills": ["PyTorch", "CUDA", "Distributed Systems"],
"languages": ["Japanese", "English"],
"total_experience_months": 104,
"connections_count": 920,
"follower_count": 1104,
"first_seen_at": "2026-05-02T09:14:00.000Z",
"last_seen_at": "2026-09-01T22:41:18.220Z",
"provenance": {
"origin": "shared_pool",
"acquisition": "provider_search",
"provider": "coresignal",
"owner_workspace_id": null,
"consent": {
"basis": "public_profile",
"candidate_facing_notice": false,
"unsubscribed": false,
"suppressed": false
},
"licence": {
"redistributable": false,
"note": "Provider-derived. Not licensed for onward redistribution."
}
}
}
],
"has_more": true,
"next_cursor": "cur_eyJrIjoiMjAyNi0wOS0wMVQyMjo0MToxOFoi..."
}last_seen_at is when Tahoe last observed this profile, not when the person last changed jobs. A pool profile can be months stale, so treat the employer and title as “as at last_seen_at” rather than current fact, and show the date if you put it in front of a recruiter.
GET/pool/profiles/{profile_handle}pool:read
One pool profile, same shape as a list row.
POST/pool/searchpool:search
Search the pool. This is the sanctioned alternative to running a real candidate search: it reads profiles Tahoe already holds, calls no provider, and spends none of your customer’s credits.
curl -s -X POST https://tahoe.workonward.com/api/partner/v1/pool/search \
-H "Authorization: Bearer $TAHOE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "senior ML engineer with distributed training experience in Tokyo",
"terms": {
"titles": ["Machine Learning Engineer", "Research Engineer"],
"skills": ["PyTorch", "CUDA"],
"companies": ["Preferred Networks"],
"locations": ["Tokyo"]
},
"limit": 50
}'| Field | Type | Notes |
|---|---|---|
query | string | Free text, max 500 characters. Optional if you send terms. |
terms.titles | string[] | Job titles to match. |
terms.skills | string[] | Skills to match. |
terms.companies | string[] | Employers to match. |
terms.locations | string[] | Places to match. |
limit | integer | 1–100. Default 25. |
You must send either a query or at least one term — an empty search is 400 invalid_request rather than “everything”, because a request that returns the whole pool is almost never what anyone meant.
The response is a list of pool_profile objects in the same envelope as the endpoints above. If the search index is briefly unavailable you get 429 pool_search_unavailable — retry after a short pause; reads of individual pool profiles are unaffected.
Related events
One event: pool.batch_upserted, under pool:read.
