Glyde Webhook API
Subscribe to real-time events across your restaurant operations. Receive instant HTTP callbacks when data changes — from check updates and payment captures to menu edits and shift changes.
🔑 Authentication
All webhook management endpoints require a Glyde API key passed via the Authorization header. Generate keys from the Glyde Dashboard → Developer → API Keys.
Authorization: Bearer glyde_sk_live_a1b2c3d4e5f6...
⚙ Managing Subscriptions
Create, list, update, and delete webhook subscriptions. Each subscription targets a single URL and can listen to one or more event types.
Create a Subscription
{
"url": "https://yourapp.com/glyde/webhooks",
"events": [
"restaurant.updated",
"check.updated",
"check.closed",
"payment.completed"
],
"restaurant_ids": ["rst_8f3k..."], // optional — omit for all locations
"description": "Production POS integration",
"metadata": { "team": "integrations" }
}
| Parameter | Type | Description |
|---|---|---|
| url required | string | HTTPS endpoint that will receive POST requests. Must return 2xx within 15 seconds. |
| events required | string[] | Array of event types to subscribe to. Use "*" for all events. |
| restaurant_ids | string[] | Scope to specific restaurant locations. Omit to receive events for all locations in your organization. |
| description | string | Human-readable label for this subscription. |
| metadata | object | Arbitrary key-value pairs stored with the subscription. |
{
"id": "whk_9x4mT...",
"url": "https://yourapp.com/glyde/webhooks",
"events": ["restaurant.updated", "check.updated", ...],
"secret": "whsec_a1b2c3d4e5f6g7h8...",
"status": "active",
"created_at": "2026-02-17T14:30:00Z"
}
secret is only returned once at creation. Store it securely — you'll need it to verify webhook signatures.List Subscriptions
// Returns an array of all active webhook subscriptionsUpdate a Subscription
{
"events": ["check.*", "payment.*"],
"status": "paused"
}
Delete a Subscription
// Returns 204 No Content📦 Payload Format
Every webhook delivery is an HTTP POST with a JSON body following a consistent envelope structure.
{
"id": "evt_3kLm9...",
"type": "check.updated",
"api_version": "2026-02-01",
"created_at": "2026-02-17T14:32:10.482Z",
"restaurant_id": "rst_8f3k...",
"data": {
// Event-specific payload — see event reference below
},
"previous_attributes": {
// For *.updated events — contains the changed fields' prior values
}
}
Delivery Headers
Content-Type: application/json Glyde-Webhook-Id: evt_3kLm9... Glyde-Webhook-Timestamp: 1708181530 Glyde-Webhook-Signature: v1=5a3c1e9b...
🔄 Retries & Reliability
Glyde expects your endpoint to return a 2xx status within 15 seconds. If your endpoint fails or times out, we'll retry with exponential backoff.
| Attempt | Delay | Max Elapsed |
|---|---|---|
| 1st retry | 30 seconds | ~30s |
| 2nd retry | 2 minutes | ~2.5m |
| 3rd retry | 15 minutes | ~17m |
| 4th retry | 1 hour | ~1h 17m |
| 5th retry | 4 hours | ~5h 17m |
failed and the subscription's status changes to degraded. Consecutive failures over 72 hours will automatically pause the subscription.🛡 Verifying Signatures
Every webhook includes an HMAC-SHA256 signature computed from the payload body and your subscription secret. Always verify signatures to ensure authenticity.
import crypto from 'crypto'; function verifyGlydeSignature(payload, headers, secret) { const timestamp = headers['glyde-webhook-timestamp']; const signature = headers['glyde-webhook-signature']; // Reject timestamps older than 5 minutes to prevent replay attacks const age = Math.floor(Date.now() / 1000) - parseInt(timestamp); if (age > 300) throw new Error('Timestamp too old'); const signed = `${timestamp}.${payload}`; const expected = 'v1=' + crypto .createHmac('sha256', secret) .update(signed) .digest('hex'); if (!crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expected) )) throw new Error('Invalid signature'); return true; }
Event Reference
All available event types organized by domain. Use wildcard patterns like check.* to subscribe to all events in a category.
🏪 Restaurant Events
Fired when restaurant-level information changes — profile details, operating hours, service areas, and configuration.
Example: restaurant.updated
{
"id": "evt_r3jk9...",
"type": "restaurant.updated",
"created_at": "2026-02-17T10:15:00Z",
"restaurant_id": "rst_8f3k...",
"data": {
"id": "rst_8f3k...",
"name": "TGI Fridays — DFW Terminal B",
"phone": "+12145551234",
"address": {
"line_1": "2400 Aviation Dr, Terminal B",
"city": "DFW Airport",
"state": "TX",
"postal_code": "75261"
},
"timezone": "America/Chicago"
},
"previous_attributes": {
"phone": "+12145559876"
}
}
🧾 Check Events
Real-time updates on check lifecycle — from creation through close. Includes balance changes, item-level detail, applied discounts, and split-check operations.
Example: check.updated
{
"id": "evt_ck29a...",
"type": "check.updated",
"created_at": "2026-02-17T19:42:08Z",
"restaurant_id": "rst_8f3k...",
"data": {
"id": "chk_m2x7...",
"check_number": 1047,
"table": "B-12",
"server": { "id": "emp_4v...", "name": "Jamie R." },
"guest_count": 3,
"order_type": "dine_in",
"items": [
{
"id": "itm_x1...",
"name": "Loaded Potato Skins",
"quantity": 1,
"price": 12.49,
"modifiers": ["extra bacon", "no sour cream"],
"status": "sent",
"sent_at": "2026-02-17T19:42:08Z"
}
],
"subtotal": 47.96,
"tax": 3.96,
"discounts": 0.00,
"total": 51.92,
"balance_due": 51.92,
"opened_at": "2026-02-17T19:28:00Z"
},
"previous_attributes": {
"subtotal": 35.47,
"total": 38.68,
"balance_due": 38.68
}
}
📋 Order Events
Track the fulfillment lifecycle of orders — from kitchen firing to completion. Ideal for KDS integrations, delivery orchestration, and real-time order tracking.
⚠ Error Handling
HTTP status codes returned by the webhook management API.
✓ Best Practices
2xx immediately and process the payload asynchronously. If your handler takes longer than 15 seconds, Glyde will treat it as a failure and retry.
id field on every event for idempotency. The same event may be delivered more than once during retries — your handler should safely ignore duplicates.
Glyde-Webhook-Signature header. This protects against spoofed deliveries.
previous_attributes for diffing. On *.updated events, only the changed fields appear in previous_attributes. Compare against data to see exactly what changed without fetching the full resource.
check.*) rather than "*" to reduce noise and minimize processing overhead.
⏱ Rate Limits
Webhook management API endpoints are rate-limited per API key.
| Endpoint | Limit | Window |
|---|---|---|
POST /v1/webhooks | 10 requests | per minute |
GET /v1/webhooks | 60 requests | per minute |
PATCH /v1/webhooks/{id} | 30 requests | per minute |
DELETE /v1/webhooks/{id} | 10 requests | per minute |
🏷 Versioning
The Glyde Webhook API uses date-based versioning. Every webhook payload includes an api_version field so you can handle schema evolution gracefully.
| Version | Status | Changes |
|---|---|---|
2026-02-01 |
Current | Initial release — all event types documented on this page. |
api_version parameter during creation.