Extensions

extensions/v1

github.com/x402-foundation/x402/go/v2/extensions/v1

import "github.com/x402-foundation/x402/go/v2/extensions/v1"

Functions

func BuildBazaarExtensionFromDiscoveryInfo(discoveryInfo types.DiscoveryInfo) types.DiscoveryExtension

Source: extensions/v1/facilitator.go:344

BuildBazaarExtensionFromDiscoveryInfo builds a v2 bazaar extension from extracted v1 discovery info.

V1 had no formal schema validation, so the synthesized schema is permissive.

func BuildV1CatalogExtensions( existingExtensions map[string]any, discoveryInfo types.DiscoveryInfo, ) map[string]any

Source: extensions/v1/facilitator.go:363

BuildV1CatalogExtensions normalizes v1 catalog extension payloads to v2 bazaar format.

Preserves non-bazaar extensions from the payment payload. Replaces legacy outputSchema entries with a synthesized bazaar extension.

func ExtractDiscoveryInfoV1(paymentRequirements interface{}) (*types.DiscoveryInfo, error)

Source: extensions/v1/facilitator.go:50

ExtractDiscoveryInfoV1 extracts discovery info from v1 PaymentRequirements and transforms to v2 format

In v1, the discovery information is stored in the outputSchema field, which contains both input (endpoint shape) and output (response schema) information.

This function makes smart assumptions to normalize v1 data into v2 DiscoveryInfo format:

  • For GET/HEAD/DELETE: Looks for queryParams, query, or params fields
  • For POST/PUT/PATCH: Looks for bodyFields, body, or data fields and normalizes bodyType
  • Extracts optional headers if present

Args:

  • paymentRequirements: V1 payment requirements (as a map or struct with outputSchema field)

Returns:

  • Discovery info in v2 format if present and valid, or nil if not discoverable

Example:

requirements := map[string]interface{}{
    "outputSchema": map[string]interface{}{
        "input": map[string]interface{}{
            "type": "http",
            "method": "GET",
            "discoverable": true,
            "queryParams": map[string]interface{}{"query": "string"},
        },
        "output": map[string]interface{}{"type": "object"},
    },
}

info, err := v1.ExtractDiscoveryInfoV1(requirements)
if info != nil {
    fmt.Printf("Endpoint method: %v\n", info.Input)
}

func ExtractResourceMetadataV1(paymentRequirements interface{}) map[string]string

Source: extensions/v1/facilitator.go:307

ExtractResourceMetadataV1 extracts resource metadata from v1 PaymentRequirements

In v1, resource information is embedded directly in the payment requirements rather than in a separate resource object.

Args:

  • paymentRequirements: V1 payment requirements

Returns:

  • Resource metadata (url, description, mimeType)

Example:

metadata := v1.ExtractResourceMetadataV1(requirements)
fmt.Printf("Resource URL: %s\n", metadata["url"])

func IsDiscoverableV1(paymentRequirements interface{}) bool

Source: extensions/v1/facilitator.go:287

IsDiscoverableV1 checks if v1 PaymentRequirements contains discoverable information

Args:

  • paymentRequirements: V1 payment requirements

Returns:

  • True if the requirements contain valid discovery info

Example:

if v1.IsDiscoverableV1(requirements) {
    info, _ := v1.ExtractDiscoveryInfoV1(requirements)
    // Catalog info in Bazaar
}

Types

type V1OutputSchema

Source: extensions/v1/facilitator.go:11

V1OutputSchema represents the v1 outputSchema structure

type V1OutputSchema struct {
	Input  map[string]interface{} `json:"input"`
	Output interface{}            `json:"output,omitempty"`
}
Fields
  • Input map[string]interface{} `json:"input"`
  • Output interface{} `json:"output,omitempty"`