본문으로 건너뛰기

변경 피드

모든 변경 사항을 순서대로 읽고 내 사본을 최신으로 유지하세요.

변경 피드는 키로 읽을 수 있는 워크스페이스에서 일어나는 모든 변경을 순서대로 담은 하나의 로그입니다. 채용 공고, 지원서, 지원자, 저장한 후보자, 리스트, 공유 인재풀, 인물, 삭제 통지가 모두 여기에 기록됩니다. 마지막으로 읽은 지점부터 이어서 읽으면 워크스페이스 전체를 주기적으로 다시 읽을 필요가 없습니다.

웹훅은 같은 이벤트를 발생 즉시 서버로 보냅니다. 그래도 복구의 기준은 피드이므로, 대부분의 연동은 웹훅을 받으면서도 피드를 함께 읽습니다.

이벤트 목록 조회

GET/eventsevents:read

이벤트를 한 페이지씩 오래된 것부터 반환합니다. 이 API의 다른 목록과 반대 순서입니다. 다시 재생하는 피드는 앞에서부터 읽어야 하기 때문입니다.

파라미터타입설명
afterinteger이 sequence 다음의 이벤트를 반환합니다. 생략하면 볼 수 있는 가장 오래된 이벤트부터 시작합니다.
typestring이벤트 유형 하나 이상을 쉼표로 구분해 넣습니다. 알 수 없는 이름은 무시되지 않고 400 unknown_event_type으로 거부됩니다.
workspace_id핸들이 워크스페이스의 이벤트만 반환합니다. 여러 워크스페이스에 접근하는 키에 유용합니다.
limitinteger기본값 25, 최대 100.
요청
curl "https://tahoe.workonward.com/api/partner/v1/events?after=48210&limit=100" \
  -H "Authorization: Bearer $TAHOE_API_KEY"
응답
{
  "object": "list",
  "data": [
    {
      "object": "event",
      "id": "evt_7Kd2mXq4Rp8v",
      "type": "job.published",
      "api_version": "2026-09-09",
      "created_at": "2026-09-08T11:20:45.331Z",
      "sequence": 48214,
      "workspace_id": "wsp_4Kd8sPm2Qx7L",
      "data": {
        "object": {
          "object": "job",
          "id": "job_3Hn6tWq9Lc2v",
          "workspace_id": "wsp_4Kd8sPm2Qx7L",
          "updated_at": "2026-09-08T11:20:45.112Z",
          "status": "published"
        },
        "previous_attributes": { "status": "draft" }
      },
      "links": { "self": "/api/partner/v1/events/evt_7Kd2mXq4Rp8v" }
    },
    {
      "object": "event",
      "id": "evt_2Wp5nRc8Kd3x",
      "type": "application.stage_changed",
      "api_version": "2026-09-09",
      "created_at": "2026-09-08T11:24:02.907Z",
      "sequence": 48219,
      "workspace_id": "wsp_4Kd8sPm2Qx7L",
      "data": {
        "object": {
          "object": "application",
          "id": "app_6Qm2xKd4Rp8v",
          "workspace_id": "wsp_4Kd8sPm2Qx7L",
          "updated_at": "2026-09-08T11:24:02.880Z",
          "stage_id": "stg_3Rp8vKd2mXq4",
          "status": "in_review",
          "changed": ["stage_id"]
        },
        "previous_attributes": { "stage_id": "stg_9Kd2mXq4Rp8v" }
      },
      "links": { "self": "/api/partner/v1/events/evt_2Wp5nRc8Kd3x" }
    }
  ],
  "has_more": true,
  "next_cursor": null,
  "next_after": 48219
}

이벤트 객체

