To accept a one-time payment with a fixed amount and expiry window, use a
transient payment intent instead. See How-to: Receive a stablecoin
payin.
Prerequisites
Before you begin, ensure that you’ve:- Aligned with Circle on your Managed Payments onboarding model (Direct or Intermediary).
- Completed Managed Payments onboarding with Circle and obtained API
credentials. The cURL examples use the sandbox host
api-sandbox.circle.com. - (Optional) Set up a webhook endpoint to receive payment intent and payment events. See Set up a webhook endpoint.
- (Optional) Funded a payer wallet with USDC and native gas on the blockchain you set on the intent, for an end-to-end test. For example, use Sepolia ETH when the intent uses an Ethereum test blockchain.
Step 1: Create a payment intent
When the customer confirms they want to pay with USDC on Ethereum, send a request to create a payment intent. In a continuous intent, you specify settlement currency and chain. No fixed charge amount is set on create. The required fields differ by Circle entity. Select the tab for the Circle entity that books your payins.- Circle LLC (US)
- Circle Singapore (CIRCLE_SG)
Create a payment intent:The response returns a
continuous intent with a created status and no
deposit address yet:Response
paymentIntents notification
for the new intent:
Webhook notification
Step 2: Get the deposit address
For security reasons, the API doesn’t return the deposit address in the create response. Retrieve it from a webhook notification or by polling the payment intent.- Webhook
- Polling
To receive webhook notifications, follow the steps in
Set up a webhook endpoint.
After you subscribe, you receive updates when the payment intent changes. When
paymentMethods.address is set, a notification arrives with a new timeline
entry and status: active.Payment intent webhook notification
Step 3: Share the deposit address with the customer
ShowpaymentMethods.address to the customer so they can send USDC on the
correct blockchain. Present it as plain text the customer can copy, or as a QR
code they can scan with a wallet app.
A continuous payment intent doesn’t define a fixed amount on create. You
communicate any specific charge, such as an invoice total, from your own
checkout or UI.
Step 4: Confirm the payment
When Circle detects the onchain transfer, it creates a payment linked to the intent and updates the intent’samountPaid. The payment starts as pending
and moves to paid when the funds settle. Track it with webhooks or by polling.
- Webhook
- Polling
Circle sends a Circle also sends a
paymentIntents notification with the updated amountPaid:Payment intent webhook notification
payments notification when it detects the transfer, with
status set to pending. A second payments notification arrives when the
payment settles and status changes to paid:Payment webhook notification
For Circle Singapore (
CIRCLE_SG) merchants, a Payment in status: "pending" may include a statusReason field indicating a compliance hold.
For example, compliance_review means Circle is awaiting Personally
Identifiable Information (PII) before releasing funds. For the full list of
values, see Stablecoin payin
states.For blockchains that require a ‘memo’ or ‘address tag’ (XLM, HBAR, etc.), the
optional
addressTag field will be present in the depositAddress object.