본문으로 건너뛰기

인물

이메일이나 LinkedIn URL로 내 기록을 Tahoe 인물과 연결하세요.

같은 사람이 Tahoe에 지원자, 소싱한 프로필, 공유 인재풀 프로필로 동시에 있을 수 있습니다. 이 엔드포인트들은 이미 가지고 있는 식별자, 즉 이메일 주소나 LinkedIn URL을 받아 어떤 Tahoe 레코드가 그 사람의 것인지 알려 줍니다.

인물 조회가 동작하는 방식

person은 레코드가 아닙니다. 조회 결과입니다. 확인한 신원과, 그 신원에 일치하는 레코드를 가리키는 포인터로 이루어집니다. 응답에도 "authoritative": false 필드로 이 사실이 표시됩니다.

병합되는 것은 없습니다. 인물은 “이메일 주소”를 갖지 않고, 각자 이메일을 가진 레코드를 가리킬 뿐입니다. 데이터가 필요하면 레코드 자체를 읽으세요.

식별자일치 대상신뢰도
linkedin_url그 LinkedIn 프로필을 가진 지원자, 소싱한 프로필, 공유 인재풀 프로필exact
email그 이메일 주소를 입력한 지원자probable

LinkedIn URL은 한 사람을 가리키므로 이 값으로 일치하면 exact입니다. 이메일 일치는 probable일 뿐입니다. 여럿이 함께 쓰는 주소, 다시 쓰이는 주소, 역할 주소가 있기 때문입니다. 각 레코드 종류는 키가 읽을 수 있을 때만 확인합니다. 지원자는 applicants:read, 소싱한 프로필은 sourced_profiles:read, 인재풀 프로필은 pool:read가 필요합니다. 키가 읽을 수 없는 레코드는 빠지며 개수에도 포함되지 않습니다.

GET/people/resolvepeople:resolve

시작점입니다. 쿼리 파라미터로 email이나 linkedin_url 중 정확히 하나를 보내세요. 둘 다 없거나 둘 다 보내면 400 invalid_request입니다. 값은 URL 인코딩하세요.

요청
curl -G https://tahoe.workonward.com/api/partner/v1/people/resolve \
  -H "Authorization: Bearer $TAHOE_API_KEY" \
  --data-urlencode "linkedin_url=https://www.linkedin.com/in/priya-raman-9x8y7z"
응답
{
  "object": "person",
  "id": "per_Lk7d2QmXr9Tz4Wc8",
  "canonical_id": "per_Lk7d2QmXr9Tz4Wc8",
  "aliases": ["per_Em3x8Rk2Wq5Nb7Jd"],
  "identity": { "kind": "linkedin_url", "value": "linkedin.com/in/priya-raman-9x8y7z" },
  "authoritative": false,
  "display": {
    "full_name": "Priya Raman",
    "headline": "Field Operations Manager at Northwind Logistics",
    "location": "Columbus, Ohio, United States",
    "photo_url": null
  },
  "display_source": {
    "object": "sourced_profile",
    "id": "cnd_8Fj3kLm2Qd7s",
    "workspace_id": "wsp_4Kd8sPm2Qx7L"
  },
  "profiles": [
    {
      "object": "sourced_profile",
      "id": "cnd_8Fj3kLm2Qd7s",
      "workspace_id": "wsp_4Kd8sPm2Qx7L",
      "match": { "on": "linkedin_url", "confidence": "exact", "strength": "full" },
      "provenance": { "origin": "sourced", "provider": "xray" }
    },
    {
      "object": "applicant",
      "id": "apl_2Xj7kQd4Rm8s",
      "workspace_id": "wsp_4Kd8sPm2Qx7L",
      "match": { "on": "linkedin_url", "confidence": "exact", "strength": "full" },
      "provenance": { "origin": "applicant", "provider": null }
    }
  ],
  "counts": {
    "profiles": 2,
    "sourced_profiles": 1,
    "applicants": 1,
    "pool_profiles": 0,
    "exact_matches": 2
  },
  "links": {
    "self": "/api/partner/v1/people/per_Lk7d2QmXr9Tz4Wc8",
    "profiles": "/api/partner/v1/people/per_Lk7d2QmXr9Tz4Wc8/profiles",
    "contact_info": "/api/partner/v1/people/per_Lk7d2QmXr9Tz4Wc8/contact-info",
    "resumes": "/api/partner/v1/people/per_Lk7d2QmXr9Tz4Wc8/resumes",
    "applications": "/api/partner/v1/people/per_Lk7d2QmXr9Tz4Wc8/applications"
  }
}
필드의미
id보낸 식별자에 대한 인물 핸들입니다.
canonical_id이 사람에 대해 알려진 가장 강한 식별자의 핸들입니다(LinkedIn URL이 이메일보다 강합니다). id가 아니라 이 값을 저장하세요.
aliases같은 사람으로 이어지는 다른 인물 핸들입니다.
identity조회에 사용한 식별자를 Tahoe가 정규화한 값입니다.
authoritative항상 false입니다. 레코드가 아니라 조회 결과라는 것을 상기시킵니다.
display, display_sourceUI에 보여 줄 이름, 헤드라인, 지역, 사진과, 그 값을 가져온 레코드입니다.
profiles일치하는 레코드를 가리키는 포인터입니다. 유형, 핸들, 워크스페이스, 일치 방식, 출처를 담으며 값은 담지 않습니다.
counts.exact_matches정확히 일치한 포인터의 수입니다. 0이면 모든 일치가 probable입니다.

