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

ParameterTypeNotes
countrystringTwo-letter country code.
companystringCurrent employer.
titlestringCurrent job title.
updated_afterRFC 3339Filters on last_seen, not on when the profile was created.
limitintegerDefault 25, max 100.
cursorstringFrom the previous page.
Response
{
  "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.

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.

Request
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
  }'
FieldTypeNotes
querystringFree text, max 500 characters. Optional if you send terms.
terms.titlesstring[]Job titles to match.
terms.skillsstring[]Skills to match.
terms.companiesstring[]Employers to match.
terms.locationsstring[]Places to match.
limitinteger1–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.