# Webhook Delivery

> Webhook delivery record with event, payload, signature, and delivery status.

- Name: `webhook-delivery`
- Categories: api
- Detail page: https://open-types.dev/types/webhook-delivery

## Install

```bash
# Types only
npx shadcn add @open-types/webhook-delivery

# Types + Zod v4 validators
npx shadcn add @open-types/webhook-delivery-zod

# Types + real-world examples
npx shadcn add @open-types/webhook-delivery-examples
```

## Types

```typescript
export type WebhookDeliveryStatus = "pending" | "delivered" | "failed";

export interface WebhookDelivery {
  id: string;
  event: string;
  timestamp: string;
  payload: Record<string, unknown>;
  url: string;
  signature?: string;
  attempt: number;
  max_attempts: number;
  status: WebhookDeliveryStatus;
}
```

## Zod validator

```typescript
import * as z from "zod";
import type { WebhookDelivery, WebhookDeliveryStatus } from "../types/webhook-delivery";

export const webhookDeliveryStatusSchema = z.enum([
  "pending",
  "delivered",
  "failed",
]) satisfies z.ZodType<WebhookDeliveryStatus>;

export const webhookDeliverySchema = z.object({
  id: z.string().min(1, { error: "Webhook delivery ID is required" }),
  event: z.string().min(1, { error: "Event is required" }),
  timestamp: z.iso.datetime({ error: "Invalid timestamp" }),
  payload: z.record(z.string(), z.unknown()),
  url: z.url({ error: "Webhook URL must be valid" }),
  signature: z.string().optional(),
  attempt: z.number().int().min(0, { error: "Attempt must be greater than or equal to 0" }),
  max_attempts: z.number().int().min(1, { error: "Max attempts must be at least 1" }),
  status: webhookDeliveryStatusSchema,
}) satisfies z.ZodType<WebhookDelivery>;

export type { WebhookDelivery, WebhookDeliveryStatus } from "../types/webhook-delivery";
```

## Examples

```typescript
// Source: hand-crafted; modeled after Stripe/GitHub webhook delivery records
import type {
  WebhookDeliveryStatus,
  WebhookDelivery,
} from "../types/webhook-delivery";

export const webhookDeliveryStatusExamples = {
  pending: "pending",
  delivered: "delivered",
  failed: "failed",
} as const satisfies Record<string, WebhookDeliveryStatus>;

const delivered = {
  id: "del_01HABCDEF0123456789ABCDE",
  event: "order.created",
  timestamp: "2026-05-16T18:30:00Z",
  payload: { order_id: "ord_42", total: 9999 },
  url: "https://example.com/webhooks/orders",
  signature: "t=1715865000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd",
  attempt: 1,
  max_attempts: 5,
  status: "delivered",
} as const satisfies WebhookDelivery;

export const webhookDeliveryExamples = {
  delivered,
  pending: {
    ...delivered,
    id: "del_pending_001",
    status: "pending",
    attempt: 0,
  } satisfies WebhookDelivery,
  retrying: {
    ...delivered,
    id: "del_retry_002",
    status: "failed",
    attempt: 3,
  } satisfies WebhookDelivery,
  exhausted: {
    ...delivered,
    id: "del_exhausted_003",
    status: "failed",
    attempt: 5,
  } satisfies WebhookDelivery,
  noSignature: {
    ...delivered,
    id: "del_nosig_004",
    signature: undefined,
  } satisfies WebhookDelivery,
} as const;
```
