Typical workflow
- Create a remitter for the individual or business sending the payment
- Create a payment for that remitter using
POST /stablecoins/payments - Accept the payment to lock in the exchange rate using
POST /stablecoins/payments/{id}/accept - Share the payment link with your customer
- Monitor payment status by polling
GET /stablecoins/payments/{id} - Once the status is
COMPLETE, funds are available in your budget
Create a new stablecoin inbound payment
POST
/stablecoins/paymentsRequest
Use this endpoint to create a new stablecoin inbound payment for a given remitter. The exchange rate isn’t locked in until the payment is accepted.Query parameters
The ID of the account to work with.Allowable values: An existing
accountId (≤ 36 characters)Request body schema
The ID of the budget to work with.Allowable values: A valid UUID (≤ 36 characters)
The ID of the remitter associated with the payment.Allowable values: A valid UUID
The amount to be paid.Allowable values: A number >= 10
The currency the remitter will send.Allowable values: A string [ 3 .. 4 ] characters (e.g.,
USDC)The currency that should be received into the budget.Allowable values: A string [ 3 .. 4 ] characters (e.g.,
USD)Display name for the payment.Allowable values: A string [ 1 .. 255 ] characters
The URL that your customer will be redirected to if they click the Back button on the hosted payment page. This is not a post-payment redirect — it only applies to the Back button.Allowable values: A valid URI (must start with
https://)The IP address of the payment requester.
The number of minutes after which the payment should expire.Allowable values: An integer [ 1 .. 1000000 ]
Response
If your request is successful, you’ll receive a201 response. The response includes a link object — link.url is a hosted payment page where your customer can select a blockchain network and send USDC. The link.chains array lists the wallet addresses for direct transfers.
Accept a stablecoin inbound payment
POST
/stablecoins/payments/{id}/acceptRequest
Use this endpoint to accept a stablecoin inbound payment. Accepting a payment locks in the stablecoin to fiat exchange rate for one hour. This two-step process (create, then accept) lets you review the payment details before committing to the exchange rate.Path parameters
The unique ID of the payment.Allowable values: A valid UUID
Query parameters
The ID of the account to work with.Allowable values: An existing
accountId (≤ 36 characters)Request body schema
Empty object{}
Response
If your request is successful, you’ll receive a200 response.
List stablecoin inbound payments
GET
/stablecoins/paymentsRequest
Use this endpoint to retrieve a paginated list of all stablecoin inbound payments for a given budget.The list response does not include
link or returnUrl for each payment. To retrieve these fields, use GET /stablecoins/payments/{id} with include=link.Query parameters
The ID of the account to work with.Allowable values: An existing
accountId (≤ 36 characters)The ID of the budget to work with.Allowable values: A valid UUID (≤ 36 characters)
The maximum number of results to return. For example,
limit=200. Defaults to 100 if not provided.Allowable values: [ 1 .. 1000 ]The number of items to skip before returning results. For example,
offset=100. Defaults to 0 if not provided.Allowable values: A valid integerResponse
If your request is successful, you’ll receive a200 response.
Retrieve a specific stablecoin inbound payment
GET
/stablecoins/payments/{id}Request
Use this endpoint to retrieve details of a specific stablecoin inbound payment.Path parameters
The unique ID of the payment.Allowable values: A valid UUID
Query parameters
The ID of the account to work with.Allowable values: An existing
accountId (≤ 36 characters)Controls which optional properties should be attached to the response. Use
include=link to return the payment link and chain addresses in the response. This is useful when you need to share the payment link with your customer after the initial creation.Allowable values: linkResponse
If your request is successful, you’ll receive a200 response.
Payment statuses
Stablecoin inbound payments can have the following statuses:- PENDING — Payment has been created but not yet detected on the blockchain
- PROCESSING — Payment has been detected on the blockchain and is being processed
- COMPLETE — Payment has been successfully processed and funds have been credited to the budget
- CANCELLED — Payment processing was cancelled
- EXPIRED — Payment was not completed before the expiry time
Handling payment expiry and failure
- EXPIRED — If the remitter doesn’t complete the blockchain transfer before the payment expires, the status changes to
EXPIRED. You’ll need to create a new payment and accept it again to generate a fresh exchange rate and payment link. - CANCELLED — If a payment is cancelled during processing, the status changes to
CANCELLED. Contact your account manager if this occurs repeatedly. - Exchange rate expiry — The exchange rate is locked for one hour from when you accept the payment. The
expiryMinutestimer runs independently — it starts when the payment is created, not when it’s accepted. IfexpiryMinutesis shorter than the time between creation and the remitter’s transfer, the payment will expire regardless of the exchange rate lock. IfexpiryMinutesis longer than one hour, the exchange rate lock may lapse before the payment itself expires.
To monitor payment status, poll
GET /stablecoins/payments/{id} at regular intervals — we recommend every 10–30 seconds. Check the status field for changes from PENDING to PROCESSING, COMPLETE, CANCELLED, or EXPIRED.Error responses
If a request fails, the API returns an appropriate HTTP status code along with a JSON array describing the error. Each error object contains apath indicating which parameter caused the issue, a message explaining the problem, and an optional errorCode.
Error response structure
Common error scenarios
Missing a required field —400 Bad Request
400 Bad Request
400 Bad Request
403 Forbidden
If the payment ID or account ID doesn’t match an existing resource, the API returns a 403 response.