Playground API
DocsStatsBlogStudio
Documentation Tree
Technical BlogFeature Deep Dives
  • Introduction
  • Quickstart
    5 min
  • How It Works
  • Recipes & Cookbooks
  • Platform Comparisons
  • Real-World Showcase
  • Interactive Studio
    Studio
  • GraphiQL IDE
    IDE
  • Session Quotas & Activity
  • Network Chaos Simulator
  • Atomic Sandbox Reset
  • Overview & Models
    Hub
  • Users Resource
  • Posts Resource
  • Comments Resource
  • Todos Resource
  • Custom Collections
    Custom
  • Multipart File Uploads
    Upload
  • Dynamic SVG Avatars
    SVG
  • Image Thumbnails
    CDN
  • Relational Filtering
  • Full-Text Search
  • Dynamic Sorting
  • Offset Pagination
  • Cursor Pagination
    Scroll
  • CSV & Excel Export & Import
    IO
  • Custom Collections
    CRUD
  • Overview & Architecture
    Hub
  • JWT Auth Flow
  • Refresh Token Rotation
    Mutex
  • RBAC Permission Matrix
    Roles
  • Expiry Simulation
  • Clock Skew Drift
  • Password Recovery Loop
  • Dual-Mode Sandboxing
  • GraphiQL IDE
    IDE
  • Relational Queries
  • Stateful Mutations
  • Realtime Subscriptions
  • Overview & Flowcharts
    Hub
  • Hosted Checkout
    Stripe
  • Payment Intents API
  • 3DS Challenge Modal
    Modal
  • Customers Vault
  • Charges & Refunds
  • Test Cards Catalog
  • Overview & Channels
    Hub
  • Virtual Email Mailbox
    Mailtrap
  • Virtual SMS Terminal
    Phone
  • In-App Notifications
  • Message Dispatcher
  • Realtime Studio
    Studio
  • Native WebSocket (/ws)
  • Socket.io Gateway
  • Presence & Echo Bot
  • Server-Sent Events (SSE)
    SSE
  • Analytics Telemetry
  • Webhook Subscriptions
  • HMAC SHA-256 Signatures
  • Delivery Logs
  • Manual Retry Simulator
  • Network Latency Delay
  • HTTP Status Codes
  • Rate-Limit Simulator
    429
  • Flaky Network & Jitter
    Chaos
  • Session Quotas & Activity
  • JSON Snapshots
    JSON
  • Headless CI/CD Testing
    CI
  • Mobile QR Code Sync
  • System Metrics & Health
  • Atomic Sandbox Reset
  • Official TypeScript SDK
  • Multi-Language Generators
  • DevTools Extension
  • OpenAPI 3.1 Spec
    JSON
  • Postman Collection v2.1
  • Bruno Collection
  • Insomnia Workspace
  • TypeScript .d.ts
    .d.ts
  • AI Prompt Rules
    Rules
  • Context Index (llms.txt)
  • Full Schema (llms-full.txt)
  • Manifest (product.json)
  • All Feature Articles
    Blog
  • React CRUD Without Backend
    Deep Dive
  • Why Static APIs Fail
  • Mocking Stateful Auth
  • WebSockets & SSE Guide
Technical Blog
Articles

In-depth articles explaining stateful mock APIs, WebSockets, payments, and frontend resilience.

Read Articles
PreviousDelivery Logs
NextNetwork Latency Delay
Outgoing Webhooks

Manual Retry & Synthetic Event Dispatcher

Trigger immediate synthetic webhook events on demand to test receiver handlers, or replay previously failed dispatches using the redelivery endpoint without modifying underlying database records.

Interactive Retry & Synthetic Dispatcher

Select a simulation scenario below to dispatch an ad-hoc event or replay a delivery log:

Dispatch Synthetic Event

Dispatches an on-demand test webhook to any target URL to verify receiver processing.

POST
response.json
1
{
2
// Click "Send" above to execute this request against the live server.
3
}

Receiver Idempotency Architecture

Because network retries and manual replays can cause duplicate deliveries ("at-least-once delivery"), webhook receivers must record the X-Playground-Delivery header before processing mutations:

1
// Redis Idempotency Pattern for Webhook Consumers (Node.js/Express)
2
import Redis from 'ioredis';
3
const redis = new Redis(process.env.REDIS_URL);
4
5
app.post('/api/webhooks', async (req, res) => {
6
const deliveryId = req.headers['x-playground-delivery'];
7
if (!deliveryId) {
8
return res.status(400).json({ error: 'Missing X-Playground-Delivery header' });
9
}
10
11
// 1. Atomic lock with 24-hour expiration (SETNX)
12
const lockKey = webhook:processed:${deliveryId};
13
const isNew = await redis.set(lockKey, '1', 'EX', 86400, 'NX');
14
15
if (!isNew) {
16
console.warn(Duplicate webhook delivery detected [${deliveryId}]. Skipping reprocessing.);
17
// Return 200 OK immediately so dispatcher does not retry
18
return res.status(200).json({ status: 'already_processed', deliveryId });
19
}
20
21
try {
22
// 2. Process domain business logic safely
23
await handleEvent(req.body.event, req.body.data);
24
return res.status(200).json({ status: 'success', deliveryId });
25
} catch (err) {
26
// Release key on fatal failure to allow legitimate manual retry
27
await redis.del(lockKey);
28
return res.status(500).json({ error: 'Processing failure' });
29
}
30
});

Retry Strategies & Failure Recovery

Comparison of standard delivery recovery patterns in event-driven systems:

PatternTrigger MechanismPayload GuaranteeBest Use Case
Automated Exponential BackoffNon-2xx response or network timeout (retried at 5s, 30s, 5m, 1h).Same payload, new timestampTransient network blips, cold starts, and rolling server deployments.
Dead-Letter Queue (DLQ)Exhaustion of maximum automated retries (e.g. after 5 failures).Archived immutable payloadLong-term outage isolation and manual engineering triage.
Manual Redelivery APIExplicit POST to /deliveries/:id/redeliver.Exact replay with original eventDebugging receiver bugfixes, local tunnel testing, and idempotency tests.