[email protected]이나 [email protected] 같은 공용 역할 주소는 400 not_an_identity로 거부됩니다. 이런 주소를 기준으로 인물을 잡으면 그 메일함을 쓰는 모든 사람이 하나로 합쳐지기 때문입니다. 유효한 개인 주소이지만 Tahoe에 없다면 404를 반환합니다.

POST/people/resolve:batchpeople:resolve

자체 테이블을 Tahoe와 맞춰 볼 수 있도록 한 번에 최대 100개의 식별자를 보냅니다. 각 키는 kind(email 또는 linkedin_url)와 value를 가진 객체입니다. expensive 속도 제한 등급(분당 60건)에 속합니다.

요청
curl -X POST https://tahoe.workonward.com/api/partner/v1/people/resolve:batch \
  -H "Authorization: Bearer $TAHOE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "keys": [
      { "kind": "linkedin_url", "value": "https://www.linkedin.com/in/priya-raman-9x8y7z" },
      { "kind": "email", "value": "[email protected]" },
      { "kind": "email", "value": "[email protected]" },
      { "kind": "email", "value": "[email protected]" }
    ]
  }'
응답(person 객체 일부 생략)
{
  "object": "list",
  "data": [
    {
      "object": "resolution",
      "input": { "kind": "linkedin_url", "value": "https://www.linkedin.com/in/priya-raman-9x8y7z" },
      "matched": true,
      "person": {
        "object": "person",
        "id": "per_Lk7d2QmXr9Tz4Wc8",
        "canonical_id": "per_Lk7d2QmXr9Tz4Wc8",
        "counts": { "profiles": 2, "exact_matches": 2 }
      }
    },
    {
      "object": "resolution",
      "input": { "kind": "email", "value": "[email protected]" },
      "matched": true,
      "person": {
        "object": "person",
        "id": "per_Qw4n8Tz2Lk6Hs1Vb",
        "canonical_id": "per_Rt5m9Xc3Jp7Gd2Nf",
        "counts": { "profiles": 1, "exact_matches": 0 }
      }
    },
    {
      "object": "resolution",
      "input": { "kind": "email", "value": "[email protected]" },
      "matched": false,
      "reason": "no_match"
    },
    {
      "object": "resolution",
      "input": { "kind": "email", "value": "[email protected]" },
      "matched": false,
      "reason": "not_an_identity"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

POST를 쓰는 이유는 이메일 주소 100개가 URL에 담겨 접근 로그에 남지 않도록 하기 위해서일 뿐입니다. 아무것도 바꾸지 않으며 반복해도 안전합니다.

GET/people/{person_handle}people:resolve

저장해 둔 핸들로 인물을 다시 조회하고, GET /people/resolve와 같은 객체를 반환합니다. canonical_id가 id와 다르면 canonical 쪽도 읽으세요. 원래 핸들에서는 probable이던 일치가 canonical 쪽에서는 exact일 수 있습니다.

GET/people/{person_handle}/profilespeople:resolve

포인터만 목록으로 반환합니다. 인물은 알고 있고, 어떤 레코드를 읽어야 할지 알고 싶을 때 쓰세요.

GET/people/{person_handle}/contact-infocontact:read

이 인물과 정확히 일치한 모든 지원자와 소싱한 프로필의 연락처를 반환합니다. 값마다 그 값이 나온 레코드를 표시하고, 중복은 없앱니다. 전화번호를 읽으려면 contact:phone:read도 필요합니다. 소싱한 프로필에서는 워크스페이스가 이미 열람한 연락처만 반환합니다. 값마다 일일 개인 데이터 한도에서 차감됩니다.

probable 일치는 여기에 아무것도 더하지 않으며, 응답의 excluded_probable_matches에 그 수가 표시됩니다. 이메일은 항상 probable로만 일치하므로, 이메일로만 조회한 인물에게는 값이 오지 않습니다. 아래 예시는 위 배치에서 이메일로 조회한 인물입니다.

요청
curl https://tahoe.workonward.com/api/partner/v1/people/per_Qw4n8Tz2Lk6Hs1Vb/contact-info \
  -H "Authorization: Bearer $TAHOE_API_KEY"
응답
{
  "object": "contact_info",
  "subject": { "object": "person", "id": "per_Qw4n8Tz2Lk6Hs1Vb" },
  "emails": [],
  "phones": [],
  "unsubscribed": false,
  "excluded_probable_matches": 1,
  "excluded_reason": "Only exact identity matches contribute contact values. Probable matches are listed under /profiles so you can judge them yourself."
}

GET/people/{person_handle}/resumesresume:read

이 인물과 정확히 일치한 지원자의 모든 이력서를, 이력서마다 따로 있는 resume_access 블록과 함께 반환합니다.

GET/people/{person_handle}/applicationsapplications:read

이 인물과 정확히 일치한 지원자의 모든 지원서입니다. LinkedIn URL로 조회한 뒤 이 엔드포인트를 호출하면 “이 후보자가 전에 우리 회사에 지원한 적이 있나?”에 답할 수 있습니다.

관련 이벤트

person.identity_linked와 person.canonical_id_changed가 있으며, 둘 다 people:resolve에 속합니다. 변경 피드를 참고하세요.