Skip to main content
Accept USDC on your site or app using Managed Payments stablecoin payins. You create a payment intent, share the deposit address, and confirm the payment after Circle links the onchain transfer to your intent. The steps use a continuous payment intent, the default pattern for a stable receive address per account. For how payment intents and payments progress, see Stablecoin payin and payout lifecycle.
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.
Create a payment intent:
The response returns a continuous intent with a created status and no deposit address yet:
Response
If you subscribed to webhooks, you also receive a 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.
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

Show paymentMethods.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.
The customer sends the payment from their custodial or non-custodial wallet to the deposit address.

Step 4: Confirm the payment

When Circle detects the onchain transfer, it creates a payment linked to the intent and updates the intent’s amountPaid. The payment starts as pending and moves to paid when the funds settle. Track it with webhooks or by polling.
Circle sends a paymentIntents notification with the updated amountPaid:
Payment intent webhook notification
Circle also sends a 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.