# Webhooks

## Create Webhook

**post** `/print-mail/v1/webhooks`

Create a Webhook.

### Body Parameters

- `enabledEvents: array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

  The list of event types this webhook listens for.

  - `"letter.created"`

  - `"letter.updated"`

  - `"postcard.created"`

  - `"postcard.updated"`

  - `"self_mailer.created"`

  - `"self_mailer.updated"`

  - `"cheque.created"`

  - `"cheque.updated"`

  - `"box.created"`

  - `"box.updated"`

  - `"snap_pack.created"`

  - `"snap_pack.updated"`

  - `"return_envelope_order.created"`

  - `"return_envelope_order.updated"`

  - `"tracker.visited"`

  - `"campaign.created"`

  - `"campaign.updated"`

  - `"virtual_mailbox_item.created"`

  - `"postal_statement.created"`

  - `"document.created"`

  - `"document.updated"`

- `url: string`

  An HTTPS URL that PostGrid can invoke for webhook deliveries.

- `description: optional string`

  An optional string describing this resource. Will be visible in the API and the dashboard.

- `metadata: optional map[unknown]`

  See the section on Metadata.

- `payloadFormat: optional "jwt" or "json"`

  The format in which a Webhook's event payload is delivered.

  - `"jwt"`

  - `"json"`

- `secret: optional string`

  A webhook signing secret with at least 20 non-whitespace characters.

### Returns

- `Webhook object { id, createdAt, enabled, 9 more }`

  - `id: string`

    A unique ID prefixed with webhook_

  - `createdAt: string`

    The UTC time at which this resource was created.

  - `enabled: boolean`

    Whether this webhook is enabled. Disabled webhooks are not triggered.

  - `enabledEvents: array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The list of event types this webhook listens for.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `live: boolean`

    `true` if this is a live mode resource else `false`.

  - `object: "webhook"`

    Always `webhook`.

    - `"webhook"`

  - `updatedAt: string`

    The UTC time at which this resource was last updated.

  - `url: string`

    An HTTPS URL that PostGrid can invoke for webhook deliveries.

  - `description: optional string`

    An optional string describing this resource. Will be visible in the API and the dashboard.

  - `metadata: optional map[unknown]`

    See the section on Metadata.

  - `payloadFormat: optional "jwt" or "json"`

    The format in which a Webhook's event payload is delivered.

    - `"jwt"`

    - `"json"`

  - `secret: optional string`

    A webhook signing secret with at least 20 non-whitespace characters.

### Example

```http
curl https://api.postgrid.com/print-mail/v1/webhooks \
    -H 'Content-Type: application/json' \
    -H "X-API-Key: $POSTGRID_PRINT_MAIL_API_KEY" \
    -d '{
          "enabledEvents": [
            "letter.created"
          ],
          "url": "https://example.com/postgrid-webhook"
        }'
```

#### Response

```json
{
  "id": "webhook_skN2ZTvFwS62oc5tJY1gzw",
  "object": "webhook",
  "live": false,
  "description": "Letter Created",
  "url": "https://example.com/postgrid-webhook",
  "enabledEvents": [
    "letter.created"
  ],
  "payloadFormat": "jwt",
  "enabled": true,
  "secret": "webhook_secret_xkNXtQ4jHevFdkTG3mSf1Q",
  "createdAt": "2022-02-16T18:37:02.048Z",
  "updatedAt": "2022-02-16T18:37:02.048Z"
}
```

## List Webhooks

**get** `/print-mail/v1/webhooks`

Retrieve a paginated list of Webhooks.

### Query Parameters

- `limit: optional number`

- `search: optional string`

  You can supply any string to help narrow down the list of resources. For example, if you pass `"New York"` (quoted), it will return resources that have that string present somewhere in their response. Alternatively, you can supply a structured search query. See the documentation on `StructuredSearchQuery` for more details.

- `skip: optional number`

### Returns

