Webhook Endpoints API - WhereParcel
Pre-register and manage webhook endpoint URLs for receiving tracking notifications. Test endpoints, rotate secrets, and monitor delivery status.
/v2/webhook-endpoints Create webhook endpoint
Overview
Pre-register a URL to receive webhooks. Registered endpoints can be referenced by webhookEndpointId during webhook registration. Free API - does not count towards usage quota.
Example Request
curl -X POST https://api.whereparcel.com/v2/webhook-endpoints \
-H "Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production" \
-H "Content-Type: application/json" \
-d '{
"name": "Production Webhook",
"url": "https://myapp.com/webhooks/whereparcel",
"description": "프로덕션 환경 웹훅 수신 URL"
}'const response = await fetch('https://api.whereparcel.com/v2/webhook-endpoints', {
method: 'POST',
headers: {
"Authorization": "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Production Webhook",
"url": "https://myapp.com/webhooks/whereparcel",
"description": "프로덕션 환경 웹훅 수신 URL"
})
});
const data = await response.json();
console.log(data);<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.whereparcel.com/v2/webhook-endpoints');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
$headers = [
'Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = [
'name' => "Production Webhook",
'url' => "https://myapp.com/webhooks/whereparcel",
'description' => "프로덕션 환경 웹훅 수신 URL"
];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);import requests
import json
url = 'https://api.whereparcel.com/v2/webhook-endpoints'
headers = {
'Authorization': 'Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type': 'application/json'
}
data = {
'name': "Production Webhook",
'url': "https://myapp.com/webhooks/whereparcel",
'description': "프로덕션 환경 웹훅 수신 URL"
}
response = requests.post(url, headers=headers, json=data)
result = response.json()
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.whereparcel.com/v2/webhook-endpoints"
payload := []byte(`{"name":"Production Webhook","url":"https://myapp.com/webhooks/whereparcel","description":"프로덕션 환경 웹훅 수신 URL"}`)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))
req.Header.Add("Authorization", "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production")
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))
}Request Body
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Required | |
url | string | Required | |
secret | string | Optional | |
description | string | Optional | |
Response
Success Response (201)
Endpoint created successfully
Response Body
{
"success": true,
"data": {
"endpointId": "endpoint_abc123",
"name": "Production Webhook",
"url": "https://myapp.com/webhooks/whereparcel",
"secret": "whsec_aBcDeFgHiJkLmNoPqRsTuVwXyZ123456",
"description": "프로덕션 환경 웹훅 수신 URL",
"isActive": true,
"createdAt": "2026-02-05T10:00:00.000Z"
}
} Error Response (400)
Bad request (invalid URL format, etc.)
Response Body
{
"success": false,
"error": {
"code": "INVALID_REQUEST",
"message": "The request parameters are invalid"
}
} Error Response (401)
Authentication failed
Response Body
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
} /v2/webhook-endpoints List webhook endpoints
Overview
Retrieve all registered webhook endpoints. Free API - does not count towards usage quota.
Example Request
curl -X GET https://api.whereparcel.com/v2/webhook-endpoints \
-H "Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production" \
-H "Content-Type: application/json"const response = await fetch('https://api.whereparcel.com/v2/webhook-endpoints', {
method: 'GET',
headers: {
"Authorization": "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production",
"Content-Type": "application/json"
}
});
const data = await response.json();
console.log(data);<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.whereparcel.com/v2/webhook-endpoints');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = [
'Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);import requests
import json
url = 'https://api.whereparcel.com/v2/webhook-endpoints'
headers = {
'Authorization': 'Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type': 'application/json'
}
response = requests.get(url, headers=headers)
result = response.json()
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.whereparcel.com/v2/webhook-endpoints"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production")
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))
}Response
Success Response (200)
Endpoint list retrieved successfully
Response Body
{
"success": true,
"data": [
{
"endpointId": "endpoint_abc123",
"name": "Production Webhook",
"url": "https://myapp.com/webhooks/whereparcel",
"description": "프로덕션 환경 웹훅 수신 URL",
"isActive": true,
"createdAt": "2026-02-05T10:00:00.000Z",
"updatedAt": "2026-02-05T10:00:00.000Z"
},
{
"endpointId": "endpoint_def456",
"name": "Staging Webhook",
"url": "https://staging.myapp.com/webhooks/whereparcel",
"description": "스테이징 환경 웹훅 수신 URL",
"isActive": false,
"createdAt": "2026-02-04T15:30:00.000Z",
"updatedAt": "2026-02-04T16:00:00.000Z"
}
]
} Error Response (401)
Authentication failed
Response Body
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
} /v2/webhook-endpoints/{endpointId} Update webhook endpoint
Overview
Update webhook endpoint information. You can change the URL, name, description, active status, etc. Free API - does not count towards usage quota.
Example Request
curl -X PUT https://api.whereparcel.com/v2/webhook-endpoints/{endpointId} \
-H "Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Webhook Name",
"url": "https://myapp.com/webhooks/new-url",
"enabled": true
}'const response = await fetch('https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}', {
method: 'PUT',
headers: {
"Authorization": "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Updated Webhook Name",
"url": "https://myapp.com/webhooks/new-url",
"enabled": true
})
});
const data = await response.json();
console.log(data);<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
$headers = [
'Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = [
'name' => "Updated Webhook Name",
'url' => "https://myapp.com/webhooks/new-url",
'enabled' => true
];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);import requests
import json
url = 'https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}'
headers = {
'Authorization': 'Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type': 'application/json'
}
data = {
'name': "Updated Webhook Name",
'url': "https://myapp.com/webhooks/new-url",
'enabled': True
}
response = requests.put(url, headers=headers, json=data)
result = response.json()
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}"
payload := []byte(`{"name":"Updated Webhook Name","url":"https://myapp.com/webhooks/new-url","enabled":true}`)
req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload))
req.Header.Add("Authorization", "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production")
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))
}Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
endpointId | string | Required | <p>Endpoint ID to update</p>
Example: endpoint_abc123 |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Optional | |
url | string | Optional | |
description | string | Optional | |
isActive | boolean | Optional | |
Response
Success Response (200)
Endpoint updated successfully
Response Body
{
"success": true,
"data": {
"endpointId": "endpoint_abc123",
"name": "Updated Webhook Name",
"url": "https://myapp.com/webhooks/new-url",
"description": "Updated description",
"isActive": true,
"updatedAt": "2026-02-05T11:00:00.000Z"
}
} Error Response (401)
Authentication failed
Response Body
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
} Error Response (404)
endpointId not found
Response Body
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "The requested resource was not found"
}
} /v2/webhook-endpoints/{endpointId} Delete webhook endpoint
Overview
Delete a webhook endpoint. Cannot delete an endpoint that is in use by active webhooks. Free API - does not count towards usage quota.
Example Request
curl -X DELETE https://api.whereparcel.com/v2/webhook-endpoints/{endpointId} \
-H "Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production" \
-H "Content-Type: application/json"const response = await fetch('https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}', {
method: 'DELETE',
headers: {
"Authorization": "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production",
"Content-Type": "application/json"
}
});
const data = await response.json();
console.log(data);<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
$headers = [
'Authorization: Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);import requests
import json
url = 'https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}'
headers = {
'Authorization': 'Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production',
'Content-Type': 'application/json'
}
response = requests.delete(url, headers=headers)
result = response.json()
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.whereparcel.com/v2/webhook-endpoints/{endpointId}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("Authorization", "Bearer wp_test_public_demo_key_do_not_use_in_production:sk_test_public_demo_secret_do_not_use_in_production")
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))
}Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
endpointId | string | Required | <p>Endpoint ID to delete</p>
Example: endpoint_abc123 |
Response
Success Response (200)
Endpoint deleted successfully
Response Body
{
"success": true,
"message": "Webhook endpoint deleted successfully"
} Error Response (401)
Authentication failed
Response Body
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
} Error Response (404)
endpointId not found
Response Body
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "The requested resource was not found"
}
} Error Response (409)
Cannot delete endpoint that is in use
Response Body
{
"success": false,
"error": {
"code": "ERROR",
"message": "An error occurred"
}
}