Transfers

Confirm the pay-in for a sandbox transfer

Sandbox affordance. Confirms the incoming payment on a transfer that is sitting in awaiting_payment, so you can drive the state machine past the one step no test key can reach on its own: in test there is no real payer and no payment confirmation, so an on-ramp would otherwise wait in awaiting_payment until it expires.

The transfer advances through both legs, in two steps, exactly as a real confirmed payment would: the pay-in leg settles (payment_confirmed, emitting transfer.updated), then the destination leg settles and the transfer reaches a terminal completed, emitting transfer.completed. Both events are delivered and both appear on GET /events, in that order - the response body carries the terminal state. The wallet balance on GET /wallets/{wallet_id}/balances moves with it.

One case still stops at payment_confirmed: a transfer whose opening leg was settled by a real rail rather than by the sandbox. Fabricating a completion there would claim money arrived and was delivered when neither happened.

Only on-ramp and fx transfers can be simulated, because they are the only ones with an incoming payment to confirm. An off-ramp opens on its payout leg and a wallet transfer is a custody move, so neither has a payer to simulate; both are refused with 409 TRANSFER_NOT_AWAITING_PAYMENT, and so is a transfer that has already moved past awaiting_payment. Create a new transfer to test another outcome.

Test keys only. A live key is refused with 403 SANDBOX_ONLY; the environment comes from the key prefix (ozav_sk_test_ vs ozav_sk_live_), never from the URL.

post/transfers/{transfer_id}/simulate

Request

  • Base URL
    https://developers.ozav.io/v2
  • Auth
    • API key in header X-API-Key
    • or HTTP bearer

Path parameters

transfer_idstring required

The opaque transfer id (ozav_tr_...).

Response

The pay-in was confirmed and the transfer advanced.

idstring required

Opaque transfer identifier, prefixed ozav_tr_.

object'transfer' required

Resource type discriminator; always the literal transfer.

customer_idstring

The ozav_cus_ id of the customer this transfer is for.

quote_idstring

The ozav_q_ id of the executed quote, when the transfer references one.

status'awaiting_payment' | 'payment_confirmed' | 'converting' | 'payout_initiated' | 'completed' | 'failed' | 'cancelled' | 'expired' | 'needs_review' | 'awaiting_approval' required

Canonical transfer state machine. A successful FX transfer walks awaiting_payment → payment_confirmed → converting → payout_initiated → completed; the remaining states are terminal failures or attention states.

ValueMeaning
awaiting_paymentTransfer created; awaiting the customer's inbound payment.
payment_confirmedThe inbound payment has been confirmed.
convertingFunds are in flight and the FX conversion is underway (not yet confirmed).
payout_initiatedThe payout to the destination has been initiated.
completedTerminal success - funds delivered to the destination.
failedTerminal failure - no funds delivered.
cancelledTerminal - the transfer was cancelled.
expiredTerminal - the transfer expired before completing.
needs_reviewStuck and needs attention (e.g. underfunded, returned, in review); not terminal.
awaiting_approvalNot returned: no transfer waits on approver keys.
approval_idstring

Not returned. No transfer waits on approver keys.

created_atstring date-time

When the transfer was created (RFC 3339 / ISO 8601, UTC).

updated_atstring date-time

When the transfer was last updated (RFC 3339 / ISO 8601, UTC).

completed_atstring date-time

When the transfer reached a terminal state (RFC 3339 / ISO 8601, UTC). Present once status is terminal.

metadataMetadata

Free-form string map (max 50 keys).

Example response

{
  "amounts": {
    "source": {
      "amount": "1250.00"
    },
    "target": {
      "amount": "1250.00"
    }
  },
  "travel_rule": {
    "originator": {
      "identity_documents": [
        {
          "type": "cpf",
          "number": "11144477735",
          "issuing_country": "BR"
        }
      ],
      "address": {
        "country": "BR"
      }
    },
    "beneficiary": {
      "identity_documents": [
        {
          "type": "cpf",
          "number": "11144477735",
          "issuing_country": "BR"
        }
      ],
      "address": {
        "country": "BR"
      }
    }
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.