Loading...

Loading...

A Developer's Guide to Implementing the x402 Protocol

This guide follows on from our previous article about EIP-3009, you can read that here

For developers, the x402 protocol is a practical toolset for monetising web services. It offers a direct alternative to cumbersome API key management and inflexible subscription models, enabling a true, pay-per-use economy.

At its core, x402 is an open-source standard that activates the long-dormant HTTP 402 "Payment Required" status code. It provides a chain-agnostic choreography for an AI agent or client to pay for a resource, like an API call, at the very moment it is requested.

The Server-Side: "One Line of Code" Monetisation

If you are a developer looking to monetise an API (the "supply" side), the integration is simple. Using middleware libraries for popular frameworks, you can payment-gate an endpoint with just a single line of code.

For a Node.js server (using Express for example), the implementation looks like this:

// This example shows how to protect an endpoint and set a price
app.use(
  paymentMiddleware("0xYourWalletAddress", {
    "/your-premium-endpoint": "$0.01" 
  })
);

// That's it. This endpoint is now monetised.
app.get("/your-premium-endpoint", (c) => {
  return c.json({ data: "secret premium data" });
});

This middleware automatically handles the entire payment negotiation, verification, and settlement flow, allowing you to focus on your application's logic.

So what is happening behind the scenes ?

The Core x402 Handshake

While the middleware makes it simple, it's crucial to understand the three-phase HTTP handshake that happens under the hood.

Phase 1: Request → Quote

  1. Initial Request: The client (which could be an AI agent) makes a standard GET request to your protected resource (/your-premium-endpoint).
  2. Payment Required: Your server's middleware intercepts this. Seeing no payment, it returns an HTTP 402: Payment Required status.
  3. Quote: The body of this 402 response is a JSON payload. This is the "bill," specifying the PaymentRequirements, such as the price (0.01 USDC), the supported network (e.g., Base), and the facilitator's API endpoint.

Phase 2: Pay → Verify

  1. Sign Payload: The client's logic (see below) receives the 402, parses the JSON "bill," and creates a payment payload. It then signs this payload off-chain using its private key.
  2. Retry with Payment: The client retries the original request. This time, it includes a new HTTP header: X-PAYMENT. The value of this header is the Base64-encoded JSON Payment Payload, which contains the signed authorisation.

Phase 3: Settle → Deliver

  1. Verify Payload: Your server's middleware intercepts the new request. It doesn't need to understand crypto; it simply forwards the X-PAYMENT payload to the specified facilitator's POST /verify endpoint. The facilitator cryptographically verifies the signature and returns a simple {"isValid": true}.
  2. Settle & Deliver: Once verified, the server does two things in parallel: it fulfils the request (granting access to the data) and sends the payload to the facilitator's POST /settle endpoint to execute the on-chain transfer.
  3. Confirmation: The server returns the final HTTP 200 OK response to the client, containing the requested resource. It also includes an X-PAYMENT-RESPONSE header, which contains the transaction hash as a receipt.

The Role of the Facilitator

The "magic" that makes the server-side implementation so simple is the facilitator. This is a third-party service that acts as the bridge between your HTTP-native server and the blockchain.

Your server remains crypto-agnostic. It never holds keys, runs a node, or pays for gas. It simply makes two stateless REST API calls (/verify and /settle) to a trusted facilitator (like those provided by Coinbase, Meridian, or Mogami), which handles all the on-chain complexity.

The Client-Side: Building an x402-Aware Agent

While the server-side is simple, the client bears the burden of complexity. Developers building agents must integrate client-side SDKs like @coinbase/x402-sdk and manage wallet capabilities.

The agent's core logic must be architected as a state machine capable of handling three scenarios:

  1. Free Requests: Standard handling for response.ok.
  2. Payment-Gated Requests: The primary logic path, triggered by response.status === 402. The agent must parse the 402, use its wallet to sign the payment, and manage the stateful retry with the X-PAYMENT header.
  3. Payment Failures: Graceful error handling if the payment fails or the service fails after payment.

The "Gasless" Magic: How EIP-3009 is Used

The "gasless" client experience is another key technical component. The client doesn't need the network's native gas token (e.g., ETH) to make a payment.

This is enabled by the EIP-3009 standard (transferWithAuthorization). The client doesn't submit a transaction; it simply signs an off-chain authorisation message. The facilitator takes this signed message and submits it to the blockchain, paying the gas fee on the client's behalf. This abstraction is what makes autonomous, high-frequency micropayments feasible.

Ultimately, x402 is a lightweight and open standard that provides the essential choreography for on-chain value exchange, finally turning the web's original, dormant "Payment Required" code into a live, usable rail for developers.

Ready to Learn More?

Explore our comprehensive courses on blockchain security and development.

Browse Courses

Share This Article