What you need
Use curl, jq and a POSIX shell, or connect an MCP client through the setup guide. A webhook is an HTTP callback: the sending service posts an event to your public URL. An inbox lets you inspect that request before connecting it to application logic.
1. Create an inbox
Run this in one shell session. The private token stays in a variable; do not enable shell tracing or paste the response into a public issue.
OPENHOOK_URL='https://openhook.dev'
INBOX=$(curl --fail-with-body -sS "$OPENHOOK_URL/api/v1/call" \
-H 'Content-Type: application/json' -d '{"action":"create"}')
OPENHOOK_TOKEN=$(printf '%s' "$INBOX" | jq -er '.data.token')
CAPTURE_URL=$(printf '%s' "$INBOX" | jq -er '.data.url')Share CAPTURE_URL with the sender. The capture address cannot read stored events. OPENHOOK_TOKEN can read and delete them, so treat it as a password.
2. Send a test request
curl --fail-with-body -sS "$CAPTURE_URL" \
-H 'Content-Type: application/json' \
-d '{"event":"example.completed","test":true}'A successful capture means Openhook stored the request. It does not prove that your application processed it. Use provider sandbox events when testing an actual payment or account workflow.
3. Read the captured event
jq -nc --arg token "$OPENHOOK_TOKEN" \
'{token:$token,since:0,timeout_seconds:5}' | \
curl --fail-with-body -sS "$OPENHOOK_URL/api/v1/wait" \
-H 'Content-Type: application/json' --data-binary @- | \
jq '.data | {request, next_since, timeout}'The event includes the method, URL, headers, a text content view and body_base64 for exact bytes. Starting at since: 0 includes requests that arrived before the wait. Store next_since after processing succeeds and pass it to the next wait.
If the wait times out, request is null. Check the capture URL, sender delivery log and inbox expiry before sending another request. A 429 response includes Retry-After; a full inbox needs cleanup.
The same workflow through MCP
Ask your connected agent:
Create an Openhook inbox for a webhook test. Keep its private token with this task and give me only the public capture URL. Wait with since: 0, inspect the method, headers and JSON body, and tell me whether event is example.completed.
The underlying tools are create_webhook and wait_for_request. A wait continues a running agent session; it does not restart a closed session. See the tool reference for schemas.
4. Clean up
jq -nc --arg token "$OPENHOOK_TOKEN" '{action:"delete",token:$token}' | \
curl --fail-with-body -sS "$OPENHOOK_URL/api/v1/call" \
-H 'Content-Type: application/json' --data-binary @-Remove any provider webhook subscription before deleting its inbox. Free inboxes expire within seven days and retain up to 1000 events. For recurring tests with a stable address, compare hosted plans.
Next: send captured events to a local handler or connect GitHub events.