Source: https://cryptanio.com/wiki/accept-usdc-payments-website/
Language: en

# How to accept USDC payments on your website

Set up payment for a single order in USDC on a network chosen in advance\: verify the exact token\, connect an address to the project\, create an invoice and confirm the result on your server\.

Updated: 2026-11-14

To accept [USDC](<https://cryptanio.com/wiki/what-is-usdc/>) on your website\, link the order to a Cryptanio invoice and determine the network and exact token in advance\. This guide uses a shop that has agreed to accept USDC on Ethereum\. The server creates a separate invoice\, the buyer receives a payment page\, and the order is confirmed after the result has been checked\. Funds arrive at your address\.

This is a fixed\-asset scenario\: the buyer must send the specified version of USDC\, rather than any coin with a similar name\. The general choice between a payment link and server integration is covered in the [guide to accepting cryptocurrency on a website](<https://cryptanio.com/wiki/accept-cryptocurrency-payments-on-your-website/>)\.

## 1\. Establish which USDC you accept {#1-establish-which-usdc-you-accept}

Compare the network and token identifier with the [official Circle directory](<https://developers.circle.com/stablecoins/usdc-contract-addresses>)\. The USDC name and a wallet logo are not enough on their own\. Circle\'s support for a network does not prove that the route is enabled in your Cryptanio project\.

Circle distinguishes native USDC\, issued directly by the issuer on the network\, from bridged USDC created by a third\-party bridge\. Do not treat these forms as interchangeable for your invoice\; the differences are explained in [Circle\'s material](<https://www.circle.com/bridged-usdc>)\. This scenario selects supported Circle USDC on Ethereum\. For another network\, recheck its token and availability\.

The word native in native USDC does not mean the blockchain\'s native coin\. On Ethereum\, USDC remains a token and the native coin is ETH\. This distinction matters when configuring the address\.

## 2\. Prepare an address for the correct asset {#2-prepare-an-address-for-the-correct-asset}

You need a project with an active Payments service\, the public address of your own wallet and permission to configure the project\. Open Payments\, select the project and Addresses\, then Add addresses\. On the Manually tab\, select Ethereum and enter an address you control\.

Select One asset and fill in Asset with the supported USDC identifier for this network\, checked against Circle\'s directory\. An empty field means the native coin\, not native USDC\. Keep Incoming enabled\, add the address\, and check that the connection is active and the network is available\. Saving an address in the address book alone does not connect receiving to the required service\.

For a manual pool\, prepare an unused address for issuing payment details\. Do not provide a private key or seed phrase\: neither is needed to connect a public address\. The basics of checking a route are explained in [Network and token differences](<https://cryptanio.com/wiki/network-and-token/>)\.

## 3\. Create an invoice for the order {#3-create-an-invoice-for-the-order}

Prepare a live server\-side API key with access to this project\, the ` invoices ` section \(Invoices\) and Read and write permission\. Save your own order number before making the request\. Do not give the key to the buyer\.

Below is a supported API v1 example for a fixed asset\. Check the network\, asset and amount for your order in the generated request\. A USDC amount is a quantity of tokens\, not a deposit of dollars into a bank account\:

```bash
#!/usr/bin/env bash
set -euo pipefail
: "${CRYPTANIO_API_KEY:?Set CRYPTANIO_API_KEY}"
: "${CRYPTANIO_OPERATION_ID:?Set CRYPTANIO_OPERATION_ID}"
: "${CRYPTANIO_PROJECT_ID:?Set CRYPTANIO_PROJECT_ID}"
json_string() {
  local text="$1" char code index output='"'
  for ((index=0; index<${#text}; index++)); do
    char="${text:index:1}"
    case "$char" in
      '"'|'\') output+="\\$char" ;;
      *) printf -v code '%d' "'$char"
         if ((code < 32)); then printf -v char '\\u%04x' "$code"; fi
         output+="$char" ;;
    esac
  done
  printf '%s"' "$output"
}
response_file="$(mktemp)"
trap 'rm -f "$response_file"' EXIT
transfer_status=0
http_status="$(curl \
  --silent --show-error --max-time 30 --request POST \
  --header "Authorization: Bearer $CRYPTANIO_API_KEY" \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header "Idempotency-Key: $CRYPTANIO_OPERATION_ID" \
  --data-binary '{"project":'"$(json_string "$CRYPTANIO_PROJECT_ID")"',"chain":"ethereum","asset":"USDC","amount":"12.50","reference":"order-42","expires_in":60,"customer":{"id":"customer-42"},"metadata":{"order":"42"}}' \
  "https://api.cryptanio.com/v1/invoices" \
  --output "$response_file" --write-out '%{http_code}')" || transfer_status=$?
if [[ "$http_status" == 2?? ]]; then
  cat "$response_file"
  exit "$transfer_status"
fi
printf 'HTTP %s\n' "$http_status" >&2
cat "$response_file" >&2
exit 1
```

[Download example](</wiki/examples/38cca7b5342c341da4c75681e8582ba082b99c168b784e03e55751750ce333d0.sh>)

Provide your project and order details\. Use a unique Idempotency\-Key for a new operation\; retain the same key when retrying the same request after a failure\. Save the link between your order and the created invoice ID\, the returned ` checkout_url `\, and the exact payment details from the response\. Do not round the returned amount or replace it with the figure in your price list\.

## 4\. Give the customer the payment page {#4-give-the-customer-the-payment-page}

Open the returned ` checkout_url ` from the order on your website\. Do not construct the page URL from the invoice ID or substitute a permanent wallet address for the issued payment details\. The network and asset have already been selected for this scenario\: the customer must check them in their wallet before sending\.

Ask the customer to send the exact amount\, taking account of the wallet\'s fee rules and the payment deadline\. If they hold a different version of USDC\, simply renaming the token will not make the transfer suitable\. Agree on the correct route first\; do not promise automatic exchange or bridging by Cryptanio\.

## 5\. Confirm the order and check the entire process {#5-confirm-the-order-and-check-the-entire-process}

The server must check the invoice\'s current state using a [webhook](<https://cryptanio.com/wiki/confirm-orders-with-crypto-payment-webhooks/>) or [API polling](<https://cryptanio.com/wiki/check-payment-api-without-webhook/>)\. Fulfil the order at ` paid `\, while retaining protection against duplicate fulfilment\. A detected transaction\, a screenshot or the buyer returning to your website does not replace this check\.

Handle underpayments\, overpayments\, late receipts and transaction rollbacks according to the particular invoice state\. In a disputed case\, keep the TXID and use the [unpaid\-order troubleshooting guide](<https://cryptanio.com/wiki/order-unpaid-after-crypto-payment/>)\. Do not assign a different asset to this order merely because the amount looks similar\.

Check the full process with your own order\: payment details\, sending\, confirmation and fulfilment\. Live mode uses real funds and network fees\. Checking only the page\'s appearance or artificial events does not prove that the selected USDC actually arrives and is accounted for correctly\.

Tags: [Payments](https://cryptanio.com/wiki/tag/payments/), [USDC](https://cryptanio.com/wiki/tag/usdc/), [API](https://cryptanio.com/wiki/tag/api/)

## Related articles

- [What is USDC](https://cryptanio.com/wiki/what-is-usdc/)
- [How to accept cryptocurrency payments on your website](https://cryptanio.com/wiki/accept-cryptocurrency-payments-on-your-website/)
- [How networks and tokens differ](https://cryptanio.com/wiki/network-and-token/)
