Skip to main content
Hooks allow you to intercept and modify payment lifecycle events on clients, servers and facilitators.

Server Hooks

x402ResourceServer (Transport-agnostic)

Register hooks on the core resource server for verification and settlement lifecycle events. Use cases include logging payments, recording analytics, implementing custom access control or recovering from transient failures.
  • onBeforeVerify — Runs before payment verification. Return { abort: true, reason } to reject, or { skip: true, result } to use a locally produced verification result.
  • onAfterVerify — Runs after successful verification. Return { skipHandler: true, response? } to settle without invoking the resource handler, or { abort: true, reason, message? } to reject the payment after verification. When a hook aborts, onVerifiedPaymentCanceled is dispatched so schemes can clear any reserved state.
  • onVerifyFailure — Runs on verification failure. Return { recovered: true, result } to override.
  • onBeforeSettle — Runs before settlement. Return { abort: true, reason } to reject, or { skip: true, result } to use a locally produced settlement result.
  • onAfterSettle — Runs after successful settlement.
  • onSettleFailure — Runs on settlement failure. Return { recovered: true, result } to override.
  • onVerifiedPaymentCanceled — Runs when a verified payment is not settled. Triggered when the protected handler throws or returns an error response (handler_threw, handler_failed), or when an onAfterVerify hook aborts (after_verify_aborted).

Settlement phases and multi-settle flows

Every settle hook receives a phase field on its context indicating which settle invocation is running: The escrow payment flow settles twice — once before the handler and once after — so onBeforeSettle, onAfterSettle, onSettleFailure, and enrichSettlementPayload / enrichSettlementResponse each fire once per settle. If your hook has side effects that must not run twice (for example, sending a receipt email), branch on context.phase:
These server-level hooks run for every payment regardless of which extensions are active. Extensions and schemes can also contribute lifecycle hook adapters that run only when their extension key or scheme/network is used. See Extensions Overview for extension-level behavior.

x402HTTPResourceServer (HTTP)

Register hooks for HTTP-specific request handling before payment processing. Use cases include bypassing payment for API key holders, granting access to subscribers or blocking specific clients.
  • onProtectedRequest — Runs on every request to a protected route.
    • Return { grantAccess: true } to bypass payment.
    • Return { abort: true, reason } to return 403.
    • Return void to continue to payment flow.

Client Hooks

x402Client (Transport-agnostic)

Register hooks on the core client for payment payload creation lifecycle events. Common use cases include requiring interactive approval for large payments or logging outgoing transactions.
  • onBeforePaymentCreation — Runs before creating a payment payload. Return { abort: true, reason } to cancel.
  • onAfterPaymentCreation — Runs after successful payload creation.
  • onPaymentCreationFailure — Runs on failure. Return { recovered: true, payload } to provide fallback.
  • onPaymentResponse — Runs after a paid request completes. Return { recovered: true } to tell the transport to retry with a fresh payload.
For static USD caps and asset allowlists, use spendControls on the client config — it runs before hooks and is the preferred way to enforce spend limits. Use onBeforePaymentCreation for dynamic or interactive checks (e.g. prompting the user for approval).

x402HTTPClient (HTTP)

Register hooks for HTTP-specific payment required handling. Use cases include trying API key authentication before paying or prompting users for payment confirmation.
  • onPaymentRequired — Runs when a 402 response is received.
    • Return { headers } to retry with alternate headers before paying.
    • Return void to proceed directly to payment.

Facilitator Hooks

x402Facilitator

Register hooks on the facilitator for verification and settlement lifecycle events. Use cases include populating a bazaar discovery catalog, compliance checks or collecting metrics across all processed payments.
  • onBeforeVerify / onAfterVerify / onVerifyFailure — Same pattern as server hooks.
  • onBeforeSettle / onAfterSettle / onSettleFailure — Same pattern as server hooks.

MCP Hooks

x402MCPClient (MCP client)

Register hooks on the MCP client for payment lifecycle events specific to tool calls. Use cases include logging payments, enforcing per-tool spending limits or auditing payment receipts.
  • onPaymentRequired — Runs when a 402 payment required response is received from a tool call. First hook to return a result wins. Return { abort: true } to cancel, { payment } to supply a pre-built payload, or void to proceed with normal payment flow.
  • onBeforePayment — Runs after payment approval but before the payment payload is created.
  • onAfterPayment — Runs after the payment payload is submitted and the tool result is received.

x402MCPServer payment wrapper (MCP server)

Register hooks in the PaymentWrapperConfig.hooks object when creating a payment wrapper. Use cases include rate limiting, logging tool executions or sending payment receipts.
  • onBeforeExecution — Runs after payment verification, before the tool handler executes. Return false to abort execution.
  • onAfterExecution — Runs after the tool handler returns, before settlement.
  • onAfterSettlement — Runs after successful payment settlement.

Hook Chaining

Hooks can be chained when registering multiple handlers:

Next, explore: