Webhook Tester API
Create a unique URL that captures every HTTP request sent to it – method, headers, query and body – then inspect them in the browser or via API.
The Webhook Tester gives you disposable endpoints (“bins”) to debug webhooks and HTTP callbacks. POST /v1/webhooks creates a bin and returns its receiving URL, https://apibox.io.vn/hook/<id>, plus a link to the live viewer. Point Stripe, GitHub, a payment gateway or your own service at that URL: it accepts any HTTP method and any sub-path, and stores the method, path, query string, headers, client IP, country and the body (up to 256 KB; binary bodies are stored as base64).
Read captured requests with GET /v1/webhooks/<id>/requests (newest first, limit 1–100, default 20). Pass since (ISO date or Unix seconds) to poll only for new requests. GET /v1/webhooks lists your active bins, PATCH /v1/webhooks/<id> changes the canned response the receiver sends back (response_status, response_body, response_content_type, name) so you can simulate errors and retries, DELETE /v1/webhooks/<id>/requests clears the history and DELETE /v1/webhooks/<id> removes the bin.
Bins created with an API key live 30 days. Each bin keeps its newest requests according to your plan – Free 50, Starter 500, Pro 2,000 – and you can have 2, 10 or 50 active bins on Free, Starter and Pro. The receiver accepts up to 60 requests per minute per bin.
Parameters
| Name | In | Type | Required | Default | |
|---|---|---|---|---|---|
id | path | string | no | Bin ID for /v1/webhooks/{id} (GET, PATCH, DELETE) and /v1/webhooks/{id}/requests[/{request_id}] (GET, DELETE). | |
name | body | string | no | POST / PATCH: label of the bin (max 100 characters). | |
response_status | body | number | no | 200 | POST / PATCH: HTTP status the receiver answers with (100–599). |
response_body | body | string | no | {"ok":true} | POST / PATCH: response body (max 10,000 characters). |
response_content_type | body | string | no | application/json | POST / PATCH: Content-Type of the response. |
limit | query | number | no | 20 | GET …/requests: number of requests returned (1–100), newest first. |
since | query | string | no | GET …/requests: only requests received after this ISO date or Unix timestamp (seconds). |
Example
curl -X POST "https://apibox.io.vn/v1/webhooks" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Stripe test","response_status":200,"response_body":"{\"received\":true}"}'const res = await fetch('https://apibox.io.vn/v1/webhooks', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Stripe test",
"response_status": 200,
"response_body": "{\"received\":true}"
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/webhooks",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"name": "Stripe test", "response_status": 200, "response_body": "{\"received\":true}"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/webhooks');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"name":"Stripe test","response_status":200,"response_body":"{\\"received\\":true}"}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Response
{
"id": "adovzlj3btginkapev4iir",
"name": "Stripe test",
"url": "https://apibox.io.vn/hook/adovzlj3btginkapev4iir",
"viewer_url": "https://apibox.io.vn/tools/webhook-tester/#adovzlj3btginkapev4iir",
"response": {
"status": 200,
"content_type": "application/json",
"body": "{\"received\":true}"
},
"request_count": 0,
"created_at": "2026-11-10T05:09:53.000Z",
"expires_at": "2026-12-10T05:09:53.000Z"
}
Use cases
- Inspect the exact payload and signature headers a webhook provider sends
- Debug payment gateway callbacks (IPN) before your backend is deployed
- Simulate 500 errors or slow consumers to test a provider’s retry logic
- Assert in end-to-end tests that your app fired the expected HTTP call
FAQ
How do I test a webhook without a public server?
Create a bin (POST /v1/webhooks, or use the online Webhook Tester), paste its https://apibox.io.vn/hook/<id> URL into the provider’s dashboard and trigger an event. The request appears in the viewer within seconds.
Can I change the response the webhook URL returns?
Yes. PATCH /v1/webhooks/<id> with response_status (100–599), response_body (up to 10,000 characters) and response_content_type. The default is 200 with {"ok":true}.
How long are captured requests kept?
Bins created via the API live 30 days and keep their newest 50 / 500 / 2,000 requests depending on your plan (Free / Starter / Pro). Older requests are removed automatically.
Related APIs
Vietnamese Fake Data
Realistic Vietnamese test data: names, addresses on the 2025 map, mobile numbers by network, CCCD and tax codes with a valid structure, companies, bank accounts.
{?}JSON Schema Mock Data
Generate realistic sample JSON from a JSON Schema (types, formats, enums, patterns, ranges, $ref, oneOf / allOf), validated against the schema.
◧Image Diff
Compare two images pixel by pixel (perceptual colour distance, anti-aliasing aware) and get the share of changed pixels, the changed area and a highlighted diff image.