Use this playbook when you are debugging oversized JSON bodies, binary webhook uploads, or webhook payloads that are too large to keep inline in the normal log dataset.
{
"urlCount": 1,
"retentionHours": 72,
"authKey": "payload-forensics-key",
"maxPayloadSize": 10485760,
"enableJSONParsing": true,
"maskSensitiveData": true,
"redactBodyPaths": [
"body.customer.email"
],
"defaultResponseCode": 200,
"defaultResponseBody": "{\"received\":true}",
"replayMaxRetries": 3,
"replayTimeoutMs": 15000
}- Text-like payloads are stored as UTF-8 strings.
- Binary payloads are stored as base64 and tagged with
bodyEncodingin log detail views. - Large payloads above the KVS offload threshold are replaced in normal log views with an offload marker object.
/logs/:logId/payloadhydrates the full stored payload, and replay also hydrates offloaded payloads automatically.
- Large events by size:
GET /logs?webhookId=<your-webhook-id>&size[gte]=1000000
- Binary or file-like traffic by content type:
GET /logs?webhookId=<your-webhook-id>&contentType=application/pdf
- Full payload retrieval for an offloaded event:
GET /logs/<log-id>/payload
contentTypeto understand whether the payload should have been parsed as JSON, text, or binary.sizeto determine whether the payload likely crossed the KVS offload threshold./logs/:logIdforbodyEncodingand the inline offload marker./logs/:logId/payloadfor the full raw payload.
| Signal | What it usually means | What to do |
|---|---|---|
| Inline body contains an offload marker object | The payload was too large for inline dataset storage | Fetch /logs/:logId/payload before diffing or replaying the event. |
| Binary content is unreadable in the normal log row | The body was stored as base64 | Inspect bodyEncoding in the log detail, then use the payload route for the raw content. |
| Replay looks incomplete for a large event | You replayed based on the inline row only | Use the built-in replay route so the actor hydrates the full KVS-backed payload automatically. |
- Capture the event with a large enough
maxPayloadSizeto avoid immediate request rejection. - Query by
size[gte]orcontentTypeto locate the affected request quickly. - Pull
/logs/:logId/payloadfor the full body. - Replay the exact captured payload to a test receiver if you need to validate parser or storage changes:
curl -X POST \
"https://<your-actor-host>/replay/<webhookId>/<logId>?url=https%3A%2F%2Fstaging.example.com%2Fpayload-test"