본문으로 이동
Claude에서 작동 · Anthropic 검증 완료
개요 개요 뉴스 뉴스
공유

웹훅 및 이벤트

실시간 이벤트. HMAC 서명 전달됨.

문서, 작업, Workspace 또는 작업이 변경되면 PaperOffice가 즉시 엔드포인트를 호출합니다. 폴링 불필요.

22개 이벤트 유형, HMAC-SHA256 서명, 3가지 재시도 전략 및 시도별 전달 로그.

모든 전달 시 HMAC-SHA256 최대 10회 반복 (기본값 5) 이벤트 ID 기준 멱등성
실시간 이벤트. HMAC 서명 전달됨.

사용 가능한 이벤트

22 이벤트 유형, 엔티티별로 그룹화

개별 이벤트를 구독하거나 모든 이벤트에 대해 와일드카드 *를 사용하세요.

문서

14
  • document.uploaded Workspace에 새 문서 업로드
  • document.created document.uploaded의 별칭 (호환성)
  • document.processed OCR/AI-IDP 파이프라인 성공적으로 완료됨
  • document.edited 문서 수정: 메타데이터, 태그 또는 콘텐츠 업데이트됨
  • document.deleted 문서가 삭제되었습니다; delete_mode은 trash(Business 및 Compliance의 휴지통) 또는 instant(기본 영구 삭제)를 표시합니다
  • document.restored 휴지통에서 문서가 복원되었습니다 (Business 및 Compliance)
  • document.moved Workspaces 간 문서 이동
  • document.version_created 기존 문서의 새 버전
  • document.lifecycle_changed 보관/아카이브 상태 변경
  • document.comment_added 문서에 댓글 작성됨
  • document.note_added 사내 메모 첨부됨
  • document.tag_added 문서에 태그 할당됨
  • document.legal_hold_placed 법적 보존 활성화 (불변)
  • document.legal_hold_released 법적 보존 해제

작업

3
  • job.completed 비동기 작업 성공적으로 완료됨
  • job.failed 비동기 작업 최종 실패
  • job.progress 진행률 업데이트 - 긴 작업

Workspaces

2
  • workspace.shared Workspace이 사용자 또는 팀과 공유됨
  • workspace.unshared Workspace 접근 권한 회수

작업

3
  • task.created 새 작업 생성
  • task.completed 작업을 완료로 표시
  • task.overdue 작업이 마감일을 초과했습니다

페이로드 및 헤더

모든 배달은 동일한 스키마를 따름

예측 가능한 JSON 본문, 고정 HTTP 헤더, ISO-8601 UTC 타임스탬프.

요청 본문

{
  "event_type": "document.processed",
  "event_id": "a3b7f9c1d4e8b2a6c9f1d4e7b2a5c8f1",
  "timestamp": "2026-04-17T14:23:11Z",
  "subscription_id": 42,
  "data": {
    "pofid": "doc_01HZY8K3M7P2Q9R5T1V6W4X2Y8",
    "workspace_id": 17,
    "filename": "invoice-2026-04-17.pdf",
    "mime_type": "application/pdf",
    "size_bytes": 284521,
    "processing_result": {
      "ocr_done": true,
      "classification": "invoice",
      "confidence": 0.98
    }
  }
}

HTTP 요청 헤더

헤더 예시 값 의미
Content-Type application/json 항상 JSON, UTF-8 인코딩됨
User-Agent PaperOffice-Webhook/1.0 방화벽 허용 목록을 위한 고정 식별자
X-PaperOffice-Event document.processed 전송된 이벤트 유형
X-PaperOffice-Event-ID a3b7f9c1… 128비트 고유 ID. 중첩 요청 방지 키로 사용하십시오.
X-PaperOffice-Subscription-ID 42 이벤트를 수신하는 구독의 ID
X-PaperOffice-Signature sha256=… 원본 바디의 HMAC-SHA256, hex 인코딩됨
cURL
curl -X POST "https://api.paperoffice.ai/latest/webhooks/subscribe" \  -H "Authorization: Bearer po_ut_YOUR_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "name": "My Production Webhook",    "url": "https://yourdomain.com/webhooks/paperoffice",    "events": ["document.processed", "job.completed", "job.failed"],    "retry_policy": "exponential",    "max_retries": 5,    "timeout_ms": 10000  }'

서명 검증

모든 전송을 HMAC-SHA256로 검증하세요

