post/v1/checkout/webhooks/payment
Merchant-facing payment status callback (mirrors the payment.completed/payment.failed webhook catalog entries). Reported completion of both sides' payments drives the trade session to LOCKED.
Request body
| Field | Type | Required |
|---|
| tradeSessionId | string (uuid) | yes |
| side | A | B | yes |
| status | completed | failed | yes |
| merchantCheckoutSessionRef | string | — |
| failedReason | string | — |
post/v1/checkout/webhooks/fulfillment
Merchant-facing fulfillment status callback — started requires the session be LOCKED, completed requires FULFILLMENT
Request body
| Field | Type | Required |
|---|
| tradeSessionId | string (uuid) | yes |
| status | started | completed | yes |
post/v1/checkout/trade-sessions/{id}/complete
Ops-triggered final completion once a trade session is FULFILLED — no automated signal exists yet for "both merchants confirm no open disputes/returns window", so this is the explicit manual interface for that step.
Response (201)
| Field | Type | Required |
|---|
| id | string (uuid) | — |
| offerId | string,null (uuid) | — |
| sellerAId | string (uuid) | — |
| sellerBId | string (uuid) | — |
| status | DRAFT | PENDING | OFFERED | ACCEPTED | RESERVING | RESERVED | WAITING_CHECKOUT_A | WAITING_CHECKOUT_B | CHECKOUT_A_COMPLETE | CHECKOUT_B_COMPLETE | SCHEDULING_A | SCHEDULING_B | EXCHANGE_A_CONFIRMED | EXCHANGE_B_CONFIRMED | EXCHANGE_FAILED | LOCKED | FULFILLMENT | FULFILLED | COMPLETED | CANCELLED | EXPIRED | PAYMENT_FAILED | RESERVATION_FAILED | FULFILLMENT_FAILED | RETURNED | REFUNDED | — |
| fulfillmentMode | MERCHANT_CHECKOUT | PEER_TO_PEER | — |
| tradeValue | numbernull | — |
| currency | string | — |
| createdAt | string (date-time) | — |
| updatedAt | string (date-time) | — |
| expiresAt | string,null (date-time) | — |
| lockedAt | string,null (date-time) | — |
| completedAt | string,null (date-time) | — |
| listingsA | object[] | — |
| listingsB | object[] | — |
| reservations | object[] | — |
| payments | object[] | — |