필드의미
id이벤트 핸들(evt_)입니다. 이미 처리한 이벤트를 건너뛸 때 쓰세요.
type아래 37가지 유형 중 하나입니다.
api_version이벤트 형태를 정한 API 버전으로, 이벤트가 기록될 때 고정됩니다.
created_at이벤트가 기록된 시각입니다.
sequence이어서 읽을 지점입니다. 항상 증가하고, 재사용되지 않으며, 연속적이지 않습니다.
workspace_id변경이 일어난 워크스페이스입니다. 특정 워크스페이스에 속하지 않는 이벤트는 null입니다.
data.object변경된 대상입니다. object 유형, id, workspace_id, updated_at과 함께 status, stage_id, reason 같은 간단한 값 몇 가지가 담깁니다.
data.object.changed일부 이벤트에만 있습니다. 변경된 필드의 이름 목록입니다.
data.object.originAPI로 한 쓰기가 만든 이벤트에만 있습니다. api: 뒤에 쓰기를 한 키의 ID가 붙습니다. Tahoe에서 한 변경에는 없습니다. 이벤트의 출처를 참고하세요.
data.previous_attributes일부 이벤트에만 있습니다. status나 stage_id 같은 간단한 필드의 이전 값입니다.
links.self이 이벤트의 경로입니다. https://tahoe.workonward.com 뒤에 붙여 쓰세요.

이벤트 하나 조회

GET/events/{event_handle}events:read

핸들로 이벤트 하나를 피드의 행과 같은 형태로 가져옵니다. 기록해 둔 웹훅 전송을 다시 확인하거나, 데드 레터 큐에 쌓인 핸들을 다시 처리할 때 쓰세요.

요청
curl https://tahoe.workonward.com/api/partner/v1/events/evt_7Kd2mXq4Rp8v \
  -H "Authorization: Bearer $TAHOE_API_KEY"

이벤트 유형

이벤트 유형은 37가지입니다. 이벤트를 읽으려면 events:read와 함께, 그 이벤트가 다루는 리소스를 읽을 수 있는 스코프가 필요합니다. 키가 읽을 수 없는 이벤트는 피드에서 빠지므로, 스코프로 가려진 레코드에 대해서는 피드도 알려 주지 않습니다.

그룹이벤트발생 시점스코프
채용 공고job.published공고가 게시되었습니다.jobs:read
job.updated공고가 변경되었고, 더 구체적인 공고 이벤트에 해당하지 않습니다.jobs:read
job.closed공고가 마감되었습니다.jobs:read
job.reopened마감된 공고가 다시 게시되었습니다.jobs:read
job.unpublished공고가 초안으로 되돌아갔습니다.jobs:read
job.deleted공고가 삭제되었습니다. 사유가 함께 옵니다.jobs:read
job.sections_updated공고의 본문 섹션이 변경되었습니다.jobs:read
지원서application.created누군가 지원했습니다.applications:read
application.updated지원서가 변경되었습니다.applications:read
application.status_changed지원서의 상태가 바뀌었습니다.applications:read
application.stage_changed지원서가 다른 파이프라인 단계로 이동했습니다.applications:read
application.withdrawn지원자가 지원을 철회했습니다.applications:read
application.deleted지원서가 삭제되었습니다. 사유가 함께 옵니다.applications:read
application.scored매칭 점수가 계산되었습니다.applications:read
application.resume_parsed이력서를 읽어 분석한 프로필이 준비되었습니다.resume:read
application.screening_completed전화 사전 스크리닝이 끝났습니다. 끝났다는 사실과 진행 결과만 알려 줍니다.screening:metadata:read
이력서resume.access_changed이력서 상태가 열림, 보기 전용, 잠김 사이에서 바뀌었습니다.resume:read
지원자applicant.created새 지원자 레코드가 생성되었습니다.applicants:read
applicant.updated지원자 레코드가 변경되었습니다.applicants:read
applicant.deleted지원자 레코드가 삭제되었습니다. 사유가 함께 옵니다.applicants:read
applicant.unsubscribed본인이 연락받지 않기를 요청했습니다.applicants:read
소싱한 프로필sourced_profile.created팀이 새 후보자를 저장했습니다.sourced_profiles:read
sourced_profile.updated저장한 후보자 정보가 변경되었습니다.sourced_profiles:read
sourced_profile.deleted저장한 후보자가 삭제되었습니다. 사유가 함께 옵니다.sourced_profiles:read
sourced_profile.contact_info_revealed새 연락처를 열람했습니다. 어떤 필드인지만 알려 주고 값은 담지 않습니다.contact:read
sourced_profile.attachment_added프로필에 첨부 파일이 추가되었습니다.attachments:read
리스트list.created리스트가 생성되었습니다.lists:read
list.updated리스트가 변경되었습니다.lists:read
list.deleted리스트가 삭제되었습니다.lists:read
list_membership.added후보자가 리스트에 추가되었습니다.lists:read
list_membership.removed후보자가 리스트에서 빠졌습니다.lists:read
list_membership.stage_changed리스트 안에서 후보자가 다른 단계로 이동했습니다.lists:read
공유 인재풀pool.batch_upserted공유 인재풀 프로필 묶음이 추가되거나 갱신되었습니다. 이벤트는 프로필마다가 아니라 묶음마다 하나씩 발생합니다.pool:read
인물person.identity_linked프로필이 기존 인물과 연결되었습니다. 예를 들어 지원자의 이메일이 저장한 후보자와 일치하는 경우입니다.people:resolve
person.canonical_id_changed인물의 대표 ID(canonical ID)가 바뀌었습니다. 저장해 둔 핸들을 새 값으로 바꾸세요.people:resolve
정보 주체data_subject.suppression_appliedTahoe가 한 사람에 대한 처리를 중단했습니다. 7일 안에 사본을 삭제하세요.events:read
data_subject.erasure_completedTahoe가 한 사람의 레코드를 파기했습니다.events:read

