Skip to content

Applicants

The people who applied, and their contact details.

An applicant is a person who applied to one of the workspace’s jobs, or who came in from the customer’s own ATS. Of everyone in Tahoe, applicants have the clearest footing: they chose to apply, and the provenance block on every record says so.

GET/applicantsapplicants:read

Applicants in the workspace, most recently updated first.

ParameterTypeNotes
emailstringExact match on the email the applicant gave.
has_applicationsbooleanOnly applicants who do (or do not) have an application.
updated_aftertimestampOnly applicants changed since. Use it for incremental sync.
limitintegerDefault 25, maximum 100.
cursorstringFrom the previous page. Send the same filters with it.
Request
curl "https://tahoe.workonward.com/api/partner/v1/applicants?updated_after=2026-09-01T00:00:00Z&limit=100" \
  -H "Authorization: Bearer $TAHOE_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "applicant",
      "id": "apl_5Nx3jLm7Qd2s",
      "workspace_id": "wsp_4Kd8sPm2Qx7L",
      "full_name": "Jordan Rivera",
      "location": "Columbus, Ohio",
      "linkedin_url": "https://www.linkedin.com/in/jordan-rivera-1a2b3c",
      "github_url": null,
      "portfolio_url": null,
      "created_at": "2026-09-02T14:21:09.115Z",
      "updated_at": "2026-09-07T09:44:31.002Z",
      "provenance": {
        "origin": "applicant",
        "acquisition": "inbound_application",
        "provider": null,
        "owner_workspace_id": "wsp_4Kd8sPm2Qx7L",
        "first_seen_at": "2026-09-02T14:21:09.115Z",
        "last_seen_at": "2026-09-07T09:44:31.002Z",
        "consent": {
          "basis": "candidate_submitted",
          "candidate_facing_notice": true,
          "unsubscribed": false,
          "suppressed": false
        },
        "licence": {
          "redistributable": false,
          "note": "Submitted by the candidate to a specific employer for a specific role."
        }
      },
      "external_refs": [],
      "links": {
        "self": "/api/partner/v1/applicants/apl_5Nx3jLm7Qd2s",
        "applications": "/api/partner/v1/applicants/apl_5Nx3jLm7Qd2s/applications",
        "resumes": "/api/partner/v1/applicants/apl_5Nx3jLm7Qd2s/resumes",
        "contact_info": "/api/partner/v1/applicants/apl_5Nx3jLm7Qd2s/contact-info"
      }
    }
  ],
  "has_more": true,
  "next_cursor": "cur_eyJrIjoiMjAyNi0wOS0wN1QwOTo0NDozMVoi..."
}

The provenance block

Every record that describes a person carries this block: applicants, sourced profiles and shared-pool profiles. It tells you where the record came from and on what basis Tahoe holds it, and it is the field your compliance team will key on.

FieldMeaning
originWhich group the person belongs to: applicant, ats_import (an applicant imported from the customer’s ATS), sourced or shared_pool.
acquisitionHow the record arrived, for example inbound_application or ats_sync.
providerFor an ATS import, the ATS it came from. null for someone who applied in Tahoe.
owner_workspace_idThe workspace the record belongs to.
first_seen_at, last_seen_atWhen Tahoe first and last saw this record.
consent.basiscandidate_submitted, customer_provided, legitimate_interest_sourcing or public_profile.
consent.candidate_facing_noticeWhether the person saw a notice when their data was collected. True only for applicants.
consent.unsubscribedThey asked not to be contacted. Honor it whatever your scopes.
consent.suppressedWhether the person is under a suppression notice. The erasure feed is the full record of those.
licence.redistributableAlways false.
licence.noteA one-line statement of where the data came from.

external_refs

When an applicant came in through an ATS connection, this holds their ID in that system. It is what an HR system needs to match Tahoe applicants to its own records without guessing from names.

An applicant imported from Greenhouse
"external_refs": [
  {
    "system": "greenhouse",
    "type": "candidate",
    "id": "48213097",
    "connection_id": "ci_7Kd2mXq4Rp8v",
    "link_origin": "import",
    "last_synced_at": "2026-09-07T03:00:11.408Z"
  }
]

Match on system plus id. connection_id identifies the customer’s ATS connection and is not something you need to call. An applicant who applied in Tahoe has an empty array.

GET/applicants/{applicant_handle}applicants:read

One applicant, in the same shape as a list row.

GET/applicants/{applicant_handle}/applicationsapplications:read

Every application this person has made in the workspace, as the same objects the Applications endpoints return. Note the scope: it is applications:read, because what comes back is applications.

GET/applicants/{applicant_handle}/resumesresume:read

Every resume this person has sent, one per application. Each carries its own resume_access block, because each application started its own clock: the same person can have one resume you can download and another that is locked.

Response
{
  "object": "list",
  "data": [
    {
      "object": "resume",
      "id": "res_6Qm2xKd4Rp8v",
      "application_id": "app_6Qm2xKd4Rp8v",
      "job_id": "job_7Kd2mXq4Rp8v",
      "filename": "jordan-rivera-resume.pdf",
      "mime": "application/pdf",
      "bytes": 184320,
      "parse_status": "parsed",
      "has_parsed_profile": true,
      "resume_access": {
        "state": "open",
        "free_until": "2026-12-01T14:21:09.115Z",
        "view_until": "2026-12-31T14:21:09.115Z",
        "state_changes_at": "2026-12-01T14:21:09.115Z",
        "unlock_credits": 50,
        "can_view": true,
        "can_download": true
      },
      "links": {
        "detail": "/api/partner/v1/applications/app_6Qm2xKd4Rp8v/resume",
        "download": "/api/partner/v1/applications/app_6Qm2xKd4Rp8v/resume/download"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

GET/applicants/{applicant_handle}/contact-infocontact:read

The email address the applicant gave and, if your key also has contact:phone:read, their phone number. Without the phone scope, phones is named in restricted, so you can tell “not allowed” from “no phone number”.

Request
curl https://tahoe.workonward.com/api/partner/v1/applicants/apl_5Nx3jLm7Qd2s/contact-info \
  -H "Authorization: Bearer $TAHOE_API_KEY"
Response (shortened)
{
  "object": "contact_info",
  "subject": { "object": "applicant", "id": "apl_5Nx3jLm7Qd2s" },
  "emails": [
    {
      "value": "[email protected]",
      "kind": "submitted",
      "status": "found",
      "verified_at": null,
      "source": {
        "object": "applicant",
        "id": "apl_5Nx3jLm7Qd2s",
        "workspace_id": "wsp_4Kd8sPm2Qx7L"
      },
      "licence": { "redistributable": false }
    }
  ],
  "phones": [],
  "unsubscribed": false,
  "restricted": ["phones"],
  "restricted_reason": {
    "phones": "scope_required:contact:phone:read"
  }
}

Each value also carries the provenance block of the record it came from. An applicant’s contact details were given by the applicant, so they are never behind a credit charge. They are still personal data: each value returned counts one against the daily personal-data budget and is recorded in the audit log.

applicant.created, applicant.updated, applicant.deleted and applicant.unsubscribed, all under applicants:read. Handle applicant.unsubscribed first: it is how you learn to stop emailing someone who asked you to. See the change feed.