Ga naar hoofdinhoud
BETALINGS API

Een betalings-API ontworpen voor AI-agentcode.

Een kleine REST API. Ondertekende webhooks. Officiële SDKs in vijf talen. Gebouwd zodat jouw agent USDC kan verzenden en verrekenen en betalingen kan verifiëren in een paar regels code.

Transactieweergave: binnenkomende USDC-betalingen bevestigd op Base

De Blockchain0x API is opzettelijk klein. We willen niet dat je een uur documentatie leest om je eerste betaling te doen. We willen dat je een snippet kopieert, je API-sleutel plakt en het uitvoert.

DE KERN ENDPOINTS

Een klein oppervlak, gebouwd voor agentcode.

De betaling-vormige routes zijn hieronder. Webhooks, api-sleutels, en alleen-lezen uitgaven-permissies ronden het oppervlak af; de SDK wikkelt alles in.

POST/v1/paymentsStuur een USDC-betaling vanuit een agent wallet
GET/v1/transactions/{id}Haal de status en hash van een transactie op
POST/v1/payment-requests/{id}/settleVerwerk een factuur met on-chain bewijs
GET/v1/agents/{id}Haal een agent wallet op
POST/v1/agentsMaak een agent wallet aan
DE VERZONDEN WEBHOOK-EVENTS

Alle ondertekend met HMAC-SHA256.

Handtekening in de X-Blockchain0x-Signature header. Replay-venster van 5 minuten. Idempotentie-sleutels bij elke POST.

payment.received

USDC is aangekomen in een van je agent wallets

payment.sent

een uitgaande betaling van je agent werd op de keten afgehandeld

wallet.deployed

de slimme portemonnee van een agent werd ingezet

webhook.test

een testlevering die je vanuit het dashboard hebt geactiveerd

EEN PAAR REGELS

Stuur USDC vanuit de wallet van je agent.

PYTHON
from blockchain0x import Client

client = Client(api_key="sk_test_...")  # sk_test_ testnet, sk_live_ mainnet
tx = client.payments.create(body={
    "agentId": "agt_123",
    "to": "0xRecipient",
    "amountWei": "10000",  # USDC base units (6 decimals): 0.01 USDC
})
print(tx)  # may return 503 until the chain adapter is wired for your network
OFFICIËLE SDK's

Typed clients voor TypeScript en Python.

TYPESCRIPT
npm install @blockchain0x/node

Werkt met Node 18+. Native TypeScript-typen.

PYTHON
pip install blockchain0x

Python 3.9+. Sync en async clients.

VOLLEDIGE ENDPOINT SCHEMA'S

De aanvraaglichamen die de SDK wikkelt.

Dit zijn de geverifieerde invoerwaarden voor elke route. Antwoorden worden hier kort weergegeven; de volledige getypte vormen bevinden zich in de SDK en de API-referentie. Bedragen zijn USDC basis eenheden (6 decimalen).

POST/v1/payments

Stuur een USDC-betaling (payments.create). amountWei is USDC basis eenheden (6 decimalen). Kan 503 retourneren totdat de chain adapter is aangesloten.

VERZOEK
{
  "agentId": "agt_123",
  "to": "0xRecipient",
  "amountWei": "10000",
  "metadata": { "reason": "Research report" }
}
ANTWOORD
{
  "txHash": "0xff5...e12"
}
POST/v1/payment-requests/{id}/settle

Verwerk een betalingsverzoek (factuur) dat in het dashboard is aangemaakt, met on-chain bewijs (paymentRequests.settle). Er is geen aanmaakroute - alleen afhandelen.

VERZOEK
{
  "txHash": "0xff5...e12",
  "payerAddress": "0xBuyer...",
  "amountUsdcVerified": "0.10"
}
ANTWOORD
{
  "txHash": "0xff5...e12"
}
GET/v1/transactions/{id}

Haal een enkele transactie op op id (transactions.get).

VERZOEK
(no body)
ANTWOORD
{
  "id": "tx_01J9...",
  "txHash": "0xff5...e12"
}
GET/v1/agents/{id}

Haal een agent wallet op (agents.get). De openbare pagina bevindt zich op wallet.blockchain0x.com/a/{slug}.

VERZOEK
(no body)
ANTWOORD
{
  "id": "agt_01J9QKE...",
  "name": "research-bot",
  "public_url": "https://wallet.blockchain0x.com/a/research-bot"
}
GET/v1/agents/{id}/spend-permissions

Lees de uitgavenrechten van een agent. LEES-ALEN via de API - creatie en wijzigingen zijn alleen via het dashboard.

VERZOEK
(no body)
ANTWOORD
{
  "allowance_wei": "5000000",
  "per_tx_wei": "1000000",
  "period_seconds": 86400,
  "start_at": "2026-05-15T00:00:00Z",
  "revoked_at": null
}
WEBHOOK HANDTEKENING VERIFICATIE

Verifieer altijd de handtekening voordat je de payload vertrouwt.

Iedereen kan POST naar je callback-URL. De handtekening is wat bewijst dat de gebeurtenis daadwerkelijk van ons afkomstig is.

