Go SDK Reference#
Packages#
| Package | Description |
|---|---|
github.com/anthropics/x402/go | Core: client, server, facilitator, types |
.../go/mechanisms/evm | EVM mechanisms: exact, aggr_deferred |
.../go/mechanisms/svm | Solana mechanisms: exact |
.../go/http/gin | Gin middleware (seller) |
.../go/http/echo | Echo middleware (seller) |
.../go/http/nethttp | net/http middleware (seller) |
.../go/http | HTTP client wrapper (buyer) |
Core Types#
Network#
Go
type Network string
// CAIP-2 format, e.g., "eip155:196", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
func (n Network) Parse() (namespace, reference string, err error)
func (n Network) Match(pattern Network) bool
Price / AssetAmount#
Go
type Price interface{}
// Can be string ("$0.01"), number (0.01), or map (AssetAmount)
type AssetAmount struct {
Asset string `json:"asset"` // Token contract address
Amount string `json:"amount"` // Smallest unit amount
Extra map[string]interface{} `json:"extra,omitempty"`
}
ResourceConfig#
Go
type ResourceConfig struct {
Scheme string `json:"scheme"` // "exact" | "aggr_deferred" | "upto"
PayTo string `json:"payTo"` // Recipient wallet
Price Price `json:"price"` // "$0.01" or AssetAmount
Network Network `json:"network"` // "eip155:196"
MaxTimeoutSeconds int `json:"maxTimeoutSeconds,omitempty"` // Default: 60
Extra map[string]interface{} `json:"extra,omitempty"`
}
VerifyResponse#
Go
type VerifyResponse struct {
IsValid bool `json:"isValid"`
InvalidReason string `json:"invalidReason,omitempty"`
InvalidMessage string `json:"invalidMessage,omitempty"`
Payer string `json:"payer,omitempty"`
}
SettleResponse#
Go
type SettleResponse struct {
Success bool `json:"success"`
ErrorReason string `json:"errorReason,omitempty"`
ErrorMessage string `json:"errorMessage,omitempty"`
Payer string `json:"payer,omitempty"`
Transaction string `json:"transaction"`
Network Network `json:"network"`
Status string `json:"status,omitempty"` // OKX: "pending" | "success" | "timeout"
}
SupportedResponse#
Go
type SupportedKind struct {
X402Version int `json:"x402Version"`
Scheme string `json:"scheme"`
Network Network `json:"network"`
Extra map[string]interface{} `json:"extra,omitempty"`
}
type SupportedResponse struct {
Kinds []SupportedKind `json:"kinds"`
Extensions []string `json:"extensions"`
Signers map[string][]string `json:"signers"` // CAIP family -> addresses
}
SettlementOverrides#
Go
type SettlementOverrides struct {
Amount string `json:"amount,omitempty"` // Atomic units, percentage, or dollar
}
View Interfaces#
Unified view for V1/V2 payment data:
Go
type PaymentRequirementsView interface {
GetScheme() string
GetNetwork() string
GetAsset() string
GetAmount() string
GetPayTo() string
GetMaxTimeoutSeconds() int
GetExtra() map[string]interface{}
}
type PaymentPayloadView interface {
GetVersion() int
GetScheme() string
GetNetwork() string
GetPayload() map[string]interface{}
}
Client API (x402Client)#
Constructor#
Go
import x402 "github.com/anthropics/x402/go"
client := x402.Newx402Client(opts ...ClientOption)
ClientOption functions:
| Option | Description |
|---|---|
WithPaymentSelector(selector) | Custom payment requirements selector |
WithPolicy(policy) | Add a payment filtering policy |
Register Methods (Chainable)#
Go
func (c *x402Client) Register(network Network, client SchemeNetworkClient) *x402Client
func (c *x402Client) RegisterV1(network Network, client SchemeNetworkClientV1) *x402Client
func (c *x402Client) RegisterPolicy(policy PaymentPolicy) *x402Client
func (c *x402Client) RegisterExtension(ext ClientExtension) *x402Client
Payment Creation#
Go
// Select best payment option from requirements list
func (c *x402Client) SelectPaymentRequirements(
requirements []types.PaymentRequirements,
) (types.PaymentRequirements, error)
// Create signed payment payload
func (c *x402Client) CreatePaymentPayload(
ctx context.Context,
requirements types.PaymentRequirements,
resource *types.ResourceInfo,
extensions map[string]interface{},
) (types.PaymentPayload, error)
Lifecycle Hooks (Chainable)#
Go
func (c *x402Client) OnBeforePaymentCreation(hook BeforePaymentCreationHook) *x402Client
func (c *x402Client) OnAfterPaymentCreation(hook AfterPaymentCreationHook) *x402Client
func (c *x402Client) OnPaymentCreationFailure(hook OnPaymentCreationFailureHook) *x402Client
Policy and Selector Types#
Go
type PaymentRequirementsSelector func(requirements []PaymentRequirementsView) PaymentRequirementsView
type PaymentPolicy func(requirements []PaymentRequirementsView) []PaymentRequirementsView
func DefaultPaymentSelector(requirements []PaymentRequirementsView) PaymentRequirementsView
Server API (x402ResourceServer)#
Constructor#
Go
server := x402.Newx402ResourceServer(opts ...ResourceServerOption)
ResourceServerOption functions:
| Option | Description |
|---|---|
WithFacilitatorClient(client) | Set facilitator client |
WithSchemeServer(network, server) | Register a scheme |
WithCacheTTL(ttl) | Set supported-kinds cache TTL |
Register Methods (Chainable)#
Go
func (s *x402ResourceServer) Register(network Network, server SchemeNetworkServer) *x402ResourceServer
func (s *x402ResourceServer) RegisterExtension(ext types.ResourceServerExtension) *x402ResourceServer
Initialization#
Go
func (s *x402ResourceServer) Initialize(ctx context.Context) error
Payment Operations#
Go
// Build requirements from config
func (s *x402ResourceServer) BuildPaymentRequirementsFromConfig(
ctx context.Context,
config ResourceConfig,
) ([]types.PaymentRequirements, error)
// Build single requirement
func (s *x402ResourceServer) BuildPaymentRequirements(
ctx context.Context,
config ResourceConfig,
supportedKind types.SupportedKind,
extensions []string,
) (types.PaymentRequirements, error)
// Create 402 response
func (s *x402ResourceServer) CreatePaymentRequiredResponse(
requirements []types.PaymentRequirements,
resourceInfo *types.ResourceInfo,
errorMsg string,
extensions map[string]interface{},
) types.PaymentRequired
// Find matching requirements for a payment payload
func (s *x402ResourceServer) FindMatchingRequirements(
available []types.PaymentRequirements,
payload types.PaymentPayload,
) *types.PaymentRequirements
// Verify payment signature
func (s *x402ResourceServer) VerifyPayment(
ctx context.Context,
payload types.PaymentPayload,
requirements types.PaymentRequirements,
) (*VerifyResponse, error)
// Settle payment on-chain
func (s *x402ResourceServer) SettlePayment(
ctx context.Context,
payload types.PaymentPayload,
requirements types.PaymentRequirements,
overrides *SettlementOverrides,
) (*SettleResponse, error)
// Check registered support
func (s *x402ResourceServer) HasRegisteredScheme(network Network, scheme string) bool
func (s *x402ResourceServer) HasFacilitatorSupport(network Network, scheme string) bool
Server Lifecycle Hooks (Chainable)#
Go
func (s *x402ResourceServer) OnBeforeVerify(hook BeforeVerifyHook) *x402ResourceServer
func (s *x402ResourceServer) OnAfterVerify(hook AfterVerifyHook) *x402ResourceServer
func (s *x402ResourceServer) OnVerifyFailure(hook OnVerifyFailureHook) *x402ResourceServer
func (s *x402ResourceServer) OnBeforeSettle(hook BeforeSettleHook) *x402ResourceServer
func (s *x402ResourceServer) OnAfterSettle(hook AfterSettleHook) *x402ResourceServer
func (s *x402ResourceServer) OnSettleFailure(hook OnSettleFailureHook) *x402ResourceServer
Scheme Interfaces#
SchemeNetworkClient (Buyer)#
Go
type SchemeNetworkClient interface {
Scheme() string
CreatePaymentPayload(ctx context.Context, requirements types.PaymentRequirements) (types.PaymentPayload, error)
}
type ExtensionAwareClient interface {
SchemeNetworkClient
CreatePaymentPayloadWithExtensions(ctx context.Context, requirements types.PaymentRequirements, extensions map[string]interface{}) (types.PaymentPayload, error)
}
SchemeNetworkServer (Seller)#
Go
type SchemeNetworkServer interface {
Scheme() string
ParsePrice(price Price, network Network) (AssetAmount, error)
EnhancePaymentRequirements(ctx context.Context, requirements types.PaymentRequirements, supportedKind types.SupportedKind, extensions []string) (types.PaymentRequirements, error)
}
SchemeNetworkFacilitator#
Go
type SchemeNetworkFacilitator interface {
Scheme() string
CaipFamily() string
GetExtra(network Network) map[string]interface{}
GetSigners(network Network) []string
Verify(ctx context.Context, payload types.PaymentPayload, requirements types.PaymentRequirements, fctx *FacilitatorContext) (*VerifyResponse, error)
Settle(ctx context.Context, payload types.PaymentPayload, requirements types.PaymentRequirements, fctx *FacilitatorContext) (*SettleResponse, error)
}
FacilitatorClient (Network Boundary)#
Go
type FacilitatorClient interface {
Verify(ctx context.Context, payloadBytes []byte, requirementsBytes []byte) (*VerifyResponse, error)
Settle(ctx context.Context, payloadBytes []byte, requirementsBytes []byte) (*SettleResponse, error)
GetSupported(ctx context.Context) (SupportedResponse, error)
}
ClientExtension#
Go
type ClientExtension interface {
Key() string
EnrichPaymentPayload(ctx context.Context, payload types.PaymentPayload, required types.PaymentRequired) (types.PaymentPayload, error)
}
MoneyParser#
Go
type MoneyParser func(amount float64, network Network) (*AssetAmount, error)
Middleware Reference#
All Go middleware packages provide three construction levels plus builder shortcuts.
Gin (go/http/gin)#
Go
import x402gin "github.com/anthropics/x402/go/http/gin"
// Standard (recommended)
r.Use(x402gin.PaymentMiddleware(routes, server, opts ...MiddlewareOption))
// From HTTP server
r.Use(x402gin.PaymentMiddlewareFromHTTPServer(httpServer, opts ...MiddlewareOption))
// From config
r.Use(x402gin.PaymentMiddlewareFromConfig(routes, opts ...MiddlewareOption))
// Builder shortcut
r.Use(x402gin.X402Payment(Config{ Routes: routes, Facilitator: facilitator, Schemes: schemes }))
// Simple one-liner
r.Use(x402gin.SimpleX402Payment(payTo, price, network, facilitatorURL))
MiddlewareOption functions:
| Option | Type | Description |
|---|---|---|
WithFacilitatorClient(client) | FacilitatorClient | Facilitator for verification/settlement |
WithScheme(network, server) | Network, SchemeNetworkServer | Register a scheme |
WithPaywallConfig(config) | *PaywallConfig | Browser paywall settings |
WithSyncFacilitatorOnStart(bool) | bool | Fetch supported kinds at startup |
WithErrorHandler(fn) | func(*gin.Context, error) | Custom error handler |
WithSettlementHandler(fn) | func(*gin.Context, *SettleResponse) | Custom settlement handler |
WithTimeout(duration) | time.Duration | Request timeout |
Config struct (builder pattern):
Go
type Config struct {
Routes x402http.RoutesConfig
Facilitator x402.FacilitatorClient
Facilitators []x402.FacilitatorClient
Schemes []SchemeConfig
PaywallConfig *x402http.PaywallConfig
SyncFacilitatorOnStart bool
Timeout time.Duration
ErrorHandler func(*gin.Context, error)
SettlementHandler func(*gin.Context, *x402.SettleResponse)
}
type SchemeConfig struct {
Network x402.Network
Server x402.SchemeNetworkServer
}
Echo (go/http/echo)#
Same API surface as Gin but with echo.Context types:
Go
import x402echo "github.com/anthropics/x402/go/http/echo"
e.Use(x402echo.PaymentMiddleware(routes, server, opts ...MiddlewareOption))
e.Use(x402echo.X402Payment(Config{ ... }))
e.Use(x402echo.SimpleX402Payment(payTo, price, network, facilitatorURL))
net/http (go/http/nethttp)#
Returns func(http.Handler) http.Handler:
Go
import x402nethttp "github.com/anthropics/x402/go/http/nethttp"
handler := x402nethttp.PaymentMiddleware(routes, server, opts ...MiddlewareOption)(yourHandler)
handler := x402nethttp.X402Payment(Config{ ... })(yourHandler)
handler := x402nethttp.SimpleX402Payment(payTo, price, network, facilitatorURL)(yourHandler)
http.ListenAndServe(":4021", handler)
HTTP Client (Buyer)#
Go
import x402http "github.com/anthropics/x402/go/http"
// Create HTTP client with payment support
httpClient := x402http.Newx402HTTPClient(x402Client)
// Wrap existing http.Client
wrappedClient := x402http.WrapHTTPClientWithPayment(http.DefaultClient, httpClient)
// Direct methods
resp, err := httpClient.GetWithPayment(ctx, url)
resp, err := httpClient.PostWithPayment(ctx, url, body)
resp, err := httpClient.DoWithPayment(ctx, req)
// Convenience functions
resp, err := x402http.Get(ctx, url, httpClient)
resp, err := x402http.Post(ctx, url, body, httpClient)
resp, err := x402http.Do(ctx, req, httpClient)
EVM Mechanisms#
ExactEvmScheme (Client)#
Go
import (
"github.com/anthropics/x402/go/mechanisms/evm"
evmsigners "github.com/anthropics/x402/go/mechanisms/evm/signers"
evmclient "github.com/anthropics/x402/go/mechanisms/evm/exact/client"
)
signer, err := evmsigners.NewClientSignerFromPrivateKey("0x...")
scheme := evmclient.NewExactEvmScheme(signer, config)
scheme.Scheme() // "exact"
ClientEvmSigner interface:
Go
type ClientEvmSigner interface {
Address() string
SignTypedData(ctx context.Context, domain TypedDataDomain, types map[string][]TypedDataField, primaryType string, message map[string]interface{}) ([]byte, error)
}
ExactEvmScheme (Server)#
Go
import evmserver "github.com/anthropics/x402/go/mechanisms/evm/exact/server"
scheme := evmserver.NewExactEvmScheme()
scheme.RegisterMoneyParser(customParser) // Optional: custom price parsing
scheme.Scheme() // "exact"
ExactEvmScheme (Facilitator)#
Go
import evmfacilitator "github.com/anthropics/x402/go/mechanisms/evm/exact/facilitator"
scheme := evmfacilitator.NewExactEvmScheme(signer, &ExactEvmSchemeConfig{
DeployERC4337WithEIP6492: false, // Auto-deploy smart wallets
SimulateInSettle: false, // Re-simulate during settle
})
EVM Types#
Go
type TypedDataDomain struct {
Name string `json:"name"`
Version string `json:"version"`
ChainID *big.Int `json:"chainId"`
VerifyingContract string `json:"verifyingContract"`
}
type TypedDataField struct {
Name string `json:"name"`
Type string `json:"type"`
}
type AssetTransferMethod string
const (
AssetTransferMethodEIP3009 AssetTransferMethod = "eip3009"
AssetTransferMethodPermit2 AssetTransferMethod = "permit2"
)
type AssetInfo struct {
Address string
Name string
Version string
Decimals int
AssetTransferMethod AssetTransferMethod
SupportsEip2612 bool
}
SVM Mechanisms#
ExactSvmScheme (Client)#
Go
import (
svmsigners "github.com/anthropics/x402/go/mechanisms/svm/signers"
svmclient "github.com/anthropics/x402/go/mechanisms/svm/exact/client"
)
signer, err := svmsigners.NewClientSignerFromPrivateKey(solanaPrivateKey)
scheme := svmclient.NewExactSvmScheme(signer, config?)
ExactSvmScheme (Server)#
Go
import svmserver "github.com/anthropics/x402/go/mechanisms/svm/exact/server"
scheme := svmserver.NewExactSvmScheme()
scheme.RegisterMoneyParser(customParser)
Facilitator Hooks#
Go
type FacilitatorVerifyContext struct {
Ctx context.Context
Payload PaymentPayloadView
Requirements PaymentRequirementsView
PayloadBytes []byte
RequirementsBytes []byte
}
type FacilitatorBeforeHookResult struct {
Abort bool
Reason string
Message string
}
type FacilitatorBeforeVerifyHook func(FacilitatorVerifyContext) (*FacilitatorBeforeHookResult, error)
type FacilitatorAfterVerifyHook func(FacilitatorVerifyResultContext) error
type FacilitatorOnVerifyFailureHook func(FacilitatorVerifyFailureContext) (*FacilitatorVerifyFailureHookResult, error)
type FacilitatorBeforeSettleHook func(FacilitatorSettleContext) (*FacilitatorBeforeHookResult, error)
type FacilitatorAfterSettleHook func(FacilitatorSettleResultContext) error
type FacilitatorOnSettleFailureHook func(FacilitatorSettleFailureContext) (*FacilitatorSettleFailureHookResult, error)