Quick Start for Buyers
This section explains how buyers (wallets, AI agents, or applications) can generate valid payment headers that authorize token transfers and authenticate payment when accessing protected resources. For the seller-side implementation, see Quick Start for Sellers.
Prerequisites
Cronos-compatible wallet with private key or browser wallet extension
USDC.E token balance (see Network Constants for contract addresses)
For Cronos Testnet, you can obtain devUSDC.e tokens from the faucet for testing purposes
Integration Steps
Receive 402 Response - Buyer requests resource and receives payment requirements
Generate Payment Header - Create EIP-3009 signature authorizing token transfer
Retry with Payment - Send request with
X-PAYMENTcontaining authorizationReceive Content - Seller settles payment and returns protected resource
Installation
npm install ethersComplete Payment Flow
const axios = require('axios');
const { ethers } = require('ethers');
const { createPaymentHeader } = require('./payment-header-generator');
async function payForResource(resourceUrl, wallet) {
try {
// Step 1: Initial request to resource (expect 402)
const initialResponse = await axios.get(resourceUrl).catch(err => err.response);
// Step 2: Check for 402 Payment Required
if (initialResponse.status !== 402) {
return initialResponse.data;
}
const { paymentRequirements } = initialResponse.data;
// Step 3: Generate payment header (sign EIP-3009 authorization)
const paymentHeaderBase64 = await createPaymentHeader({
wallet: wallet,
paymentRequirements: paymentRequirements,
network: paymentRequirements.network,
});
// Step 4: Retry request with payment header
const paidResponse = await axios.get(resourceUrl, {
headers: { 'X-PAYMENT': paymentHeaderBase64 },
});
return paidResponse.data;
} catch (error) {
throw error;
}
}
// Example usage
async function main() {
const privateKey = process.env.PRIVATE_KEY;
const provider = new ethers.JsonRpcProvider('https://evm-t3.cronos.org');
const wallet = new ethers.Wallet(privateKey, provider);
const resourceUrl = 'https://seller-api.example.com/api/premium-data';
const result = await payForResource(resourceUrl, wallet);
return result;
}
main();Generating Payment Header
Common Pitfalls
Common mistakes when implementing the payment header generation:
Wrong Token Metadata
Invalid Nonce Format
Decimal in Amount
Timestamp in Milliseconds
Last updated
Was this helpful?