Elke levering bevat een X-Blockchain0x-Signature header (t=<unix>,v1=<hex>) - een HMAC-SHA256 over de string `${t}.${rawBody}` met je webhook geheim, binnen een replayvenster van 5 minuten. In Node doet webhooks.verify van @blockchain0x/node dit en retourneert een gediscrimineerde unie waar je op takken. In andere talen, bereken dezelfde HMAC en vergelijk in constante tijd. Lees de RAW body, niet een geparsed exemplaar - opnieuw serialiseren breekt de handtekening.

TYPESCRIPT (NODE + EXPRESS)
import express from "express";
import { webhooks } from "@blockchain0x/node";

const app = express();
// Capture the RAW body. The HMAC is over the exact bytes on the wire.
app.use(express.raw({ type: "application/json" }));

app.post("/webhooks/payment", (req, res) => {
  const result = webhooks.verify({
    headers: req.headers,
    rawBody: req.body, // Buffer, raw bytes
    secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
  });
  if (!result.ok) return res.status(400).json({ code: result.code });
  // result.eventType is "payment.received" | "payment.sent" | ...
  handleEvent(result);
  res.status(200).send("ok");
});
PYTHON (FLASK)
import hmac, hashlib, os, time
from flask import Flask, request, abort

app = Flask(__name__)
SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode()

