Skip to content

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.

ParameterTypeNotes
countrystringCountry name, matched exactly but ignoring case, for example United States.
companystringMatches part of the current employer’s name, ignoring case.
titlestringMatches part of the current job title, ignoring case.
updated_aftertimestampFilters on last_seen_at, not on when the profile was first added.
limitintegerDefault 25, maximum 100.
cursorstringFrom the previous page. Send the same filters with it.
Request
curl "https://tahoe.workonward.com/api/partner/v1/pool/profiles?country=United%20States&title=operations%20manager" \
  -H "Authorization: Bearer $TAHOE_API_KEY"
Response (shortened)
{
  "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.

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.

Request
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
  }'
FieldTypeNotes
querystringA plain-language description, at most 500 characters.
terms.titlesstring[]Job titles to match. Up to 10.
terms.skillsstring[]Skills to match. Up to 20.
terms.companiesstring[]Employers to match. Up to 10.
terms.locationsstring[]Places to match. Up to 10.
limitinteger1 to 100. Default 25.

Send a query, at least one term, or both. A search with neither is 400 invalid_request rather than “everything”.

Response (shortened)
{
  "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.

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.