Query the BondTerminal API with x402 pay-per-call auth. No API key, no subscription — just sign and pay per request.
Cost: $0.01 USDC per request on Base mainnet.
Base URL: https://bondterminal.com/api/v1
MethodEndpointDescriptionAuthGET/treasury-curveUS Treasury yield curveFreeGET/bondsList all bonds (60+)x402GET/bonds/:idBond details by ISIN or local tickerx402GET/bonds/:id/analyticsPrice, YTM, duration, spreadsx402GET/bonds/:id/cashflowsCashflow schedulex402GET/bonds/:id/historyHistorical price/yield/spreadx402POST/calculateBond analytics from custom pricex402GET/riesgo-paisCurrent Argentina country riskx402GET/riesgo-pais/historyHistorical riesgo país seriesx402POST/calculate/batchBatch calculationsBearer only
Identifier formats: ISIN ( US040114HS26), local ticker with D/C suffix ( AL30D, GD30D).
Full docs: https://bondterminal.com/developers
Endpoint reference in this skill: references/endpoints.md
402 with PAYMENT-REQUIRED headertransferWithAuthorization via the x402 client libraryPAYMENT-SIGNATURE header (v2), with X-PAYMENT as legacy fallbackPAYMENT-RESPONSE headerbash
npm install @x402/core @x402/evm viem
Note: The code examples use ES modules. Use
.mjsfile extension or add"type": "module"to yourpackage.json.
The x402 payment flow requires an EVM signer on Base mainnet with USDC balance. Configure your signer following the x402 EVM documentation.
The signer must implement { address, signTypedData } — any viem-compatible wallet client works (hardware wallet, KMS, injected provider, etc).
See references/signer-setup.md for a complete signer configuration example.
javascript
import { x402Client } from '@x402/core/client';
import { x402HTTPClient } from '@x402/core/http';
import { ExactEvmScheme } from '@x402/evm'; // exact export name
// signer = { address, signTypedData } — see references/signer-setup.md
const scheme = new ExactEvmScheme(signer);
const client = new x402Client();
client.register('eip155:8453', scheme); // Base mainnet
const httpClient = new x402HTTPClient(client);
javascript
async function fetchBT(path) {
const url = `https://bondterminal.com/api/v1${path}`;
let res = await fetch(url);
if (res.status === 402) {
const paymentRequired = httpClient.getPaymentRequiredResponse(
(name) => res.headers.get(name),
await res.json()
);
const payload = await httpClient.createPaymentPayload(paymentRequired);
// Preferred v2 header
res = await fetch(url, {
headers: httpClient.encodePaymentSignatureHeader(payload),
});
// Legacy fallback for servers still expecting X-PAYMENT
if (res.status === 402) {
const encoded = Buffer.from(JSON.stringify(payload)).toString('base64');
res = await fetch(url, { headers: { 'X-PAYMENT': encoded } });
}
}
if (!res.ok) {
throw new Error(`BondTerminal request failed (${res.status})`);
}
return res.json();
}
// Examples
const bonds = await fetchBT('/bonds');
const analytics = await fetchBT('/bonds/AL30D/analytics');
const riesgo = await fetchBT('/riesgo-pais');
Validate both free and paid flows:
javascript
await fetchBT('/treasury-curve'); // free route (no payment)
await fetchBT('/riesgo-pais'); // paid route (triggers x402 flow)
The signing wallet needs:
No ETH for gas is required — x402 uses EIP-3009 (off-chain signature), not on-chain transactions.
POST /calculate/batch requires a Bearer API key subscription — not available via x402AL30D (USD), AL30C (ARS) — not AL30PAYMENT-RESPONSE header contains settlement metadata (payer, tx hash, network)