유형으로 거르기

채용 공고 이벤트만
curl "https://tahoe.workonward.com/api/partner/v1/events?after=48210&type=job.published,job.closed" \
  -H "Authorization: Bearer $TAHOE_API_KEY"

새 이벤트 유형은 API 버전 변경 없이 추가됩니다. 모르는 유형이 와도 오류로 처리하지 말고 무시하세요. ?type=은 정말 그 유형만 필요할 때만 쓰세요. 오늘 만든 필터는 내일 추가되는 유형을 받지 못합니다.

전송과 보관

  • 최소 한 번 전달. 같은 이벤트를 두 번 이상 받을 수 있습니다. 이미 처리한 id는 건너뛰고, 두 번 실행해도 안전한 핸들러를 작성하세요. 카운터를 올리거나 행을 덧붙이는 핸들러는 값이 점점 어긋납니다.
  • 30일 동안 보관. 리더가 30일 넘게 뒤처지면 가장 오래된 이벤트는 사라집니다. 증분 동기화에서 설명한 대로 전체 복사부터 다시 시작하세요.
  • 변경 후에 기록. Tahoe는 변경이 일어난 뒤에 이벤트를 기록하며, 이벤트를 기록하느라 제품의 변경을 늦추지 않습니다. 놓친 것이 있다고 의심되면 목록 엔드포인트의 updated_after 필터로 확인할 수 있습니다.
변경 피드 리더
import os

import requests

BASE = "https://tahoe.workonward.com/api/partner/v1"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['TAHOE_API_KEY']}"


def drain(store):
    """Apply every new event, oldest first. Safe to run as often as you like."""
    after = store.load_sequence()  # None on the very first run

    while True:
        params = {"limit": 100}
        if after is not None:
            params["after"] = after
        response = session.get(f"{BASE}/events", params=params, timeout=30)
        response.raise_for_status()
        body = response.json()

        for event in body["data"]:
            # Delivery is at-least-once: the same event can arrive twice.
            if not store.already_processed(event["id"]):
                handle(event)
                store.mark_processed(event["id"])
            # Save the watermark only AFTER the event is handled, so a crash
            # replays the event instead of skipping it. A gap in sequence
            # numbers is normal and is never a reason to re-read.
            after = event["sequence"]
            store.save_sequence(after)

        if not body["has_more"]:
            return

관련 문서