- `data: array of Webhook`

  - `id: string`

    A unique ID prefixed with webhook_

  - `createdAt: string`

    The UTC time at which this resource was created.

  - `enabled: boolean`

    Whether this webhook is enabled. Disabled webhooks are not triggered.

  - `enabledEvents: array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The list of event types this webhook listens for.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `live: boolean`

    `true` if this is a live mode resource else `false`.

  - `object: "webhook"`

    Always `webhook`.

    - `"webhook"`

  - `updatedAt: string`

    The UTC time at which this resource was last updated.

  - `url: string`

    An HTTPS URL that PostGrid can invoke for webhook deliveries.

  - `description: optional string`

    An optional string describing this resource. Will be visible in the API and the dashboard.

  - `metadata: optional map[unknown]`

    See the section on Metadata.

  - `payloadFormat: optional "jwt" or "json"`

    The format in which a Webhook's event payload is delivered.

    - `"jwt"`

    - `"json"`

  - `secret: optional string`

    A webhook signing secret with at least 20 non-whitespace characters.

- `limit: number`

- `object: "list"`

  - `"list"`

- `skip: number`

- `totalCount: number`

### Example

```http
curl https://api.postgrid.com/print-mail/v1/webhooks \
    -H "X-API-Key: $POSTGRID_PRINT_MAIL_API_KEY"
```

#### Response

```json
{
  "object": "list",
  "limit": 10,
  "skip": 0,
  "totalCount": 1,
  "data": [
    {
      "id": "webhook_skN2ZTvFwS62oc5tJY1gzw",
      "object": "webhook",
      "live": false,
      "description": "Letter Created",
      "url": "https://example.com/postgrid-webhook",
      "enabledEvents": [
        "letter.created"
      ],
      "payloadFormat": "jwt",
      "enabled": true,
      "secret": "webhook_secret_xkNXtQ4jHevFdkTG3mSf1Q",
      "createdAt": "2022-02-16T18:37:02.048Z",
      "updatedAt": "2022-02-16T18:37:02.048Z"
    }
  ]
}
```

## Update Webhook

**post** `/print-mail/v1/webhooks/{id}`

Update a Webhook by ID.

### Path Parameters

- `id: string`

### Body Parameters

- `description: optional string`

  An optional string describing this resource. Will be visible in the API and the dashboard.

- `enabled: optional boolean`

  Whether this webhook is enabled. Disabled webhooks are not triggered.

- `enabledEvents: optional array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

  The list of event types this webhook listens for.

  - `"letter.created"`

  - `"letter.updated"`

  - `"postcard.created"`

  - `"postcard.updated"`

  - `"self_mailer.created"`

  - `"self_mailer.updated"`

  - `"cheque.created"`

  - `"cheque.updated"`

  - `"box.created"`

  - `"box.updated"`

  - `"snap_pack.created"`

  - `"snap_pack.updated"`

  - `"return_envelope_order.created"`

  - `"return_envelope_order.updated"`

  - `"tracker.visited"`

  - `"campaign.created"`

  - `"campaign.updated"`

  - `"virtual_mailbox_item.created"`

  - `"postal_statement.created"`

  - `"document.created"`

  - `"document.updated"`

- `metadata: optional map[unknown]`

  See the section on Metadata.

- `payloadFormat: optional "jwt" or "json"`

  The format in which a Webhook's event payload is delivered.

  - `"jwt"`

  - `"json"`

- `secret: optional string`

  A webhook signing secret with at least 20 non-whitespace characters.

- `url: optional string`

  An HTTPS URL that PostGrid can invoke for webhook deliveries.

### Returns

- `Webhook object { id, createdAt, enabled, 9 more }`

  - `id: string`

    A unique ID prefixed with webhook_

  - `createdAt: string`

    The UTC time at which this resource was created.

  - `enabled: boolean`

    Whether this webhook is enabled. Disabled webhooks are not triggered.

  - `enabledEvents: array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The list of event types this webhook listens for.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `live: boolean`

    `true` if this is a live mode resource else `false`.

  - `object: "webhook"`

    Always `webhook`.

    - `"webhook"`

  - `updatedAt: string`

    The UTC time at which this resource was last updated.

  - `url: string`

    An HTTPS URL that PostGrid can invoke for webhook deliveries.

  - `description: optional string`

    An optional string describing this resource. Will be visible in the API and the dashboard.

  - `metadata: optional map[unknown]`

    See the section on Metadata.

  - `payloadFormat: optional "jwt" or "json"`

    The format in which a Webhook's event payload is delivered.

    - `"jwt"`

    - `"json"`

  - `secret: optional string`

    A webhook signing secret with at least 20 non-whitespace characters.

### Example

```http
curl https://api.postgrid.com/print-mail/v1/webhooks/$ID \
    -H 'Content-Type: application/json' \
    -H "X-API-Key: $POSTGRID_PRINT_MAIL_API_KEY" \
    -d '{}'
