웹훅 테스트
curl --request POST \
--url https://sajuapi.dev/v1/webhooks/{id}/test \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"event_type": "<string>",
"reactivate": true
}
'import requests
url = "https://sajuapi.dev/v1/webhooks/{id}/test"
payload = {
"event_type": "<string>",
"reactivate": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({event_type: '<string>', reactivate: true})
};
fetch('https://sajuapi.dev/v1/webhooks/{id}/test', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sajuapi.dev/v1/webhooks/{id}/test",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'event_type' => '<string>',
'reactivate' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sajuapi.dev/v1/webhooks/{id}/test"
payload := strings.NewReader("{\n \"event_type\": \"<string>\",\n \"reactivate\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sajuapi.dev/v1/webhooks/{id}/test")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"event_type\": \"<string>\",\n \"reactivate\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sajuapi.dev/v1/webhooks/{id}/test")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"event_type\": \"<string>\",\n \"reactivate\": true\n}"
response = http.request(request)
puts response.read_body웹훅 테스트
POST
/
v1
/
webhooks
/
{id}
/
test
웹훅 테스트
curl --request POST \
--url https://sajuapi.dev/v1/webhooks/{id}/test \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"event_type": "<string>",
"reactivate": true
}
'import requests
url = "https://sajuapi.dev/v1/webhooks/{id}/test"
payload = {
"event_type": "<string>",
"reactivate": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({event_type: '<string>', reactivate: true})
};
fetch('https://sajuapi.dev/v1/webhooks/{id}/test', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sajuapi.dev/v1/webhooks/{id}/test",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'event_type' => '<string>',
'reactivate' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sajuapi.dev/v1/webhooks/{id}/test"
payload := strings.NewReader("{\n \"event_type\": \"<string>\",\n \"reactivate\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sajuapi.dev/v1/webhooks/{id}/test")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"event_type\": \"<string>\",\n \"reactivate\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sajuapi.dev/v1/webhooks/{id}/test")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"event_type\": \"<string>\",\n \"reactivate\": true\n}"
response = http.request(request)
puts response.read_bodyv1 Enterprise API (Coming Soon)이 엔드포인트는 Enterprise 버전에서 제공될 예정입니다.
현재는 v0 API를 사용하세요.
테스트 이벤트의
data 필드에는 test: true가 포함됩니다. 이를 통해 실제 이벤트와 구분할 수 있습니다.Path 파라미터
string
required
테스트할 웹훅의 ID입니다.
whk_ 접두사로 시작합니다.Request Body 파라미터
string
default:"test.ping"
테스트할 이벤트 유형입니다. 웹훅에 등록된 이벤트 중 하나를 선택할 수 있습니다.
boolean
default:"false"
비활성화된 웹훅을 다시 활성화할지 여부입니다. 테스트가 성공하면 웹훅이 활성화됩니다.
Response
성공
테스트 전송에 성공하면 전송 결과가 반환됩니다.실패
| 상태 코드 | 에러 타입 | 설명 |
|---|---|---|
| 401 | authentication_error | API 키가 유효하지 않음 |
| 404 | not_found | 웹훅을 찾을 수 없음 |
| 429 | rate_limited | 요청 한도 초과 |
요청 예시
# 기본 테스트
curl -X POST https://api.sajuapi.dev/v1/webhooks/whk_abc123def456/test \
-H "X-API-Key: bs_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"event_type": "fortune.generated"
}'
# 비활성화된 웹훅 재활성화
curl -X POST https://api.sajuapi.dev/v1/webhooks/whk_abc123def456/test \
-H "X-API-Key: bs_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"event_type": "test.ping",
"reactivate": true
}'
// 기본 테스트
const response = await fetch(
'https://api.sajuapi.dev/v1/webhooks/whk_abc123def456/test',
{
method: 'POST',
headers: {
'X-API-Key': 'bs_live_xxx',
'Content-Type': 'application/json'
},
body: JSON.stringify({
event_type: 'fortune.generated'
})
}
);
const result = await response.json();
// 비활성화된 웹훅 재활성화
const reactivateResponse = await fetch(
'https://api.sajuapi.dev/v1/webhooks/whk_abc123def456/test',
{
method: 'POST',
headers: {
'X-API-Key': 'bs_live_xxx',
'Content-Type': 'application/json'
},
body: JSON.stringify({
event_type: 'test.ping',
reactivate: true
})
}
);
import requests
# 기본 테스트
response = requests.post(
'https://api.sajuapi.dev/v1/webhooks/whk_abc123def456/test',
headers={'X-API-Key': 'bs_live_xxx'},
json={
'event_type': 'fortune.generated'
}
)
result = response.json()
# 비활성화된 웹훅 재활성화
reactivate_response = requests.post(
'https://api.sajuapi.dev/v1/webhooks/whk_abc123def456/test',
headers={'X-API-Key': 'bs_live_xxx'},
json={
'event_type': 'test.ping',
'reactivate': True
}
)
응답 예시
성공
{
"webhook_id": "whk_abc123def456",
"event_type": "fortune.generated",
"delivery": {
"id": "dlv_test_xyz789",
"status": "success",
"response_code": 200,
"response_time_ms": 145,
"attempted_at": "2025-01-16T09:00:00Z"
},
"payload_sent": {
"id": "evt_test_abc123",
"type": "fortune.generated",
"test": true,
"created_at": "2025-01-16T09:00:00Z",
"data": {
"test": true,
"message": "This is a test event"
}
},
"reactivated": false
}
재활성화 성공
{
"webhook_id": "whk_abc123def456",
"event_type": "test.ping",
"delivery": {
"id": "dlv_test_xyz789",
"status": "success",
"response_code": 200,
"response_time_ms": 89
},
"reactivated": true,
"message": "웹훅이 성공적으로 재활성화되었습니다."
}
테스트 실패
{
"webhook_id": "whk_abc123def456",
"event_type": "fortune.generated",
"delivery": {
"id": "dlv_test_xyz789",
"status": "failed",
"response_code": 500,
"error_message": "Internal Server Error",
"response_time_ms": 5000
},
"reactivated": false
}
테스트 이벤트 페이로드
테스트 이벤트는 다음과 같은 형식으로 전송됩니다.{
"id": "evt_test_abc123",
"type": "fortune.generated",
"test": true,
"created_at": "2025-01-16T09:00:00Z",
"data": {
"test": true,
"message": "This is a test event",
"fortune_id": "ftn_test_xxx",
"profile_id": "prf_test_xxx",
"score": 85
}
}
테스트 이벤트는
test: true 필드를 포함합니다. 웹훅 핸들러에서 이 필드를 확인하여 실제 이벤트와 구분할 수 있습니다.재활성화 조건
비활성화된 웹훅을 재활성화하려면 다음 조건을 충족해야 합니다.reactivate: true파라미터를 전달해야 합니다.- 테스트 이벤트가 성공적으로 전달되어야 합니다 (HTTP 2xx 응답).
- 응답 시간이 30초 이내여야 합니다.
failure_count가 0으로 초기화됩니다.⌘I