Accepting payments
Payments.
A payment is one customer's attempt to pay a link. Axle tracks it from creation to on-chain confirmation, and you read it with your API key.
Retrieve a payment
An unknown ID, or one belonging to a different merchant, returns 404 transaction_not_found.
Key fields
| Field | Meaning |
|---|---|
amountMinor | The price in your currency's minor units. currency is the fiat code (USD). |
crypto.payCurrency | What the customer actually pays in: ETH, USDC or USDT. |
crypto.payAddress | Your wallet, where the funds were sent. |
crypto.payAmount | The crypto amount quoted, as a high-precision decimal (not minor units). |
crypto.actualAmountReceived | The amount observed on-chain. null until the payment is confirmed. |
crypto.txHash | The transaction hash. Look it up on a block explorer to verify independently. |
crypto.confirmations | Confirmations seen so far. |
livemode | Whether this belongs to a live or test key environment. |
Status lifecycle
A payment is created pending the moment checkout issues the quote, and stays pending while it waits for the customer's transaction and while confirmations accrue. It then ends in one terminal state:
| Status | Meaning |
|---|---|
pending | Awaiting the customer's transaction, or waiting on confirmations. Track progress with crypto.status and crypto.confirmations. |
success | Verified on-chain: right recipient, right amount, enough confirmations. Final, and safe to fulfil. |
failed | The on-chain transaction reverted or didn't match the expected currency. See failureReason. |
canceled | Canceled by the merchant while still pending. A customer can't cancel their own payment. |
partially_refunded | A successful payment that has been partly refunded. Some balance remains. |
refunded | Fully refunded. See Refunds. |
The status enum also contains created, processing and expired. Direct-wallet payments don't use them today, so don't build logic that depends on seeing them.
Confirmation progress: crypto.status
| crypto.status | Meaning |
|---|---|
waiting | Quote issued; no transaction submitted yet. |
confirming | A transaction hash has been submitted and is being verified; confirmations are accruing. |
finished | Verified. The payment moves to success. |
failed | The on-chain transaction failed. |
expired | The payment was canceled by the merchant. |
How Axle verifies a payment
Axle never takes the customer's word for it. For every submitted transaction it reads the chain itself:
- The transaction actually paid your connected wallet address.
- For tokens, the transfer is emitted by the real token contract (USDC/USDT), read from the contract's
Transferevent, not the transaction's own fields. - The amount is at least the quote. A payment up to 0.5% short is accepted to absorb rounding; anything further short is left pending rather than failed, in case it's a transient read problem. A payment more than 1% over still succeeds and is noted in the receipt.
- It has enough confirmations: 12 on Ethereum mainnet, 3 on Sepolia.
- The transaction hash hasn't already been used for a different payment (enforced by a database constraint).
RPC reads fail over across several providers, and every read is retried, so a single provider outage doesn't stall verification.