공유 비밀과 함께 원본 요청 바디에 대해 HMAC-SHA256를 계산하고 결과를 X-PaperOffice-Signature와 비교하세요 — 상수 시간 실행으로 반드시 수행해야 합니다.

  • 상수 시간 비교

    hash_equals, hmac.compare_digest 또는 crypto.timingSafeEqual: 비교는 실행 시간 차이를 노출해서는 안 됩니다.

  • 원본 본문 서명

    서명은 변경되지 않은 요청 본문에 대해 유효합니다. 확인 후 JSON을 파싱해야 합니다. 그렇지 않으면 해시가 달라집니다.

  • API 구독

    name, url 및 events와 함께 POST /latest/webhooks/subscribe를 호출합니다. secret이 비어 있으면 PaperOffice가 생성하여 한 번만 반환합니다.

재시도 및 배달

최대 10회 재시도를 위한 세 가지 재시도 전략

구독별로 정책을 선택합니다. 각 시도는 상태 코드, 응답 본문 및 타이밍과 함께 로깅됩니다.

  • 표준 exponential

    지수 함수 (기본값)

    시도 간 간격은 각 실패 후 두 배로 증가합니다.

  • linear

    선형

    시도 간 간격은 고정된 단계만큼 증가합니다.

  • none

    없음

    5xx 오류 시에도 재시도하지 않습니다(보내고 잊기). 테스트 후크에 유용합니다.

  • 성공 타임아웃 창 내 HTTP 2xx
  • 최대 재시도 횟수 최대 10회 재시도 (기본값 5)
  • 시간 초과 시도당 1,000–30,000 ms (기본값 10,000). 첫 번째 전송 시도는 이벤트에 따라 각각 2초 또는 5초로 제한되며, 재시도는 전체 값을 사용합니다.
  • 전송 로그 모든 시도는 기록되며 구독 삭제 후에도 로그가 유지됩니다.

관리-API

/latest/webhooks/ 아래의 5개 엔드포인트

구독 생성, 나열, 업데이트 및 삭제 — 테스트 엔드포인트 포함. 모든 호출에는 Bearer 토큰이 첨부됩니다.

  • POST /webhooks/subscribe 구독 생성; 페이로드는 HMAC-SHA256으로 서명됨 MCP 도구po-webhooks-subscribe
  • GET /webhooks/list 계정의 모든 웹훅 구독 나열 MCP 도구po-webhooks-list
  • POST /webhooks/update URL, 이벤트, 헤더, 재시도 정책 또는 활성 상태 업데이트 MCP 도구po-webhooks-update
  • POST /webhooks/delete 구독 삭제; 배달 로그는 유지됨 MCP 도구po-webhooks-delete
  • POST /webhooks/test 구독으로 테스트 이벤트 전송 및 배달 확인 MCP 도구po-webhooks-test

보안

기본부터 강화됨

각 배달 시 작동하는 여섯 가지 메커니즘 — PaperOffice 측과 고객 측 모두에서.

  • HMAC-SHA256

    모든 배달은 귀하의 Secret으로 서명됩니다. 비교는 반드시 상수 시간 내에 수행되어야 합니다.

  • SSRF 보호

    구독 및 디스패치 시 사설 IP, 내부 IP, 로컬호스트 및 클라우드 메타데이터 엔드포인트가 차단됩니다.

  • DNS 리바인딩 안전

    대상 주소는 전달 시점에 다시 확인됩니다.

  • HTTPS 권장

    http와 https 모두 허용됩니다. 프로덕션 환경에서는 HTTPS를 권장합니다.

  • 이벤트 ID 기반 멱등성

    모든 배달에는 고유한 X-PaperOffice-Event-ID가 포함됩니다. 고객 측에서 중복 제거하세요.

  • 완전한 배달 로그

    모든 시도가 기록됩니다: 상태 코드, 응답 본문, 타이밍, 오류 메시지.

제한

구독별 배달 동작 구성 가능

모든 값은 구독 생성 시 또는 이후 /webhooks/update를 통해 구독별로(계정별 아님) 설정합니다.

  • 0–10 배달당 재시도 횟수 (기본값 5)
  • 1,000–30,000 ms 시도당 타임아웃 (기본값 10,000, 첫 번째 시도 2–5초)
  • 3 재시도 정책: none, linear, exponential
  • HMAC-SHA256 배달 시 서명

웹훅은 Professional 플랜부터 제공됩니다. 귀하의 설정에 맞는 플랜은 가격 안내에서 확인할 수 있습니다.

질문

Webhooks에 대한 자주 묻는 질문

전송을 어떻게 검증합니까?

구독의 Secret을 사용하여 원본 요청 본문에 HMAC-SHA256을 계산하고, 결과를 X-PaperOffice-Signature 헤더(형식 sha256=<hex>)와 상수 시간으로 비교하십시오. 서명이 일치하지 않으면 HTTP 401로 응답하고 본문을 처리하지 마십시오.

