For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
기본 탐색 메뉴
Theme

웹훅

웹훅으로 OpenAI API의 이벤트 알림을 실시간으로 받으세요.

OpenAI 웹훅을 사용하면 배치가 완료되거나 백그라운드 응답이 생성되거나 파인튜닝 작업이 끝나는 등 API에서 이벤트가 발생할 때 실시간으로 알림을 받을 수 있습니다. OpenAI는 Standard Webhooks 사양에 따라 사용자가 관리하는 HTTP 엔드포인트로 웹훅을 전송합니다. 웹훅 이벤트의 전체 목록은 API 레퍼런스에서 확인할 수 있습니다.

API 프로젝트의 정렬 이탈 모니터링 알림을 받으려면 프로젝트 안전 알림 받기를 참고하세요.

안전 식별자에 대한 경고 및 비활성화 알림을 조직 수준에서 받으려면 안전 정책 집행 알림을 참고하세요.

Agents API 세션의 이벤트와 복구 패턴은 세션 웹훅을 참고하세요. 웹훅을 수신하는 서버를 구성할 때는 이 페이지의 엔드포인트 설정, 서명 검증, 전송 관련 안내를 따르세요.

웹훅 이벤트 API 레퍼런스

웹훅 이벤트의 전체 목록을 확인하세요.

다음은 OpenAI 웹훅을 수신하는 서버 예제입니다. 여기서는 response.completed 이벤트를 수신합니다.

Ruby 예제를 실행하려면 gem install openai webrick으로 필요한 종속성을 설치한 다음 OPENAI_API_KEY와 OPENAI_WEBHOOK_SECRET을 설정하세요.

웹훅 서버
import os
from openai import OpenAI, InvalidWebhookSignatureError
from flask import Flask, request, Response

app = Flask(__name__)
client = OpenAI(webhook_secret=os.environ["OPENAI_WEBHOOK_SECRET"])


@app.route("/webhook", methods=["POST"])
def webhook():
    try:
        # with webhook_secret set above, unwrap will raise an error if the signature is invalid
        event = client.webhooks.unwrap(request.data, request.headers)

        if event.type == "response.completed":
            response_id = event.data.id
            response = client.responses.retrieve(response_id)
            print("Response output:", response.output_text)

        return Response(status=200)
    except InvalidWebhookSignatureError as e:
        print("Invalid signature", e)
        return Response("Invalid signature", status=400)


if __name__ == "__main__":
    app.run(port=8000)

웹훅이 어떻게 동작하는지 확인하려면 OpenAI 대시보드에서 웹훅 엔드포인트를 설정하고 response.completed 이벤트를 구독하세요. 그런 다음 API 요청을 보내 백그라운드 모드에서 응답을 생성하세요.

웹훅 설정 페이지에서 샘플 데이터로 테스트 이벤트를 발생시킬 수도 있습니다.

백그라운드 응답 생성
from openai import OpenAI

client = OpenAI()

resp = client.responses.create(
    model="gpt-6-astra",
    input="Write a very long novel about otters in space.",
    background=True,
)

print(resp.status)

이 가이드에서는 대시보드에서 웹훅 엔드포인트를 만들고, 서버에서 웹훅 요청을 처리하는 코드를 설정하고, 수신한 요청을 OpenAI가 보냈는지 검증하는 방법을 알아봅니다.

웹훅 엔드포인트 만들기

서버에서 프로젝트 웹훅 요청을 받으려면 대시보드에 로그인하고 웹훅 설정 페이지를 여세요. 이 섹션에서는 프로젝트 엔드포인트를 설정합니다. 조직 수준의 안전 이벤트는 안전 정책 집행 알림을 참고하세요.

“만들기” 버튼을 클릭해 새 웹훅 엔드포인트를 만드세요. 다음 세 가지 항목을 설정합니다.

  • 엔드포인트 이름. 나중에 엔드포인트를 알아볼 수 있는 이름을 지정하세요.
  • 직접 관리하는 서버의 공개 URL.
  • 구독할 이벤트 유형 한 개 이상. 해당 이벤트가 발생하면 OpenAI가 지정한 URL로 HTTP POST 요청을 보냅니다.
웹훅 엔드포인트 편집 대화 상자

