Shared pool
Search and read the shared pool of public professional profiles.
The shared pool is a set of public professional profiles that Tahoe already holds: name, headline, job title, employer, location, skills and languages. It belongs to no workspace, it holds no contact details, and searching it is free. Use it to find people without running a paid search.
GET/pool/profilespool:read
Pool profiles, most recently seen first.
| Parameter | Type | Notes |
|---|---|---|
country | string | Country name, matched exactly but ignoring case, for example United States. |
company | string | Matches part of the current employer’s name, ignoring case. |
title | string | Matches part of the current job title, ignoring case. |
updated_after | timestamp | Filters on last_seen_at, not on when the profile was first added. |
limit | integer | Default 25, maximum 100. |
cursor | string | From the previous page. Send the same filters with it. |
curl "https://tahoe.workonward.com/api/partner/v1/pool/profiles?country=United%20States&title=operations%20manager" \
-H "Authorization: Bearer $TAHOE_API_KEY"{
"object": "list",
"data": [
{
"object": "pool_profile",
"id": "pool_4Qd7sKm2Xj8v",
"workspace_id": null,
"full_name": "Marcus Bell",
"headline": "Operations Manager, Regional Distribution",
"job_title": "Operations Manager",
"company_name": "Harbor Freight Partners",
"company_industry": "Logistics",
"company_website": "https://example.com",
"company_linkedin_url": "https://www.linkedin.com/company/harbor-freight-partners-example",
"department": "Operations",
"management_level": "Manager",
"location_full": "Dayton, Ohio, United States",
"location_country": "United States",
"linkedin_url": "https://www.linkedin.com/in/marcus-bell-3k4l5m",
"github_url": null,
"photo_url": null,
"summary": "Ten years running warehouse and last-mile operations ...",
"skills": ["Warehouse operations", "Lean methods", "Team leadership"],
"languages": ["English"],
"total_experience_months": 124,
"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",
"first_seen_at": "2026-05-02T09:14:00.000Z",
"last_seen_at": "2026-09-01T22:41:18.220Z",
"consent": {
"basis": "public_profile",
"candidate_facing_notice": false,
"unsubscribed": false,
"suppressed": false
},
"licence": {
"redistributable": false,
"note": "Collected from public professional sources. Not licensed for onward redistribution."
},
"contact_info_available": false
},
"links": { "self": "/api/partner/v1/pool/profiles/pool_4Qd7sKm2Xj8v" }
}
],
"has_more": true,
"next_cursor": "cur_eyJrIjoiMjAyNi0wOS0wMVQyMjo0MToxOFoi..."
}last_seen_at is when Tahoe last saw this profile, not when the person last changed jobs. A pool profile can be months old, so treat the employer and title as true “as of last_seen_at”, and show that date if you put the profile in front of a recruiter.
GET/pool/profiles/{profile_handle}pool:read
One pool profile, in the same shape as a list row.
POST/pool/searchpool:search
Searches the pool and returns the best matches, ranked. It reads only profiles Tahoe already holds: it does not run a new search and it spends none of the workspace’s credits.
curl -X POST https://tahoe.workonward.com/api/partner/v1/pool/search \
-H "Authorization: Bearer $TAHOE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "warehouse operations manager who has led night shifts in Ohio",
"terms": {
"titles": ["Operations Manager", "Warehouse Manager"],
"skills": ["Warehouse operations", "Team leadership"],
"locations": ["Ohio"]
},
"limit": 50
}'| Field | Type | Notes |
|---|---|---|
query | string | A plain-language description, at most 500 characters. |
terms.titles | string[] | Job titles to match. Up to 10. |
terms.skills | string[] | Skills to match. Up to 20. |
terms.companies | string[] | Employers to match. Up to 10. |
terms.locations | string[] | Places to match. Up to 10. |
limit | integer | 1 to 100. Default 25. |
Send a query, at least one term, or both. A search with neither is 400 invalid_request rather than “everything”.
{
"object": "list",
"data": [
{
"object": "pool_profile",
"id": "pool_4Qd7sKm2Xj8v",
"workspace_id": null,
"full_name": "Marcus Bell",
"job_title": "Operations Manager",
"company_name": "Harbor Freight Partners",
"location_full": "Dayton, Ohio, United States",
"last_seen_at": "2026-09-01T22:41:18.220Z",
"match_score": 78,
"match_tier": "strong"
}
],
"has_more": false,
"next_cursor": null
}Each result is a full pool profile (shortened above) plus match_score and match_tier for this search. The result is a ranking, not a list you page through: next_cursor is always null, so ask for up to 100 with limit. If search is briefly unavailable you get 429 pool_search_unavailable; wait a moment and retry. Reading single pool profiles is not affected.
Related events
One event type: pool.batch_upserted, under pool:read. It reports that a batch of pool profiles changed, not each profile. If you keep a copy of the pool, re-read it with updated_after. See the change feed.