---
title: "Replay a webhook delivery"
method: POST
path: "/v1/webhooks/{id}/deliveries/{delivery_id}/replay"
tags: ["Webhooks"]
---

# Replay a webhook delivery

`POST /v1/webhooks/{id}/deliveries/{delivery_id}/replay`

## Request

- Base URL: `https://api.gojinko.com`
- URL: `https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Replays a delivered or exhausted event delivery for a subscription you own. Sets its status to pending, resets attempt_count to 0, increments replay_count, and enqueues a fresh delivery of the same payload with a new signature timestamp. The replay keeps the same event_id, so your idempotency key still applies. Pending or failed deliveries are still being delivered or retried and cannot be replayed. Payloads are purged 30 days after the delivery's last attempt or replay; a delivery whose payload was purged can no longer be replayed.

## Path parameters

- `id` string, required
- `delivery_id` string, required

## Response `202`

Webhook delivery replay enqueued

- WebhookReplayResponse
  - `delivery` WebhookDeliveryDetail, required: One event delivery to a webhook subscription, including its attempts and replay count. `payload` is the exact envelope sent, or null after it is purged 30 days after the delivery's last attempt or replay.
    - `id` number
    - `event_id` string
    - `event_type` string
    - `booking_ref` string, nullable
    - `status` string: `pending` — queued for delivery; `delivered` — delivered successfully; `failed` — a retry is still scheduled; `exhausted` — the last attempt failed and exhausted_at is set.
    - `attempt_count` number
    - `last_http_status` number, nullable
    - `delivered_at` string, nullable
    - `created_at` string
    - `last_error` string, nullable, required
    - `updated_at` string, required
    - `exhausted_at` string, nullable, required
    - `replay_count` integer, required
    - `payload` object, nullable, required: The signed body POSTed to a registered webhook URL, also available in the delivery log until its payload is purged. Verify the signature against the secret returned once at registration before trusting a delivery. `data` is event-specific: `PartialBookingData` on `booking.partial`, `ServicingCompletedData` on `servicing.completed`, `BookingFailedData` on `booking.failed`, `BookingProcessingData` on `booking.processing`, `BookingCompletedData` on `booking.completed`, `ServicingExchangeConfirmedData` on `servicing.exchange_confirmed`, `ServicingTicketIssuedData` on `servicing.ticket_issued`, `ServicingFailedData` on `servicing.failed`. `manage_booking_url` and `customer_emails[]` hold traveller personal data and mirror what Jinko’s email shows. Email content uses display strings; empty strings, nulls, empty lists and empty objects are omitted from new fields. Integers and booleans are always sent. Existing data fields retain their original behaviour, including nulls.
      - `event` 'booking.processing' | 'booking.completed' | 'booking.failed' | 'booking.partial' | 'servicing.completed' | 'servicing.exchange_confirmed' | 'servicing.ticket_issued' | 'servicing.failed', required: A booking lifecycle event. `booking.processing` — Payment is authorized and the booking is being confirmed with the suppliers. No supplier reference exists yet. `booking.completed` — Every item of the booking is confirmed and the payment is captured. `booking.failed` — No item of the booking could be confirmed. The payment hold is released and nothing is charged. `booking.partial` — Payment is captured but only some items were confirmed; the trip needs attention. A distinct event, so a handler written before it existed can never mistake it for a success. `servicing.completed` — A post-booking operation on one booked item (a cancellation) is complete and its money is settled. Distinct from booking.completed: it reports a booking being undone, not made. `servicing.exchange_confirmed` — The supplier confirmed an exchange of one booked item. For a flight, the new e-ticket number may follow in servicing.ticket_issued. `servicing.ticket_issued` — The new e-ticket number of an exchanged flight is available. `servicing.failed` — An exchange or a refund could not be completed. The original booking is unchanged unless the payload says otherwise.
      - `booking_ref` string, required: Empty string when the event concerns no single booking.
      - `status` string, required: Deprecated: branch on `event`, which already names the outcome. Resulting booking state: `processing` for booking.processing, `confirmed` for booking.completed, `failed` for booking.failed, `partial` for booking.partial, `servicing.completed` for servicing.completed, `servicing.exchange_confirmed` for servicing.exchange_confirmed, `servicing.ticket_issued` for servicing.ticket_issued, `servicing.failed` for servicing.failed.
      - `occurred_at` string, required: When the event happened, RFC 3339 UTC — NOT when it was delivered. A retry or a replay carries the original instant.
      - `event_id` string, required: Unique per occurrence of an event: a servicing event, which can happen more than once on one booking, has a new one each time (each cancellation has its own). Deliveries are deduplicated on it, and a retry or a replay repeats it — key your own idempotency off this. Treat it as an opaque string: its format is not part of the contract.
      - `livemode` boolean, required: False when the event came from a sandbox booking.
      - `data` union
        - PartialBookingData: The `data` object carried by `booking.partial`. `items` lists every item on the trip with its own outcome, booked and failed alike. `captured_total_money` is what was actually charged — the completed items only, NOT the trip total, so reconciling against the original quote will not balance. `captured_total` (deprecated) is the same figure in major units.
          - `items` PartialBookingItem[], required: Every item on the trip with its own outcome, booked and failed alike.
            - `item_id` string, required
            - `kind` string, required: "flight", "hotel", "car" or "ground".
            - `status` 'completed' | 'failed', required: Whether THIS item was booked. At least one of each is what makes it partial.
            - `supplier_references` SupplierReference[]: The confirmations the supplier itself issued for this item, on a completed item. Absent on a failed item. The Jinko reference is the event-level `booking_ref`.
              - …
            - `booking_reference` string: Deprecated: use `supplier_references` instead. A confirmation for this item; when the airline’s own locator is not known it can hold an id only Jinko’s intermediary answers to.
            - `captured_amount` object: Deprecated: use `captured_amount_money` instead.
              - …
            - `captured_amount_money` MoneyValue: Money as every new field carries it: `value` is an INTEGER in minor units at the ISO 4217 digits of `currency` (`decimal_places`), and `display` is the same figure ready to show. All four members are always present; a figure the platform does not know is absent, never `{value: 0}`. New integrations read the `*_money` fields (and `value` on the objects that carry it); the two-scale rule described on `Money` applies only to the deprecated fields.
              - …
          - `captured_total` object: Deprecated: use `captured_total_money` instead.
            - `amount` number, required: Major currency units.
            - `currency` string, required
          - `captured_total_money` MoneyValue: Money as every new field carries it: `value` is an INTEGER in minor units at the ISO 4217 digits of `currency` (`decimal_places`), and `display` is the same figure ready to show. All four members are always present; a figure the platform does not know is absent, never `{value: 0}`. New integrations read the `*_money` fields (and `value` on the objects that carry it); the two-scale rule described on `Money` applies only to the deprecated fields.
            - `value` integer, required: Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).
            - `currency` string, required: ISO 4217 currency code.
            - `decimal_places` integer, required: The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.
            - `display` string, required: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. "USD 412.50". Show this; compute with `value`.
        - ServicingCompletedData: The `data` object carried by `servicing.completed`. `refund` is what the payment provider settled back to the customer for this item; `penalty` is the supplier fee the customer agreed to. Either is `null` when the operation carries no such figure — which is not zero. The cancellation email is included when available. Its manage-booking link is not sent today.
          - `operation` string: The operation that finished ("svc_…"), the same handle the commit answered and the status routes take. Absent when the cancellation ran on an older path that has no such handle.
          - `operation_kind` string, required: What the operation did, e.g. `cancel`.
          - `booked_item_id` string: The booked item the operation acted on — `booked_item_id` on get_booking.
          - `item` integer, required: Deprecated: use `booked_item_id` instead. The booked item as an integer.
          - `state` string, required: Always `succeeded`: the event is sent only when the operation succeeded.
          - `refund` object, nullable: Money as every new field carries it: `value` is an INTEGER in minor units at the ISO 4217 digits of `currency` (`decimal_places`), and `display` is the same figure ready to show. All four members are always present; a figure the platform does not know is absent, never `{value: 0}`. New integrations read the `*_money` fields (and `value` on the objects that carry it); the two-scale rule described on `Money` applies only to the deprecated fields.
            - `value` integer, required: Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).
            - `currency` string, required: ISO 4217 currency code.
            - `decimal_places` integer, required: The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.
            - `display` string, required: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. "USD 412.50". Show this; compute with `value`.
          - `penalty` object, nullable: Money as every new field carries it: `value` is an INTEGER in minor units at the ISO 4217 digits of `currency` (`decimal_places`), and `display` is the same figure ready to show. All four members are always present; a figure the platform does not know is absent, never `{value: 0}`. New integrations read the `*_money` fields (and `value` on the objects that carry it); the two-scale rule described on `Money` applies only to the deprecated fields.
            - `value` integer, required: Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).
            - `currency` string, required: ISO 4217 currency code.
            - `decimal_places` integer, required: The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.
            - `display` string, required: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. "USD 412.50". Show this; compute with `value`.
          - `booking_ref` string, required
          - `servicing_event` string, required: The event name again, `servicing.completed`.
          - `manage_booking_url` string, uri: Jinko web app booking link. Personal data: its query includes the traveller’s last name.
          - `customer_emails` union[]: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - union
              - …
        - BookingFailedData: Booking failure details and the booking failure email. Its content.reason_code may differ from failure_reason. The email can be present even when no curated failure code exists.
          - `failure_reason` 'price_changed' | 'offer_unavailable' | 'booking_not_created' | 'booking_cancelled_at_provider': Curated failure code; omitted when unclassified.
          - `failure_message` string: Customer sentence for price_changed and offer_unavailable only.
          - `customer_emails` BookingFailedCustomerEmail[]: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - `to` string, email: Recipient contact address; omitted when there is none. Personal data.
            - `subject` string, required: Subject line built from the same email data.
            - `template` 'booking-failed', required
            - `content` BookingFailedEmailContent, required: What the booking failure email shows, including the resolved provider and product nouns. Values are display strings as the email shows them.
              - …
        - BookingProcessingData: Payment authorized; the booking is being confirmed with suppliers. Carries the booking confirmation email and its manage-booking link.
          - `manage_booking_url` string, uri: Jinko web app booking link. Personal data: its query includes the traveller’s last name.
          - `customer_emails` BookingConfirmationCustomerEmail[], required: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - `to` string, email: Recipient contact address; omitted when there is none. Personal data.
            - `subject` string, required: Subject line built from the same email data.
            - `template` 'booking-confirmation', required
            - `content` BookingConfirmationEmailContent, required: What the default booking confirmation email shows at authorization, or after capture for ground and car items. Values are display strings as the email shows them. Payment is the authorized amount before capture and the captured amount afterwards. Charges are not sent today.
              - …
        - BookingCompletedData: The booked items with their supplier references, and the post-capture emails in sending order: flight, hotel, then one booking confirmation for ground and one for car, plus their manage-booking link.
          - `items` CompletedBookingItem[]: Every booked item, each with its `booked_item_id` and `supplier_references`. Absent on events sent before contract 0.75.0.
            - `item_id` string, required: The trip item id.
            - `kind` string, required: "flight", "hotel", "car" or "ground".
            - `booked_item_id` string: The booked item’s handle: `booked_item_id` on get_booking, and what servicing takes. Omitted when the platform cannot name the item.
            - `supplier_references` SupplierReference[], required: The confirmations the supplier itself issued for this item; `[]` when none is known. The Jinko reference is the event-level `booking_ref`.
              - …
          - `manage_booking_url` string, uri: Jinko web app booking link. Personal data: its query includes the traveller’s last name.
          - `customer_emails` union[]: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - union
              - …
        - ServicingExchangeConfirmedData: The supplier confirmed an exchange of one booked item. Carries the flight exchange or car exchange email. The manage-booking link is currently sent only for car exchanges.
          - `operation` string: Servicing operation handle (svc_…), sent only when the operation has one. Other exchange identifiers are never sent in this field.
          - `booked_item_id` string: The booked item serviced — `booked_item_id` on get_booking; omitted when unknown.
          - `item` integer: Deprecated: use `booked_item_id` instead. The booked item as an integer.
          - `booking_ref` string: Original booking’s Jinko reference, JNK-XXXXXX.
          - `operation_kind` 'exchange', required: The servicing operation: exchange.
          - `manage_booking_url` string, uri: Jinko web app booking link. Personal data: its query includes the traveller’s last name.
          - `customer_emails` union[], required: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - union
              - …
        - ServicingTicketIssuedData: The reissued e-ticket number is known, following a flight exchange with document_unobserved true. Carries the ticket-number follow-up email.
          - `operation` string: Servicing operation handle (svc_…), sent only when the operation has one. Other exchange identifiers are never sent in this field.
          - `booked_item_id` string: The booked item serviced — `booked_item_id` on get_booking; omitted when unknown.
          - `item` integer: Deprecated: use `booked_item_id` instead. The booked item as an integer.
          - `booking_ref` string: Original booking’s Jinko reference, JNK-XXXXXX.
          - `operation_kind` 'exchange', required: The servicing operation: exchange.
          - `customer_emails` FlightExchangeTicketNumberCustomerEmail[], required: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - `to` string, email: Recipient contact address; omitted when there is none. Personal data.
            - `subject` string, required: Subject line built from the same email data.
            - `template` 'flight-exchange-ticket-number', required
            - `content` FlightExchangeTicketNumberEmailContent, required: What the ticket-number follow-up email shows after a flight exchange. Values are display strings as the email shows them.
              - …
        - ServicingFailedData: An exchange, refund or void could not be completed. Carries its failure email. No operation handle is sent today.
          - `operation` string: Servicing operation handle (svc_…), sent only when the operation has one. Other exchange identifiers are never sent in this field.
          - `booked_item_id` string: The booked item serviced — `booked_item_id` on get_booking; omitted when unknown.
          - `item` integer: Deprecated: use `booked_item_id` instead. The booked item as an integer.
          - `booking_ref` string: Original booking’s Jinko reference, JNK-XXXXXX.
          - `operation_kind` 'exchange' | 'refund' | 'void', required: The operation that failed. The refund failure email covers refunds and voids.
          - `customer_emails` union[], required: One entry per email Jinko sends or would send at this moment, in sending order, even if email delivery is disabled. Template selects the content shape.
            - union
              - …

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `402`: Payment required — organization balance exhausted
- `404`: Resource not found
- `409`: CONFLICT: delivery_in_progress while delivery or retries are pending, or payload_purged once the payload is purged, 30 days after the delivery's last attempt or replay. The replay reason is in code beside error.
- `410`: The resource this request names no longer exists
- `422`: Validation error
- `429`: Rate limit or quota exceeded
- `502`: The travel provider rejected the request, or an upstream call failed
- `503`: No travel provider can serve the request right now
- `504`: The travel provider did not answer in time

---

[API](https://skmtc.dev/gojinko/apis/jinko-public-api.md) - [All operations](https://skmtc.dev/gojinko/apis/jinko-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gojinko/apis/jinko-public-api/revisions/ac5046767e4c?raw)