새 웹훅을 만들면 서버에서 수신한 웹훅 요청을 검증하는 데 필요한 서명용 비밀 키가 발급됩니다. 이 값은 다시 확인할 수 없으므로 나중에 사용할 수 있도록 저장하세요.

웹훅 엔드포인트를 만들었다면 이제 수신한 이벤트 페이로드를 처리할 서버 측 엔드포인트를 설정하세요.

서버에서 웹훅 요청 처리하기

구독한 이벤트가 발생하면 웹훅 URL로 다음과 같은 HTTP POST 요청이 전송됩니다.

POST https://yourserver.com/webhook
user-agent: OpenAI/1.0 (+https://platform.openai.com/docs/webhooks)
content-type: application/json
webhook-id: wh_685342e6c53c8190a1be43f081506c52
webhook-timestamp: 1750287078
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{
  "object": "event",
  "id": "evt_685343a1381c819085d44c354e1b330e",
  "type": "response.completed",
  "created_at": 1750287018,
  "data": { "id": "resp_abc123" }
}

엔드포인트는 HTTP 요청을 정상적으로 수신했음을 알리는 성공 상태 코드(2xx)를 신속히 반환해야 합니다. 시간 초과를 방지하려면 시간이 걸리는 처리를 백그라운드 워커에 맡겨 엔드포인트가 즉시 응답할 수 있도록 하세요. 엔드포인트가 성공 상태 코드(2xx)를 반환하지 않거나 몇 초 안에 응답하지 않으면 OpenAI가 웹훅 요청을 다시 보냅니다. 재시도 간격은 지수 백오프 방식으로 늘어나며, 전송 시도는 최대 72시간 동안 계속됩니다. OpenAI는 3xx 리디렉션을 따라가지 않고 전송 실패로 처리하므로 엔드포인트에 최종 목적지 URL을 지정하세요.

드물게 OpenAI 내부 시스템 문제로 동일한 웹훅 이벤트가 여러 번 전송될 수 있습니다. webhook-id 헤더를 멱등성 키로 사용하면 중복 이벤트를 걸러낼 수 있습니다.

로컬에서 웹훅 테스트하기

웹훅을 테스트하려면 인터넷에서 접근할 수 있는 공개 URL이 필요합니다. 로컬 개발 환경은 대개 외부에 공개되어 있지 않아 웹훅을 테스트하기 어렵습니다. 이때 다음 도구를 활용할 수 있습니다.

웹훅 서명 검증하기

OpenAI 웹훅 이벤트를 검증 없이 수신하고 처리할 수는 있지만, 수신한 요청을 실제로 OpenAI가 보냈는지 검증해야 합니다. 특히 웹훅을 수신한 후 백엔드에서 작업을 수행한다면 검증이 중요합니다. 웹훅 요청에 포함된 헤더 정보와 웹훅 비밀 키를 함께 사용하면 OpenAI가 보낸 웹훅인지 검증할 수 있습니다.

OpenAI 대시보드에서 웹훅 엔드포인트를 만들면 서명용 비밀 키가 발급됩니다. 서버에서 이 키를 사용할 수 있도록 환경 변수로 설정하세요.

export OPENAI_WEBHOOK_SECRET="<your secret here>"

웹훅 서명을 검증하는 가장 간단한 방법은 공식 OpenAI SDK에서 제공하는 unwrap() 헬퍼 메서드를 사용하는 것입니다.

OpenAI SDK로 서명 검증하기
import os

from flask import request
from openai import OpenAI

client = OpenAI()
webhook_secret = os.environ["OPENAI_WEBHOOK_SECRET"]

# will raise if the signature is invalid
event = client.webhooks.unwrap(
    request.data,
    request.headers,
    secret=webhook_secret,
)

Standard Webhooks 라이브러리로도 서명을 검증할 수 있습니다.

Standard Webhooks 라이브러리로 서명 검증하기
$webhook_secret = getenv("OPENAI_WEBHOOK_SECRET");
$wh = new \StandardWebhooks\Webhook($webhook_secret);
$wh->verify($webhook_payload, $webhook_headers);

필요하다면 Standard Webhooks 사양의 검증 절차에 따라 서명 검증을 직접 구현할 수도 있습니다.

서명용 비밀 키를 분실했거나 실수로 노출했다면 서명용 비밀 키 교체를 통해 새 키를 발급받을 수 있습니다.