```

#### Response

```json
{
  "id": "webhook_skN2ZTvFwS62oc5tJY1gzw",
  "object": "webhook",
  "live": false,
  "description": "Letter creates and updates",
  "url": "https://example.com/postgrid-webhook",
  "enabledEvents": [
    "letter.created",
    "letter.updated"
  ],
  "payloadFormat": "jwt",
  "enabled": true,
  "secret": "webhook_secret_xkNXtQ4jHevFdkTG3mSf1Q",
  "createdAt": "2022-02-16T18:37:02.048Z",
  "updatedAt": "2022-02-16T18:37:14.021Z"
}
```

## Get Webhook

**get** `/print-mail/v1/webhooks/{id}`

Retrieve a Webhook by ID.

### Path Parameters

- `id: string`

### Returns

- `Webhook object { id, createdAt, enabled, 9 more }`

  - `id: string`

    A unique ID prefixed with webhook_

  - `createdAt: string`

    The UTC time at which this resource was created.

  - `enabled: boolean`

    Whether this webhook is enabled. Disabled webhooks are not triggered.

  - `enabledEvents: array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The list of event types this webhook listens for.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `live: boolean`

    `true` if this is a live mode resource else `false`.

  - `object: "webhook"`

    Always `webhook`.

    - `"webhook"`

  - `updatedAt: string`

    The UTC time at which this resource was last updated.

  - `url: string`

    An HTTPS URL that PostGrid can invoke for webhook deliveries.

  - `description: optional string`

    An optional string describing this resource. Will be visible in the API and the dashboard.

  - `metadata: optional map[unknown]`

    See the section on Metadata.

  - `payloadFormat: optional "jwt" or "json"`

    The format in which a Webhook's event payload is delivered.

    - `"jwt"`

    - `"json"`

  - `secret: optional string`

    A webhook signing secret with at least 20 non-whitespace characters.

### Example

```http
curl https://api.postgrid.com/print-mail/v1/webhooks/$ID \
    -H "X-API-Key: $POSTGRID_PRINT_MAIL_API_KEY"
```

#### Response

```json
{
  "id": "webhook_skN2ZTvFwS62oc5tJY1gzw",
  "object": "webhook",
  "live": false,
  "description": "Letter Created",
  "url": "https://example.com/postgrid-webhook",
  "enabledEvents": [
    "letter.created"
  ],
  "payloadFormat": "jwt",
  "enabled": true,
  "secret": "webhook_secret_xkNXtQ4jHevFdkTG3mSf1Q",
  "createdAt": "2022-02-16T18:37:02.048Z",
  "updatedAt": "2022-02-16T18:37:02.048Z"
}
```

## Delete Webhook

**delete** `/print-mail/v1/webhooks/{id}`

Delete a Webhook by ID. Note that this operation cannot be undone.

### Path Parameters

- `id: string`

### Returns

- `id: string`

  A unique ID prefixed with webhook_

- `deleted: true`

  - `true`

- `object: "webhook"`

  Always `webhook`.

  - `"webhook"`

### Example

```http
curl https://api.postgrid.com/print-mail/v1/webhooks/$ID \
    -X DELETE \
    -H "X-API-Key: $POSTGRID_PRINT_MAIL_API_KEY"
```

#### Response

```json
{
  "id": "webhook_skN2ZTvFwS62oc5tJY1gzw",
  "object": "webhook",
  "deleted": true
}
```

## List Webhook Invocations

**get** `/print-mail/v1/webhooks/{id}/invocations`

Retrieve a paginated list of invocations for a Webhook.

### Path Parameters

- `id: string`

### Query Parameters

- `limit: optional number`

- `search: optional string`

  You can supply any string to help narrow down the list of resources. For example, if you pass `"New York"` (quoted), it will return resources that have that string present somewhere in their response. Alternatively, you can supply a structured search query. See the documentation on `StructuredSearchQuery` for more details.

- `skip: optional number`

### Returns