Secret은 어디서 오나요?

POST /latest/webhooks/subscribe를 통해 구독을 생성할 때. secret 필드를 비워두면 PaperOffice가 Secret을 생성하고 응답에서 한 번만 반환합니다. POST /latest/webhooks/update를 통해 언제든지 이를 교체할 수 있습니다.

내 엔드포인트가 응답하지 않으면 어떻게 됩니까?

HTTP 2xx 범위의 응답 외의 모든 응답이나 타임아웃은 실패로 간주됩니다. 지수적, 선형, 없음 중 선택 가능한 재시도 정책에 따라 PaperOffice는 설정된 최대 재시도 횟수(0~10, 기본값 5)까지 배달을 재시도합니다. 각 시도는 상태 코드, 응답 본문 및 측정된 시간과 함께 배달 로그에 기록됩니다.

동일한 배달이 중복되어 도착할 수 있나요?

네, 타임아웃 후 재시도가 발생하면 중복 도착이 가능합니다. 따라서 X-PaperOffice-Event-ID 헤더를 통해 중복 제거를 수행하세요. 이 ID는 이벤트별로 고유하며 데이터베이스의 멱등성 키로 적합합니다.

구독할 수 있는 이벤트 유형은 무엇인가요?

문서, 작업, 워크스페이스, 작업 항목 등 4개 그룹에서 총 22가지 이벤트 유형을 구독할 수 있습니다. 개별 이벤트를 구독하거나 와일드카드 *를 사용하여 모든 이벤트를 구독할 수 있습니다. workspace_id 또는 pofid와 같은 필터를 통해 구독 범위를 추가로 좁힐 수 있습니다.

웹훅은 어떤 플랜에 포함되어 있나요?

웹훅은 Professional 플랜 이상에서 제공됩니다. 현재 설정에 적합한 플랜은 가격 안내 페이지에서 확인할 수 있습니다.

웹훅에서 표는 어떻게 전달됩니까?

표 필드(예: 검사 값 또는 줄 항목)의 경우, document.processed 이벤트는 data.extracted_tables 필드도 함께 전달합니다. 해당 tables 목록에는 각 표 필드당 하나의 항목이 포함되며, 여기에는 key, label, columns 및 rows 필드가 있습니다. 모든 셀은 value 필드(PaperOffice가 숫자로 판독한 경우 숫자, 그렇지 않으면 인쇄된 텍스트 그대로)와 value_raw 필드(인쇄된 텍스트 그대로, 또는 해당 값이 알려지지 않은 경우 null 값)를 포함합니다. extracted_fields 필드는 변경되지 않습니다. 각 전송에는 최대 50개의 표가 포함되며, 각 표는 최대 1,000행과 40열로 구성됩니다. 셀당 최대 2,000자이며 모든 표의 총 크기는 512KB를 초과할 수 없습니다. 데이터가 잘린 경우 truncated 필드에는 true 값이 설정되며, row_count 필드에는 전체 행 수가 명시됩니다. 서명은 extracted_tables 필드를 포함한 전체 요청 본문을 덮습니다.

document.processed 이벤트에서 새로 추가된 기능은 무엇입니까?

새로 추가된 기능: key_fields 필드에 document_number 필드(예: 송장 번호)와 publisher 필드(문서 발행자)가 추가되었습니다. 이는 PaperOffice가 해당 값을 읽은 경우에만 적용됩니다. 줄 항목은 data.extracted_tables 필드에 별도의 표로 전달됩니다. 이 표의 key 필드 값은 __document__content__extraction__line_items이며, 에이전트 필드의 경우 _line_items입니다. 이 표의 각 행은 하나의 줄 항목을 나타냅니다.

PaperOffice AI · Problem Solver

저희에게 말씀해 주세요, 매일 시간을 많이 소요하는 일을.

간단히 설명해 주세요. 전문 용어는 필요 없습니다.

또는 예제로 시작하세요

PaperOffice를 어떻게 사용하시겠습니까?

컴퓨터와 스마트폰 연결 완료: 컴퓨터에서 워크스페이스 사용, 전화기로 문서 캡처.

어디서 시작하시겠습니까?

풀 워크스페이스는 컴퓨터에 최적화되어 있습니다. 모바일 버전은 문서 캡처, 검토 및 승인에 적합합니다.

무료 등록 app.paperoffice.ai

컴퓨터에서 시작

개인 접근 링크를 이메일로 보내드립니다.