{
  "name": "x402agency",
  "version": "1.0",
  "description": "BSV Agent Directory — AI services that accept micropayments",
  "agents": [
    {
      "name": "nano-banana-2.1",
      "displayName": "Nano Banana 2.1",
      "tagline": "New — launched 2026-10-06 · AI Image Generation with Search Grounding",
      "description": "Google Nano Banana 2.1 image generation and editing, launched October 6, 2026. This host defaults to nano-banana-2.1 at 1K. Supports up to 14 reference images, 15 aspect ratios, 1K/2K/4K, and Google Web and Image Search grounding. All four models share one worker. The family URL https://nano-banana.x402agency.com defaults to nano-banana-2.1; the model field overrides any host's default. Replicate base → charged USD per output image (25% margin), in 1K/2K/4K order: nano-banana-2.1 $0.0336/$0.0504/$0.1134 → $0.042/$0.063/$0.14175; nano-banana-2 $0.067/$0.101/$0.151 → $0.08375/$0.12625/$0.18875; nano-banana-pro $0.15/$0.15/$0.30 → $0.1875/$0.1875/$0.375. The original nano-banana is available only via model: nano-banana, at a flat $0.039 base / $0.04875 charged per image, with no resolution or model-specific extras. Validate params before quoting, retry the same request for its hash-bound quote, then poll for image URLs. Full refunds on upstream failure, cancellation, or completion without an image.",
      "url": "https://nano-banana-2-1.x402agency.com",
      "capabilities": [
        "text-to-image",
        "image-to-image",
        "search-grounded-generation"
      ],
      "model": "Nano Banana 2.1",
      "modelProvider": "Google via Replicate",
      "category": "generation",
      "delivery": "async",
      "pricing": {
        "model": "per-resolution",
        "currency": "USD",
        "tiers": [
          {
            "label": "1K",
            "usd": 0.042
          },
          {
            "label": "2K",
            "usd": 0.063
          },
          {
            "label": "4K",
            "usd": 0.14175
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/.well-known/x402-info",
          "description": "Live discovery and satoshi prices. Includes default_model, hosts (host → model), models (Replicate id, description, default_resolution, params, tiers with resolution or null, usd_base, usd_total, satoshis), and flat pricing.tiers labelled <model> <res>; existing manifest fields are preserved.",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/generate",
          "description": "Submit an image generation prompt. Model-specific validation runs before the 402 quote; payment must use the same effective model and request body bound to the quote's hash. Returns a prediction ID for polling. Failures or no image trigger a full refund.",
          "auth": true,
          "payment": true,
          "delivery": "async",
          "input": {
            "prompt": {
              "type": "string",
              "required": true,
              "description": "Text description of the image to generate"
            },
            "model": {
              "type": "string",
              "description": "Override the host's default model. Original nano-banana: $0.039 base / $0.04875 charged per image, no resolution or extras. Family URL: https://nano-banana.x402agency.com (defaults to nano-banana-2.1).",
              "enum": [
                "nano-banana-2.1",
                "nano-banana-2",
                "nano-banana-pro",
                "nano-banana"
              ],
              "default": "nano-banana-2.1"
            },
            "image_input": {
              "type": "array",
              "description": "Up to 14 reference image URLs, supported by every model",
              "default": "[]"
            },
            "resolution": {
              "type": "string",
              "description": "nano-banana-2.1 and nano-banana-2: default 1K. nano-banana-pro: default 2K. Omit for original nano-banana (unsupported). The displayed default applies to this host without a model override.",
              "enum": [
                "1K",
                "2K",
                "4K"
              ],
              "default": "1K"
            },
            "aspect_ratio": {
              "type": "string",
              "description": "The displayed enum applies to this host's default; a model override uses that model's params from x402-info. nano-banana-2.1 and nano-banana-2 accept 15 values: match_input_image, 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9. nano-banana-pro and original nano-banana accept 11: match_input_image, 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. All models default to match_input_image.",
              "enum": [
                "match_input_image",
                "1:1",
                "1:4",
                "1:8",
                "2:3",
                "3:2",
                "3:4",
                "4:1",
                "4:3",
                "4:5",
                "5:4",
                "8:1",
                "9:16",
                "16:9",
                "21:9"
              ],
              "default": "match_input_image"
            },
            "output_format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "jpg",
                "png"
              ],
              "default": "jpg"
            },
            "google_search": {
              "type": "boolean",
              "description": "Google Web Search grounding; only nano-banana-2.1 and nano-banana-2",
              "default": "false"
            },
            "image_search": {
              "type": "boolean",
              "description": "Google Image Search grounding; only nano-banana-2.1 and nano-banana-2",
              "default": "false"
            },
            "safety_filter_level": {
              "type": "string",
              "description": "Safety filtering; only nano-banana-pro",
              "enum": [
                "block_low_and_above",
                "block_medium_and_above",
                "block_only_high"
              ],
              "default": "block_only_high"
            },
            "allow_fallback_model": {
              "type": "boolean",
              "description": "Allow Replicate's fallback model when Pro is at capacity; only nano-banana-pro",
              "default": "false"
            }
          },
          "output": {
            "prediction_id": "Prediction ID for GET /status/{id}",
            "poll_url": "Identity-scoped polling path; no additional payment"
          },
          "polling": {
            "interval": 15,
            "maxWait": 180,
            "terminalStates": [
              "succeeded",
              "failed",
              "canceled"
            ]
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline or deferred"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll every 15 seconds (suggested max wait 180 seconds). Returns image URLs on success. Identity-scoped, 24-hour TTL, no additional payment. Full deferred refund on failure, cancellation, or completion without an image.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "refund": {
            "trigger": "prediction_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://nano-banana-2-1.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "nano-banana-2",
      "displayName": "Nano Banana 2",
      "tagline": "AI Image Generation with Search Grounding",
      "description": "Google Nano Banana 2 image generation and editing. This host defaults to nano-banana-2 at 1K. Supports up to 14 reference images, 15 aspect ratios, 1K/2K/4K, and Google Web and Image Search grounding. All four models share one worker. The family URL https://nano-banana.x402agency.com defaults to nano-banana-2.1; the model field overrides any host's default. Replicate base → charged USD per output image (25% margin), in 1K/2K/4K order: nano-banana-2.1 $0.0336/$0.0504/$0.1134 → $0.042/$0.063/$0.14175; nano-banana-2 $0.067/$0.101/$0.151 → $0.08375/$0.12625/$0.18875; nano-banana-pro $0.15/$0.15/$0.30 → $0.1875/$0.1875/$0.375. The original nano-banana is available only via model: nano-banana, at a flat $0.039 base / $0.04875 charged per image, with no resolution or model-specific extras. Validate params before quoting, retry the same request for its hash-bound quote, then poll for image URLs. Full refunds on upstream failure, cancellation, or completion without an image.",
      "url": "https://nano-banana-2.x402agency.com",
      "capabilities": [
        "text-to-image",
        "image-to-image",
        "search-grounded-generation"
      ],
      "model": "Nano Banana 2",
      "modelProvider": "Google via Replicate",
      "category": "generation",
      "delivery": "async",
      "pricing": {
        "model": "per-resolution",
        "currency": "USD",
        "tiers": [
          {
            "label": "1K",
            "usd": 0.08375
          },
          {
            "label": "2K",
            "usd": 0.12625
          },
          {
            "label": "4K",
            "usd": 0.18875
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/.well-known/x402-info",
          "description": "Live discovery and satoshi prices. Includes default_model, hosts (host → model), models (Replicate id, description, default_resolution, params, tiers with resolution or null, usd_base, usd_total, satoshis), and flat pricing.tiers labelled <model> <res>; existing manifest fields are preserved.",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/generate",
          "description": "Submit an image generation prompt. Model-specific validation runs before the 402 quote; payment must use the same effective model and request body bound to the quote's hash. Returns a prediction ID for polling. Failures or no image trigger a full refund.",
          "auth": true,
          "payment": true,
          "delivery": "async",
          "input": {
            "prompt": {
              "type": "string",
              "required": true,
              "description": "Text description of the image to generate"
            },
            "model": {
              "type": "string",
              "description": "Override the host's default model. Original nano-banana: $0.039 base / $0.04875 charged per image, no resolution or extras. Family URL: https://nano-banana.x402agency.com (defaults to nano-banana-2.1).",
              "enum": [
                "nano-banana-2.1",
                "nano-banana-2",
                "nano-banana-pro",
                "nano-banana"
              ],
              "default": "nano-banana-2"
            },
            "image_input": {
              "type": "array",
              "description": "Up to 14 reference image URLs, supported by every model",
              "default": "[]"
            },
            "resolution": {
              "type": "string",
              "description": "nano-banana-2.1 and nano-banana-2: default 1K. nano-banana-pro: default 2K. Omit for original nano-banana (unsupported). The displayed default applies to this host without a model override.",
              "enum": [
                "1K",
                "2K",
                "4K"
              ],
              "default": "1K"
            },
            "aspect_ratio": {
              "type": "string",
              "description": "The displayed enum applies to this host's default; a model override uses that model's params from x402-info. nano-banana-2.1 and nano-banana-2 accept 15 values: match_input_image, 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9. nano-banana-pro and original nano-banana accept 11: match_input_image, 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. All models default to match_input_image.",
              "enum": [
                "match_input_image",
                "1:1",
                "1:4",
                "1:8",
                "2:3",
                "3:2",
                "3:4",
                "4:1",
                "4:3",
                "4:5",
                "5:4",
                "8:1",
                "9:16",
                "16:9",
                "21:9"
              ],
              "default": "match_input_image"
            },
            "output_format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "jpg",
                "png"
              ],
              "default": "jpg"
            },
            "google_search": {
              "type": "boolean",
              "description": "Google Web Search grounding; only nano-banana-2.1 and nano-banana-2",
              "default": "false"
            },
            "image_search": {
              "type": "boolean",
              "description": "Google Image Search grounding; only nano-banana-2.1 and nano-banana-2",
              "default": "false"
            },
            "safety_filter_level": {
              "type": "string",
              "description": "Safety filtering; only nano-banana-pro",
              "enum": [
                "block_low_and_above",
                "block_medium_and_above",
                "block_only_high"
              ],
              "default": "block_only_high"
            },
            "allow_fallback_model": {
              "type": "boolean",
              "description": "Allow Replicate's fallback model when Pro is at capacity; only nano-banana-pro",
              "default": "false"
            }
          },
          "output": {
            "prediction_id": "Prediction ID for GET /status/{id}",
            "poll_url": "Identity-scoped polling path; no additional payment"
          },
          "polling": {
            "interval": 15,
            "maxWait": 180,
            "terminalStates": [
              "succeeded",
              "failed",
              "canceled"
            ]
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline or deferred"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll every 15 seconds (suggested max wait 180 seconds). Returns image URLs on success. Identity-scoped, 24-hour TTL, no additional payment. Full deferred refund on failure, cancellation, or completion without an image.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "refund": {
            "trigger": "prediction_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://nano-banana-2.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "nano-banana-pro",
      "displayName": "Nano Banana Pro",
      "tagline": "AI Image Generation with Safety Controls",
      "description": "Google Nano Banana Pro image generation and editing. This host defaults to nano-banana-pro at 2K. Supports up to 14 reference images, 11 aspect ratios, 1K/2K/4K, safety_filter_level, and allow_fallback_model. All four models share one worker. The family URL https://nano-banana.x402agency.com defaults to nano-banana-2.1; the model field overrides any host's default. Replicate base → charged USD per output image (25% margin), in 1K/2K/4K order: nano-banana-2.1 $0.0336/$0.0504/$0.1134 → $0.042/$0.063/$0.14175; nano-banana-2 $0.067/$0.101/$0.151 → $0.08375/$0.12625/$0.18875; nano-banana-pro $0.15/$0.15/$0.30 → $0.1875/$0.1875/$0.375. The original nano-banana is available only via model: nano-banana, at a flat $0.039 base / $0.04875 charged per image, with no resolution or model-specific extras. Validate params before quoting, retry the same request for its hash-bound quote, then poll for image URLs. Full refunds on upstream failure, cancellation, or completion without an image.",
      "url": "https://nano-banana-pro.x402agency.com",
      "capabilities": [
        "text-to-image",
        "image-to-image"
      ],
      "model": "Nano Banana Pro",
      "modelProvider": "Google via Replicate",
      "category": "generation",
      "delivery": "async",
      "pricing": {
        "model": "per-resolution",
        "currency": "USD",
        "tiers": [
          {
            "label": "1K",
            "usd": 0.1875
          },
          {
            "label": "2K",
            "usd": 0.1875
          },
          {
            "label": "4K",
            "usd": 0.375
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/.well-known/x402-info",
          "description": "Live discovery and satoshi prices. Includes default_model, hosts (host → model), models (Replicate id, description, default_resolution, params, tiers with resolution or null, usd_base, usd_total, satoshis), and flat pricing.tiers labelled <model> <res>; existing manifest fields are preserved.",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/generate",
          "description": "Submit an image generation prompt. Model-specific validation runs before the 402 quote; payment must use the same effective model and request body bound to the quote's hash. Returns a prediction ID for polling. Failures or no image trigger a full refund.",
          "auth": true,
          "payment": true,
          "delivery": "async",
          "input": {
            "prompt": {
              "type": "string",
              "required": true,
              "description": "Text description of the image to generate"
            },
            "model": {
              "type": "string",
              "description": "Override the host's default model. Original nano-banana: $0.039 base / $0.04875 charged per image, no resolution or extras. Family URL: https://nano-banana.x402agency.com (defaults to nano-banana-2.1).",
              "enum": [
                "nano-banana-2.1",
                "nano-banana-2",
                "nano-banana-pro",
                "nano-banana"
              ],
              "default": "nano-banana-pro"
            },
            "image_input": {
              "type": "array",
              "description": "Up to 14 reference image URLs, supported by every model",
              "default": "[]"
            },
            "resolution": {
              "type": "string",
              "description": "nano-banana-2.1 and nano-banana-2: default 1K. nano-banana-pro: default 2K. Omit for original nano-banana (unsupported). The displayed default applies to this host without a model override.",
              "enum": [
                "1K",
                "2K",
                "4K"
              ],
              "default": "2K"
            },
            "aspect_ratio": {
              "type": "string",
              "description": "The displayed enum applies to this host's default; a model override uses that model's params from x402-info. nano-banana-2.1 and nano-banana-2 accept 15 values: match_input_image, 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9. nano-banana-pro and original nano-banana accept 11: match_input_image, 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. All models default to match_input_image.",
              "enum": [
                "match_input_image",
                "1:1",
                "2:3",
                "3:2",
                "3:4",
                "4:3",
                "4:5",
                "5:4",
                "9:16",
                "16:9",
                "21:9"
              ],
              "default": "match_input_image"
            },
            "output_format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "jpg",
                "png"
              ],
              "default": "jpg"
            },
            "google_search": {
              "type": "boolean",
              "description": "Google Web Search grounding; only nano-banana-2.1 and nano-banana-2",
              "default": "false"
            },
            "image_search": {
              "type": "boolean",
              "description": "Google Image Search grounding; only nano-banana-2.1 and nano-banana-2",
              "default": "false"
            },
            "safety_filter_level": {
              "type": "string",
              "description": "Safety filtering; only nano-banana-pro",
              "enum": [
                "block_low_and_above",
                "block_medium_and_above",
                "block_only_high"
              ],
              "default": "block_only_high"
            },
            "allow_fallback_model": {
              "type": "boolean",
              "description": "Allow Replicate's fallback model when Pro is at capacity; only nano-banana-pro",
              "default": "false"
            }
          },
          "output": {
            "prediction_id": "Prediction ID for GET /status/{id}",
            "poll_url": "Identity-scoped polling path; no additional payment"
          },
          "polling": {
            "interval": 15,
            "maxWait": 180,
            "terminalStates": [
              "succeeded",
              "failed",
              "canceled"
            ]
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline or deferred"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll every 15 seconds (suggested max wait 180 seconds). Returns image URLs on success. Identity-scoped, 24-hour TTL, no additional payment. Full deferred refund on failure, cancellation, or completion without an image.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "refund": {
            "trigger": "prediction_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://nano-banana-pro.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "veo",
      "displayName": "Veo Agent",
      "tagline": "AI Video Generation",
      "description": "Generate 4-8 second video clips with optional synchronized audio using Google's Veo 3.1 Fast model. Supports image-input continuity for seamless scene transitions and dialogue rendering.",
      "url": "https://veo-3-1-fast.x402agency.com",
      "capabilities": [
        "text-to-video",
        "image-to-video",
        "audio-generation"
      ],
      "model": "Veo 3.1 Fast",
      "modelProvider": "Google via Replicate",
      "category": "generation",
      "delivery": "async",
      "pricing": {
        "model": "per-second",
        "currency": "USD",
        "tiers": [
          {
            "label": "4s + audio",
            "usd": 0.75
          },
          {
            "label": "8s + audio",
            "usd": 1.5
          },
          {
            "label": "4s silent",
            "usd": 0.5
          },
          {
            "label": "8s silent",
            "usd": 1
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/generate",
          "description": "Submit a video generation prompt. Returns a prediction ID for polling.",
          "auth": true,
          "payment": true,
          "delivery": "async",
          "input": {
            "prompt": {
              "type": "string",
              "required": true,
              "description": "Text description of the video to generate"
            },
            "duration": {
              "type": "integer",
              "description": "Video duration in seconds",
              "enum": [
                "4",
                "6",
                "8"
              ],
              "default": "8"
            },
            "audio": {
              "type": "boolean",
              "description": "Generate synchronized audio",
              "default": "true"
            },
            "image": {
              "type": "string",
              "description": "Input image URL for visual continuity"
            }
          },
          "polling": {
            "interval": 15,
            "maxWait": 300,
            "terminalStates": [
              "succeeded",
              "failed",
              "canceled"
            ]
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline or deferred"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll prediction status. Returns video URL when complete. Identity-scoped.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "refund": {
            "trigger": "prediction_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://veo-3-1-fast.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "whisper",
      "displayName": "Whisper Agent",
      "tagline": "Speech-to-Text",
      "description": "Transcribe audio to text using OpenAI's Whisper Large v3 Turbo running on Cloudflare Workers AI. Synchronous responses - results returned immediately after payment. Priced per audio minute.",
      "url": "https://whisper-large-v3-turbo.x402agency.com",
      "capabilities": [
        "speech-to-text",
        "transcription"
      ],
      "model": "Whisper Large v3 Turbo",
      "modelProvider": "OpenAI via Cloudflare Workers AI",
      "category": "analysis",
      "delivery": "sync",
      "pricing": {
        "model": "per-minute",
        "currency": "USD",
        "tiers": [
          {
            "label": "1 min",
            "usd": 0.0006375
          },
          {
            "label": "5 min",
            "usd": 0.0031875
          },
          {
            "label": "30 min",
            "usd": 0.019125
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/transcribe",
          "description": "Transcribe audio. Synchronous - returns transcription immediately.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "audio": {
              "type": "string",
              "required": true,
              "description": "Base64-encoded audio data"
            },
            "content_type": {
              "type": "string",
              "description": "Audio MIME type",
              "default": "audio/wav"
            }
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        }
      ],
      "x402_info": "https://whisper-large-v3-turbo.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "x-research",
      "displayName": "X Research Agent",
      "tagline": "Twitter/X Research API",
      "description": "Full-archive X/Twitter research on the official X API v2: search back to 2006, post counts over time, profiles, user lookup, threads, quote posts, mentions, trending topics, and single-post lookup. Search returns 20 posts per page by default (limit 1-100, up to 5 pages / 500 posts) with date ranges (since/until), ID ranges (since_id/until_id), engagement filters, sorting, entity extraction, and markdown output. /counts sizes a topic for about a cent before a /search. Synchronous responses. Pricing follows X's per-resource billing with a 25% margin: each returned post costs $0.005 upstream and its author is free, so the pre-paid ceiling per returned post is $0.005 × 1.25 = $0.00625; an explicit user lookup costs $0.010 × 1.25 = $0.0125. Search and quotes ceiling = pages × limit × $0.00625 ($0.125 at the defaults; search $3.125 at limit 100 × 5 pages). Thread = ($0.005 + pages × limit × $0.005) × 1.25. Mentions = ($0.010 if by username + pages × limit × $0.005) × 1.25. Profile = $0.1375 at limit 20 ($0.0125 without posts), user = $0.0125 each, tweet = $0.00625, trending = $0.0125, counts = $0.00625 (recent) or $0.0125 (all) per page. The quote binds endpoint, pages, effective limit, counts mode and mentions selector; the paid retry must match. You pre-pay the ceiling; the charge settles on the posts X actually returned (plus any explicitly looked-up user) and the excess is refunded inline. Full inline refund when X fails before returning anything; a failure after earlier pages returns a partial result charged only for what X returned. A refund that cannot be issued inline is redeemed at GET /owed/{claim_id}. The 402 response always carries the exact satoshi amount.",
      "url": "https://x-research.x402agency.com",
      "capabilities": [
        "full-archive-tweet-search",
        "post-counts",
        "profile-lookup",
        "user-lookup",
        "thread-analysis",
        "quote-posts",
        "mentions",
        "trending-topics",
        "single-tweet-lookup"
      ],
      "model": "X API v2",
      "modelProvider": "X/Twitter",
      "category": "research",
      "delivery": "sync",
      "pricing": {
        "model": "per-resource",
        "currency": "USD",
        "tiers": [
          {
            "label": "Counts: 1 page, mode recent",
            "usd": 0.00625
          },
          {
            "label": "Tweet: 1 post",
            "usd": 0.00625
          },
          {
            "label": "Trending: 1 trends request",
            "usd": 0.0125
          },
          {
            "label": "User: 1 user",
            "usd": 0.0125
          },
          {
            "label": "Search: limit 20, 1 page",
            "usd": 0.125
          },
          {
            "label": "Quotes: limit 20, 1 page",
            "usd": 0.125
          },
          {
            "label": "Thread: root + limit 20, 1 page",
            "usd": 0.13125
          },
          {
            "label": "Profile: user + 20 posts",
            "usd": 0.1375
          },
          {
            "label": "Mentions: by username, limit 20, 1 page",
            "usd": 0.1375
          },
          {
            "label": "Search: limit 100, 5 pages (maximum)",
            "usd": 3.125
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant",
          "output": {
            "status": "string ('ok')",
            "service": "string ('x-research-agent')"
          }
        },
        {
          "method": "GET",
          "path": "/.well-known/x402-info",
          "description": "Live discovery manifest: capabilities and refund format, per-endpoint pricing formulas with USD and satoshi examples at the current BSV/USD rate, exact input and output schemas, the response envelope, and error codes.",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/search",
          "description": "Full-archive post search back to 2006 with date and ID ranges, engagement filters, sorting and pagination. Retweets are excluded automatically. Fetched posts are deduplicated, filtered, sorted, then capped at `limit × pages_fetched` (up to `limit × pages`). Price ceiling: pages × clamp(limit, 10, 100) × $0.005 × 1.25; $0.125 at the defaults (limit 20, 1 page). You pre-pay the ceiling; the charge settles on the posts X actually returned (plus any explicitly looked-up user) and the excess is refunded inline. Full inline refund when X fails before returning anything; a failure after earlier pages returns a partial result charged only for what X returned.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "query": {
              "type": "string",
              "required": true,
              "description": "X API search syntax, max 1024 chars. Examples: 'bitcoin', 'from:elonmusk', '#hashtag lang:en'. -is:retweet is appended."
            },
            "sort": {
              "type": "string",
              "description": "Order of the returned posts",
              "enum": [
                "likes",
                "retweets",
                "views",
                "recent"
              ],
              "default": "likes"
            },
            "min_likes": {
              "type": "integer",
              "description": "Drop posts with fewer likes (after fetch; does not change the price)"
            },
            "min_views": {
              "type": "integer",
              "description": "Drop posts with fewer views (after fetch; does not change the price)"
            },
            "quality": {
              "type": "boolean",
              "description": "true drops posts with fewer than 10 likes; omitted = false"
            },
            "exclude_replies": {
              "type": "boolean",
              "description": "Append -is:reply to the query",
              "default": true
            },
            "limit": {
              "type": "integer",
              "description": "Max posts per page. Each upstream page fetches clamp(limit, 10, 100) posts and is priced at that. Bound to the quote.",
              "default": 20,
              "min": 1,
              "max": 100
            },
            "pages": {
              "type": "integer",
              "description": "Pages to fetch (cost multiplier). Bound to the quote.",
              "default": 1,
              "min": 1,
              "max": 5
            },
            "since": {
              "type": "string",
              "description": "Start time: '30m','1h','3h','12h','1d','7d','30d','90d','1y', or an ISO 8601 timestamp"
            },
            "until": {
              "type": "string",
              "description": "End time: same forms as since. Combine with since for a date range."
            },
            "since_id": {
              "type": "string",
              "description": "Only posts with an ID greater than this numeric post ID (incremental monitoring). Not combinable with since/until."
            },
            "until_id": {
              "type": "string",
              "description": "Only posts with an ID less than this numeric post ID. Not combinable with since/until."
            },
            "format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "json",
                "markdown"
              ],
              "default": "json"
            }
          },
          "output": {
            "format": "string ('json')",
            "tweets": "array of Tweet",
            "tweet_count": "integer",
            "query": "string (as sent)",
            "sort": "string",
            "(format: markdown)": "format, content (markdown research document), tweet_count"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline; partial result with excess refund after earlier pages succeeded"
          }
        },
        {
          "method": "POST",
          "path": "/profile",
          "description": "User profile plus recent posts with full metrics. For the user object alone use include_tweets false or /user. Price ceiling: ($0.010 user + limit × $0.005 posts) × 1.25; $0.1375 at the default limit 20, $0.0125 with include_tweets false. You pre-pay the ceiling; the charge settles on the posts X actually returned (plus any explicitly looked-up user) and the excess is refunded inline. Full inline refund when X fails before returning anything; a failure after earlier pages returns a partial result charged only for what X returned.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "username": {
              "type": "string",
              "required": true,
              "description": "X username, with or without @ (1-15 chars, letters, digits, underscore)"
            },
            "limit": {
              "type": "integer",
              "description": "Timeline page size (sets the price). Bound to the quote.",
              "default": 20,
              "min": 5,
              "max": 100
            },
            "include_tweets": {
              "type": "boolean",
              "description": "false skips the timeline: one user object, $0.010 × 1.25, recent_tweets empty. Bound to the quote.",
              "default": true
            }
          },
          "output": {
            "profile": "User (id, username, name, verified, verified_type, description, location, followers_count, following_count, tweet_count, listed_count, created_at, profile_image_url)",
            "recent_tweets": "array of Tweet; empty with include_tweets false",
            "tweet_count": "integer"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline; partial result with excess refund after earlier pages succeeded"
          }
        },
        {
          "method": "POST",
          "path": "/thread",
          "description": "A post and its conversation: the root post plus up to pages × limit posts of the conversation, deduplicated and sorted. Price ceiling: ($0.005 root post + pages × limit × $0.005) × 1.25; $0.13125 at the defaults (limit 20, 1 page). You pre-pay the ceiling; the charge settles on the posts X actually returned (plus any explicitly looked-up user) and the excess is refunded inline. Full inline refund when X fails before returning anything; a failure after earlier pages returns a partial result charged only for what X returned.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "tweet_id": {
              "type": "string",
              "required": true,
              "description": "Numeric post ID (up to 20 digits)"
            },
            "sort": {
              "type": "string",
              "description": "Order of the replies",
              "enum": [
                "likes",
                "retweets",
                "views",
                "recent"
              ],
              "default": "likes"
            },
            "limit": {
              "type": "integer",
              "description": "Conversation search page size (sets the price). Bound to the quote.",
              "default": 20,
              "min": 10,
              "max": 100
            },
            "pages": {
              "type": "integer",
              "description": "Pages of replies to fetch (cost multiplier). Bound to the quote.",
              "default": 1,
              "min": 1,
              "max": 5
            }
          },
          "output": {
            "root_tweet": "Tweet or null",
            "replies": "array of Tweet",
            "reply_count": "integer",
            "sort": "string"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline; partial result with excess refund after earlier pages succeeded"
          }
        },
        {
          "method": "POST",
          "path": "/trending",
          "description": "Trending topics for a location (WOEID). The body may be empty. Flat price: one trends request, $0.010 × 1.25 = $0.0125. Full inline refund on upstream failure.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "woeid": {
              "type": "integer",
              "description": "Where On Earth ID: 1 = worldwide, 23424977 = US, 23424975 = UK",
              "default": 1
            }
          },
          "output": {
            "trends": "array of {name, url, tweet_count}; tweet_count is null when X omits it",
            "count": "integer",
            "woeid": "integer",
            "source": "string ('trends_api')"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/tweet",
          "description": "Single post lookup by ID with full metrics, entities and media. Price: $0.005 × 1.25 = $0.00625. Full inline refund on upstream failure.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "tweet_id": {
              "type": "string",
              "required": true,
              "description": "Numeric post ID (up to 20 digits)"
            }
          },
          "output": {
            "tweet": "Tweet"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/counts",
          "description": "Cheap trend analysis: post volume per minute/hour/day for any search query, without reading a post. Billed per request, not per post, so sizing a topic costs about a cent. Run it before a large /search. Retweets are counted unless the query says -is:retweet. Price ceiling: pages × $0.005 × 1.25 (mode recent) or pages × $0.010 × 1.25 (mode all); $0.00625 / $0.0125 per page. Unused pages are refunded; a failed page is a full refund.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "query": {
              "type": "string",
              "required": true,
              "description": "X API search syntax, max 1024 chars; sent as given"
            },
            "mode": {
              "type": "string",
              "description": "recent = last 7 days ($0.005 per request); all = full archive back to 2006 ($0.010 per request, default window 30 days). Bound to the quote.",
              "enum": [
                "recent",
                "all"
              ],
              "default": "recent"
            },
            "granularity": {
              "type": "string",
              "description": "Bucket size",
              "enum": [
                "minute",
                "hour",
                "day"
              ],
              "default": "day"
            },
            "since": {
              "type": "string",
              "description": "Start time: '30m','1h','3h','12h','1d','7d','30d','90d','1y', or an ISO 8601 timestamp. Mode recent reaches at most 7 days back ('30d','90d','1y' are rejected)."
            },
            "until": {
              "type": "string",
              "description": "End time: same forms as since"
            },
            "since_id": {
              "type": "string",
              "description": "Only posts with an ID greater than this numeric post ID (1-19 digits). Not combinable with since/until."
            },
            "until_id": {
              "type": "string",
              "description": "Only posts with an ID less than this numeric post ID (1-19 digits). Not combinable with since/until."
            },
            "pages": {
              "type": "integer",
              "description": "Upstream requests to follow (cost multiplier). Mode all returns about 31 days of buckets per page. Bound to the quote.",
              "default": 1,
              "min": 1,
              "max": 5
            },
            "format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "json",
                "markdown"
              ],
              "default": "json"
            }
          },
          "output": {
            "format": "string ('json')",
            "query": "string",
            "mode": "string ('recent' | 'all')",
            "granularity": "string",
            "buckets": "array of {start, end, count}, oldest first",
            "bucket_count": "integer",
            "total": "integer, sum of the returned buckets",
            "pages_fetched": "integer",
            "complete": "boolean; false when the window continues past `pages`",
            "(format: markdown)": "format, content (markdown table), total, bucket_count, complete"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/quotes",
          "description": "Posts quoting a post: how it is being discussed. Every fetched post is returned. Price ceiling: pages × limit × $0.005 × 1.25; $0.125 at the defaults (limit 20, 1 page). You pre-pay the ceiling; the charge settles on the posts X actually returned (plus any explicitly looked-up user) and the excess is refunded inline. Full inline refund when X fails before returning anything; a failure after earlier pages returns a partial result charged only for what X returned.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "tweet_id": {
              "type": "string",
              "required": true,
              "description": "Numeric post ID (1-19 digits)"
            },
            "limit": {
              "type": "integer",
              "description": "Posts per page (sets the price). Bound to the quote.",
              "default": 20,
              "min": 10,
              "max": 100
            },
            "pages": {
              "type": "integer",
              "description": "Pages to fetch (cost multiplier). Bound to the quote.",
              "default": 1,
              "min": 1,
              "max": 5
            },
            "sort": {
              "type": "string",
              "description": "Order of the returned posts",
              "enum": [
                "likes",
                "retweets",
                "views",
                "recent"
              ],
              "default": "likes"
            },
            "format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "json",
                "markdown"
              ],
              "default": "json"
            }
          },
          "output": {
            "format": "string ('json')",
            "tweet_id": "string",
            "tweets": "array of Tweet",
            "tweet_count": "integer",
            "sort": "string",
            "complete": "boolean; false when more quotes exist past `pages`",
            "(format: markdown)": "format, content (markdown research document), tweet_count, complete"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline; partial result with excess refund after earlier pages succeeded"
          }
        },
        {
          "method": "POST",
          "path": "/user",
          "description": "User objects only, no posts. Exactly one of username, user_id, user_ids. Resolve author ids from search results or check up to 100 accounts in one call. Users X does not return are listed in not_found and refunded through settlement. Price ceiling: users × $0.010 × 1.25; $0.0125 per user ($1.25 for 100). Full inline refund on upstream failure.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "username": {
              "type": "string",
              "description": "X username, with or without @ (1-15 chars, letters, digits, underscore)"
            },
            "user_id": {
              "type": "string",
              "description": "Numeric user ID (1-19 digits)"
            },
            "user_ids": {
              "type": "array",
              "description": "1-100 numeric user ID strings; duplicates are dropped before pricing. The user count is bound to the quote."
            }
          },
          "output": {
            "users": "array of User (the /profile `profile` object)",
            "count": "integer",
            "not_found": "array of the requested usernames/ids X did not return"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/mentions",
          "description": "Posts mentioning a user, newest first. Exactly one of username, user_id. Pass the returned newest_id as since_id on the next run for incremental monitoring. Every fetched post is returned. Price ceiling: ($0.010 user lookup if by username + pages × limit × $0.005) × 1.25; $0.1375 by username, $0.125 by user_id at the defaults (limit 20, 1 page). You pre-pay the ceiling; the charge settles on the posts X actually returned (plus any explicitly looked-up user) and the excess is refunded inline. Full inline refund when X fails before returning anything; a failure after earlier pages returns a partial result charged only for what X returned.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "username": {
              "type": "string",
              "description": "X username, with or without @; adds one user lookup ($0.010). The selector is bound to the quote."
            },
            "user_id": {
              "type": "string",
              "description": "Numeric user ID (1-19 digits); skips the lookup"
            },
            "limit": {
              "type": "integer",
              "description": "Posts per page (sets the price). Bound to the quote.",
              "default": 20,
              "min": 5,
              "max": 100
            },
            "pages": {
              "type": "integer",
              "description": "Pages to fetch (cost multiplier). Bound to the quote.",
              "default": 1,
              "min": 1,
              "max": 5
            },
            "since_id": {
              "type": "string",
              "description": "Only posts with an ID greater than this numeric post ID (1-19 digits)"
            },
            "format": {
              "type": "string",
              "description": "Output format",
              "enum": [
                "json",
                "markdown"
              ],
              "default": "json"
            }
          },
          "output": {
            "format": "string ('json')",
            "user_id": "string",
            "username": "string or null (null when selected by user_id)",
            "tweets": "array of Tweet",
            "tweet_count": "integer",
            "newest_id": "string or null",
            "complete": "boolean; false when more mentions exist past `pages`",
            "(format: markdown)": "format, content (markdown research document), tweet_count, newest_id, complete"
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline; partial result with excess refund after earlier pages succeeded"
          }
        },
        {
          "method": "GET",
          "path": "/owed/{claim_id}",
          "description": "Redeem a refund that could not be issued inline, using the owed_url (or claim_id) from that response. Identity-scoped; unknown, expired, or other identities' claims return 404. Pays at most once and replays the receipt for 7 days. URL-encode claim_id as a path segment.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "output": {
            "claim_id": "string",
            "owed_url": "string",
            "settled": "boolean",
            "refund": "BRC-29 refund block (transaction, derivationPrefix, derivationSuffix, senderIdentityKey, satoshis, txid)"
          }
        }
      ],
      "x402_info": "https://x-research.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "kling",
      "displayName": "Kling Agent",
      "tagline": "AI Video Generation (Kling)",
      "description": "Generate high-quality videos with 24 model variants across Kling O3, v3, v2.5-turbo, v2.1, and v1 generations via fal.ai. Supports text-to-video, image-to-video, reference-guided generation, video editing, video-guided generation, and lip-sync avatars. Per-second pricing with audio mode selection.",
      "url": "https://kling.x402agency.com",
      "capabilities": [
        "text-to-video",
        "image-to-video",
        "video-editing",
        "lip-sync-avatar",
        "reference-guided-video"
      ],
      "model": "Kling (24 variants: O3/v3/v2.5-turbo/v2.1/v1)",
      "modelProvider": "Kuaishou via fal.ai",
      "category": "generation",
      "delivery": "async",
      "pricing": {
        "model": "per-second",
        "currency": "USD",
        "tiers": [
          {
            "label": "O3 Standard 3s",
            "usd": 0.63
          },
          {
            "label": "O3 Standard 3s + audio",
            "usd": 0.84
          },
          {
            "label": "v3 Standard 3s",
            "usd": 0.63
          },
          {
            "label": "v3 Standard 3s + audio + voice",
            "usd": 1.155
          },
          {
            "label": "v1 Standard 5s",
            "usd": 0.175
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/text-to-video",
          "description": "Generate video from text prompt. Returns a request ID for polling.",
          "auth": true,
          "payment": true,
          "delivery": "async",
          "input": {
            "prompt": {
              "type": "string",
              "required": true,
              "description": "Text description of the video to generate"
            },
            "model": {
              "type": "string",
              "description": "Model variant",
              "enum": [
                "o3/standard",
                "o3/pro",
                "v3/standard",
                "v3/pro",
                "v2.5-turbo/pro",
                "v2.1/master",
                "v1/standard"
              ],
              "default": "o3/standard"
            },
            "duration": {
              "type": "number",
              "description": "Video duration in seconds (3-15 for O3/v3, 5 or 10 for legacy)"
            },
            "aspect_ratio": {
              "type": "string",
              "description": "Aspect ratio",
              "enum": [
                "16:9",
                "9:16",
                "1:1"
              ],
              "default": "16:9"
            },
            "audio": {
              "type": "boolean",
              "description": "Generate audio (O3/v3 only)",
              "default": "false"
            }
          },
          "polling": {
            "interval": 15,
            "maxWait": 300,
            "terminalStates": [
              "succeeded",
              "failed"
            ]
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline or deferred"
          }
        },
        {
          "method": "POST",
          "path": "/image-to-video",
          "description": "Generate video from input image(s). Returns a request ID for polling.",
          "auth": true,
          "payment": true,
          "delivery": "async",
          "input": {
            "prompt": {
              "type": "string",
              "required": true,
              "description": "Text description of desired motion/content"
            },
            "image_url": {
              "type": "string",
              "required": true,
              "description": "Start image URL"
            },
            "end_image_url": {
              "type": "string",
              "description": "End image URL (O3/v3/v2.5-turbo only)"
            },
            "model": {
              "type": "string",
              "description": "Model variant",
              "default": "o3/standard"
            },
            "duration": {
              "type": "number",
              "description": "Video duration in seconds"
            }
          },
          "polling": {
            "interval": 15,
            "maxWait": 300,
            "terminalStates": [
              "succeeded",
              "failed"
            ]
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline or deferred"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll job status. Returns video URL when complete. Identity-scoped.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "refund": {
            "trigger": "job_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://kling.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "1sat",
      "displayName": "1Sat Agent",
      "tagline": "1Sat Ordinals Inscriptions",
      "description": "Inscribe any file as a 1Sat Ordinal on BSV. Builds the inscription locking script — your wallet funds, signs, and broadcasts the transaction. Supports images, text, HTML, JSON, SVG, and more. Pure satoshi pricing (no USD conversion).",
      "url": "https://1sat.x402agency.com",
      "capabilities": [
        "inscription",
        "ordinals",
        "1sat",
        "nft"
      ],
      "model": "Inscription Script Builder",
      "modelProvider": "x402agency",
      "category": "on-chain",
      "delivery": "sync",
      "pricing": {
        "model": "per-byte (mining fee + 25%)",
        "currency": "USD",
        "tiers": [
          {
            "label": "1 KB (200 sats min)",
            "usd": 0.0001
          },
          {
            "label": "10 KB (1,280 sats)",
            "usd": 0.00064
          },
          {
            "label": "100 KB (12,800 sats)",
            "usd": 0.0064
          },
          {
            "label": "500 KB max (64,000 sats)",
            "usd": 0.032
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/inscribe",
          "description": "Build a 1Sat Ordinals inscription locking script. Returns the script + a createAction template for the client's wallet.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "data": {
              "type": "string",
              "required": true,
              "description": "Base64-encoded file bytes (max 500KB decoded)"
            },
            "contentType": {
              "type": "string",
              "required": true,
              "description": "MIME type",
              "enum": [
                "image/png",
                "image/jpeg",
                "image/webp",
                "image/gif",
                "image/svg+xml",
                "text/plain",
                "text/html",
                "application/json"
              ]
            },
            "publicKey": {
              "type": "string",
              "required": true,
              "description": "66-char hex compressed pubkey (02/03 prefix) for the inscription locking script"
            },
            "keyID": {
              "type": "string",
              "description": "BRC-42 key ID for derivation tracking"
            }
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        }
      ],
      "x402_info": "https://1sat.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "openai",
      "displayName": "OpenAI Agent",
      "tagline": "AI Chat Completions (GPT-5.x)",
      "description": "Chat completions using OpenAI's GPT-5.x model families. Supports gpt-5-nano, gpt-5-mini, gpt-5, gpt-5.2, o4-mini, gpt-5.2-pro, gpt-5.5, gpt-5.5-pro, gpt-5.6-sol, gpt-5.6-terra, and gpt-5.6-luna. The gpt-5.5/gpt-5.6 families have a 1.05M-token context window with a long-context surcharge (2x input / 1.5x output) above 272K input tokens. Native tool calling on all models (auto-transformed for the Responses API models gpt-5.2-pro and gpt-5.5-pro). Per-token pricing with pre-pay on max_tokens ceiling. Synchronous for every model except the two Responses API pro models (gpt-5.2-pro, gpt-5.5-pro), which are asynchronous: POST /chat returns a job_id and you poll GET /status/{id} for the result.",
      "url": "https://openai-chat.x402agency.com",
      "capabilities": [
        "chat-completion",
        "reasoning",
        "code-generation",
        "tool-calling"
      ],
      "model": "GPT-5.x family (11 models)",
      "modelProvider": "OpenAI",
      "category": "analysis",
      "delivery": "sync",
      "pricing": {
        "model": "per-token",
        "currency": "USD",
        "tiers": [
          {
            "label": "gpt-5-nano (4K out)",
            "usd": 0.002079
          },
          {
            "label": "gpt-5.6-luna (4K out)",
            "usd": 0.006269
          },
          {
            "label": "gpt-5-mini (4K out)",
            "usd": 0.010396
          },
          {
            "label": "o4-mini (4K out)",
            "usd": 0.023215
          },
          {
            "label": "gpt-5 (4K out)",
            "usd": 0.051981
          },
          {
            "label": "gpt-5.6-terra (4K out)",
            "usd": 0.06269
          },
          {
            "label": "gpt-5.2 (4K out)",
            "usd": 0.072774
          },
          {
            "label": "gpt-5.6-sol (4K out)",
            "usd": 0.1049
          },
          {
            "label": "gpt-5.5 (4K out)",
            "usd": 0.156725
          },
          {
            "label": "gpt-5.2-pro (4K out)",
            "usd": 0.873285
          },
          {
            "label": "gpt-5.5-pro (4K out)",
            "usd": 0.94035
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/chat",
          "description": "Chat completion. Synchronous for most models — returns the completion immediately. For the pro models (gpt-5.2-pro, gpt-5.5-pro) it is asynchronous: returns {status:'processing', job_id, poll_url, payment} — poll GET /status/{id} for the result.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "model": {
              "type": "string",
              "description": "OpenAI model. gpt-5.2-pro and gpt-5.5-pro are asynchronous (returns a job_id — poll GET /status/{id}); all other models are synchronous.",
              "enum": [
                "gpt-5-nano",
                "gpt-5-mini",
                "gpt-5",
                "gpt-5.2",
                "o4-mini",
                "gpt-5.2-pro",
                "gpt-5.5",
                "gpt-5.5-pro",
                "gpt-5.6-sol",
                "gpt-5.6-terra",
                "gpt-5.6-luna"
              ],
              "default": "gpt-5.6-sol"
            },
            "messages": {
              "type": "array",
              "required": true,
              "description": "Array of {role, content} message objects"
            },
            "max_tokens": {
              "type": "integer",
              "description": "Maximum tokens to generate (1-128000)",
              "default": "4096"
            },
            "temperature": {
              "type": "number",
              "description": "Sampling temperature (0.0-2.0)"
            },
            "reasoning_effort": {
              "type": "string",
              "description": "Reasoning effort. o4-mini: low/medium/high; gpt-5.x reasoning models: minimal/low/medium/high; pro models (gpt-5.2-pro, gpt-5.5-pro): medium/high/xhigh"
            },
            "tools": {
              "type": "array",
              "description": "Tool/function definitions (OpenAI Chat Completions format; auto-transformed for Responses API models)"
            },
            "tool_choice": {
              "type": "string",
              "description": "Tool choice strategy: auto, required, none, or a specific function"
            }
          },
          "refund": {
            "trigger": "server_error",
            "delivery": "inline"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll an async pro-model job (gpt-5.2-pro, gpt-5.5-pro). Returns the completion (choices/usage/payment, plus optional excessRefund) once status != 'processing', or an error with a full refund block on terminal failure. Authenticated, no additional payment. Identity-scoped: 403 ERR_NOT_YOUR_JOB for another identity's job, 404 ERR_JOB_NOT_FOUND if unknown or expired. Jobs live 24h. Excess and failure refunds settle here, not on /chat.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "refund": {
            "trigger": "job_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://openai-chat.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "claude",
      "displayName": "Claude Agent",
      "tagline": "AI Chat Completions (Claude)",
      "description": "Chat completions using Anthropic's Claude model family via the Messages API with the full parameter surface (thinking/effort, tools, structured outputs, prompt caching, fallbacks, fast mode, mid-conversation system messages). Supports claude-haiku-4-5, claude-sonnet-4-6, claude-opus-4-6, claude-opus-4-7, claude-opus-4-8, claude-sonnet-5, claude-opus-5, claude-fable-5 and claude-fable-5-1 (Anthropic's most capable model). Per-token pricing with pre-pay on the max_tokens ceiling (incl. thinking tokens); settlement from real usage incl. cache writes/reads and web searches; fast mode (2x) on claude-opus-5 / claude-opus-4-8. Sync-with-async-fallback on every model: each request runs as a server-side job — POST /chat waits up to wait_seconds (default 240) and returns the completion inline, otherwise returns {status:'processing', job_id, poll_url} and you poll GET /status/{id} (auth, no extra payment, 24h); background: true returns the job id immediately, so long Fable-tier runs never time out or lose payment. Every request shape Anthropic would 400 is rejected before payment (sampling params only on haiku-4-5 / 4.6 family; thinking budgets only on haiku-4-5 / 4.6 family; thinking cannot be disabled on fable-5 / fable-5-1; prefill only on haiku-4-5; forced tool_choice rejected on fable-5-1). Full refund on any upstream failure incl. 4xx; excess refunds when actual usage is below the pre-paid ceiling.",
      "url": "https://claude-chat.x402agency.com",
      "capabilities": [
        "chat-completion",
        "reasoning",
        "code-generation",
        "tool-calling"
      ],
      "model": "Claude family (9 models)",
      "modelProvider": "Anthropic",
      "category": "analysis",
      "delivery": "sync",
      "pricing": {
        "model": "per-token",
        "currency": "USD",
        "tiers": [
          {
            "label": "claude-haiku-4-5 (4K out)",
            "usd": 0.02685
          },
          {
            "label": "claude-sonnet-5 (4K out)",
            "usd": 0.0537
          },
          {
            "label": "claude-sonnet-4-6 (4K out)",
            "usd": 0.08055
          },
          {
            "label": "claude-opus-4-6 (4K out)",
            "usd": 0.13425
          },
          {
            "label": "claude-opus-4-7 (4K out)",
            "usd": 0.13425
          },
          {
            "label": "claude-opus-4-8 (4K out)",
            "usd": 0.13425
          },
          {
            "label": "claude-opus-5 (4K out)",
            "usd": 0.13425
          },
          {
            "label": "claude-fable-5 (4K out)",
            "usd": 0.2685
          },
          {
            "label": "claude-fable-5-1 (4K out)",
            "usd": 0.2685
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/chat",
          "description": "Chat completion (Anthropic Messages format). Sync-with-async-fallback on every model: the request runs as a server-side job; /chat waits up to wait_seconds (default 240, max 280) and returns {status:'success', job_id, delivery:'sync', content, text, thinking_text, stop_reason, stop_details, usage, payment, excessRefund?, timing} inline. If the model is still generating (Fable-tier runs at high effort can take 10-40 min) it returns HTTP 200 {status:'processing', job_id, poll_url, job_status, progress, timing, payment} — poll GET /status/{id}. background: true returns the job id immediately. Payment is never lost to a client timeout.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "model": {
              "type": "string",
              "description": "Anthropic model. All models are sync-with-async-fallback.",
              "enum": [
                "claude-haiku-4-5",
                "claude-sonnet-4-6",
                "claude-opus-4-6",
                "claude-opus-4-7",
                "claude-opus-4-8",
                "claude-sonnet-5",
                "claude-opus-5",
                "claude-fable-5",
                "claude-fable-5-1"
              ],
              "default": "claude-sonnet-5"
            },
            "messages": {
              "type": "array",
              "required": true,
              "description": "Array of {role, content} message objects (Anthropic Messages format). A trailing assistant message (prefill) is accepted only on claude-haiku-4-5. role 'system' entries (mid-conversation system messages, with optional output_config / clear_at) only on claude-opus-5, claude-opus-4-8, claude-fable-5, claude-fable-5-1."
            },
            "system": {
              "type": "string",
              "description": "System prompt (string or content block array; cache_control supported)"
            },
            "max_tokens": {
              "type": "integer",
              "description": "Maximum tokens to generate (1-128000), including thinking tokens. Pre-pay ceiling — set it generously; unused tokens are refunded.",
              "default": "4096"
            },
            "temperature": {
              "type": "number",
              "description": "Sampling temperature (0.0-1.0). claude-haiku-4-5 and the 4.6 family only — rejected before payment on opus-4-7/4-8, sonnet-5, opus-5, fable-5, fable-5-1 (ERR_TEMPERATURE_UNSUPPORTED)."
            },
            "top_p": {
              "type": "number",
              "description": "Nucleus sampling (0.0-1.0). claude-haiku-4-5 / 4.6 family only."
            },
            "top_k": {
              "type": "integer",
              "description": "Top-k sampling. claude-haiku-4-5 / 4.6 family only."
            },
            "thinking": {
              "type": "object",
              "description": "Extended thinking config. {\"type\": \"enabled\", \"budget_tokens\": N} (1024 <= N < max_tokens) on claude-haiku-4-5 / 4.6 family; {\"type\": \"adaptive\", \"display\"?: \"omitted\"|\"summarized\"|\"updates\"} on everything except haiku (display 'updates' only on fable-5 / fable-5-1); {\"type\": \"disabled\"} rejected on fable-5 / fable-5-1 (always on) and on opus-5 at effort xhigh/max. Omitted: adaptive thinking on sonnet-5 / opus-5 / fable-5 / fable-5-1, no thinking on opus-4-7/4-8 and the 4.6 family. Thinking tokens bill as output."
            },
            "output_config": {
              "type": "object",
              "description": "{effort: 'low'|'medium'|'high'|'xhigh'|'max', format?: {type: 'json_schema', ...}, task_budget?: {type: 'tokens', total: N}}. effort is the primary cost/latency dial on the Claude 5 family (no xhigh on the 4.6 family; none on haiku-4-5)."
            },
            "tools": {
              "type": "array",
              "description": "Tool definitions (custom tools with input_schema and optional strict: true; server tools like web_search_20260209, web_fetch_20260209, code_execution_20260521). A declared web_search tool adds a pre-pay allowance of max_uses (or 10) searches at $0.01 each."
            },
            "tool_choice": {
              "type": "object",
              "description": "{type: auto|any|tool|none}. any/tool rejected on claude-fable-5-1 (use auto + instruction, strict: true, or output_config.format)."
            },
            "stop_sequences": {
              "type": "array",
              "description": "Custom stop sequences"
            },
            "metadata": {
              "type": "object",
              "description": "Anthropic request metadata (e.g. user_id)"
            },
            "fallbacks": {
              "type": "array",
              "description": "Server-side refusal fallbacks: [{model: 'claude-opus-4-8'}] (1-3 entries) or 'default'. claude-opus-5 / claude-fable-5 / claude-fable-5-1 only; beta headers added automatically. The fallback model's rates apply if it served the response."
            },
            "speed": {
              "type": "string",
              "description": "'fast' for fast mode on claude-opus-5 / claude-opus-4-8 only (2x price; bound into the quote)."
            },
            "context_management": {
              "type": "object",
              "description": "Context editing / compaction config (beta headers added automatically)."
            },
            "mcp_servers": {
              "type": "array",
              "description": "MCP connector servers (pair with tools[{type: 'mcp_toolset'}]); beta header added automatically."
            },
            "inference_geo": {
              "type": "string",
              "description": "'us' pins inference to the US (1.1x price; Claude 4.6+ only) or 'global' (default). Bound into the quote."
            },
            "cache_control": {
              "type": "object",
              "description": "Top-level automatic prompt caching {type: 'ephemeral', ttl?: '5m'|'1h'}. Any cache_control in the request prices the input at the cache-write rate in the pre-pay; cache reads are refunded on settlement."
            },
            "betas": {
              "type": "array",
              "description": "Extra anthropic-beta flags. Flags implied by other parameters (thinking display updates, fallbacks, fast mode, mid-conversation output_config / clear_at, context management, compact, MCP client, task budgets) are added automatically."
            },
            "background": {
              "type": "boolean",
              "description": "true: return {status:'processing', job_id, poll_url} immediately instead of waiting.",
              "default": "false"
            },
            "wait_seconds": {
              "type": "integer",
              "description": "How long /chat waits for the result before returning the job id (max 280).",
              "default": "240"
            }
          },
          "refund": {
            "trigger": "upstream_failure",
            "delivery": "inline"
          }
        },
        {
          "method": "GET",
          "path": "/status/{id}",
          "description": "Poll a job created by /chat (any Claude model). Returns {status:'processing', job_id, job_status, progress:{output_chars, output_tokens_est, blocks, events}, timing, payment} while running; the same {status:'success', content, text, usage, payment, excessRefund?, timing} body /chat returns on completion; or an error with a full refund block if the Anthropic request failed (ERR_JOB_FAILED_REFUND_ISSUED). Authenticated, no additional payment. Identity-scoped: 403 ERR_NOT_YOUR_JOB for another identity's job, 404 ERR_JOB_NOT_FOUND if unknown or expired, 400 ERR_INVALID_JOB_ID. Jobs live 24h. Excess and failure refunds settle exactly once on the first response that sees the terminal state (inline on /chat for sync delivery, here for async) and are returned again on later polls.",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "polling": {
            "interval": 3,
            "maxWait": 86400,
            "terminalStates": [
              "success",
              "error"
            ]
          },
          "refund": {
            "trigger": "job_failure",
            "delivery": "deferred"
          }
        }
      ],
      "x402_info": "https://claude-chat.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "polymirror",
      "displayName": "PolyMirror Agent",
      "tagline": "Polymarket Whale Tracking",
      "description": "Monitor top Polymarket traders, search by name or wallet, get deep profiles with win rates and analytics, and track whale portfolios. All Polymarket data APIs wrapped with enrichment and caching.",
      "url": "https://polymirror.x402agency.com",
      "capabilities": [
        "leaderboard",
        "trader-search",
        "deep-profiles",
        "portfolio-tracking"
      ],
      "model": "Polymarket Data + Gamma + CLOB APIs",
      "modelProvider": "Polymarket (public)",
      "category": "research",
      "delivery": "sync",
      "pricing": {
        "model": "per-request",
        "currency": "USD",
        "tiers": [
          {
            "label": "/leaderboard",
            "usd": 0.005
          },
          {
            "label": "/search",
            "usd": 0.005
          },
          {
            "label": "/trader",
            "usd": 0.01
          },
          {
            "label": "/portfolio",
            "usd": 0.008
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/leaderboard",
          "description": "Top Polymarket traders with enriched metrics (win rate, active positions, market diversity)",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "category": {
              "type": "string",
              "description": "OVERALL|POLITICS|SPORTS|CRYPTO|CULTURE|ECONOMICS|TECH|FINANCE",
              "default": "OVERALL"
            },
            "time_period": {
              "type": "string",
              "description": "DAY|WEEK|MONTH|ALL",
              "default": "WEEK"
            },
            "order_by": {
              "type": "string",
              "description": "PNL|VOL",
              "default": "PNL"
            },
            "limit": {
              "type": "integer",
              "description": "1-50",
              "default": "25"
            }
          },
          "refund": {
            "trigger": "server_error",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/search",
          "description": "Find a trader by username, wallet address, or X/Twitter handle",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "query": {
              "type": "string",
              "required": true,
              "description": "Search by username, wallet prefix, or X handle (min 2 chars)"
            }
          },
          "refund": {
            "trigger": "server_error",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/trader",
          "description": "Deep trader profile with positions, trades, win rate, and market diversity",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "wallet": {
              "type": "string",
              "required": true,
              "description": "0x-prefixed 42-char hex address"
            },
            "depth": {
              "type": "string",
              "description": "summary|full|trades",
              "default": "summary"
            }
          },
          "refund": {
            "trigger": "server_error",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/portfolio",
          "description": "Current positions of up to 10 watched wallets",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "wallets": {
              "type": "array",
              "required": true,
              "description": "Array of 0x-prefixed hex addresses (max 10)"
            }
          },
          "refund": {
            "trigger": "server_error",
            "delivery": "inline"
          }
        }
      ],
      "x402_info": "https://polymirror.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "nanostore",
      "displayName": "NanoStore",
      "tagline": "File Hosting (UHRP)",
      "description": "Host files on Google Cloud Storage with on-chain UHRP content addressing. Upload any file up to 11 GB with configurable retention (minutes to 131 years). Files are publicly accessible via GCS CDN. Operated by Babbage.",
      "url": "https://nanostore.babbage.systems",
      "capabilities": [
        "file-hosting",
        "uhrp",
        "content-addressing"
      ],
      "model": "UHRP Storage",
      "modelProvider": "Babbage",
      "category": "storage",
      "delivery": "sync",
      "thirdParty": true,
      "pricing": {
        "model": "per-GB-month",
        "currency": "USD",
        "tiers": [
          {
            "label": "1 MB / 1 year",
            "usd": 0.000365
          },
          {
            "label": "10 MB / 1 year",
            "usd": 0.00365
          },
          {
            "label": "100 MB / 1 year",
            "usd": 0.0365
          },
          {
            "label": "1 GB / 1 year",
            "usd": 0.365
          }
        ]
      },
      "endpoints": [
        {
          "method": "POST",
          "path": "/quote",
          "description": "Get price quote for hosting (public, no auth)",
          "auth": false,
          "payment": false,
          "delivery": "instant",
          "input": {
            "fileSize": {
              "type": "integer",
              "required": true,
              "description": "File size in bytes (max 11 billion)"
            },
            "retentionPeriod": {
              "type": "integer",
              "required": true,
              "description": "Hosting duration in minutes (min 180, max 69M)"
            }
          },
          "output": {
            "quote": "integer — cost in satoshis (minimum 10)"
          }
        },
        {
          "method": "POST",
          "path": "/upload",
          "description": "Get presigned GCS upload URL (pay via 402 flow)",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "fileSize": {
              "type": "integer",
              "required": true,
              "description": "File size in bytes"
            },
            "retentionPeriod": {
              "type": "integer",
              "required": true,
              "description": "Hosting duration in minutes"
            }
          },
          "output": {
            "uploadURL": "Presigned GCS URL — PUT your file bytes here",
            "requiredHeaders": "Headers to include in the PUT request"
          }
        },
        {
          "method": "GET",
          "path": "/list",
          "description": "List your uploaded files (identity-scoped)",
          "auth": true,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/find",
          "description": "Get file metadata by UHRP URL (identity-scoped)",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "input": {
            "uhrpUrl": {
              "type": "string",
              "required": true,
              "description": "UHRP URL to look up"
            }
          }
        },
        {
          "method": "POST",
          "path": "/renew",
          "description": "Extend file expiration (pay via 402 flow)",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "uhrpUrl": {
              "type": "string",
              "required": true,
              "description": "UHRP URL of the file to renew"
            },
            "additionalMinutes": {
              "type": "integer",
              "required": true,
              "description": "Minutes to add to expiration"
            }
          }
        }
      ],
      "x402_info": "https://x402agency.com/manifests/nanostore.json"
    },
    {
      "name": "messagebox",
      "displayName": "MessageBox",
      "tagline": "P2P Message Relay",
      "description": "Peer-to-peer message relay for Bitcoin identity keys. Send and receive messages with store-and-forward delivery, real-time WebSocket push, recipient-controlled delivery fees, and FCM push notifications. Operated by Babbage.",
      "url": "https://messagebox.babbage.systems",
      "capabilities": [
        "messaging",
        "p2p",
        "websocket",
        "push-notifications",
        "permissions"
      ],
      "model": "MessageBox Server",
      "modelProvider": "Babbage",
      "category": "messaging",
      "delivery": "sync",
      "thirdParty": true,
      "pricing": {
        "model": "recipient-controlled",
        "currency": "USD",
        "tiers": [
          {
            "label": "Free delivery",
            "usd": 0
          },
          {
            "label": "Notifications (server fee)",
            "usd": 0
          }
        ]
      },
      "endpoints": [
        {
          "method": "POST",
          "path": "/sendMessage",
          "description": "Send message to recipient(s) — payment in body when fees apply",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "message.recipient": {
              "type": "string",
              "required": true,
              "description": "Recipient identity key (66-char hex)"
            },
            "message.messageBox": {
              "type": "string",
              "required": true,
              "description": "Target message box (e.g., 'payment_inbox')"
            },
            "message.messageId": {
              "type": "string",
              "required": true,
              "description": "Unique message ID"
            },
            "message.body": {
              "type": "string",
              "required": true,
              "description": "Message content"
            }
          }
        },
        {
          "method": "POST",
          "path": "/listMessages",
          "description": "Retrieve messages from your message box (identity-scoped)",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "input": {
            "messageBox": {
              "type": "string",
              "required": true,
              "description": "Message box to list from"
            }
          }
        },
        {
          "method": "POST",
          "path": "/acknowledgeMessage",
          "description": "Acknowledge and delete received messages",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "input": {
            "messageIds": {
              "type": "string[]",
              "required": true,
              "description": "Array of message IDs to acknowledge"
            }
          }
        },
        {
          "method": "GET",
          "path": "/permissions/quote",
          "description": "Get delivery cost quote for recipient(s)",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "input": {
            "recipient": {
              "type": "string",
              "required": true,
              "description": "Recipient identity key (query param)"
            },
            "messageBox": {
              "type": "string",
              "required": true,
              "description": "Message box type (query param)"
            }
          }
        },
        {
          "method": "POST",
          "path": "/permissions/set",
          "description": "Set delivery permission (-1=block, 0=free, >0=sats required)",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "input": {
            "messageBox": {
              "type": "string",
              "required": true,
              "description": "Message box type"
            },
            "recipientFee": {
              "type": "integer",
              "required": true,
              "description": "Fee: -1=block, 0=free, >0=satoshis"
            }
          }
        },
        {
          "method": "GET",
          "path": "/permissions/list",
          "description": "List all your permission settings with pagination",
          "auth": true,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/registerDevice",
          "description": "Register FCM device for push notifications",
          "auth": true,
          "payment": false,
          "delivery": "instant",
          "input": {
            "fcmToken": {
              "type": "string",
              "required": true,
              "description": "Firebase Cloud Messaging token"
            }
          }
        }
      ],
      "x402_info": "https://x402agency.com/manifests/message-box.json"
    },
    {
      "name": "reader",
      "displayName": "Web Reader Agent",
      "tagline": "URL → Clean Markdown",
      "description": "Extract clean, readable content from any web page. Handles JavaScript rendering, anti-bot measures, and complex layouts. Returns structured markdown perfect for LLM input.",
      "url": "https://reader.x402agency.com",
      "capabilities": [
        "web-reading",
        "content-extraction",
        "markdown-conversion",
        "web-search"
      ],
      "model": "Jina Reader API",
      "modelProvider": "Jina AI",
      "category": "research",
      "delivery": "sync",
      "pricing": {
        "model": "per-request",
        "currency": "USD",
        "tiers": [
          {
            "label": "Read URL",
            "usd": 0.003
          },
          {
            "label": "Web search",
            "usd": 0.005
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/",
          "description": "Health check",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "POST",
          "path": "/read",
          "description": "Extract clean markdown from a URL. Handles JS rendering and anti-bot measures.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "url": {
              "type": "string",
              "required": true,
              "description": "URL to read and extract content from"
            }
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        },
        {
          "method": "POST",
          "path": "/search",
          "description": "Web search with content extraction. Returns results with clean markdown.",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "query": {
              "type": "string",
              "required": true,
              "description": "Search query"
            }
          },
          "refund": {
            "trigger": "service_failure",
            "delivery": "inline"
          }
        }
      ],
      "x402_info": "https://reader.x402agency.com/.well-known/x402-info"
    },
    {
      "name": "btc-beacon",
      "displayName": "BTC Beacon",
      "tagline": "Immortal BTC Header Beacon",
      "description": "A Bitcoin (BSV) covenant that is a full BTC light client: genesis-synced, permissionlessly cranked, reorg-aware. Read the verified BTC chain tip, 80-byte headers, and SPV proofs. Core reads are free forever (contract-frozen); the paid shelf sells bulk + convenience in satoshis. Paid reads buy the fuel the beacon's cranks burn.",
      "url": "https://btc-beacon.dev-a3e.workers.dev",
      "capabilities": [
        "btc-headers",
        "chain-tip",
        "spv-proofs",
        "free-forever-reads",
        "donations"
      ],
      "model": "BTC Relay Covenant",
      "modelProvider": "btc-beacon",
      "category": "on-chain",
      "delivery": "sync",
      "thirdParty": true,
      "pricing": {
        "model": "per-request",
        "currency": "USD",
        "tiers": [
          {
            "label": "Core reads (tip / headers / lineage) — free forever",
            "usd": 0,
            "satoshis": 0
          },
          {
            "label": "SPV bundle — /spv/:txid (10 sats)",
            "usd": 0.0000013,
            "satoshis": 10
          },
          {
            "label": "Bulk headers — /headers-range (100 sats)",
            "usd": 0.0000131,
            "satoshis": 100
          },
          {
            "label": "Donation — donor-chosen 200–10M sats (default 1,000)",
            "usd": 0.000131,
            "satoshis": 1000
          }
        ]
      },
      "endpoints": [
        {
          "method": "GET",
          "path": "/tip",
          "description": "The beacon's current verified BTC tip (free forever, no auth)",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/headers/:txid",
          "description": "80-byte BTC headers carried by one crank tx (free forever, no auth)",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/lineage",
          "description": "The crank ledger — every covenant spend from deploy to tip (free forever)",
          "auth": false,
          "payment": false,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/spv/:txid",
          "description": "Verified tx bytes + Merkle path (BUMP) in one round trip — 10 sats",
          "auth": true,
          "payment": true,
          "delivery": "instant"
        },
        {
          "method": "GET",
          "path": "/headers-range",
          "description": "Bulk 80-byte headers by height: ?from=&to= (≤2000 per call) — 100 sats",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "from": {
              "type": "integer",
              "required": true,
              "description": "First BTC block height"
            },
            "to": {
              "type": "integer",
              "required": true,
              "description": "Last BTC block height (inclusive)"
            }
          }
        },
        {
          "method": "POST",
          "path": "/donate-x402",
          "description": "Machine-payable donation — ?sats=N chooses the amount (200–10,000,000)",
          "auth": true,
          "payment": true,
          "delivery": "instant",
          "input": {
            "sats": {
              "type": "integer",
              "required": false,
              "description": "Donation amount in satoshis (default 1000, clamped 200–10,000,000)",
              "default": "1000"
            }
          }
        }
      ],
      "x402_info": "https://btc-beacon.dev-a3e.workers.dev/.well-known/x402-info"
    }
  ]
}