- `data: array of WebhookInvocation`

  - `id: string`

    A unique ID prefixed with `webhook_invocation_`.

  - `createdAt: string`

    The UTC time at which this invocation was created.

  - `event: string`

    The ID of the event that was delivered in this invocation.

  - `object: "webhook_invocation"`

    Always `webhook_invocation`.

    - `"webhook_invocation"`

  - `statusCode: number`

    The HTTP status code returned by your endpoint for this invocation.

  - `type: "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The type of event that a Webhook can listen for and that an Event represents.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `updatedAt: string`

    The UTC time at which this invocation was last updated.

  - `webhook: string`

    The ID of the webhook that was invoked.

  - `orderID: optional string`

    The ID of the order associated with this invocation, if the event was order-related.

- `limit: number`

- `object: "list"`

  - `"list"`

- `skip: number`

- `totalCount: number`

### Example

```http
curl https://api.postgrid.com/print-mail/v1/webhooks/$ID/invocations \
    -H "X-API-Key: $POSTGRID_PRINT_MAIL_API_KEY"
```

#### Response

```json
{
  "object": "list",
  "limit": 10,
  "skip": 0,
  "totalCount": 1,
  "data": [
    {
      "id": "webhook_invocation_6TAGtJezjUyGFnznTRdX37",
      "object": "webhook_invocation",
      "webhook": "webhook_skN2ZTvFwS62oc5tJY1gzw",
      "event": "event_r1nfP4xAacyqMYtt7PeyFD",
      "orderID": "letter_rqfnwvzq5TUsYR2r6L9V8X",
      "type": "letter.created",
      "statusCode": 200,
      "createdAt": "2021-04-02T02:09:32.066Z",
      "updatedAt": "2021-04-02T02:09:32.066Z"
    }
  ]
}
```

## Domain Types

### Webhook

- `Webhook object { id, createdAt, enabled, 9 more }`

  - `id: string`

    A unique ID prefixed with webhook_

  - `createdAt: string`

    The UTC time at which this resource was created.

  - `enabled: boolean`

    Whether this webhook is enabled. Disabled webhooks are not triggered.

  - `enabledEvents: array of "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The list of event types this webhook listens for.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `live: boolean`

    `true` if this is a live mode resource else `false`.

  - `object: "webhook"`

    Always `webhook`.

    - `"webhook"`

  - `updatedAt: string`

    The UTC time at which this resource was last updated.

  - `url: string`

    An HTTPS URL that PostGrid can invoke for webhook deliveries.

  - `description: optional string`

    An optional string describing this resource. Will be visible in the API and the dashboard.

  - `metadata: optional map[unknown]`

    See the section on Metadata.

  - `payloadFormat: optional "jwt" or "json"`

    The format in which a Webhook's event payload is delivered.

    - `"jwt"`

    - `"json"`

  - `secret: optional string`

    A webhook signing secret with at least 20 non-whitespace characters.

### Webhook Invocation

- `WebhookInvocation object { id, createdAt, event, 6 more }`

  - `id: string`

    A unique ID prefixed with `webhook_invocation_`.

  - `createdAt: string`

    The UTC time at which this invocation was created.

  - `event: string`

    The ID of the event that was delivered in this invocation.

  - `object: "webhook_invocation"`

    Always `webhook_invocation`.

    - `"webhook_invocation"`

  - `statusCode: number`

    The HTTP status code returned by your endpoint for this invocation.

  - `type: "letter.created" or "letter.updated" or "postcard.created" or 18 more`

    The type of event that a Webhook can listen for and that an Event represents.

    - `"letter.created"`

    - `"letter.updated"`

    - `"postcard.created"`

    - `"postcard.updated"`

    - `"self_mailer.created"`

    - `"self_mailer.updated"`

    - `"cheque.created"`

    - `"cheque.updated"`

    - `"box.created"`

    - `"box.updated"`

    - `"snap_pack.created"`

    - `"snap_pack.updated"`

    - `"return_envelope_order.created"`

    - `"return_envelope_order.updated"`

    - `"tracker.visited"`

    - `"campaign.created"`

    - `"campaign.updated"`

    - `"virtual_mailbox_item.created"`

    - `"postal_statement.created"`

    - `"document.created"`

    - `"document.updated"`

  - `updatedAt: string`

    The UTC time at which this invocation was last updated.

  - `webhook: string`

    The ID of the webhook that was invoked.

  - `orderID: optional string`

    The ID of the order associated with this invocation, if the event was order-related.

### Webhook Delete Response

- `WebhookDeleteResponse object { id, deleted, object }`

  - `id: string`

    A unique ID prefixed with webhook_

  - `deleted: true`

    - `true`

  - `object: "webhook"`

    Always `webhook`.

    - `"webhook"`
