Changelog
New updates and improvements
Track API changes, new features, migration guides, and deprecation notices.
v2.1.0 — x402 Agent Payments, Base, and Arbitrum
New endpoints now support AI agent payments with gasless stablecoin transfers. Base and Arbitrum are also now supported across payment sessions and agent payments.
Highlights
Added
POST /payments/agent/settleAdded
POST /payments/agent/verifyAdded x402 payment session support
Added Base and Arbitrum support
Agent payments
POST /payments/agent/settle
Settle gasless stablecoin payments from AI agents. This endpoint accepts signed payloads from:
eip3009for USDC on Base and Arbitrumpermit2for USDC and USDT on Base, Arbitrum, and BSCsolanafor SOL, USDC, and USDT on Solana
CoinCircuit submits the transaction on-chain and covers gas.
POST /payments/agent/verify
Pre-validate a signed agent payment before touching the blockchain. This runs scheme-specific checks and returns 200 for a valid payment, or 400 with per-check results.
x402 HTTP 402 payment flow
Payment sessions now work in the x402 flow.
Supported schemes and chains
eip3009— USDC on Base and Arbitrumpermit2— USDC and USDT on Base, Arbitrum, and BSCsolana— SOL, USDC, and USDT on Solana
New supported blockchains
Base
Base is now supported for all payment sessions. USDC on Base settles in under 2 seconds. Base is also the default chain for EIP-3009 agent payments.
Arbitrum
Arbitrum One is now supported for all payment sessions. It supports USDC and USDT with both EIP-3009 and Permit2.
v2.0.0 — Payment API Transition and Payouts Unified
This release updates payment session payloads, renames webhook event types, and introduces a unified payouts API. Existing API keys keep their current behavior. New API keys use the updated format automatically.
Highlights
Renamed webhook event types from
session.*topayment.*Redesigned payment session response shape
Added inline
settlementsUnified payouts under
POST /payoutsDeprecated legacy payout endpoints
Payment API changes
Webhook event types renamed
Payment session event names now use payment.* instead of session.*. The payload shape stays the same. Only the event type string changes.
"session.completed"
"session.expired"
"session.partial"
"session.failed""payment.completed"
"payment.expired"
"payment.partial"
"payment.underpaid"
"payment.failed"New API keys use the updated format automatically
Versioning is tied to your API key:
Existing API keys keep the current response shape and event types
New API keys use the updated response shape and webhook names
No extra config is required
No change is required to keep your current integration working. Create a new API key only when you are ready to adopt the new format.
Session response shape redesigned
The session response is now flatter:
statusis replaced bystateamountandcurrencyare now top-level stringsgross,fees, andnetmove tosettlements
state replaces status
The top-level session status is now binary:
openwhile the session is activeclosedonce the session is finalized
The payment outcome now lives in payment.status.
settlements is now included in the payment response
Payment session responses now include settlement details inline. You no longer need a separate settlements lookup for the same breakdown.
Payouts API changes
/payout/fiat and /payout/crypto are deprecated. They will be removed on March 30, 2026.
Legacy payout endpoints replaced by /payouts
Use the unified payouts API for both fiat and crypto payouts. Fee lookup is also now unified.
Unified payout request body
Use method to choose fiat or crypto. Use recipientId instead of bankAccountId or addressId.
Amount now means what the recipient receives
The old API treated amount as the total deducted from your balance. The new API treats amount as the amount delivered to the recipient. Fees are charged separately.
Payout response redesigned
The response now uses flat amount fields, a unified recipient object, and a conversion object when payout currency differs from the balance currency.
Migration guide
Follow these steps to move to the new format. You can adopt them incrementally.
3. Update payment.partial handling
payment.partial is now strictly mid-flow. It only fires when the session is still open and waiting for more funds. Terminal underpayment now emits payment.underpaid.
if (event === "payment.partial") {
// data.session.state === "open"
notifyCustomerOfPartialPayment(data.session.payment.amountReceived);
}
if (event === "payment.underpaid") {
// data.session.state === "closed"
initiateRefundFlow(data.session.payment.amountReceived);
}4. Update session response parsing
Move parsing logic from nested amount fields to top-level amount, currency, and settlements.
// Previous
session.status
session.amount.requested.amount
session.amount.requested.currency
session.amount.gross
session.amount.fees
session.amount.net
// New
session.state
session.amount
session.currency
session.settlements.gross
session.settlements.fees
session.settlements.net5. Migrate payout endpoints
Replace legacy payout endpoints with POST /payouts. Add method to the request body. Replace bankAccountId or addressId with recipientId. Replace fee lookups with GET /payouts/fees.
// Old
POST /payout/fiat { balanceCurrency, amount, bankAccountId, narration }
POST /payout/crypto { balanceCurrency, amount, addressId }
// New
POST /payouts {
method: "fiat" | "crypto",
currency: "NGN",
amount: "10000.00",
recipientId: "...",
narration: "...",
reference: "..."
}7. Update payout response parsing
Move response parsing from nested amount and endpoint-specific recipient objects to flat fields and the unified recipient object.
// Old response fields
payout.amount.gross
payout.amount.fee
payout.amount.net
payout.amount.currency
payout.bankAccount
payout.crypto.amount
payout.crypto.chain
payout.crypto.address
// New response fields
payout.amount
payout.fee
payout.total
payout.currency
payout.recipient.type
payout.recipient.address
payout.recipient.chain
payout.recipient.bankName
payout.conversionLast updated
Was this helpful?