docs
Get startedTroubleshootingPaymentsWebhooksAgent paymentsSwop MCPOviIdentity (swop.id)SwivyRPC (preview)API reference

Event reference

Every webhook event and every field in its payload.

Request format

Every delivery is an HTTP POST with a JSON body and these headers:

HeaderExampleMeaning
Content-Typeapplication/json
User-AgentSwop-Webhooks/1.0
Swop-Signaturet=1761760800,v1=5f2b…See Verify signatures
Swop-Eventcheckout.paidThe event name, also in the body
Swop-Delivery-Id6720a1…Stable across retries of one delivery; use it to de-duplicate

The body is an envelope:

FieldTypeMeaning
idstringEvent ID, evt_…
eventstringcheckout.paid, payout.released or ping
createdAtISO 8601When the event was created
dataobjectThe order (below). For ping, { "message": "Swop webhook test" }

checkout.paid

The buyer's money arrived and the order exists. Fulfil it.

{
  "id": "evt_3f9a1c2b7d4e5f60",
  "event": "checkout.paid",
  "createdAt": "2026-10-29T18:01:12.000Z",
  "data": {
    "orderId": "ORD-…",
    "publicReference": "…",
    "status": "paid",
    "orderType": "physical",
    "checkoutMode": "online",
    "financial": { "subtotal": 25, "shippingCost": 5, "totalCost": 30, "currency": "USDC" },
    "payment": { "method": "wallet", "status": "completed" },
    "settlement": { "policy": "escrow_on_receipt", "status": "held", "releasedAt": null, "txHash": null },
    "buyer": {
      "name": "Ada Buyer",
      "email": "ada@example.com",
      "phone": "",
      "address": { "line1": "1 Main St", "city": "Austin", "state": "TX", "postalCode": "78701", "country": "US" }
    },
    "lineItems": [
      {
        "productId": "66a1b2c3d4e5f6a7b8c9d0e1",
        "name": "Swop Classic Card",
        "quantity": 1,
        "unitAmount": 25,
        "totalAmount": 25,
        "shippingAmount": 5
      }
    ],
    "createdAt": "2026-10-29T18:01:05.000Z"
  }
}

payout.released

Swop released your money: escrow was released, or the transfer to your wallet was sent. Book the revenue. Same data shape as above, with:

"settlement": {
  "policy": "escrow_on_receipt",
  "status": "released",
  "releasedAt": "2026-11-04T10:22:00.000Z",
  "txHash": "5Kq…"
}

settlement.txHash is the blockchain transaction that paid you, which you can look up in a block explorer.

The order object (data)

FieldTypeMeaning
orderIdstringSwop's order ID
publicReferencestringThe reference shown to the buyer on their receipt
statusstringcreated, paid, fulfilling, completed, cancelled, failed
orderTypestringdigital, physical, in_person_checkout or mixed
checkoutModestringonline or in_person
financial.subtotalnumberItems total, in USDC
financial.shippingCostnumberShipping total, in USDC
financial.totalCostnumberWhat the buyer paid, in USDC
financial.currencystringUSDC
payment.methodstringwallet, stripe, cash, external, geo_bucks or unknown
payment.statusstringpending, completed, failed, refunded, cancelled
settlement.policystringdirect or escrow_on_receipt (escrow)
settlement.statusstringpending, held, release_pending, releasing, released, failed, refunded
settlement.releasedAtISO 8601 | nullWhen your money was released
settlement.txHashstring | nullThe payout transaction
buyer.name, buyer.email, buyer.phonestringThe buyer's contact details, for fulfilment
buyer.addressobject | nullShipping address for physical orders
lineItems[]arrayproductId, name, quantity, unitAmount, totalAmount, shippingAmount
createdAtISO 8601When the order was created

Matching a webhook to your checkout

The payload carries the order ID, not the checkout's intentId. To link them, match on the products and amount, or look up the checkout with GET /checkout-intents/{intentId} after payment and store the order reference it returns.

Buyer details are personal data. Use them only to fulfil the order and keep them as safe as you'd keep your own customers' data.

On this page