# Accept USDC on Ethereum (ERC20)

> Accept USDC on Ethereum (ERC20) with CryptoLike: price in USD or USDC, the payer pays on a hosted page, funds reach your balance after confirmations.

Source: https://cryptolike.net/coins/usdc-erc20
Updated: 2026-09-28

CryptoLike credits a USDC (ERC20) payment to your balance after 12 confirmations of the Ethereum network and reports it to your server with a signed webhook. You create the payment; the payer sends USDC from their own Ethereum wallet; CryptoLike watches the address, counts confirmations and moves the status from `pending` to `paid`.

## How a USDC (ERC20) payment works

A USDC (ERC20) payment in CryptoLike goes through four steps and three statuses: `new`, `pending` and `paid`. The payment page, the API and the webhooks show the same status string, so your order logic reads one field. The payer needs no account with CryptoLike, only an Ethereum wallet that holds USDC and some ETH for gas.

1. **You create the payment** with `POST /v1/invoices`, the [Magento 2 module](https://cryptolike.net/integrations/magento), the [PrestaShop module](https://cryptolike.net/integrations/prestashop) or a [payment link](https://cryptolike.net/use-cases/payment-links). Status: `new`.
2. **The payer sees what to send:** the exact USDC amount, the network (Ethereum), the address with a QR code and the time left.
3. **The transfer is detected.** Status: `pending`, "Payment detected. Waiting for confirmation."
4. **The payment is confirmed.** After 12 confirmations the status is `paid`, the funds are on your balance and a signed `invoice.paid` [webhook](https://cryptolike.net/docs/webhooks) arrives.

## What sets USDC on Ethereum apart

USDC is a US-dollar stablecoin issued by Circle. On Ethereum it has 6 decimal places: a USDC amount in `POST /v1/invoices` may carry up to six digits after the point, and the API refuses a finer one. A USD price is converted and rounded up to six places. Circle can block an address, and a wallet on a blocked address cannot send USDC, so a payment from it never arrives. USDC and USDT are different tokens even though both track the dollar: a USDC payment is paid only in USDC, and a payer who holds USDT needs a [USDT payment](https://cryptolike.net/coins/usdt-erc20).

## What the payer should know about Ethereum

CryptoLike accepts USDC on Ethereum only from the official USDC ERC20 contract, sent to an address that starts with `0x`. The payer's wallet pays the Ethereum network fee, called gas, in ETH, so the payer needs some ETH next to the USDC. The amount on the payment page must arrive in full, on Ethereum mainnet only.

- **Address.** `0x` followed by 40 hexadecimal characters. Other EVM-compatible networks use the same format, so check the network name on the page, not only the address.
- **Network fee.** Gas is paid in ETH and changes with network load. A wallet with USDC and zero ETH cannot send.
- **Contract.** Only USDC of the contract `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` is credited; a token with the same name from another contract is not.
- **Exact amount.** If an exchange deducts its withdrawal fee, the payment arrives short and becomes `underpaid`. Send the difference to the same address before the time runs out.
- **Network.** USDC sent on another network never reaches this payment and cannot be recovered.

## Create a USDC (ERC20) payment

To create a USDC (ERC20) payment in CryptoLike, take the `id` of the asset with `ticker` USDC and `network` eth from `GET /v1/currencies` and pass it as `coin_id` to `POST /v1/invoices`. Price it in USD, as in the example, or in USDC; a fiat amount is converted at the current rate, locked for the payment's time limit.

```bash
COIN_ID=$(curl -s https://api.cryptolike.net/v1/currencies \
  | jq -r '.currencies[] | select(.ticker=="USDC" and .network=="eth") | .id')

BODY='{"amount":"1200.00","currency":"USD","coin_id":"'"$COIN_ID"'","order_id":"INV-2026-042"}'
curl -s https://api.cryptolike.net/v1/invoices \
  -H "Content-Type: application/json" -H "Idempotency-Key: INV-2026-042" \
  -H "X-API-Key: $KEY_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" -d "$BODY"
```

The response carries `address`, `payer_amount`, `rate_locked` and `checkout_url`: send the payer there. Signing: [API authentication](https://cryptolike.net/docs/auth); every field: [API reference](https://cryptolike.net/docs/api).

## FAQ

### How many confirmations does USDC ERC20 need?

CryptoLike credits USDC (ERC20) after 12 confirmations of the Ethereum network. The threshold is set per asset, returned in `GET /v1/currencies` and shown to the payer as progress. More on [confirmations](https://cryptolike.net/glossary/confirmations).

### What if the payer sends USDC on another network?

The transfer does not reach this payment and cannot be recovered: CryptoLike accepts USDC on Ethereum only. If the payer holds USDT instead, create a payment for [USDT on Ethereum](https://cryptolike.net/coins/usdt-erc20) or [USDT on TRON](https://cryptolike.net/coins/usdt-trc20).

### Can I price in USD?

Yes. Send `currency: "USD"` with the USDC `coin_id`: CryptoLike converts at the current rate and locks it for the payment's time limit ([rate lock](https://cryptolike.net/glossary/rate-lock)). If no fresh rate is available, the API answers `503`: retry, or price the payment in USDC.

### Can I bill a client in USDC without a website?

Yes. Create a payment in the cabinet or the Telegram bot and send the link; the client pays on the same payment page. [Crypto invoicing](https://cryptolike.net/use-cases/invoicing) covers the B2B flow.

### How do payouts in USDC work?

`POST /v1/withdrawals` with `coin_id`, `amount`, `to_address` and your `payout_id`, or a CSV of up to 1,000 rows in the cabinet ([mass payouts](https://cryptolike.net/use-cases/mass-payouts)). `POST /v1/withdrawals/estimate` first shows the platform fee, the reserved network fee (in USDC, no ETH balance needed) and the total debit. Payouts require a verified account; fees are on the [pricing page](https://cryptolike.net/pricing).
