삭제 통지
Tahoe가 인물 정보를 소거하거나 처리 중단할 때, 내가 함께 지워야 할 데이터.
삭제 통지 피드는 이 API에서 정보가 아니라 지시를 전달하는 유일한 부분입니다. 각 통지는 한 사람을 더 이상 처리하면 안 된다는 사실과 관련 레코드, 그리고 기한을 알려 줍니다. Tahoe에서 읽은 데이터를 조금이라도 저장한다면, 이 피드를 하루에 한 번 이상 읽고 통지에 따라 조치해야 합니다.
삭제 통지 목록 조회
GET/erasuresevents:read
내 키에 해당하는 모든 통지를 오래된 것부터 한 페이지씩 반환합니다.
| 파라미터 | 타입 | 설명 |
|---|---|---|
limit | integer | 기본값 25, 최대 100. |
cursor | string | 이전 페이지의 next_cursor입니다. 변경 피드와 달리 이 목록은 커서로 페이지를 넘깁니다. |
curl "https://tahoe.workonward.com/api/partner/v1/erasures?limit=100" \
-H "Authorization: Bearer $TAHOE_API_KEY"{
"object": "list",
"data": [
{
"object": "erasure",
"id": "ers_5Nx3jLm7Qd2s",
"action": "suppression_applied",
"reason": "data_subject_erasure",
"workspace_id": "wsp_4Kd8sPm2Qx7L",
"resources": [
{
"object": "applicant",
"id": "apl_8Fj3kLm2Qd7s",
"workspace_id": "wsp_4Kd8sPm2Qx7L"
},
{
"object": "application",
"id": "app_6Qm2xKd4Rp8v",
"workspace_id": "wsp_4Kd8sPm2Qx7L"
}
],
"action_required": "cease_processing_and_delete_your_copy",
"deadline_at": "2026-09-14T14:02:11.408Z",
"destruction_pending": true,
"destruction_reason": "retention_floor",
"at": "2026-09-07T14:02:11.408Z",
"subject_identified": false
}
],
"has_more": false,
"next_cursor": null
}통지 객체
| 필드 | 의미 |
|---|---|
id | 통지 핸들(ers_)입니다. 조치를 마친 뒤 기록해 두면 같은 통지에 두 번 조치하지 않습니다. |
action | suppression_applied 또는 erasure_completed입니다. 아래를 참고하세요. |
reason | 통지가 발행된 이유입니다. 아래 사유 목록을 참고하세요. |
workspace_id | 통지가 나온 워크스페이스입니다. 모두에게 적용되는 통지는 null입니다. |
resources | 삭제할 레코드 목록으로, 각각 object, id, workspace_id를 담습니다. |
action_required | cease_processing_and_delete_your_copy 또는 confirm_deletion입니다. |
deadline_at | 통지 후 7일입니다. 그때까지 사본을 모두 지워야 합니다. |
destruction_pending | Tahoe 자체가 법정 보존 규정에 따라 아직 레코드를 보관해야 하는 동안 true입니다. |
destruction_reason | destruction_pending이 true일 때 적용되는 보존 규정입니다. |
at | 통지가 발행된 시각입니다. |
subject_identified | 항상 false입니다. 통지는 사람을 밝히지 않고 레코드만 알려 줍니다. |
매일 읽기
커서는 1시간 뒤 만료되고, 마지막 페이지에는 커서가 아예 없습니다. 그래서 실행과 실행 사이에 보관할 재개 지점이 없습니다. 실행할 때마다 피드를 처음부터 읽고, 이미 조치한 id의 통지는 건너뛰세요.
두 가지 action
| action | 의미 | 해야 할 일 |
|---|---|---|
suppression_applied | Tahoe가 이 사람에 대한 처리를 중단했습니다. | 지금 조치하세요. deadline_at까지 목록에 있는 모든 레코드의 사본을 삭제하고, 그 사람에 대한 처리를 멈추세요. |
erasure_completed | Tahoe가 레코드를 파기했습니다. | 내 사본도 사라졌는지 확인하세요. 목록의 레코드가 아직 남아 있다면 지금 삭제하세요. |
모든 삭제(소거)가 처리 중단 통지로 시작하지는 않습니다. Tahoe가 레코드를 바로 파기할 수 있으면 받는 통지는 erasure_completed 하나뿐입니다. 어느 쪽이든 먼저 도착한 통지를 삭제 지시로 받아들이세요.
통지가 두 가지인 이유
여러 지역에서 고용 기록에는 법정 보존 기간이 있어, Tahoe는 본인이 소거를 요청한 뒤에도 최대 4년까지 레코드를 보관해야 할 수 있습니다. 그래서 “처리 중단”과 “레코드 파기” 사이에 몇 년이 걸릴 수 있습니다.
기한은 처리 중단 시점부터 시작합니다. destruction_pending이 true이면 Tahoe가 무시할 수 없는 보존 규정 때문에 아직 레코드를 보관하고 있다는 뜻이며, destruction_reason이 어떤 규정인지 알려 줍니다. 그래도 내가 할 일은 달라지지 않습니다. 7일 안에 사본을 삭제하세요.
사유
| reason | 발생 원인 |
|---|---|
data_subject_erasure | 본인이 소거를 요청했습니다. |
suppression | 완전한 소거까지는 아니지만, 본인이 처리하지 말 것을 요청했습니다. |
provider_takedown | 데이터 출처나 플랫폼이 삭제를 요구했습니다. |
user_deleted | 워크스페이스의 누군가가 레코드를 삭제했습니다. |
workspace_deleted | 워크스페이스 전체가 삭제되었습니다. |
retention_expiry | 보존 기간이 끝났습니다. |
legal_hold_release | 삭제를 막고 있던 법적 보존 조치가 해제되었습니다. |
사유에 따라 할 일이 달라지지는 않습니다. 삭제하면 됩니다. 사유는 삭제한 이유를 기록해 두고, 나중에 누가 묻더라도 출처가 요구한 삭제와 본인의 요청을 구분할 수 있도록 제공됩니다. 새 사유가 추가될 수 있으니, 모르는 값도 똑같이 처리하세요.
워크스페이스가 없는 통지는 모두에게 적용됩니다
레코드에 조치하기
resources에는 삭제할 핸들이 담겨 있습니다. 데이터를 복사할 때 저장해 둔 바로 그 핸들이므로, 검색할 필요 없이 바로 찾을 수 있습니다. object와 id를 함께 맞춰 보세요.
BASE = "https://tahoe.workonward.com/api/partner/v1"
def consume_erasures(session, store):
"""Act on every erasure notice. Run at least once a day."""
cursor = None
# A cursor expires after an hour and the last page has none, so there is
# no resume point to keep between runs. Read from the start every time and
# skip the notices you have already acted on.
while True:
params = {"limit": 100}
if cursor:
params["cursor"] = cursor
response = session.get(f"{BASE}/erasures", params=params, timeout=30)
response.raise_for_status()
body = response.json()
for notice in body["data"]:
if store.notice_handled(notice["id"]):
continue
# Delete on EITHER action. suppression_applied starts the 7-day
# clock; erasure_completed can arrive on its own when Tahoe
# destroys a record at once. Never wait for erasure_completed.
for resource in notice["resources"]:
store.purge(resource["object"], resource["id"])
store.suppress_forever(resource["object"], resource["id"])
# A notice with workspace_id null applies to every holder of the
# data, so never filter this feed by workspace.
store.record_notice(notice["id"], notice["reason"], notice["deadline_at"])
cursor = body["next_cursor"]
if not cursor:
return삭제한 핸들 목록을 영구히 보관하고 쓰기 전마다 확인하세요. 그래야 나중의 동기화가 삭제한 사람을 되살리지 않습니다. 이 목록이 절대 만료되면 안 되는 이유는 삭제와 소거 가이드에서 설명합니다.
변경 피드에도 같은 통지가 옵니다
각 통지는 변경 피드에도 data_subject.suppression_applied 또는 data_subject.erasure_completed로 나타납니다. 그래서 이미 피드를 읽는 리더는 별도 연동 없이 조치할 수 있습니다. 이 엔드포인트는 이벤트 워터마크와 별개로 통지만 따로 점검하고 다시 처리할 수 있도록 제공됩니다. 피드 리더가 멈춰 있었다면, 가장 중요한 통지부터 따라잡는 방법이 바로 이것입니다.