# Webhooks (Outbound)

Gett delivers four **outbound** webhooks to your system — two that drive the order lifecycle and two optional catalog-sync notifications. Each is a `POST` to a URL on *your* server (the **Webhook Base URL** you set during onboarding), signed per the [Standard Webhooks](https://www.standardwebhooks.com) spec. They are the partner-implemented side of the contract: **Gett calls you**, not the other way around.

:::note[Direction]
These are **Gett → your server**. They are *not* endpoints you call on Gett — for the inbound REST API see the [Catalog](/api/commerce/catalog) and [Store Status](/api/commerce/store-status) operations.
:::

## Contract overview

| Webhook | Fires | Request body | Your response |
|---------|-------|--------------|---------------|
| [Validate Order](#validate-order) | Before the customer pays | [`ExternalOrder`](/api/commerce/~schemas#externalorder) | `200` + order with `amounts` |
| [Place Order](#place-order) | After successful payment | [`StandardOrderWebhook`](/api/commerce/~schemas#standardorderwebhook) | `200` + order with `amounts` |
| [Catalog Sync Succeeded](#catalog-sync-succeeded) | Catalog ingest went live *(optional)* | [`CatalogSyncWebhook`](/api/commerce/~schemas#catalogsyncwebhook) | any `2xx` ack |
| [Catalog Sync Failed](#catalog-sync-failed) | Catalog ingest failed *(optional)* | [`CatalogSyncWebhook`](/api/commerce/~schemas#catalogsyncwebhook) | any `2xx` ack |

All four carry the **same** Standard Webhooks headers and are verified with the **same** `whsec_…` signing secret — one verifier covers every webhook. See [Security — Standard Webhooks signing](/commerce-partners/order-webhooks#security--standard-webhooks-signing) for the headers, algorithm, and ready-to-use verification code.

## Validate Order

`POST {WebhookUrl}/validate` — a price-and-availability check **before** the customer is charged. No side effects: don't reserve inventory or charge here. Respond `200` with the order including your server-computed `amounts`, and use the inline `errors` array for business-logic rejections (never `4xx`).

- **Request** — [`ExternalOrder`](/api/commerce/~schemas#externalorder) (no `paymentToken`)
- **Response** — `200` with [`ExternalOrder`](/api/commerce/~schemas#externalorder)
- **Full contract, examples & verification code** → [Order Webhooks](/commerce-partners/order-webhooks#request-body)

## Place Order

`POST {WebhookUrl}/place` — the point of no return, sent **after** payment. Reserve inventory and charge here. When Gett tokenized the customer's saved card on your behalf, the body carries `paymentToken` (a single-use Braintree nonce); it is omitted when you tokenize on your side.

- **Request** — [`StandardOrderWebhook`](/api/commerce/~schemas#standardorderwebhook) (`ExternalOrder` + optional `paymentToken`)
- **Response** — `200` with [`ExternalOrder`](/api/commerce/~schemas#externalorder)
- **Full contract, examples & verification code** → [Order Webhooks](/commerce-partners/order-webhooks#request-body)

## Catalog Sync Succeeded

`POST {WebhookUrl}/catalog-sync` with `type` `catalog.sync.succeeded` — fired when a catalog you pushed has been validated and is now live; `data.errors` is empty. **Optional and best-effort**: it fires only when your store has a Webhook Base URL configured, and the [catalog-ingest status poll](/commerce-partners/catalog-integration#ingest-status-lifecycle) remains the authoritative signal.

- **Request** — [`CatalogSyncWebhook`](/api/commerce/~schemas#catalogsyncwebhook) envelope (`type` / `timestamp` / `data`)
- **Response** — any `2xx` (no body required)
- **Full contract & examples** → [Catalog Integration](/commerce-partners/catalog-integration#optional-catalog-sync-webhooks)

## Catalog Sync Failed

`POST {WebhookUrl}/catalog-sync` with `type` `catalog.sync.failed` — fired when a catalog you pushed could not go live because a pull, referential-validation, or generation stage failed. `data.errors` carries the same sanitized, partner-safe reasons as the status poll. Same optional/best-effort caveat as above.

- **Request** — [`CatalogSyncWebhook`](/api/commerce/~schemas#catalogsyncwebhook) envelope; `data.errors` populated
- **Response** — any `2xx` (no body required)
- **Full contract & examples** → [Catalog Integration](/commerce-partners/catalog-integration#optional-catalog-sync-webhooks)
