Transfer
The Transfer entity in Payments.
A Transfer is the atomic record of a single money movement — a charge against a Payment Instrument, a refund (reversal), a settlement, or a fee. If you have used Stripe, this is the equivalent of a Charge plus a PaymentIntent collapsed into one object: there is no separate "intent" step, and the same shape covers debits, credits, refunds, and disputes via the type field. Most production integrations create Transfers indirectly through Checkout / Embedded Checkout / Subscriptions; the direct client.createTransfer API is for headless server-to-server charges against an already-saved Payment Instrument.
Lifecycle
- Created —
PENDING.client.createTransfer({ amount, currency, source })(or any checkout flow) submits the charge to the processor. - Authorized → captured — the processor authorizes the funding source. For card transfers Easy Labs auto-captures; the state moves to
SUCCEEDEDwhen funds clear, orFAILEDwith afailure_code/failure_message. - Settled — once
ready_to_settle_atis in the past, the Transfer is included in the next merchant Settlement. Funds appear in the merchant payout. - Reversed (refunded) — calling
client.createRefund(transferId, { refund_amount })produces a child Transfer withtype: "REVERSAL"andparent_transferpointing back at the original. The original Transfer'sstatebecomesREVERSEDonce fully reversed. - Disputed — if the buyer initiates a chargeback, a
dispute.createdwebhook fires and a separate Transfer withtype: "DISPUTE"is created to hold the disputed amount.
Webhooks: payment.created and payment.updated track the canonical state transitions. refund.created / refund.updated fire on reversals.
Relationships
A Transfer has one source (a Payment Instrument ID), one merchant_identity (the Customer being charged), and optionally one parent_transfer (for reversals). Each Order embeds at most one Transfer. Disputes reference Transfers by ID.
Fields that matter
id(string) — pass togetTransfer,createRefund, or astransferIdfor dispute lookups.amount,amount_requested,currency— the captured amount, the originally requested amount, and ISO currency. Amounts are in the smallest unit (cents for USD).state("PENDING" | "SUCCEEDED" | "FAILED" | "REVERSED" | "CANCELED" | "UNKNOWN") — terminal states areSUCCEEDED,FAILED,REVERSED,CANCELED.type("DEBIT" | "CREDIT" | "REVERSAL" | "DISPUTE" | "FEE" | "ADJUSTMENT" | "RESERVE" | "SETTLEMENT" | "UNKNOWN") — what kind of money movement this is. Filter ontype === "DEBIT"for buyer charges.failure_code,failure_message— populated whenstate === "FAILED". Surface these to the buyer for retry-friendly errors (insufficient funds, declined, etc.).parent_transfer(string | null) — set on reversals to the original Transfer's ID.fee(number) — Easy Labs / network fee for this Transfer in the smallest unit.ready_to_settle_at(string) — ISO timestamp when this Transfer is eligible for the next settlement.