@app.post("/webhooks/payment")
def receive():
    raw = request.get_data()  # RAW bytes - do not parse first
    sig = request.headers.get("X-Blockchain0x-Signature", "")
    ts = request.headers.get("X-Blockchain0x-Timestamp", "")
    # Header is "t=<unix>,v1=<hex>"; some proxies send bare hex + the ts header.
    parts = dict(p.split("=", 1) for p in sig.split(",") if "=" in p)
    t, v1 = parts.get("t", ts), parts.get("v1", sig)
    want = hmac.new(SECRET, t.encode() + b"." + raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(want, v1) or abs(time.time() - int(t)) > 300:
        abort(401)
    handle_event(request.headers.get("X-Blockchain0x-Event-Type"), request.get_json())
    return "ok", 200

De webhook secret wordt één keer teruggegeven wanneer je de webhook aanmaakt of roteert (webhooks.rotateSecret), en BLOCKCHAIN0X_WEBHOOK_SECRET is waar je handler hem leest. Roterende wijziging maakt de oude secret ongeldig, dus coördineer de uitrol: zet de nieuwe secret in de env van je server, deploy, en roteer daarna. De meegeleverde events zijn payment.received, payment.sent, wallet.deployed en webhook.test - branch op het event type en negeer de rest.

IDEMPOTENTIE

Probeer het opnieuw op een veilige manier. De API zal niet twee keer betalen.

Agentcode herhalingen. Netwerken vallen verbindingen weg. LLM's besluiten om de tool twee keer aan te roepen. Om dit veilig te maken, stuur een Idempotency-Key header op de POST. payments.create in de SDK mint automatisch een stabiele voor jou, zodat een herhaalde oproep samenvalt met een enkele on-chain indiening in plaats van twee keer te betalen. Overschrijf het met je eigen sleutel wanneer je dezelfde logische operatie over processen wilt dedupliceren.

BASH
curl -X POST https://api.blockchain0x.com/v1/payments \
  -H "Authorization: Bearer $BLOCKCHAIN0X_API_KEY" \
  -H "Idempotency-Key: 8e2c3a40-pay-vendor-once" \
  -H "Content-Type: application/json" \
  -d '{ "agentId": "agt_123", "to": "0xRecipient", "amountWei": "10000" }'
  • Eerste oproep: dient de betaling in, retourneert de transactie.
  • Probeer opnieuw met dezelfde sleutel: samenvoegen tot één on-chain indiening in plaats van twee keer te betalen.
  • De SDK regelt het: payments.create auto-mints een stabiele Idempotency-Key, zodat een herhaalde oproep veilig is uit de doos.
  • Overschrijf het: geef je eigen sleutel door wanneer je dezelfde logische bewerking over processen wilt dedupliceren.

Het aanbevolen patroon is om een UUID per logische operatie in jouw agentcode te genereren (bijv. één UUID per "betaal leverancier X voor bestelling Y") en deze opnieuw te gebruiken bij herhalingen totdat de operatie slaagt. De officiële SDK's genereren er automatisch één voor payments.create als je deze niet opgeeft.

SLEUTELBEPERKINGEN

Lees je limiet van de reactie, niet van een tabel.

Limieten schalen met uw plan. In plaats van getallen hard te coderen die afdrijven, vertelt elke reactie u waar u staat en de SDK's regelen de terugval voor u.

Headers op elke succesvolle reactie

  • X-RateLimit-Limit: de constante prijs van uw plan
  • X-RateLimit-Remaining: hoeveel oproepen zijn er nog over in dit venster
  • X-RateLimit-Reset: unix-seconden wanneer het venster reset

Wanneer je de limiet bereikt (HTTP 429)

  • Respons bevat Retry-After in seconden
  • De officiële SDK's proberen opnieuw bij 429 en 5xx met exponentiële terugval, met inachtneming van Retry-After
  • De meeste code behandelt 429 nooit handmatig omdat de SDK dat al doet
X402 COMPATIBILITEIT

Spreekt x402 vloeiend. Werkt ook zonder.

x402 is het open protocol voor HTTP-native betalingen. De premisse: elke API die 402 Payment Required retourneert, kan betalingsvereisten in de respons adverteren, en elke client die de specificatie begrijpt, kan betalen en opnieuw proberen - geen aanmelding, geen API-sleutel, geen onderhandelingen buiten de band. Blockchain0x levert echte x402-pakketten: een betaalzijde client en ontvangzijde server adapters. Het enige schema vandaag is exact-usdc, op Base.

DE 402 DIE EEN SERVER RETOURNEERT WANNEER EEN OPROEPER NIET HEEFT BETAALD
HTTP/1.1 402 Payment Required
Content-Type: application/json

{
  "version": 1,
  "resource": "https://api.example.com/paid-endpoint",
  "accepts": [
    { "scheme": "exact-usdc", "network": "eip155:8453" }
  ]
}

Wat de agentaanroeper doet

  1. Leest de 402-body: versie 1, de resource en een niet-lege accepts[] met betalingsvereisten (scheme exact-usdc, network eip155:8453 voor Base).
  2. Maakt een betaling aan en verstuurt de request opnieuw met een X-Payment: exact-usdc:<base64(json)> header.
  3. Aan de betaalzijde doet createX402Client({ sdk }) uit @blockchain0x/x402 dit voor u - het beantwoordt 402's automatisch.
  4. Je server verifieert de X-Payment-header en voert de oorspronkelijke aanvraag uit.

Beide zijden, echte pakketten

Aan de betaalzijde, createX402Client({ sdk }) van @blockchain0x/x402 verpakt fetch en beantwoordt automatisch 402s. Aan de ontvangkant, createX402Plugin (Fastify) en createX402Middleware (Express) maak je eigen eindpunten. Of sla x402 over en gebruik de REST API direct - de twee kunnen gecombineerd worden, zodat je x402 kunt toevoegen wanneer je er klaar voor bent.

VAKANT VRAAG

Vijf API-vragen die ontwikkelaars als eerste stellen.

Kan ik de API gebruiken zonder de SDK?

Ja. De SDK's zijn dunne wrappers rond standaard JSON over HTTPS met bearer-token-auth. Alles wat HTTP en HMAC-SHA256 kan spreken, kan de API rechtstreeks gebruiken. De SDK's bestaan voor ergonomisch typen, herhalingen en idempotency-key generatie; ze zijn handig, niet vereist. We leveren clients voor Node, Python, Ruby, Go en JVM; in elke andere taal, bel de ruwe API.

Wat gebeurt er als mijn webhook-eindpunt niet werkt wanneer een gebeurtenis plaatsvindt?

Leveringen proberen opnieuw met backoff en elke poging wordt gelogd in het dashboard met de HTTP-responscode. Als je een evenement mist, kun je het reconciliëren via de API - haal de transactie op op id met GET /v1/transactions/{id} - in plaats van alleen op de webhook te vertrouwen. Verifieer elke levering met webhooks.verify (of de gedocumenteerde HMAC) voordat je het vertrouwt, en reageer snel 2xx zodat een trage handler niet als een mislukking lijkt.

Hoe voorkom ik dubbele betalingen als mijn agent opnieuw probeert bij netwerkfouten?

Stuur een Idempotency-Key-header bij de POST. payments.create in de SDK mint automatisch een stabiele voor je, zodat een herhaalde oproep samenvalt tot een enkele on-chain indiening in plaats van twee keer te betalen. Overschrijf het met je eigen sleutel wanneer je dezelfde logische bewerking over processen wilt dedupliceren. De sleutel is het veiligheidsnet voor precies het geval waarin je agent of het netwerk halverwege opnieuw probeert.

Is er een snelheidslimiet?

Ja, en het schaalt met je plan. In plaats van cijfers die afdrijven hard te coderen, lees ze van de respons: elke oproep retourneert X-RateLimit-Limit, X-RateLimit-Remaining, en X-RateLimit-Reset, en een 429 bevat Retry-After in seconden. De officiële SDK's proberen al opnieuw bij 429 en 5xx met exponentiële terugval en respecteren Retry-After, zodat de meeste code dit nooit handmatig hoeft te behandelen.

Is dit x402-compatibel?

Ja. De x402-pakketten zijn echt: createX402Client({ sdk }) van @blockchain0x/x402 beantwoordt 402-uitdagingen aan de betaalzijde, en createX402Plugin (Fastify) / createX402Middleware (Express) poort je eigen eindpunten aan de ontvangzijde. Het enige schema vandaag is exact-usdc, en het draadformaat is een X-Payment: exact-usdc:<base64(json)> aanvraagheader tegen een 402 waarvan de body versie 1 adverteert en een accepts[] lijst. Je kunt ook x402 negeren en gewoon de REST API rechtstreeks gebruiken.

Verzend je eerste betaling.

Gratis om te beginnen. Een paar regels van API-sleutel naar je eerste USDC-overdracht op Base.