Agent skill

Uber Webhooks Skill

Receive and verify Uber Eats webhooks. Use when setting up Uber webhook handlers, debugging X-Uber-Signature verification, or handling order events like orders.notification, orders.cancel, store.provisioned, or store.status.changed.

Install this skill

npx skills add hookdeck/webhook-skills --skill uber-webhooks


When to Use This Skill

  • How do I receive Uber Eats webhooks?
  • How do I verify Uber webhook signatures?
  • Why is my X-Uber-Signature verification failing?
  • How do I handle orders.notification or orders.cancel events?
  • Setting up an Uber Eats webhook receiver in Express, Next.js, or FastAPI

Verification (core)

Uber Eats signs the raw request body with HMAC-SHA256 keyed on your app's client secret and sends the digest as a lowercased hex string in the X-Uber-Signature header (no sha256= prefix). Pass the raw body bytes, compute the digest, and compare timing-safe.

Node:

const crypto = require('crypto');

function verifyUberWebhook(rawBody, signatureHeader, clientSecret) {
  if (!signatureHeader) return false;
  const expected = crypto
    .createHmac('sha256', clientSecret)
    .update(rawBody)
    .digest('hex');
  try {
    return crypto.timingSafeEqual(
      Buffer.from(signatureHeader, 'hex'),
      Buffer.from(expected, 'hex')
    );
  } catch {
    return false;
  }
}

Python:

import hmac, hashlib

def verify_uber_webhook(raw_body: bytes, signature_header: str, client_secret: str) -> bool:
    if not signature_header:
        return False
    expected = hmac.new(client_secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(signature_header, expected)

For complete handlers with route wiring, event dispatch, and tests, see:

Common Event Types

The event type is in the JSON body's event_type field (not a header).

EventDescription
orders.notificationNew order created
orders.cancelOrder cancelled (non-v1.0.0 stores)
orders.failureOrder cancelled (API v1.0.0 only)
orders.releaseFast order release: courier reached the geo-fence
orders.scheduled.notificationScheduled order created (API v1.0.0 only)
order.fulfillment_issues.resolvedCustomer confirmed a fulfillment change
store.provisionedStore granted app access
store.deprovisionedStore access removed
store.status.changedStore online status changed

For the full event reference, see Uber Eats Webhooks.

Important Headers

HeaderDescription
X-Uber-SignatureLowercased hex HMAC-SHA256 of the raw body, keyed with client secret
X-Uber-DeliveryUnique delivery/attempt identifier

Acknowledging Deliveries

Respond with HTTP 200 and an empty body to acknowledge. Uber retries on 500/502/503/504, timeouts, and network errors with backoff (10s, 30s, 60s, 120s, then exponential, up to ~7 attempts).

Environment Variables

UBER_CLIENT_SECRET=your_app_client_secret   # From the Uber Developer Dashboard

Note: Uber Direct (Deliveries) webhooks use a different scheme — a dedicated per-webhook Signing Key (not the client secret) sent as x-uber-signature / x-postmates-signature. See references/verification.md.

Local Development

# Start tunnel (no account needed)
npx hookdeck-cli listen 3000 uber --path /webhooks/uber

Reference Materials


Repository

hookdeck/webhook-skills

v0.1.0 · MIT · Updated Aug 3, 2026

View on GitHub →