{
  "l402Version": "2026-07",
  "name": "AgentBodega",
  "description": "L402/Lightning discovery companion for AgentBodega paid utility APIs.",
  "status": "discovery_only",
  "protocol": {
    "scheme": "L402",
    "network": "bitcoin-lightning",
    "challengeHeader": "WWW-Authenticate",
    "challengeFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
    "authorizationHeader": "Authorization",
    "credentialFormat": "L402 <macaroon>:<preimage>",
    "docs": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification"
  },
  "issuer": {
    "url": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
    "status": "configured_but_disabled"
  },
  "gateway": {
    "mode": "trusted_reverse_proxy",
    "enabled": false,
    "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
    "proofHeader": "x-agentbodega-l402-gateway",
    "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
    "acceptedMetadataHeaders": [
      "x-agentbodega-l402-payment-hash",
      "x-agentbodega-l402-preimage-hash",
      "x-agentbodega-l402-invoice-hash",
      "x-agentbodega-l402-amount-sats",
      "x-agentbodega-l402-amount-msats",
      "x-agentbodega-l402-macaroon-id",
      "x-agentbodega-l402-caveats"
    ],
    "forbiddenForwardHeaders": [
      "authorization"
    ],
    "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
  },
  "layout": {
    "bodega": {
      "id": "agentbodega",
      "name": "AgentBodega"
    },
    "hierarchy": [
      "department",
      "aisle",
      "shelf",
      "offering"
    ],
    "requiredLevels": [
      "department",
      "aisle",
      "offering"
    ],
    "optionalLevels": [
      "shelf"
    ],
    "idFormat": "stable-slug",
    "sourceOfTruth": "src/catalog/taxonomy.ts",
    "taxonomyEndpoint": "/api/taxonomy",
    "note": "AgentBodega is the single store root. Each offering carries stable department, aisle, optional shelf, and offering IDs; shelves are optional and only appear when they add useful grouping."
  },
  "discovery": {
    "l402": "https://agentbodega.store/.well-known/l402-services",
    "x402": "https://agentbodega.store/.well-known/x402",
    "openapi": "https://agentbodega.store/openapi.json",
    "directory": "https://agentbodega.store/api/directory",
    "taxonomy": "https://agentbodega.store/api/taxonomy",
    "storefront": "https://agentbodega.store/api/storefront",
    "llmsTxt": "https://agentbodega.store/llms.txt"
  },
  "paymentSurfaces": {
    "l402": {
      "protocol": "l402",
      "network": "bitcoin-lightning",
      "status": "discovery_only",
      "sourceOfTruth": "lightning_invoice_preimage",
      "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
      "gateway": {
        "mode": "trusted_reverse_proxy",
        "enabled": false,
        "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
        "proofHeader": "x-agentbodega-l402-gateway",
        "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
        "acceptedMetadataHeaders": [
          "x-agentbodega-l402-payment-hash",
          "x-agentbodega-l402-preimage-hash",
          "x-agentbodega-l402-invoice-hash",
          "x-agentbodega-l402-amount-sats",
          "x-agentbodega-l402-amount-msats",
          "x-agentbodega-l402-macaroon-id",
          "x-agentbodega-l402-caveats"
        ],
        "forbiddenForwardHeaders": [
          "authorization"
        ],
        "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
      }
    },
    "x402": {
      "protocol": "x402",
      "network": "eip155:8453",
      "asset": "USDC",
      "assetAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "discovery": "https://agentbodega.store/.well-known/x402",
      "status": "configured",
      "sourceOfTruth": "blockchain_settlement"
    },
    "mpp": {
      "protocol": "mpp",
      "status": "configured",
      "enabled": true,
      "method": "evm",
      "intent": "charge",
      "amount": "0.005",
      "currency": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "network": "eip155:8453",
      "recipient": "0xe8799C2dedA78ECcEB329D1E8FE9F110bf55E4F8",
      "challengeHeader": "WWW-Authenticate",
      "credentialHeader": "Authorization",
      "receiptHeader": "Payment-Receipt",
      "discovery": "https://agentbodega.store/openapi.json",
      "requirements": {
        "secret": "MPP_SECRET_KEY with at least 32 bytes",
        "asset": "Base USDC via x402 facilitator settlement"
      }
    }
  },
  "resources": [
    {
      "id": "x402-inspector",
      "resource": "https://agentbodega.store/api/inspect/x402",
      "type": "http",
      "method": "POST",
      "serviceName": "x402 Endpoint Inspector",
      "description": "Inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.",
      "longDescription": "Purpose: Inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.\nBest use: Use this when an agent needs inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: method, headers, body, timeoutMs.\n\nAccepted fields:\n- url (required, string): Url value for x402 Endpoint Inspector. Constraints: format: uri. Constraints: format: uri.\n- method (optional, string): Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\".\n- headers (optional, object): Headers object for configuring x402 Endpoint Inspector.\n- body (optional, object): Body object for configuring x402 Endpoint Inspector.\n- timeoutMs (optional, integer): Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000. Constraints: default: 5000; min: 500; max: 8000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com/api/paid\"\n}\n```",
      "category": "x402-tools",
      "kind": "http-json",
      "departmentId": "x402-tools",
      "department": "x402 Tools",
      "aisleId": "payment-discovery",
      "aisle": "Payment Discovery",
      "shelfId": "endpoint-inspection",
      "shelf": "Endpoint Inspection",
      "offeringId": "x402-inspector",
      "offering": "x402 Endpoint Inspector",
      "pathIds": [
        "x402-tools",
        "payment-discovery",
        "endpoint-inspection",
        "x402-inspector"
      ],
      "pathLabels": [
        "x402 Tools",
        "Payment Discovery",
        "Endpoint Inspection",
        "x402 Endpoint Inspector"
      ],
      "taxonomyPath": "x402-tools.payment-discovery.endpoint-inspection.x402-inspector",
      "layout": {
        "department": {
          "id": "x402-tools",
          "name": "x402 Tools"
        },
        "aisle": {
          "id": "payment-discovery",
          "name": "Payment Discovery"
        },
        "shelf": {
          "id": "endpoint-inspection",
          "name": "Endpoint Inspection"
        },
        "offering": {
          "id": "x402-inspector",
          "name": "x402 Endpoint Inspector"
        },
        "pathIds": [
          "x402-tools",
          "payment-discovery",
          "endpoint-inspection",
          "x402-inspector"
        ],
        "pathLabels": [
          "x402 Tools",
          "Payment Discovery",
          "Endpoint Inspection",
          "x402 Endpoint Inspector"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "x402",
        "inspection",
        "agent-tools",
        "bazaar",
        "openapi"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/inspect/x402",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/inspect/x402",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for x402 Endpoint Inspector. Constraints: format: uri."
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "HEAD",
              "POST"
            ],
            "default": "GET",
            "description": "Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\"."
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Headers object for configuring x402 Endpoint Inspector."
          },
          "body": {
            "type": "object",
            "additionalProperties": true,
            "description": "Body object for configuring x402 Endpoint Inspector."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 500,
            "maximum": 8000,
            "default": 5000,
            "description": "Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "method",
          "headers",
          "body",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for x402 Endpoint Inspector. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "method",
            "type": "string",
            "required": false,
            "description": "Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\".",
            "constraints": {
              "enum": [
                "GET",
                "HEAD",
                "POST"
              ],
              "default": "GET"
            }
          },
          {
            "name": "headers",
            "type": "object",
            "required": false,
            "description": "Headers object for configuring x402 Endpoint Inspector."
          },
          {
            "name": "body",
            "type": "object",
            "required": false,
            "description": "Body object for configuring x402 Endpoint Inspector."
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000.",
            "constraints": {
              "default": 5000,
              "minimum": 500,
              "maximum": 8000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com/api/paid"
        }
      },
      "exampleRequest": {
        "url": "https://example.com/api/paid"
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "paymentRequired": true,
        "status": 402,
        "metadataQuality": {
          "score": 100
        },
        "discovery": {
          "x402": {
            "status": 200
          },
          "openapi": {
            "status": 200
          }
        }
      },
      "configured": false
    },
    {
      "id": "public-data-catalog",
      "resource": "https://agentbodega.store/api/public-data/catalog",
      "type": "http",
      "method": "POST",
      "serviceName": "Public Data Catalog",
      "description": "Return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.",
      "longDescription": "Purpose: Return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.\nBest use: Use this when an agent needs return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, category, name, includeSchemas, limit.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against endpoint name, title, category, description, tags, and path.\n- category (optional, string): Optional Public Data department/category to return. Constraints: accepted values: \"catalog\", \"workflow-bundles\", \"cached-results\", \"recurring-monitoring\", \"discovery-verification\", \"data-enrichment\", \"marketplace-listings\", \"real-estate-rentals\", \"ecommerce-products-reviews\", \"health-prices\", \"jobs-hiring\", \"facebook-data\", \"social-video-intelligence\", \"news\", \"public-records\".\n- name (optional, string): Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads.\n- includeSchemas (optional, boolean): Include each endpoint's full input and output schemas. Constraints: default: true.\n- limit (optional, integer): Maximum number of endpoints to return after filters. Constraints: default: 28; min: 1; max: 50.\n\nExample request body:\n```json\n{\n  \"category\": \"public-records\",\n  \"includeSchemas\": true,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "department-catalog",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "catalog",
      "aisle": "Catalog",
      "shelfId": "catalog",
      "shelf": "Catalog",
      "offeringId": "public-data-catalog",
      "offering": "Public Data Catalog",
      "pathIds": [
        "public-data",
        "catalog",
        "catalog",
        "public-data-catalog"
      ],
      "pathLabels": [
        "Public Data",
        "Catalog",
        "Catalog",
        "Public Data Catalog"
      ],
      "taxonomyPath": "public-data.catalog.catalog.public-data-catalog",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "catalog",
          "name": "Catalog"
        },
        "shelf": {
          "id": "catalog",
          "name": "Catalog"
        },
        "offering": {
          "id": "public-data-catalog",
          "name": "Public Data Catalog"
        },
        "pathIds": [
          "public-data",
          "catalog",
          "catalog",
          "public-data-catalog"
        ],
        "pathLabels": [
          "Public Data",
          "Catalog",
          "Catalog",
          "Public Data Catalog"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data-department",
        "public-data",
        "catalog",
        "marketplace-listings",
        "real-estate",
        "ecommerce",
        "facebook-data",
        "jobs",
        "public-records",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/catalog",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/catalog",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Optional text filter matched against endpoint name, title, category, description, tags, and path."
          },
          "category": {
            "type": "string",
            "enum": [
              "catalog",
              "workflow-bundles",
              "cached-results",
              "recurring-monitoring",
              "discovery-verification",
              "data-enrichment",
              "marketplace-listings",
              "real-estate-rentals",
              "ecommerce-products-reviews",
              "health-prices",
              "jobs-hiring",
              "facebook-data",
              "social-video-intelligence",
              "news",
              "public-records"
            ],
            "description": "Optional Public Data department/category to return."
          },
          "name": {
            "type": "string",
            "description": "Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads."
          },
          "includeSchemas": {
            "type": "boolean",
            "default": true,
            "description": "Include each endpoint's full input and output schemas."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 28,
            "description": "Maximum number of endpoints to return after filters."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "category",
          "name",
          "includeSchemas",
          "limit"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against endpoint name, title, category, description, tags, and path."
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional Public Data department/category to return.",
            "constraints": {
              "enum": [
                "catalog",
                "workflow-bundles",
                "cached-results",
                "recurring-monitoring",
                "discovery-verification",
                "data-enrichment",
                "marketplace-listings",
                "real-estate-rentals",
                "ecommerce-products-reviews",
                "health-prices",
                "jobs-hiring",
                "facebook-data",
                "social-video-intelligence",
                "news",
                "public-records"
              ]
            }
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads."
          },
          {
            "name": "includeSchemas",
            "type": "boolean",
            "required": false,
            "description": "Include each endpoint's full input and output schemas.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum number of endpoints to return after filters.",
            "constraints": {
              "default": 28,
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "category": "public-records",
          "includeSchemas": true,
          "limit": 10
        }
      },
      "exampleRequest": {
        "category": "public-records",
        "includeSchemas": true,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "department",
          "categories",
          "endpoints"
        ],
        "properties": {
          "department": {
            "type": "object",
            "additionalProperties": true
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "department": {
          "name": "AgentBodega Public Data Department",
          "department": "Public Data"
        },
        "categories": [
          {
            "category": "public-records",
            "count": 3
          }
        ],
        "endpoints": [
          {
            "name": "osha-violations-scraper",
            "category": "public-records",
            "price": {
              "mode": "dynamic"
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "social-media-catalog",
      "resource": "https://agentbodega.store/api/social-media/catalog",
      "type": "http",
      "method": "POST",
      "serviceName": "Social Media Department Catalog",
      "description": "Return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.",
      "longDescription": "Purpose: Return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.\nBest use: Use this when an agent needs return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: platform, query, includeSchemas, includeExternalPattern, includeCoverageMap, limit.\n\nAccepted fields:\n- platform (optional, string): Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department. Constraints: accepted values: \"all\", \"x\", \"twitter\", \"tiktok\", \"instagram\", \"facebook\", \"reddit\", \"youtube\", \"linkedin\", \"threads\", \"bluesky\", \"pinterest\", \"twitch\", \"snapchat\", \"github\", \"spotify\", \"soundcloud\", \"rumble\", \"truthsocial\", \"web\", \"amazon\", \"inference\", \"ads\", \"link-in-bio\", \"ugc\"; default: \"all\".\n- query (optional, string): Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases.\n- includeSchemas (optional, boolean): Include full schemas for configured AgentBodega social data endpoints. Constraints: default: true.\n- includeExternalPattern (optional, boolean): Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources. Constraints: default: true.\n- includeCoverageMap (optional, boolean): Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources. Constraints: default: true.\n- limit (optional, integer): Maximum configured endpoints and pattern rows to return. Constraints: default: 20; min: 1; max: 50.\n\nExample request body:\n```json\n{\n  \"platform\": \"all\",\n  \"includeExternalPattern\": true,\n  \"includeCoverageMap\": true,\n  \"includeSchemas\": true,\n  \"limit\": 50\n}\n```",
      "category": "social-media",
      "kind": "department-catalog",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "catalog",
      "aisle": "Catalog",
      "offeringId": "social-media-catalog",
      "offering": "Social Media Department Catalog",
      "pathIds": [
        "social-media",
        "catalog",
        "social-media-catalog"
      ],
      "pathLabels": [
        "Social Media",
        "Catalog",
        "Social Media Department Catalog"
      ],
      "taxonomyPath": "social-media.catalog.social-media-catalog",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "catalog",
          "name": "Catalog"
        },
        "offering": {
          "id": "social-media-catalog",
          "name": "Social Media Department Catalog"
        },
        "pathIds": [
          "social-media",
          "catalog",
          "social-media-catalog"
        ],
        "pathLabels": [
          "Social Media",
          "Catalog",
          "Social Media Department Catalog"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "tiktok",
        "facebook",
        "instagram",
        "reddit",
        "youtube",
        "linkedin",
        "threads",
        "bluesky",
        "pinterest",
        "twitch",
        "spotify",
        "ads",
        "ugc",
        "public-data",
        "creator-research",
        "social-listening"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/catalog",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/catalog",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "all",
              "x",
              "twitter",
              "tiktok",
              "instagram",
              "facebook",
              "reddit",
              "youtube",
              "linkedin",
              "threads",
              "bluesky",
              "pinterest",
              "twitch",
              "snapchat",
              "github",
              "spotify",
              "soundcloud",
              "rumble",
              "truthsocial",
              "web",
              "amazon",
              "inference",
              "ads",
              "link-in-bio",
              "ugc"
            ],
            "default": "all",
            "description": "Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department."
          },
          "query": {
            "type": "string",
            "description": "Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases."
          },
          "includeSchemas": {
            "type": "boolean",
            "default": true,
            "description": "Include full schemas for configured AgentBodega social data endpoints."
          },
          "includeExternalPattern": {
            "type": "boolean",
            "default": true,
            "description": "Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources."
          },
          "includeCoverageMap": {
            "type": "boolean",
            "default": true,
            "description": "Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Maximum configured endpoints and pattern rows to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "platform",
          "query",
          "includeSchemas",
          "includeExternalPattern",
          "includeCoverageMap",
          "limit"
        ],
        "fields": [
          {
            "name": "platform",
            "type": "string",
            "required": false,
            "description": "Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department.",
            "constraints": {
              "enum": [
                "all",
                "x",
                "twitter",
                "tiktok",
                "instagram",
                "facebook",
                "reddit",
                "youtube",
                "linkedin",
                "threads",
                "bluesky",
                "pinterest",
                "twitch",
                "snapchat",
                "github",
                "spotify",
                "soundcloud",
                "rumble",
                "truthsocial",
                "web",
                "amazon",
                "inference",
                "ads",
                "link-in-bio",
                "ugc"
              ],
              "default": "all"
            }
          },
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases."
          },
          {
            "name": "includeSchemas",
            "type": "boolean",
            "required": false,
            "description": "Include full schemas for configured AgentBodega social data endpoints.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeExternalPattern",
            "type": "boolean",
            "required": false,
            "description": "Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeCoverageMap",
            "type": "boolean",
            "required": false,
            "description": "Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum configured endpoints and pattern rows to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "platform": "all",
          "includeExternalPattern": true,
          "includeCoverageMap": true,
          "includeSchemas": true,
          "limit": 50
        }
      },
      "exampleRequest": {
        "platform": "all",
        "includeExternalPattern": true,
        "includeCoverageMap": true,
        "includeSchemas": true,
        "limit": 50
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "department",
          "endpoints",
          "xTwitterReadOnlyPattern",
          "socialCoveragePattern"
        ],
        "properties": {
          "department": {
            "type": "object",
            "additionalProperties": true
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "xTwitterReadOnlyPattern": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "socialCoveragePattern": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "nextSteps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "department": {
          "name": "AgentBodega Social Media Department",
          "department": "Social Media"
        },
        "endpoints": [
          {
            "name": "facebook-page-posts-scraper",
            "platform": "facebook",
            "configured": true
          }
        ],
        "xTwitterReadOnlyPattern": [
          {
            "id": "x-tweet-search",
            "status": "available",
            "priceUsd": "0.06",
            "configured": true
          }
        ],
        "socialCoveragePattern": [
          {
            "id": "tiktok-social-video",
            "status": "staged",
            "configured": false,
            "plannedProducts": [
              "profiles",
              "videos",
              "comments",
              "search"
            ]
          }
        ]
      },
      "configured": false
    },
    {
      "id": "web-search",
      "resource": "https://agentbodega.store/api/web/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Search",
      "description": "Search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.",
      "longDescription": "Purpose: Search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.\nBest use: Use this when an agent needs search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: query.\nOptional fields: limit, site, freshness, includeSnippets, timeoutMs.\n\nAccepted fields:\n- query (required, string): Natural-language search query or keyword query to run against public web results. Constraints: min length: 2; max length: 240.\n- limit (optional, integer): Maximum normalized results to return. Constraints: default: 5; min: 1; max: 10.\n- site (optional, string): Optional public domain scope, such as example.com. URL-like values are normalized to the hostname. Constraints: max length: 120.\n- freshness (optional, string): Optional freshness preference. Use any when recency is not required. Constraints: accepted values: \"any\", \"day\", \"week\", \"month\", \"year\"; default: \"any\".\n- includeSnippets (optional, boolean): Set false to omit result snippets and return titles, URLs, domains, and rank only. Constraints: default: true.\n- timeoutMs (optional, integer): Search timeout in milliseconds. Constraints: default: 6000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"query\": \"agent payment APIs\",\n  \"limit\": 5,\n  \"freshness\": \"any\",\n  \"includeSnippets\": true\n}\n```",
      "category": "search-web",
      "kind": "web-search-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "search",
      "aisle": "Search",
      "shelfId": "web-results",
      "shelf": "Web Results",
      "offeringId": "web-search",
      "offering": "Web Search",
      "pathIds": [
        "search-web",
        "search",
        "web-results",
        "web-search"
      ],
      "pathLabels": [
        "Search & Web",
        "Search",
        "Web Results",
        "Web Search"
      ],
      "taxonomyPath": "search-web.search.web-results.web-search",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "search",
          "name": "Search"
        },
        "shelf": {
          "id": "web-results",
          "name": "Web Results"
        },
        "offering": {
          "id": "web-search",
          "name": "Web Search"
        },
        "pathIds": [
          "search-web",
          "search",
          "web-results",
          "web-search"
        ],
        "pathLabels": [
          "Search & Web",
          "Search",
          "Web Results",
          "Web Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "search",
        "source-discovery",
        "citations",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 240,
            "description": "Natural-language search query or keyword query to run against public web results."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum normalized results to return."
          },
          "site": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname."
          },
          "freshness": {
            "type": "string",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "year"
            ],
            "default": "any",
            "description": "Optional freshness preference. Use any when recency is not required."
          },
          "includeSnippets": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit result snippets and return titles, URLs, domains, and rank only."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 6000,
            "description": "Search timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "query"
        ],
        "optional": [
          "limit",
          "site",
          "freshness",
          "includeSnippets",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Natural-language search query or keyword query to run against public web results.",
            "constraints": {
              "minLength": 2,
              "maxLength": 240
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized results to return.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "site",
            "type": "string",
            "required": false,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "freshness",
            "type": "string",
            "required": false,
            "description": "Optional freshness preference. Use any when recency is not required.",
            "constraints": {
              "enum": [
                "any",
                "day",
                "week",
                "month",
                "year"
              ],
              "default": "any"
            }
          },
          {
            "name": "includeSnippets",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit result snippets and return titles, URLs, domains, and rank only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Search timeout in milliseconds.",
            "constraints": {
              "default": 6000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "agent payment APIs",
          "limit": 5,
          "freshness": "any",
          "includeSnippets": true
        }
      },
      "exampleRequest": {
        "query": "agent payment APIs",
        "limit": 5,
        "freshness": "any",
        "includeSnippets": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "search",
          "results",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "search": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-search",
          "name": "Web Search",
          "department": "Search & Web"
        },
        "requested": {
          "query": "agent payment APIs",
          "site": null,
          "freshness": "any",
          "limit": 5,
          "includeSnippets": true
        },
        "source": {
          "routing": "managed-web-search",
          "upstreamDetailsDisclosed": false
        },
        "search": {
          "query": "agent payment APIs",
          "resultCount": 2,
          "checkedAt": "2026-07-07T00:00:00.000Z",
          "durationMs": 420
        },
        "results": [
          {
            "rank": 1,
            "title": "Agent Payment API Guide",
            "url": "https://example.com/agent-payments",
            "domain": "example.com",
            "snippet": "A guide to payment-enabled API calls for agents."
          },
          {
            "rank": 2,
            "title": "x402 API Examples",
            "url": "https://example.org/x402-examples",
            "domain": "example.org",
            "snippet": "Examples of HTTP 402 payment flows."
          }
        ],
        "limits": {
          "maxResults": 10,
          "timeoutMs": 6000
        }
      },
      "configured": false
    },
    {
      "id": "web-answer",
      "resource": "https://agentbodega.store/api/web/answer",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Answer",
      "description": "Answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.",
      "longDescription": "Purpose: Answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.\nBest use: Use this when an agent needs answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: query.\nOptional fields: limit, maxSources, site, freshness, answerStyle, includeSourceText, timeoutMs.\n\nAccepted fields:\n- query (required, string): Question or research task to answer from public web results. Constraints: min length: 2; max length: 240.\n- limit (optional, integer): Maximum search results to inspect before building the answer. Constraints: default: 5; min: 1; max: 10.\n- maxSources (optional, integer): Maximum result pages to fetch and cite. Constraints: default: 3; min: 1; max: 5.\n- site (optional, string): Optional public domain scope, such as example.com. URL-like values are normalized to the hostname. Constraints: max length: 120.\n- freshness (optional, string): Optional freshness preference. Use any when recency is not required. Constraints: accepted values: \"any\", \"day\", \"week\", \"month\", \"year\"; default: \"any\".\n- answerStyle (optional, string): Brief returns a shorter answer; standard includes more evidence. Constraints: accepted values: \"brief\", \"standard\"; default: \"standard\".\n- includeSourceText (optional, boolean): Set true to include short source text excerpts used for the answer. Constraints: default: false.\n- timeoutMs (optional, integer): Search and source fetch timeout in milliseconds. Constraints: default: 6000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"query\": \"What are x402 paid APIs?\",\n  \"maxSources\": 3,\n  \"answerStyle\": \"standard\",\n  \"freshness\": \"any\"\n}\n```",
      "category": "search-web",
      "kind": "web-answer-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "answer",
      "aisle": "Answer",
      "shelfId": "cited-answers",
      "shelf": "Cited Answers",
      "offeringId": "web-answer",
      "offering": "Web Answer",
      "pathIds": [
        "search-web",
        "answer",
        "cited-answers",
        "web-answer"
      ],
      "pathLabels": [
        "Search & Web",
        "Answer",
        "Cited Answers",
        "Web Answer"
      ],
      "taxonomyPath": "search-web.answer.cited-answers.web-answer",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "answer",
          "name": "Answer"
        },
        "shelf": {
          "id": "cited-answers",
          "name": "Cited Answers"
        },
        "offering": {
          "id": "web-answer",
          "name": "Web Answer"
        },
        "pathIds": [
          "search-web",
          "answer",
          "cited-answers",
          "web-answer"
        ],
        "pathLabels": [
          "Search & Web",
          "Answer",
          "Cited Answers",
          "Web Answer"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "answer",
        "citations",
        "source-grounded",
        "research",
        "summary",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/answer",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/answer",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 240,
            "description": "Question or research task to answer from public web results."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum search results to inspect before building the answer."
          },
          "maxSources": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 3,
            "description": "Maximum result pages to fetch and cite."
          },
          "site": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname."
          },
          "freshness": {
            "type": "string",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "year"
            ],
            "default": "any",
            "description": "Optional freshness preference. Use any when recency is not required."
          },
          "answerStyle": {
            "type": "string",
            "enum": [
              "brief",
              "standard"
            ],
            "default": "standard",
            "description": "Brief returns a shorter answer; standard includes more evidence."
          },
          "includeSourceText": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include short source text excerpts used for the answer."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 6000,
            "description": "Search and source fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "query"
        ],
        "optional": [
          "limit",
          "maxSources",
          "site",
          "freshness",
          "answerStyle",
          "includeSourceText",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Question or research task to answer from public web results.",
            "constraints": {
              "minLength": 2,
              "maxLength": 240
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum search results to inspect before building the answer.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "maxSources",
            "type": "integer",
            "required": false,
            "description": "Maximum result pages to fetch and cite.",
            "constraints": {
              "default": 3,
              "minimum": 1,
              "maximum": 5
            }
          },
          {
            "name": "site",
            "type": "string",
            "required": false,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "freshness",
            "type": "string",
            "required": false,
            "description": "Optional freshness preference. Use any when recency is not required.",
            "constraints": {
              "enum": [
                "any",
                "day",
                "week",
                "month",
                "year"
              ],
              "default": "any"
            }
          },
          {
            "name": "answerStyle",
            "type": "string",
            "required": false,
            "description": "Brief returns a shorter answer; standard includes more evidence.",
            "constraints": {
              "enum": [
                "brief",
                "standard"
              ],
              "default": "standard"
            }
          },
          {
            "name": "includeSourceText",
            "type": "boolean",
            "required": false,
            "description": "Set true to include short source text excerpts used for the answer.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Search and source fetch timeout in milliseconds.",
            "constraints": {
              "default": 6000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "What are x402 paid APIs?",
          "maxSources": 3,
          "answerStyle": "standard",
          "freshness": "any"
        }
      },
      "exampleRequest": {
        "query": "What are x402 paid APIs?",
        "maxSources": 3,
        "answerStyle": "standard",
        "freshness": "any"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "answer",
          "sources",
          "search",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "answer": {
            "type": "object",
            "additionalProperties": true
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "search": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-answer",
          "name": "Web Answer",
          "department": "Search & Web"
        },
        "requested": {
          "query": "What are x402 paid APIs?",
          "site": null,
          "freshness": "any",
          "limit": 5,
          "maxSources": 3,
          "answerStyle": "standard",
          "includeSourceText": false
        },
        "source": {
          "routing": "managed-web-answer",
          "upstreamDetailsDisclosed": false
        },
        "answer": {
          "summary": "x402 paid APIs are HTTP endpoints that return a payment challenge before fulfillment, then provide the requested JSON result after payment settlement.",
          "confidence": "medium",
          "method": "extractive_cited_summary",
          "generatedAt": "2026-07-07T00:00:00.000Z"
        },
        "sources": [
          {
            "rank": 1,
            "title": "x402 API Examples",
            "url": "https://example.org/x402-examples",
            "domain": "example.org",
            "snippet": "Examples of HTTP 402 payment flows.",
            "used": true
          }
        ],
        "search": {
          "resultCount": 2,
          "fetchedSources": 1,
          "checkedAt": "2026-07-07T00:00:00.000Z",
          "durationMs": 830
        },
        "limits": {
          "maxResults": 10,
          "maxSources": 5,
          "timeoutMs": 6000
        }
      },
      "configured": false
    },
    {
      "id": "jwt-inspector",
      "resource": "https://agentbodega.store/api/developer/jwt/inspect",
      "type": "http",
      "method": "POST",
      "serviceName": "JWT Inspector",
      "description": "Decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.",
      "longDescription": "Purpose: Decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.\nBest use: Use this when an agent needs decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: token.\nOptional fields: expectedIssuer, expectedAudience, now, includeRaw.\n\nAccepted fields:\n- token (required, string): Compact JWT string with three dot-separated Base64URL segments. Constraints: min length: 20; max length: 8192.\n- expectedIssuer (optional, string): Optional issuer value to compare with the token iss claim. Constraints: max length: 300.\n- expectedAudience (optional, string): Optional audience value to compare with the token aud claim. Constraints: max length: 300.\n- now (optional, integer): Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time. Constraints: min: 0.\n- includeRaw (optional, boolean): Set true to include the raw header and payload objects. The signature is never returned. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature\",\n  \"expectedIssuer\": \"https://issuer.example\",\n  \"expectedAudience\": \"agent-api\",\n  \"includeRaw\": false\n}\n```",
      "category": "developer-utilities",
      "kind": "jwt-inspection-tool",
      "departmentId": "developer-utilities",
      "department": "Developer Utilities",
      "aisleId": "jwt",
      "aisle": "JWT",
      "shelfId": "inspect",
      "shelf": "Inspect",
      "offeringId": "jwt-inspector",
      "offering": "JWT Inspector",
      "pathIds": [
        "developer-utilities",
        "jwt",
        "inspect",
        "jwt-inspector"
      ],
      "pathLabels": [
        "Developer Utilities",
        "JWT",
        "Inspect",
        "JWT Inspector"
      ],
      "taxonomyPath": "developer-utilities.jwt.inspect.jwt-inspector",
      "layout": {
        "department": {
          "id": "developer-utilities",
          "name": "Developer Utilities"
        },
        "aisle": {
          "id": "jwt",
          "name": "JWT"
        },
        "shelf": {
          "id": "inspect",
          "name": "Inspect"
        },
        "offering": {
          "id": "jwt-inspector",
          "name": "JWT Inspector"
        },
        "pathIds": [
          "developer-utilities",
          "jwt",
          "inspect",
          "jwt-inspector"
        ],
        "pathLabels": [
          "Developer Utilities",
          "JWT",
          "Inspect",
          "JWT Inspector"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "developer-utilities",
        "jwt",
        "auth-debug",
        "token-inspection",
        "api-debug",
        "security",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/developer/jwt/inspect",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/developer/jwt/inspect",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "minLength": 20,
            "maxLength": 8192,
            "description": "Compact JWT string with three dot-separated Base64URL segments."
          },
          "expectedIssuer": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional issuer value to compare with the token iss claim."
          },
          "expectedAudience": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional audience value to compare with the token aud claim."
          },
          "now": {
            "type": "integer",
            "minimum": 0,
            "description": "Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time."
          },
          "includeRaw": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include the raw header and payload objects. The signature is never returned."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "token"
        ],
        "optional": [
          "expectedIssuer",
          "expectedAudience",
          "now",
          "includeRaw"
        ],
        "fields": [
          {
            "name": "token",
            "type": "string",
            "required": true,
            "description": "Compact JWT string with three dot-separated Base64URL segments.",
            "constraints": {
              "minLength": 20,
              "maxLength": 8192
            }
          },
          {
            "name": "expectedIssuer",
            "type": "string",
            "required": false,
            "description": "Optional issuer value to compare with the token iss claim.",
            "constraints": {
              "maxLength": 300
            }
          },
          {
            "name": "expectedAudience",
            "type": "string",
            "required": false,
            "description": "Optional audience value to compare with the token aud claim.",
            "constraints": {
              "maxLength": 300
            }
          },
          {
            "name": "now",
            "type": "integer",
            "required": false,
            "description": "Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "includeRaw",
            "type": "boolean",
            "required": false,
            "description": "Set true to include the raw header and payload objects. The signature is never returned.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature",
          "expectedIssuer": "https://issuer.example",
          "expectedAudience": "agent-api",
          "includeRaw": false
        }
      },
      "exampleRequest": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature",
        "expectedIssuer": "https://issuer.example",
        "expectedAudience": "agent-api",
        "includeRaw": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "token",
          "header",
          "claims",
          "checks",
          "warnings",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "token": {
            "type": "object",
            "additionalProperties": true
          },
          "header": {
            "type": "object",
            "additionalProperties": true
          },
          "claims": {
            "type": "object",
            "additionalProperties": true
          },
          "checks": {
            "type": "object",
            "additionalProperties": true
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "jwt-inspector",
          "name": "JWT Inspector",
          "department": "Developer Utilities"
        },
        "requested": {
          "expectedIssuer": "https://issuer.example",
          "expectedAudience": "agent-api",
          "includeRaw": false
        },
        "token": {
          "format": "compact-jwt",
          "segments": 3,
          "signaturePresent": true,
          "signatureVerified": false
        },
        "header": {
          "alg": "HS256",
          "typ": "JWT"
        },
        "claims": {
          "issuer": "https://issuer.example",
          "subject": "user_123",
          "audience": [
            "agent-api"
          ],
          "expiresAt": {
            "unix": 1893456000,
            "iso": "2030-01-01T00:00:00.000Z",
            "status": "valid"
          },
          "issuedAt": {
            "unix": 1704067200,
            "iso": "2024-01-01T00:00:00.000Z"
          }
        },
        "checks": {
          "issuer": "match",
          "audience": "match",
          "expired": false,
          "notBefore": "not_present",
          "issuedAtInFuture": false
        },
        "warnings": [
          "Signature was decoded but not cryptographically verified."
        ],
        "limits": {
          "maxTokenChars": 8192
        }
      },
      "configured": false
    },
    {
      "id": "web-fetch",
      "resource": "https://agentbodega.store/api/web/fetch",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Page Fetch",
      "description": "Fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.",
      "longDescription": "Purpose: Fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.\nBest use: Use this when an agent needs fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeHtml, includeLinks, maxBytes, maxLinks, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected. Constraints: format: uri.\n- includeHtml (optional, boolean): Set true to return a truncated sanitized HTML excerpt. Constraints: default: false.\n- includeLinks (optional, boolean): Set true to extract normalized outbound and same-page links up to maxLinks. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read before truncating extraction. Constraints: default: 32768; min: 1024; max: 65536.\n- maxLinks (optional, integer): Maximum links to return when includeLinks is true. Constraints: default: 20; min: 0; max: 50.\n- timeoutMs (optional, integer): Fetch timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeLinks\": true,\n  \"maxBytes\": 32768,\n  \"maxLinks\": 10\n}\n```",
      "category": "search-web",
      "kind": "web-extraction-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "page-extraction",
      "aisle": "Page Extraction",
      "shelfId": "fetch",
      "shelf": "Fetch",
      "offeringId": "web-fetch",
      "offering": "Web Page Fetch",
      "pathIds": [
        "search-web",
        "page-extraction",
        "fetch",
        "web-fetch"
      ],
      "pathLabels": [
        "Search & Web",
        "Page Extraction",
        "Fetch",
        "Web Page Fetch"
      ],
      "taxonomyPath": "search-web.page-extraction.fetch.web-fetch",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "page-extraction",
          "name": "Page Extraction"
        },
        "shelf": {
          "id": "fetch",
          "name": "Fetch"
        },
        "offering": {
          "id": "web-fetch",
          "name": "Web Page Fetch"
        },
        "pathIds": [
          "search-web",
          "page-extraction",
          "fetch",
          "web-fetch"
        ],
        "pathLabels": [
          "Search & Web",
          "Page Extraction",
          "Fetch",
          "Web Page Fetch"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "fetch",
        "page-extraction",
        "metadata",
        "links",
        "markdown",
        "content-extraction",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/fetch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/fetch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected."
          },
          "includeHtml": {
            "type": "boolean",
            "default": false,
            "description": "Set true to return a truncated sanitized HTML excerpt."
          },
          "includeLinks": {
            "type": "boolean",
            "default": true,
            "description": "Set true to extract normalized outbound and same-page links up to maxLinks."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read before truncating extraction."
          },
          "maxLinks": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 20,
            "description": "Maximum links to return when includeLinks is true."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeHtml",
          "includeLinks",
          "maxBytes",
          "maxLinks",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeHtml",
            "type": "boolean",
            "required": false,
            "description": "Set true to return a truncated sanitized HTML excerpt.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeLinks",
            "type": "boolean",
            "required": false,
            "description": "Set true to extract normalized outbound and same-page links up to maxLinks.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read before truncating extraction.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "maxLinks",
            "type": "integer",
            "required": false,
            "description": "Maximum links to return when includeLinks is true.",
            "constraints": {
              "default": 20,
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeLinks": true,
        "maxBytes": 32768,
        "maxLinks": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "metadata",
          "text",
          "links",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true
          },
          "text": {
            "type": "object",
            "additionalProperties": true
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "htmlExcerpt": {
            "type": "string"
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-fetch",
          "name": "Web Page Fetch",
          "department": "Search & Web"
        },
        "requested": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "metadata": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonical": "https://example.com/"
        },
        "text": {
          "plain": "Example Domain\n\nThis domain is for use in illustrative examples.",
          "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples.",
          "characters": 65,
          "words": 10
        },
        "links": [
          {
            "href": "https://www.iana.org/domains/example",
            "text": "More information",
            "rel": ""
          }
        ],
        "limits": {
          "maxBytes": 32768,
          "maxLinks": 10,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "link-preview",
      "resource": "https://agentbodega.store/api/search/link-preview",
      "type": "http",
      "method": "POST",
      "serviceName": "Link Preview",
      "description": "Fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.",
      "longDescription": "Purpose: Fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.\nBest use: Use this when an agent needs fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeImage, maxBytes, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected. Constraints: format: uri.\n- includeImage (optional, boolean): Set false to omit preview image metadata while still returning title, description, and canonical URL. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read while extracting preview tags. Constraints: default: 32768; min: 1024; max: 65536.\n- timeoutMs (optional, integer): Fetch timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeImage\": true,\n  \"maxBytes\": 32768\n}\n```",
      "category": "search-web",
      "kind": "link-preview-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "page-extraction",
      "aisle": "Page Extraction",
      "shelfId": "link-preview",
      "shelf": "Link Preview",
      "offeringId": "link-preview",
      "offering": "Link Preview",
      "pathIds": [
        "search-web",
        "page-extraction",
        "link-preview",
        "link-preview"
      ],
      "pathLabels": [
        "Search & Web",
        "Page Extraction",
        "Link Preview",
        "Link Preview"
      ],
      "taxonomyPath": "search-web.page-extraction.link-preview.link-preview",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "page-extraction",
          "name": "Page Extraction"
        },
        "shelf": {
          "id": "link-preview",
          "name": "Link Preview"
        },
        "offering": {
          "id": "link-preview",
          "name": "Link Preview"
        },
        "pathIds": [
          "search-web",
          "page-extraction",
          "link-preview",
          "link-preview"
        ],
        "pathLabels": [
          "Search & Web",
          "Page Extraction",
          "Link Preview",
          "Link Preview"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "link-preview",
        "open-graph",
        "metadata",
        "page-extraction",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/search/link-preview",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/search/link-preview",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected."
          },
          "includeImage": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit preview image metadata while still returning title, description, and canonical URL."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read while extracting preview tags."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeImage",
          "maxBytes",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeImage",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit preview image metadata while still returning title, description, and canonical URL.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read while extracting preview tags.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeImage": true,
          "maxBytes": 32768
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeImage": true,
        "maxBytes": 32768
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "preview",
          "signals",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "preview": {
            "type": "object",
            "additionalProperties": true
          },
          "signals": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "link-preview",
          "name": "Link Preview",
          "department": "Search & Web"
        },
        "requested": {
          "url": "https://example.com",
          "includeImage": true,
          "maxBytes": 32768,
          "timeoutMs": 5000
        },
        "source": {
          "routing": "direct-public-fetch",
          "upstreamDetailsDisclosed": false
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "preview": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonicalUrl": "https://example.com/",
          "url": "https://example.com/",
          "domain": "example.com",
          "siteName": "",
          "type": "",
          "image": null,
          "language": "en"
        },
        "signals": {
          "title": "title",
          "description": "meta:description",
          "canonicalUrl": "link:canonical",
          "siteName": "none",
          "type": "none",
          "image": "none"
        },
        "limits": {
          "maxBytes": 32768,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "any-to-markdown",
      "resource": "https://agentbodega.store/api/documents/any-to-markdown",
      "type": "http",
      "method": "POST",
      "serviceName": "Any URL to Markdown",
      "description": "Convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.",
      "longDescription": "Purpose: Convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.\nBest use: Use this when an agent needs convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeLinks, maxBytes, maxLinks, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected. Constraints: format: uri.\n- includeLinks (optional, boolean): Set true to include normalized links that were visible in the source content. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read before truncating the markdown extraction. Constraints: default: 32768; min: 1024; max: 65536.\n- maxLinks (optional, integer): Maximum links to return when includeLinks is true. Constraints: default: 20; min: 0; max: 50.\n- timeoutMs (optional, integer): Fetch and extraction timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeLinks\": true,\n  \"maxBytes\": 32768,\n  \"maxLinks\": 10\n}\n```",
      "category": "documents-content",
      "kind": "content-extraction-tool",
      "departmentId": "documents-content",
      "department": "Documents & Content",
      "aisleId": "extraction",
      "aisle": "Extraction",
      "shelfId": "url-to-markdown",
      "shelf": "Url To Markdown",
      "offeringId": "any-to-markdown",
      "offering": "Any URL to Markdown",
      "pathIds": [
        "documents-content",
        "extraction",
        "url-to-markdown",
        "any-to-markdown"
      ],
      "pathLabels": [
        "Documents & Content",
        "Extraction",
        "Url To Markdown",
        "Any URL to Markdown"
      ],
      "taxonomyPath": "documents-content.extraction.url-to-markdown.any-to-markdown",
      "layout": {
        "department": {
          "id": "documents-content",
          "name": "Documents & Content"
        },
        "aisle": {
          "id": "extraction",
          "name": "Extraction"
        },
        "shelf": {
          "id": "url-to-markdown",
          "name": "Url To Markdown"
        },
        "offering": {
          "id": "any-to-markdown",
          "name": "Any URL to Markdown"
        },
        "pathIds": [
          "documents-content",
          "extraction",
          "url-to-markdown",
          "any-to-markdown"
        ],
        "pathLabels": [
          "Documents & Content",
          "Extraction",
          "Url To Markdown",
          "Any URL to Markdown"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "documents-content",
        "markdown",
        "content-extraction",
        "rag-prep",
        "clean-text",
        "links",
        "metadata",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/documents/any-to-markdown",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/documents/any-to-markdown",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected."
          },
          "includeLinks": {
            "type": "boolean",
            "default": true,
            "description": "Set true to include normalized links that were visible in the source content."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read before truncating the markdown extraction."
          },
          "maxLinks": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 20,
            "description": "Maximum links to return when includeLinks is true."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch and extraction timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeLinks",
          "maxBytes",
          "maxLinks",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeLinks",
            "type": "boolean",
            "required": false,
            "description": "Set true to include normalized links that were visible in the source content.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read before truncating the markdown extraction.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "maxLinks",
            "type": "integer",
            "required": false,
            "description": "Maximum links to return when includeLinks is true.",
            "constraints": {
              "default": 20,
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch and extraction timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeLinks": true,
        "maxBytes": 32768,
        "maxLinks": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "metadata",
          "text",
          "links",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true
          },
          "text": {
            "type": "object",
            "additionalProperties": true
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "any-to-markdown",
          "name": "Any URL to Markdown",
          "department": "Documents & Content"
        },
        "requested": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "metadata": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonical": "https://example.com/"
        },
        "text": {
          "plain": "Example Domain\n\nThis domain is for use in illustrative examples.",
          "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples.",
          "characters": 65,
          "words": 10
        },
        "links": [
          {
            "href": "https://www.iana.org/domains/example",
            "text": "More information",
            "rel": ""
          }
        ],
        "limits": {
          "maxBytes": 32768,
          "maxLinks": 10,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "image-format-converter",
      "resource": "https://agentbodega.store/api/media/image/convert",
      "type": "http",
      "method": "POST",
      "serviceName": "Image Format Converter",
      "description": "Create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.",
      "longDescription": "Purpose: Create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.\nBest use: Use this when an agent needs create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: imageUrl, targetFormat.\nOptional fields: width, height, fit, quality, background, filename, ttlSeconds.\n\nAccepted fields:\n- imageUrl (required, string): Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected. Constraints: format: uri.\n- targetFormat (required, string): Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend. Constraints: accepted values: \"jpg\", \"jpeg\", \"png\", \"webp\", \"avif\".\n- width (optional, integer): Optional output width in pixels. If omitted, the source width is preserved when the backend supports it. Constraints: min: 1; max: 4096.\n- height (optional, integer): Optional output height in pixels. If omitted, the source height is preserved when the backend supports it. Constraints: min: 1; max: 4096.\n- fit (optional, string): Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds. Constraints: accepted values: \"scale-down\", \"contain\", \"cover\", \"crop\", \"pad\"; default: \"scale-down\".\n- quality (optional, integer): Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded. Constraints: default: 85; min: 1; max: 95.\n- background (optional, string): Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff. Constraints: max length: 40.\n- filename (optional, string): Optional download filename. The service normalizes the extension to match targetFormat. Constraints: max length: 120.\n- ttlSeconds (optional, integer): How long the signed conversion download URL should remain usable, in seconds. Constraints: default: 3600; min: 60; max: 86400.\n\nExample request body:\n```json\n{\n  \"imageUrl\": \"https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg\",\n  \"targetFormat\": \"webp\",\n  \"width\": 800,\n  \"fit\": \"scale-down\",\n  \"quality\": 85,\n  \"ttlSeconds\": 3600\n}\n```",
      "category": "edge-ai-automation",
      "kind": "media-conversion-tool",
      "departmentId": "edge-ai-automation",
      "department": "Edge AI & Automation",
      "aisleId": "media-conversion",
      "aisle": "Media Conversion",
      "shelfId": "image-format",
      "shelf": "Image Format",
      "offeringId": "image-format-converter",
      "offering": "Image Format Converter",
      "pathIds": [
        "edge-ai-automation",
        "media-conversion",
        "image-format",
        "image-format-converter"
      ],
      "pathLabels": [
        "Edge AI & Automation",
        "Media Conversion",
        "Image Format",
        "Image Format Converter"
      ],
      "taxonomyPath": "edge-ai-automation.media-conversion.image-format.image-format-converter",
      "layout": {
        "department": {
          "id": "edge-ai-automation",
          "name": "Edge AI & Automation"
        },
        "aisle": {
          "id": "media-conversion",
          "name": "Media Conversion"
        },
        "shelf": {
          "id": "image-format",
          "name": "Image Format"
        },
        "offering": {
          "id": "image-format-converter",
          "name": "Image Format Converter"
        },
        "pathIds": [
          "edge-ai-automation",
          "media-conversion",
          "image-format",
          "image-format-converter"
        ],
        "pathLabels": [
          "Edge AI & Automation",
          "Media Conversion",
          "Image Format",
          "Image Format Converter"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "edge-ai-automation",
        "media",
        "image",
        "image-conversion",
        "heic",
        "jpg",
        "jpeg",
        "png",
        "webp",
        "avif",
        "agent-tools",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/media/image/convert",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/media/image/convert",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "imageUrl",
          "targetFormat"
        ],
        "properties": {
          "imageUrl": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected."
          },
          "targetFormat": {
            "type": "string",
            "enum": [
              "jpg",
              "jpeg",
              "png",
              "webp",
              "avif"
            ],
            "description": "Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend."
          },
          "width": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "description": "Optional output width in pixels. If omitted, the source width is preserved when the backend supports it."
          },
          "height": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "description": "Optional output height in pixels. If omitted, the source height is preserved when the backend supports it."
          },
          "fit": {
            "type": "string",
            "enum": [
              "scale-down",
              "contain",
              "cover",
              "crop",
              "pad"
            ],
            "default": "scale-down",
            "description": "Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds."
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 95,
            "default": 85,
            "description": "Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded."
          },
          "background": {
            "type": "string",
            "maxLength": 40,
            "description": "Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff."
          },
          "filename": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional download filename. The service normalizes the extension to match targetFormat."
          },
          "ttlSeconds": {
            "type": "integer",
            "minimum": 60,
            "maximum": 86400,
            "default": 3600,
            "description": "How long the signed conversion download URL should remain usable, in seconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "imageUrl",
          "targetFormat"
        ],
        "optional": [
          "width",
          "height",
          "fit",
          "quality",
          "background",
          "filename",
          "ttlSeconds"
        ],
        "fields": [
          {
            "name": "imageUrl",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "targetFormat",
            "type": "string",
            "required": true,
            "description": "Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend.",
            "constraints": {
              "enum": [
                "jpg",
                "jpeg",
                "png",
                "webp",
                "avif"
              ]
            }
          },
          {
            "name": "width",
            "type": "integer",
            "required": false,
            "description": "Optional output width in pixels. If omitted, the source width is preserved when the backend supports it.",
            "constraints": {
              "minimum": 1,
              "maximum": 4096
            }
          },
          {
            "name": "height",
            "type": "integer",
            "required": false,
            "description": "Optional output height in pixels. If omitted, the source height is preserved when the backend supports it.",
            "constraints": {
              "minimum": 1,
              "maximum": 4096
            }
          },
          {
            "name": "fit",
            "type": "string",
            "required": false,
            "description": "Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds.",
            "constraints": {
              "enum": [
                "scale-down",
                "contain",
                "cover",
                "crop",
                "pad"
              ],
              "default": "scale-down"
            }
          },
          {
            "name": "quality",
            "type": "integer",
            "required": false,
            "description": "Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded.",
            "constraints": {
              "default": 85,
              "minimum": 1,
              "maximum": 95
            }
          },
          {
            "name": "background",
            "type": "string",
            "required": false,
            "description": "Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff.",
            "constraints": {
              "maxLength": 40
            }
          },
          {
            "name": "filename",
            "type": "string",
            "required": false,
            "description": "Optional download filename. The service normalizes the extension to match targetFormat.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "ttlSeconds",
            "type": "integer",
            "required": false,
            "description": "How long the signed conversion download URL should remain usable, in seconds.",
            "constraints": {
              "default": 3600,
              "minimum": 60,
              "maximum": 86400
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
          "targetFormat": "webp",
          "width": 800,
          "fit": "scale-down",
          "quality": 85,
          "ttlSeconds": 3600
        }
      },
      "exampleRequest": {
        "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
        "targetFormat": "webp",
        "width": 800,
        "fit": "scale-down",
        "quality": 85,
        "ttlSeconds": 3600
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "conversion",
          "download",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "conversion": {
            "type": "object",
            "additionalProperties": true
          },
          "download": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "image-format-converter",
          "name": "Image Format Converter",
          "department": "Edge AI & Automation"
        },
        "requested": {
          "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
          "targetFormat": "webp",
          "width": 800,
          "fit": "scale-down",
          "quality": 85,
          "ttlSeconds": 3600
        },
        "source": {
          "contentType": "image/jpeg",
          "contentLength": 36287,
          "extension": "jpg",
          "validated": true,
          "redirectsAllowed": false
        },
        "conversion": {
          "targetFormat": "webp",
          "contentType": "image/webp",
          "filename": "JPEG_example_flower.webp"
        },
        "download": {
          "url": "https://agentbodega.store/i/signed-token",
          "method": "GET",
          "expiresAt": "2026-07-07T18:00:00.000Z"
        },
        "limits": {
          "maxSourceBytes": 10485760,
          "maxDimension": 4096,
          "maxQuality": 95,
          "maxTtlSeconds": 86400
        }
      },
      "configured": false
    },
    {
      "id": "real-estate-listings-search",
      "resource": "https://agentbodega.store/api/real-estate/listings/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Real Estate Listing Search",
      "description": "Search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.",
      "longDescription": "Purpose: Search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.\nBest use: Use this when an agent needs search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: source, mode, market, listingType, priceMin, priceMax, bedsMin, bathsMin, homeTypes, propertyType, bedrooms, sortBy, daysOnMarket, sqftMin, sqftMax, lotSizeMin, lotSizeMax, yearBuiltMin, yearBuiltMax, amenities, searchUrls, addresses, zpids, propertyIds, locationSlug, state, zipCode, maxRent, petFriendly, maxPages, filterToRequestedCity, includeSchools, includeHistory, includeDetails, smartScrape, maxResults.\n\nAccepted fields:\n- source (optional, string): Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments. Constraints: accepted values: \"auto\", \"zillow\", \"apartments\", \"realtor\"; default: \"auto\".\n- mode (optional, string): Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids. Constraints: accepted values: \"search\", \"url\", \"lookup\"; default: \"search\".\n- market (optional, string): City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX.\n- listingType (optional, string): Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\".\n- priceMin (optional, integer): Price Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- priceMax (optional, integer): Price Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- bedsMin (optional, integer): Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10. Constraints: min: 0; max: 10.\n- bathsMin (optional, integer): Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10. Constraints: min: 0; max: 10.\n- homeTypes (optional, array): List of home types values for Real Estate Listing Search. Constraints: max items: 7. Constraints: max items: 7.\n- propertyType (optional, string): Rental property type used by the Apartments-backed provider. Constraints: accepted values: \"apartments\", \"houses\", \"townhomes\", \"condos\".\n- bedrooms (optional, any): Rental bedroom filter used by the Apartments-backed provider.\n- sortBy (optional, string): Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\".\n- daysOnMarket (optional, string): Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\".\n- sqftMin (optional, integer): Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- sqftMax (optional, integer): Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- lotSizeMin (optional, integer): Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- lotSizeMax (optional, integer): Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- yearBuiltMin (optional, integer): Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030. Constraints: min: 1800; max: 2030.\n- yearBuiltMax (optional, integer): Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030. Constraints: min: 1800; max: 2030.\n- amenities (optional, array): List of amenities values for Real Estate Listing Search. Constraints: max items: 7. Constraints: max items: 7.\n- searchUrls (optional, array): Listing or search URLs for url mode. Constraints: max items: 3.\n- addresses (optional, array): Addresses for lookup mode. Constraints: max items: 10.\n- zpids (optional, array): Zillow property ids for lookup mode. Constraints: max items: 10.\n- propertyIds (optional, array): Provider property ids for lookup mode, currently used by the realtor-backed provider. Constraints: max items: 10.\n- locationSlug (optional, string): Provider-specific location slug for rental searches when city/state parsing is not enough.\n- state (optional, string): Two-letter state hint for rental searches. Constraints: min length: 2; max length: 2.\n- zipCode (optional, string): ZIP hint for rental searches.\n- maxRent (optional, integer): Maximum monthly rent. If omitted, priceMax is reused for rental searches. Constraints: min: 0.\n- petFriendly (optional, boolean): Rental search filter for pet-friendly listings. Constraints: default: false.\n- maxPages (optional, integer): Maximum rendered search pages for the Apartments-backed provider. Constraints: default: 1; min: 1; max: 2.\n- filterToRequestedCity (optional, boolean): Optional exact-city filter for Apartments-backed city searches.\n- includeSchools (optional, boolean): Include school data where the selected provider supports detail extraction. Constraints: default: true.\n- includeHistory (optional, boolean): Include price/tax history where the selected provider supports detail extraction. Constraints: default: true.\n- includeDetails (optional, boolean): Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows. Constraints: default: false.\n- smartScrape (optional, boolean): Allow the managed adapter to skip known unchanged properties where its persistent cache supports it. Constraints: default: true.\n- maxResults (optional, integer): Maximum listing rows to return. Detail-enriched calls are capped at 10 rows. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"source\": \"zillow\",\n  \"mode\": \"search\",\n  \"market\": \"Houston, TX 77008\",\n  \"listingType\": \"for_sale\",\n  \"priceMin\": 200000,\n  \"priceMax\": 500000,\n  \"bedsMin\": 3,\n  \"homeTypes\": [\n    \"houses\",\n    \"townhomes\"\n  ],\n  \"includeDetails\": false,\n  \"maxResults\": 10\n}\n```",
      "category": "real-estate",
      "kind": "real-estate-tool",
      "departmentId": "real-estate",
      "department": "Real Estate",
      "aisleId": "listing-search",
      "aisle": "Listing Search",
      "shelfId": "homes-and-rentals",
      "shelf": "Homes And Rentals",
      "offeringId": "real-estate-listings-search",
      "offering": "Real Estate Listing Search",
      "pathIds": [
        "real-estate",
        "listing-search",
        "homes-and-rentals",
        "real-estate-listings-search"
      ],
      "pathLabels": [
        "Real Estate",
        "Listing Search",
        "Homes And Rentals",
        "Real Estate Listing Search"
      ],
      "taxonomyPath": "real-estate.listing-search.homes-and-rentals.real-estate-listings-search",
      "layout": {
        "department": {
          "id": "real-estate",
          "name": "Real Estate"
        },
        "aisle": {
          "id": "listing-search",
          "name": "Listing Search"
        },
        "shelf": {
          "id": "homes-and-rentals",
          "name": "Homes And Rentals"
        },
        "offering": {
          "id": "real-estate-listings-search",
          "name": "Real Estate Listing Search"
        },
        "pathIds": [
          "real-estate",
          "listing-search",
          "homes-and-rentals",
          "real-estate-listings-search"
        ],
        "pathLabels": [
          "Real Estate",
          "Listing Search",
          "Homes And Rentals",
          "Real Estate Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "real-estate",
        "property-search",
        "home-listings",
        "housing",
        "for-sale",
        "for-rent",
        "rentals",
        "apartments",
        "apartments-com",
        "zillow",
        "realtor",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/real-estate/listings/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/real-estate/listings/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "auto",
              "zillow",
              "apartments",
              "realtor"
            ],
            "default": "auto",
            "description": "Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments."
          },
          "mode": {
            "type": "string",
            "enum": [
              "search",
              "url",
              "lookup"
            ],
            "default": "search",
            "description": "Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids."
          },
          "market": {
            "type": "string",
            "description": "City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX."
          },
          "listingType": {
            "type": "string",
            "enum": [
              "for_sale",
              "recently_sold",
              "for_rent",
              "foreclosure"
            ],
            "default": "for_sale",
            "description": "Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\"."
          },
          "priceMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Price Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "priceMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Price Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "bedsMin": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "description": "Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10."
          },
          "bathsMin": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "description": "Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10."
          },
          "homeTypes": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "string",
              "enum": [
                "houses",
                "townhomes",
                "multifamily",
                "condos",
                "land",
                "apartments",
                "manufactured"
              ],
              "description": "Home Types item filter for Real Estate Listing Search. Accepted values: \"houses\", \"townhomes\", \"multifamily\", \"condos\", \"land\", \"apartments\", \"manufactured\". Constraints: accepted values: \"houses\", \"townhomes\", \"multifamily\", \"condos\", \"land\", \"apartments\", \"manufactured\"."
            },
            "description": "List of home types values for Real Estate Listing Search. Constraints: max items: 7."
          },
          "propertyType": {
            "type": "string",
            "enum": [
              "apartments",
              "houses",
              "townhomes",
              "condos"
            ],
            "description": "Rental property type used by the Apartments-backed provider."
          },
          "bedrooms": {
            "oneOf": [
              {
                "type": "string",
                "enum": [
                  "any",
                  "studio",
                  "1",
                  "2",
                  "3",
                  "4",
                  "5+"
                ]
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 5
              }
            ],
            "description": "Rental bedroom filter used by the Apartments-backed provider."
          },
          "sortBy": {
            "type": "string",
            "enum": [
              "newest",
              "relevance",
              "pricea",
              "priced",
              "beds",
              "baths",
              "size",
              "lot",
              "zest"
            ],
            "default": "newest",
            "description": "Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\"."
          },
          "daysOnMarket": {
            "type": "string",
            "enum": [
              "",
              "1",
              "7",
              "14",
              "30",
              "90",
              "6m",
              "12m",
              "24m",
              "36m"
            ],
            "default": "",
            "description": "Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\"."
          },
          "sqftMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "sqftMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "lotSizeMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "lotSizeMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "yearBuiltMin": {
            "type": "integer",
            "minimum": 1800,
            "maximum": 2030,
            "description": "Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030."
          },
          "yearBuiltMax": {
            "type": "integer",
            "minimum": 1800,
            "maximum": 2030,
            "description": "Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030."
          },
          "amenities": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "string",
              "enum": [
                "pool",
                "ac",
                "waterfront",
                "single-story",
                "garage",
                "basement",
                "3d-tour"
              ],
              "description": "Amenities item filter for Real Estate Listing Search. Accepted values: \"pool\", \"ac\", \"waterfront\", \"single-story\", \"garage\", \"basement\", \"3d-tour\". Constraints: accepted values: \"pool\", \"ac\", \"waterfront\", \"single-story\", \"garage\", \"basement\", \"3d-tour\"."
            },
            "description": "List of amenities values for Real Estate Listing Search. Constraints: max items: 7."
          },
          "searchUrls": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "type": "string",
              "format": "uri",
              "description": "Search Urls item value for Real Estate Listing Search. Constraints: format: uri."
            },
            "description": "Listing or search URLs for url mode."
          },
          "addresses": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Addresses item value for Real Estate Listing Search."
            },
            "description": "Addresses for lookup mode."
          },
          "zpids": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Zpids item value for Real Estate Listing Search."
            },
            "description": "Zillow property ids for lookup mode."
          },
          "propertyIds": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Property Ids item value for Real Estate Listing Search."
            },
            "description": "Provider property ids for lookup mode, currently used by the realtor-backed provider."
          },
          "locationSlug": {
            "type": "string",
            "description": "Provider-specific location slug for rental searches when city/state parsing is not enough."
          },
          "state": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "description": "Two-letter state hint for rental searches."
          },
          "zipCode": {
            "type": "string",
            "description": "ZIP hint for rental searches."
          },
          "maxRent": {
            "type": "integer",
            "minimum": 0,
            "description": "Maximum monthly rent. If omitted, priceMax is reused for rental searches."
          },
          "petFriendly": {
            "type": "boolean",
            "default": false,
            "description": "Rental search filter for pet-friendly listings."
          },
          "maxPages": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2,
            "default": 1,
            "description": "Maximum rendered search pages for the Apartments-backed provider."
          },
          "filterToRequestedCity": {
            "type": "boolean",
            "description": "Optional exact-city filter for Apartments-backed city searches."
          },
          "includeSchools": {
            "type": "boolean",
            "default": true,
            "description": "Include school data where the selected provider supports detail extraction."
          },
          "includeHistory": {
            "type": "boolean",
            "default": true,
            "description": "Include price/tax history where the selected provider supports detail extraction."
          },
          "includeDetails": {
            "type": "boolean",
            "default": false,
            "description": "Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows."
          },
          "smartScrape": {
            "type": "boolean",
            "default": true,
            "description": "Allow the managed adapter to skip known unchanged properties where its persistent cache supports it."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum listing rows to return. Detail-enriched calls are capped at 10 rows."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "source",
          "mode",
          "market",
          "listingType",
          "priceMin",
          "priceMax",
          "bedsMin",
          "bathsMin",
          "homeTypes",
          "propertyType",
          "bedrooms",
          "sortBy",
          "daysOnMarket",
          "sqftMin",
          "sqftMax",
          "lotSizeMin",
          "lotSizeMax",
          "yearBuiltMin",
          "yearBuiltMax",
          "amenities",
          "searchUrls",
          "addresses",
          "zpids",
          "propertyIds",
          "locationSlug",
          "state",
          "zipCode",
          "maxRent",
          "petFriendly",
          "maxPages",
          "filterToRequestedCity",
          "includeSchools",
          "includeHistory",
          "includeDetails",
          "smartScrape",
          "maxResults"
        ],
        "fields": [
          {
            "name": "source",
            "type": "string",
            "required": false,
            "description": "Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments.",
            "constraints": {
              "enum": [
                "auto",
                "zillow",
                "apartments",
                "realtor"
              ],
              "default": "auto"
            }
          },
          {
            "name": "mode",
            "type": "string",
            "required": false,
            "description": "Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids.",
            "constraints": {
              "enum": [
                "search",
                "url",
                "lookup"
              ],
              "default": "search"
            }
          },
          {
            "name": "market",
            "type": "string",
            "required": false,
            "description": "City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX."
          },
          {
            "name": "listingType",
            "type": "string",
            "required": false,
            "description": "Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\".",
            "constraints": {
              "enum": [
                "for_sale",
                "recently_sold",
                "for_rent",
                "foreclosure"
              ],
              "default": "for_sale"
            }
          },
          {
            "name": "priceMin",
            "type": "integer",
            "required": false,
            "description": "Price Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "priceMax",
            "type": "integer",
            "required": false,
            "description": "Price Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "bedsMin",
            "type": "integer",
            "required": false,
            "description": "Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10.",
            "constraints": {
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "bathsMin",
            "type": "integer",
            "required": false,
            "description": "Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10.",
            "constraints": {
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "homeTypes",
            "type": "array",
            "required": false,
            "description": "List of home types values for Real Estate Listing Search. Constraints: max items: 7.",
            "constraints": {
              "maxItems": 7
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "propertyType",
            "type": "string",
            "required": false,
            "description": "Rental property type used by the Apartments-backed provider.",
            "constraints": {
              "enum": [
                "apartments",
                "houses",
                "townhomes",
                "condos"
              ]
            }
          },
          {
            "name": "bedrooms",
            "type": "any",
            "required": false,
            "description": "Rental bedroom filter used by the Apartments-backed provider."
          },
          {
            "name": "sortBy",
            "type": "string",
            "required": false,
            "description": "Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\".",
            "constraints": {
              "enum": [
                "newest",
                "relevance",
                "pricea",
                "priced",
                "beds",
                "baths",
                "size",
                "lot",
                "zest"
              ],
              "default": "newest"
            }
          },
          {
            "name": "daysOnMarket",
            "type": "string",
            "required": false,
            "description": "Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\".",
            "constraints": {
              "enum": [
                "",
                "1",
                "7",
                "14",
                "30",
                "90",
                "6m",
                "12m",
                "24m",
                "36m"
              ],
              "default": ""
            }
          },
          {
            "name": "sqftMin",
            "type": "integer",
            "required": false,
            "description": "Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "sqftMax",
            "type": "integer",
            "required": false,
            "description": "Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "lotSizeMin",
            "type": "integer",
            "required": false,
            "description": "Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "lotSizeMax",
            "type": "integer",
            "required": false,
            "description": "Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "yearBuiltMin",
            "type": "integer",
            "required": false,
            "description": "Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030.",
            "constraints": {
              "minimum": 1800,
              "maximum": 2030
            }
          },
          {
            "name": "yearBuiltMax",
            "type": "integer",
            "required": false,
            "description": "Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030.",
            "constraints": {
              "minimum": 1800,
              "maximum": 2030
            }
          },
          {
            "name": "amenities",
            "type": "array",
            "required": false,
            "description": "List of amenities values for Real Estate Listing Search. Constraints: max items: 7.",
            "constraints": {
              "maxItems": 7
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "searchUrls",
            "type": "array",
            "required": false,
            "description": "Listing or search URLs for url mode.",
            "constraints": {
              "maxItems": 3
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "addresses",
            "type": "array",
            "required": false,
            "description": "Addresses for lookup mode.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "zpids",
            "type": "array",
            "required": false,
            "description": "Zillow property ids for lookup mode.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "propertyIds",
            "type": "array",
            "required": false,
            "description": "Provider property ids for lookup mode, currently used by the realtor-backed provider.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "locationSlug",
            "type": "string",
            "required": false,
            "description": "Provider-specific location slug for rental searches when city/state parsing is not enough."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Two-letter state hint for rental searches.",
            "constraints": {
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "zipCode",
            "type": "string",
            "required": false,
            "description": "ZIP hint for rental searches."
          },
          {
            "name": "maxRent",
            "type": "integer",
            "required": false,
            "description": "Maximum monthly rent. If omitted, priceMax is reused for rental searches.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "petFriendly",
            "type": "boolean",
            "required": false,
            "description": "Rental search filter for pet-friendly listings.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "maxPages",
            "type": "integer",
            "required": false,
            "description": "Maximum rendered search pages for the Apartments-backed provider.",
            "constraints": {
              "default": 1,
              "minimum": 1,
              "maximum": 2
            }
          },
          {
            "name": "filterToRequestedCity",
            "type": "boolean",
            "required": false,
            "description": "Optional exact-city filter for Apartments-backed city searches."
          },
          {
            "name": "includeSchools",
            "type": "boolean",
            "required": false,
            "description": "Include school data where the selected provider supports detail extraction.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Include price/tax history where the selected provider supports detail extraction.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeDetails",
            "type": "boolean",
            "required": false,
            "description": "Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "smartScrape",
            "type": "boolean",
            "required": false,
            "description": "Allow the managed adapter to skip known unchanged properties where its persistent cache supports it.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum listing rows to return. Detail-enriched calls are capped at 10 rows.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "source": "zillow",
          "mode": "search",
          "market": "Houston, TX 77008",
          "listingType": "for_sale",
          "priceMin": 200000,
          "priceMax": 500000,
          "bedsMin": 3,
          "homeTypes": [
            "houses",
            "townhomes"
          ],
          "includeDetails": false,
          "maxResults": 10
        }
      },
      "exampleRequest": {
        "source": "zillow",
        "mode": "search",
        "market": "Houston, TX 77008",
        "listingType": "for_sale",
        "priceMin": 200000,
        "priceMax": 500000,
        "bedsMin": 3,
        "homeTypes": [
          "houses",
          "townhomes"
        ],
        "includeDetails": false,
        "maxResults": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "result_count",
          "results",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "result_count": {
            "type": "integer"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "real-estate-listings-search",
          "name": "Real Estate Listing Search",
          "department": "Real Estate"
        },
        "requested": {
          "source": "zillow",
          "mode": "search",
          "market": "Houston, TX 77008",
          "listingType": "for_sale",
          "maxResults": 10,
          "includeDetails": false
        },
        "source": {
          "selected": "zillow",
          "routing": "managed-adapter",
          "resultFreshness": "live-run",
          "upstreamDetailsDisclosed": false
        },
        "result_count": 1,
        "results": [
          {
            "source": "zillow",
            "listing_id": "27886690",
            "address": "1246 Omar St, Houston, TX 77008",
            "price_usd": 1050000,
            "beds": 4,
            "baths": 2,
            "sqft": 2454
          }
        ]
      },
      "configured": false
    },
    {
      "id": "prediction-market-search",
      "resource": "https://agentbodega.store/api/prediction-markets/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Prediction Market Search",
      "description": "Search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.",
      "longDescription": "Purpose: Search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.\nBest use: Use this when an agent needs search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, venue, activeOnly, closed, category, limit, sort, includeRules.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against market title, slug, description, outcomes, and category labels. Constraints: max length: 160.\n- venue (optional, string): Venue selector. Use managed for AgentBodega's normalized market feed. Constraints: accepted values: \"managed\", \"polymarket\"; default: \"managed\".\n- activeOnly (optional, boolean): When true, return currently active, unresolved markets only. Constraints: default: true.\n- closed (optional, boolean): Set true only when historical or resolved markets are acceptable. Constraints: default: false.\n- category (optional, string): Optional category, event, or tag filter when the caller wants a narrower market family. Constraints: max length: 80.\n- limit (optional, integer): Maximum normalized market rows to return. Constraints: default: 10; min: 1; max: 25.\n- sort (optional, string): Sort order for returned markets. Constraints: accepted values: \"volume_desc\", \"liquidity_desc\", \"newest\", \"ending_soon\"; default: \"volume_desc\".\n- includeRules (optional, boolean): Set true to include capped market rule or description text. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"query\": \"AI agents\",\n  \"category\": \"technology\",\n  \"activeOnly\": true,\n  \"limit\": 10,\n  \"sort\": \"volume_desc\",\n  \"includeRules\": false\n}\n```",
      "category": "prediction-markets",
      "kind": "market-search-tool",
      "departmentId": "prediction-markets",
      "department": "Prediction Markets",
      "aisleId": "market-search",
      "aisle": "Market Search",
      "shelfId": "search",
      "shelf": "Search",
      "offeringId": "prediction-market-search",
      "offering": "Prediction Market Search",
      "pathIds": [
        "prediction-markets",
        "market-search",
        "search",
        "prediction-market-search"
      ],
      "pathLabels": [
        "Prediction Markets",
        "Market Search",
        "Search",
        "Prediction Market Search"
      ],
      "taxonomyPath": "prediction-markets.market-search.search.prediction-market-search",
      "layout": {
        "department": {
          "id": "prediction-markets",
          "name": "Prediction Markets"
        },
        "aisle": {
          "id": "market-search",
          "name": "Market Search"
        },
        "shelf": {
          "id": "search",
          "name": "Search"
        },
        "offering": {
          "id": "prediction-market-search",
          "name": "Prediction Market Search"
        },
        "pathIds": [
          "prediction-markets",
          "market-search",
          "search",
          "prediction-market-search"
        ],
        "pathLabels": [
          "Prediction Markets",
          "Market Search",
          "Search",
          "Prediction Market Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "prediction-markets",
        "market-search",
        "markets",
        "events",
        "probabilities",
        "public-data",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/prediction-markets/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/prediction-markets/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels."
          },
          "venue": {
            "type": "string",
            "enum": [
              "managed",
              "polymarket"
            ],
            "default": "managed",
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed."
          },
          "activeOnly": {
            "type": "boolean",
            "default": true,
            "description": "When true, return currently active, unresolved markets only."
          },
          "closed": {
            "type": "boolean",
            "default": false,
            "description": "Set true only when historical or resolved markets are acceptable."
          },
          "category": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "default": 10,
            "description": "Maximum normalized market rows to return."
          },
          "sort": {
            "type": "string",
            "enum": [
              "volume_desc",
              "liquidity_desc",
              "newest",
              "ending_soon"
            ],
            "default": "volume_desc",
            "description": "Sort order for returned markets."
          },
          "includeRules": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include capped market rule or description text."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "venue",
          "activeOnly",
          "closed",
          "category",
          "limit",
          "sort",
          "includeRules"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "venue",
            "type": "string",
            "required": false,
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed.",
            "constraints": {
              "enum": [
                "managed",
                "polymarket"
              ],
              "default": "managed"
            }
          },
          {
            "name": "activeOnly",
            "type": "boolean",
            "required": false,
            "description": "When true, return currently active, unresolved markets only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "closed",
            "type": "boolean",
            "required": false,
            "description": "Set true only when historical or resolved markets are acceptable.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized market rows to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned markets.",
            "constraints": {
              "enum": [
                "volume_desc",
                "liquidity_desc",
                "newest",
                "ending_soon"
              ],
              "default": "volume_desc"
            }
          },
          {
            "name": "includeRules",
            "type": "boolean",
            "required": false,
            "description": "Set true to include capped market rule or description text.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "AI agents",
          "category": "technology",
          "activeOnly": true,
          "limit": 10,
          "sort": "volume_desc",
          "includeRules": false
        }
      },
      "exampleRequest": {
        "query": "AI agents",
        "category": "technology",
        "activeOnly": true,
        "limit": 10,
        "sort": "volume_desc",
        "includeRules": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "marketFeed",
          "count",
          "markets",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the market search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized filters and caps."
          },
          "marketFeed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Provider-neutral feed metadata and public-data boundary."
          },
          "count": {
            "type": "integer",
            "description": "Number of normalized market rows returned."
          },
          "markets": {
            "type": "array",
            "description": "Normalized prediction-market rows. These are read-only market intelligence records, not trading instructions.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable market id."
                },
                "slug": {
                  "type": "string",
                  "description": "Stable market slug when available."
                },
                "title": {
                  "type": "string",
                  "description": "Market question or title."
                },
                "url": {
                  "type": "string",
                  "description": "Public market URL when available."
                },
                "venue": {
                  "type": "string",
                  "description": "Normalized venue label."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether the market is active."
                },
                "closed": {
                  "type": "boolean",
                  "description": "Whether the market is closed or resolved."
                },
                "endsAt": {
                  "type": "string",
                  "description": "Market end timestamp when available."
                },
                "volume": {
                  "type": "number",
                  "description": "Reported all-time volume when available."
                },
                "liquidity": {
                  "type": "number",
                  "description": "Reported liquidity when available."
                },
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Outcome labels and implied prices when available."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalized category, event, or tag labels."
                },
                "rules": {
                  "type": "string",
                  "description": "Optional capped rules/description text when includeRules is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "marketFeed": {
          "type": "managed-prediction-market-feed",
          "readOnly": true,
          "noTradeExecution": true
        },
        "count": 1,
        "markets": [
          {
            "title": "Will example event happen?",
            "outcomes": [
              {
                "label": "Yes",
                "price": 0.42
              },
              {
                "label": "No",
                "price": 0.58
              }
            ],
            "volume": 125000,
            "liquidity": 32000
          }
        ]
      },
      "configured": false
    },
    {
      "id": "prediction-market-listings",
      "resource": "https://agentbodega.store/api/prediction-markets/listings",
      "type": "http",
      "method": "POST",
      "serviceName": "Prediction Market Listings",
      "description": "Return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.",
      "longDescription": "Purpose: Return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.\nBest use: Use this when an agent needs return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, venue, activeOnly, closed, category, limit, sort, includeRules.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against market title, slug, description, outcomes, and category labels. Constraints: max length: 160.\n- venue (optional, string): Venue selector. Use managed for AgentBodega's normalized market feed. Constraints: accepted values: \"managed\", \"polymarket\"; default: \"managed\".\n- activeOnly (optional, boolean): When true, return currently active, unresolved markets only. Constraints: default: true.\n- closed (optional, boolean): Set true only when historical or resolved markets are acceptable. Constraints: default: false.\n- category (optional, string): Optional category, event, or tag filter when the caller wants a narrower market family. Constraints: max length: 80.\n- limit (optional, integer): Maximum normalized market rows to return. Constraints: default: 10; min: 1; max: 25.\n- sort (optional, string): Sort order for returned markets. Constraints: accepted values: \"volume_desc\", \"liquidity_desc\", \"newest\", \"ending_soon\"; default: \"volume_desc\".\n- includeRules (optional, boolean): Set true to include capped market rule or description text. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"activeOnly\": true,\n  \"closed\": false,\n  \"limit\": 10,\n  \"sort\": \"volume_desc\",\n  \"includeRules\": false\n}\n```",
      "category": "prediction-markets",
      "kind": "market-listings-tool",
      "departmentId": "prediction-markets",
      "department": "Prediction Markets",
      "aisleId": "market-search",
      "aisle": "Market Search",
      "shelfId": "active-listings",
      "shelf": "Active Listings",
      "offeringId": "prediction-market-listings",
      "offering": "Prediction Market Listings",
      "pathIds": [
        "prediction-markets",
        "market-search",
        "active-listings",
        "prediction-market-listings"
      ],
      "pathLabels": [
        "Prediction Markets",
        "Market Search",
        "Active Listings",
        "Prediction Market Listings"
      ],
      "taxonomyPath": "prediction-markets.market-search.active-listings.prediction-market-listings",
      "layout": {
        "department": {
          "id": "prediction-markets",
          "name": "Prediction Markets"
        },
        "aisle": {
          "id": "market-search",
          "name": "Market Search"
        },
        "shelf": {
          "id": "active-listings",
          "name": "Active Listings"
        },
        "offering": {
          "id": "prediction-market-listings",
          "name": "Prediction Market Listings"
        },
        "pathIds": [
          "prediction-markets",
          "market-search",
          "active-listings",
          "prediction-market-listings"
        ],
        "pathLabels": [
          "Prediction Markets",
          "Market Search",
          "Active Listings",
          "Prediction Market Listings"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "prediction-markets",
        "market-listings",
        "markets",
        "events",
        "probabilities",
        "public-data",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/prediction-markets/listings",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/prediction-markets/listings",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels."
          },
          "venue": {
            "type": "string",
            "enum": [
              "managed",
              "polymarket"
            ],
            "default": "managed",
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed."
          },
          "activeOnly": {
            "type": "boolean",
            "default": true,
            "description": "When true, return currently active, unresolved markets only."
          },
          "closed": {
            "type": "boolean",
            "default": false,
            "description": "Set true only when historical or resolved markets are acceptable."
          },
          "category": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "default": 10,
            "description": "Maximum normalized market rows to return."
          },
          "sort": {
            "type": "string",
            "enum": [
              "volume_desc",
              "liquidity_desc",
              "newest",
              "ending_soon"
            ],
            "default": "volume_desc",
            "description": "Sort order for returned markets."
          },
          "includeRules": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include capped market rule or description text."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "venue",
          "activeOnly",
          "closed",
          "category",
          "limit",
          "sort",
          "includeRules"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "venue",
            "type": "string",
            "required": false,
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed.",
            "constraints": {
              "enum": [
                "managed",
                "polymarket"
              ],
              "default": "managed"
            }
          },
          {
            "name": "activeOnly",
            "type": "boolean",
            "required": false,
            "description": "When true, return currently active, unresolved markets only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "closed",
            "type": "boolean",
            "required": false,
            "description": "Set true only when historical or resolved markets are acceptable.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized market rows to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned markets.",
            "constraints": {
              "enum": [
                "volume_desc",
                "liquidity_desc",
                "newest",
                "ending_soon"
              ],
              "default": "volume_desc"
            }
          },
          {
            "name": "includeRules",
            "type": "boolean",
            "required": false,
            "description": "Set true to include capped market rule or description text.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "activeOnly": true,
          "closed": false,
          "limit": 10,
          "sort": "volume_desc",
          "includeRules": false
        }
      },
      "exampleRequest": {
        "activeOnly": true,
        "closed": false,
        "limit": 10,
        "sort": "volume_desc",
        "includeRules": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "marketFeed",
          "count",
          "markets",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the market search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized filters and caps."
          },
          "marketFeed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Provider-neutral feed metadata and public-data boundary."
          },
          "count": {
            "type": "integer",
            "description": "Number of normalized market rows returned."
          },
          "markets": {
            "type": "array",
            "description": "Normalized prediction-market rows. These are read-only market intelligence records, not trading instructions.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable market id."
                },
                "slug": {
                  "type": "string",
                  "description": "Stable market slug when available."
                },
                "title": {
                  "type": "string",
                  "description": "Market question or title."
                },
                "url": {
                  "type": "string",
                  "description": "Public market URL when available."
                },
                "venue": {
                  "type": "string",
                  "description": "Normalized venue label."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether the market is active."
                },
                "closed": {
                  "type": "boolean",
                  "description": "Whether the market is closed or resolved."
                },
                "endsAt": {
                  "type": "string",
                  "description": "Market end timestamp when available."
                },
                "volume": {
                  "type": "number",
                  "description": "Reported all-time volume when available."
                },
                "liquidity": {
                  "type": "number",
                  "description": "Reported liquidity when available."
                },
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Outcome labels and implied prices when available."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalized category, event, or tag labels."
                },
                "rules": {
                  "type": "string",
                  "description": "Optional capped rules/description text when includeRules is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "marketFeed": {
          "type": "managed-prediction-market-feed",
          "readOnly": true,
          "noTradeExecution": true
        },
        "count": 1,
        "markets": [
          {
            "title": "Top active example market",
            "outcomes": [
              {
                "label": "Yes",
                "price": 0.61
              },
              {
                "label": "No",
                "price": 0.39
              }
            ],
            "volume": 250000,
            "liquidity": 48000
          }
        ]
      },
      "configured": false
    },
    {
      "id": "x-user-profile",
      "resource": "https://agentbodega.store/api/social-media/x/user-profile",
      "type": "http",
      "method": "POST",
      "serviceName": "X User Profile Lookup",
      "description": "Look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.",
      "longDescription": "Purpose: Look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.\nBest use: Use this when an agent needs look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: username.\nOptional fields: none.\n\nAccepted fields:\n- username (required, string): Public username or profile URL. Leading @ is accepted and normalized. Constraints: min length: 1; max length: 80.\n\nExample request body:\n```json\n{\n  \"username\": \"OpenAI\"\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "profiles",
      "shelf": "Profiles",
      "offeringId": "x-user-profile",
      "offering": "X User Profile Lookup",
      "pathIds": [
        "social-media",
        "x-twitter",
        "profiles",
        "x-user-profile"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Profiles",
        "X User Profile Lookup"
      ],
      "taxonomyPath": "social-media.x-twitter.profiles.x-user-profile",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "profiles",
          "name": "Profiles"
        },
        "offering": {
          "id": "x-user-profile",
          "name": "X User Profile Lookup"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "profiles",
          "x-user-profile"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Profiles",
          "X User Profile Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "profile",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/user-profile",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/user-profile",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Public username or profile URL. Leading @ is accepted and normalized."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "username"
        ],
        "optional": [],
        "fields": [
          {
            "name": "username",
            "type": "string",
            "required": true,
            "description": "Public username or profile URL. Leading @ is accepted and normalized.",
            "constraints": {
              "minLength": 1,
              "maxLength": 80
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "username": "OpenAI"
        }
      },
      "exampleRequest": {
        "username": "OpenAI"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-user-profile",
          "name": "X User Profile Lookup",
          "department": "Social Media"
        },
        "requested": {
          "username": "OpenAI"
        },
        "profile": {
          "id": "44196397",
          "username": "OpenAI",
          "name": "OpenAI",
          "verified": true,
          "metrics": {
            "followers": 1000000,
            "following": 0,
            "posts": 1000
          }
        }
      },
      "configured": false
    },
    {
      "id": "x-tweet",
      "resource": "https://agentbodega.store/api/social-media/x/tweet",
      "type": "http",
      "method": "POST",
      "serviceName": "X Post Lookup",
      "description": "Look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.",
      "longDescription": "Purpose: Look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.\nBest use: Use this when an agent needs look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: tweetId, tweetUrl.\n\nAccepted fields:\n- tweetId (optional, string): Numeric public post id. Required unless tweetUrl is supplied.\n- tweetUrl (optional, string): Public post URL. Required unless tweetId is supplied. Constraints: format: uri; max length: 300.\n\nExample request body:\n```json\n{\n  \"tweetId\": \"20\"\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "posts",
      "shelf": "Posts",
      "offeringId": "x-tweet",
      "offering": "X Post Lookup",
      "pathIds": [
        "social-media",
        "x-twitter",
        "posts",
        "x-tweet"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Posts",
        "X Post Lookup"
      ],
      "taxonomyPath": "social-media.x-twitter.posts.x-tweet",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "posts",
          "name": "Posts"
        },
        "offering": {
          "id": "x-tweet",
          "name": "X Post Lookup"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "posts",
          "x-tweet"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Posts",
          "X Post Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "tweet",
        "post",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/tweet",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/tweet",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "anyOf": [
          {
            "required": [
              "tweetId"
            ]
          },
          {
            "required": [
              "tweetUrl"
            ]
          }
        ],
        "properties": {
          "tweetId": {
            "type": "string",
            "pattern": "^[0-9]{1,30}$",
            "description": "Numeric public post id. Required unless tweetUrl is supplied."
          },
          "tweetUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 300,
            "description": "Public post URL. Required unless tweetId is supplied."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "tweetId",
          "tweetUrl"
        ],
        "fields": [
          {
            "name": "tweetId",
            "type": "string",
            "required": false,
            "description": "Numeric public post id. Required unless tweetUrl is supplied."
          },
          {
            "name": "tweetUrl",
            "type": "string",
            "required": false,
            "description": "Public post URL. Required unless tweetId is supplied.",
            "constraints": {
              "format": "uri",
              "maxLength": 300
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "tweetId": "20"
        }
      },
      "exampleRequest": {
        "tweetId": "20"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-tweet",
          "name": "X Post Lookup",
          "department": "Social Media"
        },
        "requested": {
          "tweetId": "20"
        },
        "tweet": {
          "id": "20",
          "text": "Normalized public post text",
          "author": {
            "username": "jack"
          },
          "metrics": {
            "likes": 0,
            "reposts": 0,
            "replies": 0
          }
        }
      },
      "configured": false
    },
    {
      "id": "x-user-timeline",
      "resource": "https://agentbodega.store/api/social-media/x/user-timeline",
      "type": "http",
      "method": "POST",
      "serviceName": "X User Timeline",
      "description": "Return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.",
      "longDescription": "Purpose: Return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.\nBest use: Use this when an agent needs return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: username.\nOptional fields: maxResults.\n\nAccepted fields:\n- username (required, string): Public username or profile URL. Leading @ is accepted and normalized. Constraints: min length: 1; max length: 80.\n- maxResults (optional, integer): Maximum recent posts to return. Constraints: default: 20; min: 1; max: 100.\n\nExample request body:\n```json\n{\n  \"username\": \"OpenAI\",\n  \"maxResults\": 5\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "timelines",
      "shelf": "Timelines",
      "offeringId": "x-user-timeline",
      "offering": "X User Timeline",
      "pathIds": [
        "social-media",
        "x-twitter",
        "timelines",
        "x-user-timeline"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Timelines",
        "X User Timeline"
      ],
      "taxonomyPath": "social-media.x-twitter.timelines.x-user-timeline",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "timelines",
          "name": "Timelines"
        },
        "offering": {
          "id": "x-user-timeline",
          "name": "X User Timeline"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "timelines",
          "x-user-timeline"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Timelines",
          "X User Timeline"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "timeline",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/user-timeline",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/user-timeline",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Public username or profile URL. Leading @ is accepted and normalized."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "description": "Maximum recent posts to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "username"
        ],
        "optional": [
          "maxResults"
        ],
        "fields": [
          {
            "name": "username",
            "type": "string",
            "required": true,
            "description": "Public username or profile URL. Leading @ is accepted and normalized.",
            "constraints": {
              "minLength": 1,
              "maxLength": 80
            }
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum recent posts to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "username": "OpenAI",
          "maxResults": 5
        }
      },
      "exampleRequest": {
        "username": "OpenAI",
        "maxResults": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-user-timeline",
          "name": "X User Timeline",
          "department": "Social Media"
        },
        "requested": {
          "username": "OpenAI",
          "maxResults": 5
        },
        "result_count": 5,
        "results": [
          {
            "id": "1110302988",
            "text": "Normalized public post text",
            "author": {
              "username": "OpenAI"
            },
            "metrics": {
              "likes": 10,
              "reposts": 2,
              "replies": 1
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "x-tweet-search",
      "resource": "https://agentbodega.store/api/social-media/x/tweet-search",
      "type": "http",
      "method": "POST",
      "serviceName": "X Post Search",
      "description": "Search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.",
      "longDescription": "Purpose: Search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.\nBest use: Use this when an agent needs search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.\nPrice: $0.06 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, words, phrase, anyWords, noneWords, hashtags, from, to, mentioning, minReplies, minLikes, minReposts, since, until, maxResults.\n\nAccepted fields:\n- query (optional, string): Raw X/Twitter search query. If supplied, structured filter fields are ignored. Constraints: max length: 500.\n- words (optional, string): All words to include. Constraints: max length: 160.\n- phrase (optional, string): Exact phrase to include. Constraints: max length: 160.\n- anyWords (optional, array): Any of these words may match. Constraints: max items: 12.\n- noneWords (optional, array): Words to exclude. Constraints: max items: 12.\n- hashtags (optional, array): Hashtags to include, with or without #. Constraints: max items: 12.\n- from (optional, string): Only posts from this username. Constraints: max length: 80.\n- to (optional, string): Only replies to this username. Constraints: max length: 80.\n- mentioning (optional, string): Only posts mentioning this username. Constraints: max length: 80.\n- minReplies (optional, integer): Minimum reply count. Constraints: min: 0.\n- minLikes (optional, integer): Minimum like count. Constraints: min: 0.\n- minReposts (optional, integer): Minimum repost count. Constraints: min: 0.\n- since (optional, string): Start date in YYYY-MM-DD.\n- until (optional, string): End date in YYYY-MM-DD.\n- maxResults (optional, integer): Maximum posts to return. Search is capped at 20 per call. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"from\": \"OpenAI\",\n  \"words\": \"agent\",\n  \"minLikes\": 10,\n  \"maxResults\": 5\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "search",
      "shelf": "Search",
      "offeringId": "x-tweet-search",
      "offering": "X Post Search",
      "pathIds": [
        "social-media",
        "x-twitter",
        "search",
        "x-tweet-search"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Search",
        "X Post Search"
      ],
      "taxonomyPath": "social-media.x-twitter.search.x-tweet-search",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "search",
          "name": "Search"
        },
        "offering": {
          "id": "x-tweet-search",
          "name": "X Post Search"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "search",
          "x-tweet-search"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Search",
          "X Post Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "search",
        "social-listening",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/tweet-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.06"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/tweet-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "anyOf": [
          {
            "required": [
              "query"
            ]
          },
          {
            "required": [
              "words"
            ]
          },
          {
            "required": [
              "phrase"
            ]
          },
          {
            "required": [
              "hashtags"
            ]
          },
          {
            "required": [
              "from"
            ]
          }
        ],
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 500,
            "description": "Raw X/Twitter search query. If supplied, structured filter fields are ignored."
          },
          "words": {
            "type": "string",
            "maxLength": 160,
            "description": "All words to include."
          },
          "phrase": {
            "type": "string",
            "maxLength": 160,
            "description": "Exact phrase to include."
          },
          "anyWords": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "Any Words item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Any of these words may match."
          },
          "noneWords": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "None Words item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Words to exclude."
          },
          "hashtags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "Hashtags item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Hashtags to include, with or without #."
          },
          "from": {
            "type": "string",
            "maxLength": 80,
            "description": "Only posts from this username."
          },
          "to": {
            "type": "string",
            "maxLength": 80,
            "description": "Only replies to this username."
          },
          "mentioning": {
            "type": "string",
            "maxLength": 80,
            "description": "Only posts mentioning this username."
          },
          "minReplies": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum reply count."
          },
          "minLikes": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum like count."
          },
          "minReposts": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum repost count."
          },
          "since": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "Start date in YYYY-MM-DD."
          },
          "until": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "End date in YYYY-MM-DD."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum posts to return. Search is capped at 20 per call."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "words",
          "phrase",
          "anyWords",
          "noneWords",
          "hashtags",
          "from",
          "to",
          "mentioning",
          "minReplies",
          "minLikes",
          "minReposts",
          "since",
          "until",
          "maxResults"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Raw X/Twitter search query. If supplied, structured filter fields are ignored.",
            "constraints": {
              "maxLength": 500
            }
          },
          {
            "name": "words",
            "type": "string",
            "required": false,
            "description": "All words to include.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "phrase",
            "type": "string",
            "required": false,
            "description": "Exact phrase to include.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "anyWords",
            "type": "array",
            "required": false,
            "description": "Any of these words may match.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "noneWords",
            "type": "array",
            "required": false,
            "description": "Words to exclude.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "hashtags",
            "type": "array",
            "required": false,
            "description": "Hashtags to include, with or without #.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "type": "string",
            "required": false,
            "description": "Only posts from this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "to",
            "type": "string",
            "required": false,
            "description": "Only replies to this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "mentioning",
            "type": "string",
            "required": false,
            "description": "Only posts mentioning this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "minReplies",
            "type": "integer",
            "required": false,
            "description": "Minimum reply count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minLikes",
            "type": "integer",
            "required": false,
            "description": "Minimum like count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minReposts",
            "type": "integer",
            "required": false,
            "description": "Minimum repost count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "since",
            "type": "string",
            "required": false,
            "description": "Start date in YYYY-MM-DD."
          },
          {
            "name": "until",
            "type": "string",
            "required": false,
            "description": "End date in YYYY-MM-DD."
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum posts to return. Search is capped at 20 per call.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "from": "OpenAI",
          "words": "agent",
          "minLikes": 10,
          "maxResults": 5
        }
      },
      "exampleRequest": {
        "from": "OpenAI",
        "words": "agent",
        "minLikes": 10,
        "maxResults": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-tweet-search",
          "name": "X Post Search",
          "department": "Social Media"
        },
        "requested": {
          "query": "agent from:OpenAI min_faves:10",
          "maxResults": 5
        },
        "result_count": 5,
        "results": [
          {
            "id": "1110302988",
            "text": "Normalized public post text",
            "author": {
              "username": "OpenAI"
            },
            "metrics": {
              "likes": 10,
              "reposts": 2,
              "replies": 1
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "outdoor-recreation-availability",
      "resource": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
      "type": "http",
      "method": "POST",
      "serviceName": "Outdoor Recreation Availability Check",
      "description": "Check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.",
      "longDescription": "Purpose: Check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.\nBest use: Use this when an agent needs check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: resource, startDate, endDate.\nOptional fields: entityId, entityType, state, isLottery, filters, limit, includeMetadata, proxiesSx.\n\nAccepted fields:\n- resource (required, string): Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources.\n- entityId (optional, string): Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied.\n- entityType (optional, string): Optional known resource type. URLs usually imply this automatically. Constraints: accepted values: \"campground\", \"campsite\", \"permit\", \"timedentry\", \"timedentry_tour\".\n- state (optional, string): Optional state filter for name resolution, such as CA or California.\n- startDate (required, string): Start date in YYYY-MM-DD. For campgrounds this is the check-in date. Constraints: format: date.\n- endDate (required, string): End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout. Constraints: format: date.\n- isLottery (optional, boolean): For permits, request lottery quota/application state instead of post-draw/walk-up availability. Constraints: default: false.\n- filters (optional, object): Filters object for configuring Outdoor Recreation Availability Check. Object accepts: groupSize, siteType, equipment, rvLengthFt, electric, accessibility, petsAllowed, loop, availableOnly.\n- limit (optional, integer): Maximum matching sites, divisions, or slots to return. Constraints: default: 20; min: 1; max: 50.\n- includeMetadata (optional, boolean): For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available. Constraints: default: true.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"resource\": \"Upper Pines Campground\",\n  \"state\": \"CA\",\n  \"startDate\": \"2026-06-15\",\n  \"endDate\": \"2026-06-19\",\n  \"filters\": {\n    \"siteType\": \"TENT ONLY\",\n    \"groupSize\": 4,\n    \"availableOnly\": true\n  },\n  \"limit\": 5\n}\n```",
      "category": "public-data",
      "kind": "data-job",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "outdoor-recreation",
      "aisle": "Outdoor Recreation",
      "shelfId": "outdoor-recreation",
      "shelf": "Outdoor Recreation",
      "offeringId": "outdoor-recreation-availability",
      "offering": "Outdoor Recreation Availability Check",
      "pathIds": [
        "public-data",
        "outdoor-recreation",
        "outdoor-recreation",
        "outdoor-recreation-availability"
      ],
      "pathLabels": [
        "Public Data",
        "Outdoor Recreation",
        "Outdoor Recreation",
        "Outdoor Recreation Availability Check"
      ],
      "taxonomyPath": "public-data.outdoor-recreation.outdoor-recreation.outdoor-recreation-availability",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "outdoor-recreation",
          "name": "Outdoor Recreation"
        },
        "shelf": {
          "id": "outdoor-recreation",
          "name": "Outdoor Recreation"
        },
        "offering": {
          "id": "outdoor-recreation-availability",
          "name": "Outdoor Recreation Availability Check"
        },
        "pathIds": [
          "public-data",
          "outdoor-recreation",
          "outdoor-recreation",
          "outdoor-recreation-availability"
        ],
        "pathLabels": [
          "Public Data",
          "Outdoor Recreation",
          "Outdoor Recreation",
          "Outdoor Recreation Availability Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "camping",
        "permits",
        "public-data",
        "travel",
        "availability",
        "parks"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "resource",
          "startDate",
          "endDate"
        ],
        "properties": {
          "resource": {
            "type": "string",
            "description": "Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources."
          },
          "entityId": {
            "type": "string",
            "description": "Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied."
          },
          "entityType": {
            "type": "string",
            "enum": [
              "campground",
              "campsite",
              "permit",
              "timedentry",
              "timedentry_tour"
            ],
            "description": "Optional known resource type. URLs usually imply this automatically."
          },
          "state": {
            "type": "string",
            "description": "Optional state filter for name resolution, such as CA or California."
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "description": "Start date in YYYY-MM-DD. For campgrounds this is the check-in date."
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "description": "End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout."
          },
          "isLottery": {
            "type": "boolean",
            "default": false,
            "description": "For permits, request lottery quota/application state instead of post-draw/walk-up availability."
          },
          "filters": {
            "type": "object",
            "properties": {
              "groupSize": {
                "type": "integer",
                "minimum": 1,
                "description": "Group Size numeric value for Outdoor Recreation Availability Check. Constraints: min: 1."
              },
              "siteType": {
                "type": "string",
                "description": "Campground site type filter, such as tent only, RV, group, or standard."
              },
              "equipment": {
                "type": "string",
                "description": "Equipment name to match in permitted equipment, such as RV or tent."
              },
              "rvLengthFt": {
                "type": "integer",
                "minimum": 1,
                "description": "Rv Length Ft numeric value for Outdoor Recreation Availability Check. Constraints: min: 1."
              },
              "electric": {
                "type": "boolean",
                "description": "Set true to enable electric behavior for Outdoor Recreation Availability Check."
              },
              "accessibility": {
                "type": "boolean",
                "description": "Set true to enable accessibility behavior for Outdoor Recreation Availability Check."
              },
              "petsAllowed": {
                "type": "boolean",
                "description": "Set true to enable pets allowed behavior for Outdoor Recreation Availability Check."
              },
              "loop": {
                "type": "string",
                "description": "Loop value for Outdoor Recreation Availability Check."
              },
              "availableOnly": {
                "type": "boolean",
                "default": true,
                "description": "Set true to enable available only behavior for Outdoor Recreation Availability Check. Constraints: default: true."
              }
            },
            "additionalProperties": false,
            "description": "Filters object for configuring Outdoor Recreation Availability Check."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Maximum matching sites, divisions, or slots to return."
          },
          "includeMetadata": {
            "type": "boolean",
            "default": true,
            "description": "For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "resource",
          "startDate",
          "endDate"
        ],
        "optional": [
          "entityId",
          "entityType",
          "state",
          "isLottery",
          "filters",
          "limit",
          "includeMetadata",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "resource",
            "type": "string",
            "required": true,
            "description": "Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources."
          },
          {
            "name": "entityId",
            "type": "string",
            "required": false,
            "description": "Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied."
          },
          {
            "name": "entityType",
            "type": "string",
            "required": false,
            "description": "Optional known resource type. URLs usually imply this automatically.",
            "constraints": {
              "enum": [
                "campground",
                "campsite",
                "permit",
                "timedentry",
                "timedentry_tour"
              ]
            }
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Optional state filter for name resolution, such as CA or California."
          },
          {
            "name": "startDate",
            "type": "string",
            "required": true,
            "description": "Start date in YYYY-MM-DD. For campgrounds this is the check-in date.",
            "constraints": {
              "format": "date"
            }
          },
          {
            "name": "endDate",
            "type": "string",
            "required": true,
            "description": "End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout.",
            "constraints": {
              "format": "date"
            }
          },
          {
            "name": "isLottery",
            "type": "boolean",
            "required": false,
            "description": "For permits, request lottery quota/application state instead of post-draw/walk-up availability.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "filters",
            "type": "object",
            "required": false,
            "description": "Filters object for configuring Outdoor Recreation Availability Check.",
            "fields": [
              {
                "name": "groupSize",
                "type": "integer",
                "required": false,
                "description": "Group Size numeric value for Outdoor Recreation Availability Check. Constraints: min: 1.",
                "constraints": {
                  "minimum": 1
                }
              },
              {
                "name": "siteType",
                "type": "string",
                "required": false,
                "description": "Campground site type filter, such as tent only, RV, group, or standard."
              },
              {
                "name": "equipment",
                "type": "string",
                "required": false,
                "description": "Equipment name to match in permitted equipment, such as RV or tent."
              },
              {
                "name": "rvLengthFt",
                "type": "integer",
                "required": false,
                "description": "Rv Length Ft numeric value for Outdoor Recreation Availability Check. Constraints: min: 1.",
                "constraints": {
                  "minimum": 1
                }
              },
              {
                "name": "electric",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable electric behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "accessibility",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable accessibility behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "petsAllowed",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable pets allowed behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "loop",
                "type": "string",
                "required": false,
                "description": "Loop value for Outdoor Recreation Availability Check."
              },
              {
                "name": "availableOnly",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable available only behavior for Outdoor Recreation Availability Check. Constraints: default: true.",
                "constraints": {
                  "default": true
                }
              }
            ]
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum matching sites, divisions, or slots to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "includeMetadata",
            "type": "boolean",
            "required": false,
            "description": "For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "resource": "Upper Pines Campground",
          "state": "CA",
          "startDate": "2026-06-15",
          "endDate": "2026-06-19",
          "filters": {
            "siteType": "TENT ONLY",
            "groupSize": 4,
            "availableOnly": true
          },
          "limit": 5
        }
      },
      "exampleRequest": {
        "resource": "Upper Pines Campground",
        "state": "CA",
        "startDate": "2026-06-15",
        "endDate": "2026-06-19",
        "filters": {
          "siteType": "TENT ONLY",
          "groupSize": 4,
          "availableOnly": true
        },
        "limit": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "kind",
          "requested",
          "resolved",
          "checkedAt"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "campground",
              "campsite",
              "permit",
              "timedentry",
              "timedentry_tour"
            ]
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "resolved": {
            "type": "object",
            "additionalProperties": true
          },
          "sites": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "divisions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "slots": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "kind": "campground",
        "resolved": {
          "entityId": "232447",
          "entityType": "campground",
          "name": "Upper Pines Campground",
          "state": "CA"
        },
        "dateRange": {
          "checkin": "2026-06-15",
          "checkout": "2026-06-19",
          "nights": 4
        },
        "sites": [
          {
            "campsite_id": "98",
            "site_number": "040",
            "loop": "Upper Pines",
            "campsite_type": "TENT ONLY NONELECTRIC",
            "max_num_people": 6,
            "pets_allowed": "Domestic",
            "availability": {
              "2026-06-15": "Available",
              "2026-06-16": "Available",
              "2026-06-17": "Reserved",
              "2026-06-18": "Available"
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "news-headline-search",
      "resource": "https://agentbodega.store/api/public-data/news-headlines/search",
      "type": "http",
      "method": "POST",
      "serviceName": "News Headline Search",
      "description": "Search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.",
      "longDescription": "Purpose: Search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.\nBest use: Use this when an agent needs search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: topic, publisher, query, hours, limit, includeContent, minSentiment, maxSentiment, sort.\n\nAccepted fields:\n- topic (optional, string): Optional news topic filter. Use all for the full managed index. Constraints: accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\"; default: \"all\".\n- publisher (optional, string): Optional publisher/feed id filter when the caller already knows the feed label to narrow. Constraints: max length: 80.\n- query (optional, string): Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords. Constraints: max length: 160.\n- hours (optional, integer): Lookback window in hours. Defaults to the last 24 hours and is capped at 24. Constraints: default: 24; min: 1; max: 24.\n- limit (optional, integer): Maximum headline rows to return after filtering and sorting. Constraints: default: 10; min: 1; max: 50.\n- includeContent (optional, boolean): Set true to include a capped cleaned content excerpt when available. Constraints: default: false.\n- minSentiment (optional, number): Optional lower bound for compound sentiment from -1 to 1. Constraints: min: -1; max: 1.\n- maxSentiment (optional, number): Optional upper bound for compound sentiment from -1 to 1. Constraints: min: -1; max: 1.\n- sort (optional, string): Sort order for returned headlines. Constraints: accepted values: \"published_desc\", \"published_asc\", \"sentiment_desc\", \"sentiment_asc\"; default: \"published_desc\".\n\nExample request body:\n```json\n{\n  \"topic\": \"tech\",\n  \"query\": \"ai\",\n  \"hours\": 6,\n  \"limit\": 10,\n  \"sort\": \"published_desc\",\n  \"includeContent\": false\n}\n```",
      "category": "public-data",
      "kind": "news-search-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "headlines",
      "shelf": "Headlines",
      "offeringId": "news-headline-search",
      "offering": "News Headline Search",
      "pathIds": [
        "public-data",
        "news",
        "headlines",
        "news-headline-search"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Headlines",
        "News Headline Search"
      ],
      "taxonomyPath": "public-data.news.headlines.news-headline-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "headlines",
          "name": "Headlines"
        },
        "offering": {
          "id": "news-headline-search",
          "name": "News Headline Search"
        },
        "pathIds": [
          "public-data",
          "news",
          "headlines",
          "news-headline-search"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Headlines",
          "News Headline Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "headlines",
        "current-events",
        "topic-filter",
        "sentiment",
        "publisher-links",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news-headlines/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news-headlines/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "enum": [
              "all",
              "tech",
              "news",
              "business",
              "science",
              "gaming",
              "culture",
              "politics",
              "sports"
            ],
            "default": "all",
            "description": "Optional news topic filter. Use all for the full managed index."
          },
          "publisher": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional publisher/feed id filter when the caller already knows the feed label to narrow."
          },
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 24,
            "description": "Lookback window in hours. Defaults to the last 24 hours and is capped at 24."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "Maximum headline rows to return after filtering and sorting."
          },
          "includeContent": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include a capped cleaned content excerpt when available."
          },
          "minSentiment": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Optional lower bound for compound sentiment from -1 to 1."
          },
          "maxSentiment": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Optional upper bound for compound sentiment from -1 to 1."
          },
          "sort": {
            "type": "string",
            "enum": [
              "published_desc",
              "published_asc",
              "sentiment_desc",
              "sentiment_asc"
            ],
            "default": "published_desc",
            "description": "Sort order for returned headlines."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "topic",
          "publisher",
          "query",
          "hours",
          "limit",
          "includeContent",
          "minSentiment",
          "maxSentiment",
          "sort"
        ],
        "fields": [
          {
            "name": "topic",
            "type": "string",
            "required": false,
            "description": "Optional news topic filter. Use all for the full managed index.",
            "constraints": {
              "enum": [
                "all",
                "tech",
                "news",
                "business",
                "science",
                "gaming",
                "culture",
                "politics",
                "sports"
              ],
              "default": "all"
            }
          },
          {
            "name": "publisher",
            "type": "string",
            "required": false,
            "description": "Optional publisher/feed id filter when the caller already knows the feed label to narrow.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Lookback window in hours. Defaults to the last 24 hours and is capped at 24.",
            "constraints": {
              "default": 24,
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum headline rows to return after filtering and sorting.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "includeContent",
            "type": "boolean",
            "required": false,
            "description": "Set true to include a capped cleaned content excerpt when available.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "minSentiment",
            "type": "number",
            "required": false,
            "description": "Optional lower bound for compound sentiment from -1 to 1.",
            "constraints": {
              "minimum": -1,
              "maximum": 1
            }
          },
          {
            "name": "maxSentiment",
            "type": "number",
            "required": false,
            "description": "Optional upper bound for compound sentiment from -1 to 1.",
            "constraints": {
              "minimum": -1,
              "maximum": 1
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned headlines.",
            "constraints": {
              "enum": [
                "published_desc",
                "published_asc",
                "sentiment_desc",
                "sentiment_asc"
              ],
              "default": "published_desc"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "topic": "tech",
          "query": "ai",
          "hours": 6,
          "limit": 10,
          "sort": "published_desc",
          "includeContent": false
        }
      },
      "exampleRequest": {
        "topic": "tech",
        "query": "ai",
        "hours": 6,
        "limit": 10,
        "sort": "published_desc",
        "includeContent": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "feed",
          "count",
          "headlines",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when headline search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "feed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Whitelabeled managed index metadata; backend provider URLs are not disclosed."
          },
          "count": {
            "type": "integer",
            "description": "Number of headline rows returned."
          },
          "headlines": {
            "type": "array",
            "description": "Normalized headline rows.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable upstream row id or deterministic fallback."
                },
                "title": {
                  "type": "string",
                  "description": "Headline title."
                },
                "description": {
                  "type": "string",
                  "description": "Short article description or summary."
                },
                "url": {
                  "type": "string",
                  "description": "Publisher article URL."
                },
                "topic": {
                  "type": "string",
                  "description": "Assigned topic bucket."
                },
                "publisher": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Publisher/feed label when available."
                },
                "publishedAt": {
                  "type": "string",
                  "description": "Article publish timestamp when available."
                },
                "insertedAt": {
                  "type": "string",
                  "description": "Index insertion timestamp when available."
                },
                "age": {
                  "type": "string",
                  "description": "Short relative age label from the managed index."
                },
                "keywords": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Keyword labels when available."
                },
                "sentiment": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Compound, positive, negative, and neutral sentiment hints when available."
                },
                "contentText": {
                  "type": "string",
                  "description": "Optional capped cleaned content excerpt when includeContent is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for this search."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-headline-search",
          "name": "News Headline Search",
          "department": "Public Data"
        },
        "requested": {
          "topic": "tech",
          "query": "ai",
          "hours": 6,
          "limit": 10,
          "sort": "published_desc",
          "includeContent": false
        },
        "feed": {
          "type": "managed-news-index",
          "windowHours": 6,
          "upstreamDetailsDisclosed": false,
          "storyDedupeApplied": true
        },
        "count": 1,
        "headlines": [
          {
            "id": "headline_example",
            "title": "AI infrastructure startup announces new agent workflow tools",
            "description": "The company described new tools for faster agent research and data retrieval.",
            "url": "https://publisher.example/news/ai-agent-workflow-tools",
            "topic": "tech",
            "publisher": {
              "id": "publisher-example",
              "domain": "publisher.example"
            },
            "publishedAt": "2026-07-07T19:35:14.000Z",
            "insertedAt": "2026-07-07T19:36:00.000Z",
            "age": "24m",
            "keywords": [
              "AI",
              "agents",
              "workflow"
            ],
            "sentiment": {
              "compound": 0.12,
              "positive": 0.18,
              "negative": 0.02,
              "neutral": 0.8
            }
          }
        ],
        "limits": {
          "maxLimit": 50,
          "maxLookbackHours": 24,
          "maxContentChars": 1500
        }
      },
      "configured": false
    },
    {
      "id": "news-briefing-summary",
      "resource": "https://agentbodega.store/api/public-data/news-briefing/summary",
      "type": "http",
      "method": "POST",
      "serviceName": "News Briefing Summary",
      "description": "Return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.",
      "longDescription": "Purpose: Return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.\nBest use: Use this when an agent needs return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, limit.\n\nAccepted fields:\n- query (optional, string): Optional case-insensitive filter matched against briefing titles and summary text. Constraints: max length: 160.\n- limit (optional, integer): Maximum briefing items to return. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"query\": \"technology\",\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "news-briefing-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "briefings",
      "shelf": "Briefings",
      "offeringId": "news-briefing-summary",
      "offering": "News Briefing Summary",
      "pathIds": [
        "public-data",
        "news",
        "briefings",
        "news-briefing-summary"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Briefings",
        "News Briefing Summary"
      ],
      "taxonomyPath": "public-data.news.briefings.news-briefing-summary",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "briefings",
          "name": "Briefings"
        },
        "offering": {
          "id": "news-briefing-summary",
          "name": "News Briefing Summary"
        },
        "pathIds": [
          "public-data",
          "news",
          "briefings",
          "news-briefing-summary"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Briefings",
          "News Briefing Summary"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "briefing",
        "summary",
        "current-events",
        "situational-awareness",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news-briefing/summary",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news-briefing/summary",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional case-insensitive filter matched against briefing titles and summary text."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum briefing items to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "limit"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional case-insensitive filter matched against briefing titles and summary text.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum briefing items to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "technology",
          "limit": 10
        }
      },
      "exampleRequest": {
        "query": "technology",
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "briefing",
          "count",
          "items",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the briefing was parsed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "briefing": {
            "type": "object",
            "additionalProperties": true,
            "description": "Whitelabeled briefing metadata and refresh cadence."
          },
          "count": {
            "type": "integer",
            "description": "Number of briefing items returned."
          },
          "items": {
            "type": "array",
            "description": "Briefing items in source order.",
            "items": {
              "type": "object",
              "required": [
                "rank",
                "title",
                "summary"
              ],
              "properties": {
                "rank": {
                  "type": "integer",
                  "description": "One-based rank in the briefing."
                },
                "title": {
                  "type": "string",
                  "description": "Briefing topic or headline."
                },
                "summary": {
                  "type": "string",
                  "description": "Compact summary of the development."
                }
              },
              "additionalProperties": false
            }
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for this briefing fetch."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-briefing-summary",
          "name": "News Briefing Summary",
          "department": "Public Data"
        },
        "requested": {
          "query": "technology",
          "limit": 10
        },
        "briefing": {
          "window": "rolling_24h",
          "refreshCadence": "multiple-times-daily",
          "upstreamDetailsDisclosed": false
        },
        "count": 1,
        "items": [
          {
            "rank": 1,
            "title": "Technology stocks rebound",
            "summary": "Several technology names recovered after new product announcements and stronger demand commentary."
          }
        ]
      },
      "configured": false
    },
    {
      "id": "news-morning-briefing",
      "resource": "https://agentbodega.store/api/public-data/news/morning-briefing",
      "type": "http",
      "method": "POST",
      "serviceName": "Morning Briefing",
      "description": "Build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.",
      "longDescription": "Purpose: Build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.\nBest use: Use this when an agent needs build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: focus, topics, hours, maxItemsPerSection, includeCitations.\n\nAccepted fields:\n- focus (optional, string): Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name. Constraints: max length: 160.\n- topics (optional, array): Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index. Constraints: max items: 6.\n- hours (optional, integer): Lookback window in hours. Defaults to the last 12 hours and is capped at 24. Constraints: default: 12; min: 1; max: 24.\n- maxItemsPerSection (optional, integer): Maximum normalized headline rows returned in each briefing section. Constraints: default: 4; min: 1; max: 8.\n- includeCitations (optional, boolean): Set false to omit the flattened citation list while keeping URLs on section items. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"focus\": \"ai markets\",\n  \"topics\": [\n    \"news\",\n    \"business\",\n    \"tech\"\n  ],\n  \"hours\": 12,\n  \"maxItemsPerSection\": 4,\n  \"includeCitations\": true\n}\n```",
      "category": "public-data",
      "kind": "news-briefing-bundle",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "briefings",
      "shelf": "Briefings",
      "offeringId": "news-morning-briefing",
      "offering": "Morning Briefing",
      "pathIds": [
        "public-data",
        "news",
        "briefings",
        "news-morning-briefing"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Briefings",
        "Morning Briefing"
      ],
      "taxonomyPath": "public-data.news.briefings.news-morning-briefing",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "briefings",
          "name": "Briefings"
        },
        "offering": {
          "id": "news-morning-briefing",
          "name": "Morning Briefing"
        },
        "pathIds": [
          "public-data",
          "news",
          "briefings",
          "news-morning-briefing"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Briefings",
          "Morning Briefing"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "briefing",
        "morning-briefing",
        "markets",
        "ai",
        "crypto",
        "current-events",
        "citations",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news/morning-briefing",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news/morning-briefing",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "focus": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name."
          },
          "topics": {
            "type": "array",
            "maxItems": 6,
            "items": {
              "type": "string",
              "enum": [
                "all",
                "tech",
                "news",
                "business",
                "science",
                "gaming",
                "culture",
                "politics",
                "sports"
              ],
              "description": "Topics item filter for Morning Briefing. Accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\". Constraints: accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\"."
            },
            "description": "Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 12,
            "description": "Lookback window in hours. Defaults to the last 12 hours and is capped at 24."
          },
          "maxItemsPerSection": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8,
            "default": 4,
            "description": "Maximum normalized headline rows returned in each briefing section."
          },
          "includeCitations": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit the flattened citation list while keeping URLs on section items."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "focus",
          "topics",
          "hours",
          "maxItemsPerSection",
          "includeCitations"
        ],
        "fields": [
          {
            "name": "focus",
            "type": "string",
            "required": false,
            "description": "Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "topics",
            "type": "array",
            "required": false,
            "description": "Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index.",
            "constraints": {
              "maxItems": 6
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Lookback window in hours. Defaults to the last 12 hours and is capped at 24.",
            "constraints": {
              "default": 12,
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "maxItemsPerSection",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized headline rows returned in each briefing section.",
            "constraints": {
              "default": 4,
              "minimum": 1,
              "maximum": 8
            }
          },
          {
            "name": "includeCitations",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit the flattened citation list while keeping URLs on section items.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "focus": "ai markets",
          "topics": [
            "news",
            "business",
            "tech"
          ],
          "hours": 12,
          "maxItemsPerSection": 4,
          "includeCitations": true
        }
      },
      "exampleRequest": {
        "focus": "ai markets",
        "topics": [
          "news",
          "business",
          "tech"
        ],
        "hours": 12,
        "maxItemsPerSection": 4,
        "includeCitations": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "briefing",
          "sections",
          "topStories",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the briefing completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "briefing": {
            "type": "object",
            "additionalProperties": true,
            "description": "High-level bundle summary, ranking/diversity policy, section count, item count, and source-disclosure policy."
          },
          "sections": {
            "type": "array",
            "description": "Briefing sections grouped by agent-relevant intent.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "title",
                "count",
                "items"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable section id."
                },
                "title": {
                  "type": "string",
                  "description": "Human-readable section title."
                },
                "summary": {
                  "type": "string",
                  "description": "One-line summary built from the section's highest-ranked diversified items."
                },
                "count": {
                  "type": "integer",
                  "description": "Number of items in this section."
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Normalized headline rows with publisher article URLs."
                },
                "ranking": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Selection policy used for this section."
                }
              },
              "additionalProperties": true
            }
          },
          "topStories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Highest-ranked cross-section stories."
          },
          "citations": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Flattened citation list when includeCitations is true."
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this bundle route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for the briefing."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-morning-briefing",
          "name": "Morning Briefing",
          "department": "Public Data"
        },
        "requested": {
          "focus": "ai markets",
          "topics": [
            "news",
            "business",
            "tech"
          ],
          "hours": 12,
          "maxItemsPerSection": 4,
          "includeCitations": true
        },
        "briefing": {
          "mode": "managed-news-bundle",
          "summary": "Generated 8 briefing items across 4 sections.",
          "sectionCount": 4,
          "itemCount": 8,
          "upstreamDetailsDisclosed": false,
          "resultFreshness": "live",
          "pricing": {
            "model": "x402_per_call",
            "usd": "0.03"
          },
          "ranking": {
            "strategy": "dedupe_relevance_authority_freshness_source_diversity",
            "storyDedupeApplied": true,
            "sourceDiversityApplied": true,
            "maxItemsPerPublisherPerSection": 2,
            "maxTopStoriesPerPublisher": 1
          }
        },
        "sections": [
          {
            "id": "markets",
            "title": "Markets & Business",
            "summary": "Technology stocks rebound",
            "count": 1,
            "items": [
              {
                "title": "Technology stocks rebound",
                "url": "https://publisher.example/news/technology-stocks-rebound",
                "topic": "business",
                "publishedAt": "2026-07-07T12:00:00.000Z"
              }
            ],
            "ranking": {
              "strategy": "relevance_authority_freshness_diversity",
              "sourceDiversityApplied": true,
              "maxItemsPerPublisher": 2
            }
          }
        ],
        "topStories": [
          {
            "title": "AI infrastructure startup announces new agent workflow tools",
            "url": "https://publisher.example/news/ai-agent-workflow-tools",
            "topic": "tech"
          }
        ],
        "citations": [
          {
            "section": "markets",
            "title": "Technology stocks rebound",
            "url": "https://publisher.example/news/technology-stocks-rebound"
          }
        ],
        "limits": {
          "maxLookbackHours": 24,
          "maxSections": 6,
          "maxItemsPerSection": 8,
          "maxItemsPerPublisherPerSection": 2,
          "maxFetchedHeadlines": 250
        }
      },
      "configured": false
    },
    {
      "id": "classified-listing-search",
      "resource": "https://agentbodega.store/api/public-data/classified-listing-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Classified Listing Search",
      "description": "Search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.",
      "longDescription": "Purpose: Search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.\nBest use: Use this when an agent needs search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: city, category, query.\nOptional fields: sort, postal, search_distance, min_price, max_price, min_bedrooms, max_bedrooms, hasPic, bundleDuplicates, limit, proxiesSx.\n\nAccepted fields:\n- city (required, string): Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston.\n- category (required, string): Listing category abbreviation, such as sss, cta, apa, jjj, or zip.\n- query (required, string): Search text.\n- sort (optional, string): Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\".\n- postal (optional, string): Optional postal code to force geo-scoping when the caller's IP region differs from the target city.\n- search_distance (optional, integer): Optional radius in miles when postal is supplied. Constraints: min: 1; max: 500.\n- min_price (optional, integer): Min price numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- max_price (optional, integer): Max price numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- min_bedrooms (optional, integer): Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- max_bedrooms (optional, integer): Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- hasPic (optional, boolean): Set true to enable has pic behavior for Classified Listing Search.\n- bundleDuplicates (optional, boolean): Set true to enable bundle duplicates behavior for Classified Listing Search.\n- limit (optional, integer): Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100. Constraints: default: 25; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"city\": \"sfbay\",\n  \"category\": \"sss\",\n  \"query\": \"bicycle\",\n  \"sort\": \"date\",\n  \"postal\": \"94103\",\n  \"search_distance\": 25,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "marketplace-listings",
      "aisle": "Marketplace Listings",
      "shelfId": "marketplace-listings",
      "shelf": "Marketplace Listings",
      "offeringId": "classified-listing-search",
      "offering": "Classified Listing Search",
      "pathIds": [
        "public-data",
        "marketplace-listings",
        "marketplace-listings",
        "classified-listing-search"
      ],
      "pathLabels": [
        "Public Data",
        "Marketplace Listings",
        "Marketplace Listings",
        "Classified Listing Search"
      ],
      "taxonomyPath": "public-data.marketplace-listings.marketplace-listings.classified-listing-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "marketplace-listings",
          "name": "Marketplace Listings"
        },
        "shelf": {
          "id": "marketplace-listings",
          "name": "Marketplace Listings"
        },
        "offering": {
          "id": "classified-listing-search",
          "name": "Classified Listing Search"
        },
        "pathIds": [
          "public-data",
          "marketplace-listings",
          "marketplace-listings",
          "classified-listing-search"
        ],
        "pathLabels": [
          "Public Data",
          "Marketplace Listings",
          "Marketplace Listings",
          "Classified Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "classifieds",
        "marketplace-listings",
        "local-search",
        "public-data",
        "search"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/classified-listing-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/classified-listing-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "city",
          "category",
          "query"
        ],
        "properties": {
          "city": {
            "type": "string",
            "description": "Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston."
          },
          "category": {
            "type": "string",
            "description": "Listing category abbreviation, such as sss, cta, apa, jjj, or zip."
          },
          "query": {
            "type": "string",
            "description": "Search text."
          },
          "sort": {
            "type": "string",
            "enum": [
              "date",
              "rel",
              "priceasc",
              "pricedsc"
            ],
            "default": "date",
            "description": "Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\"."
          },
          "postal": {
            "type": "string",
            "description": "Optional postal code to force geo-scoping when the caller's IP region differs from the target city."
          },
          "search_distance": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "description": "Optional radius in miles when postal is supplied."
          },
          "min_price": {
            "type": "integer",
            "minimum": 0,
            "description": "Min price numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "max_price": {
            "type": "integer",
            "minimum": 0,
            "description": "Max price numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "min_bedrooms": {
            "type": "integer",
            "minimum": 0,
            "description": "Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "max_bedrooms": {
            "type": "integer",
            "minimum": 0,
            "description": "Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "hasPic": {
            "type": "boolean",
            "description": "Set true to enable has pic behavior for Classified Listing Search."
          },
          "bundleDuplicates": {
            "type": "boolean",
            "description": "Set true to enable bundle duplicates behavior for Classified Listing Search."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "city",
          "category",
          "query"
        ],
        "optional": [
          "sort",
          "postal",
          "search_distance",
          "min_price",
          "max_price",
          "min_bedrooms",
          "max_bedrooms",
          "hasPic",
          "bundleDuplicates",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "city",
            "type": "string",
            "required": true,
            "description": "Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston."
          },
          {
            "name": "category",
            "type": "string",
            "required": true,
            "description": "Listing category abbreviation, such as sss, cta, apa, jjj, or zip."
          },
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Search text."
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\".",
            "constraints": {
              "enum": [
                "date",
                "rel",
                "priceasc",
                "pricedsc"
              ],
              "default": "date"
            }
          },
          {
            "name": "postal",
            "type": "string",
            "required": false,
            "description": "Optional postal code to force geo-scoping when the caller's IP region differs from the target city."
          },
          {
            "name": "search_distance",
            "type": "integer",
            "required": false,
            "description": "Optional radius in miles when postal is supplied.",
            "constraints": {
              "minimum": 1,
              "maximum": 500
            }
          },
          {
            "name": "min_price",
            "type": "integer",
            "required": false,
            "description": "Min price numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "max_price",
            "type": "integer",
            "required": false,
            "description": "Max price numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "min_bedrooms",
            "type": "integer",
            "required": false,
            "description": "Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "max_bedrooms",
            "type": "integer",
            "required": false,
            "description": "Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "hasPic",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable has pic behavior for Classified Listing Search."
          },
          {
            "name": "bundleDuplicates",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable bundle duplicates behavior for Classified Listing Search."
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "city": "sfbay",
          "category": "sss",
          "query": "bicycle",
          "sort": "date",
          "postal": "94103",
          "search_distance": 25,
          "limit": 10
        }
      },
      "exampleRequest": {
        "city": "sfbay",
        "category": "sss",
        "query": "bicycle",
        "sort": "date",
        "postal": "94103",
        "search_distance": 25,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "classified-listing-search",
          "name": "Classified Listing Search",
          "department": "Public Data"
        },
        "total_results": 5635,
        "results": [
          {
            "posting_id": 7927446618,
            "title": "Kryptonite bike chain",
            "price": "$100",
            "location": "san leandro",
            "subarea": "eby"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "california-highway-traffic",
      "resource": "https://agentbodega.store/api/public-data/california-highway-traffic",
      "type": "http",
      "method": "POST",
      "serviceName": "California Highway Traffic Speeds",
      "description": "Return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.",
      "longDescription": "Purpose: Return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.\nBest use: Use this when an agent needs return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: region, road, direction, minMph, includeIncidents, includeSensors, limit, proxiesSx.\n\nAccepted fields:\n- region (optional, string): California traffic region. Constraints: accepted values: \"NoCal\", \"SoCal\", \"CenCal\"; default: \"NoCal\".\n- road (optional, string): Optional road/highway filter, such as 101, 580, I-80, or CA-1.\n- direction (optional, string): Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\".\n- minMph (optional, integer): Only return sections whose average speed is at or below this MPH. Constraints: min: 0.\n- includeIncidents (optional, boolean): Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true. Constraints: default: true.\n- includeSensors (optional, boolean): Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false. Constraints: default: false.\n- limit (optional, integer): Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200. Constraints: default: 100; min: 1; max: 200.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"region\": \"NoCal\",\n  \"road\": \"580\",\n  \"includeIncidents\": true,\n  \"limit\": 20\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "transportation",
      "aisle": "Transportation",
      "shelfId": "transportation",
      "shelf": "Transportation",
      "offeringId": "california-highway-traffic",
      "offering": "California Highway Traffic Speeds",
      "pathIds": [
        "public-data",
        "transportation",
        "transportation",
        "california-highway-traffic"
      ],
      "pathLabels": [
        "Public Data",
        "Transportation",
        "Transportation",
        "California Highway Traffic Speeds"
      ],
      "taxonomyPath": "public-data.transportation.transportation.california-highway-traffic",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "transportation",
          "name": "Transportation"
        },
        "shelf": {
          "id": "transportation",
          "name": "Transportation"
        },
        "offering": {
          "id": "california-highway-traffic",
          "name": "California Highway Traffic Speeds"
        },
        "pathIds": [
          "public-data",
          "transportation",
          "transportation",
          "california-highway-traffic"
        ],
        "pathLabels": [
          "Public Data",
          "Transportation",
          "Transportation",
          "California Highway Traffic Speeds"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "traffic",
        "california",
        "highways",
        "public-data",
        "transportation"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/california-highway-traffic",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/california-highway-traffic",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "region": {
            "type": "string",
            "enum": [
              "NoCal",
              "SoCal",
              "CenCal"
            ],
            "default": "NoCal",
            "description": "California traffic region."
          },
          "road": {
            "type": "string",
            "description": "Optional road/highway filter, such as 101, 580, I-80, or CA-1."
          },
          "direction": {
            "type": "string",
            "enum": [
              "North",
              "South",
              "East",
              "West"
            ],
            "description": "Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\"."
          },
          "minMph": {
            "type": "integer",
            "minimum": 0,
            "description": "Only return sections whose average speed is at or below this MPH."
          },
          "includeIncidents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true."
          },
          "includeSensors": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "default": 100,
            "description": "Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "region",
          "road",
          "direction",
          "minMph",
          "includeIncidents",
          "includeSensors",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "region",
            "type": "string",
            "required": false,
            "description": "California traffic region.",
            "constraints": {
              "enum": [
                "NoCal",
                "SoCal",
                "CenCal"
              ],
              "default": "NoCal"
            }
          },
          {
            "name": "road",
            "type": "string",
            "required": false,
            "description": "Optional road/highway filter, such as 101, 580, I-80, or CA-1."
          },
          {
            "name": "direction",
            "type": "string",
            "required": false,
            "description": "Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\".",
            "constraints": {
              "enum": [
                "North",
                "South",
                "East",
                "West"
              ]
            }
          },
          {
            "name": "minMph",
            "type": "integer",
            "required": false,
            "description": "Only return sections whose average speed is at or below this MPH.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "includeIncidents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeSensors",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200.",
            "constraints": {
              "default": 100,
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "region": "NoCal",
          "road": "580",
          "includeIncidents": true,
          "limit": 20
        }
      },
      "exampleRequest": {
        "region": "NoCal",
        "road": "580",
        "includeIncidents": true,
        "limit": 20
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "california-highway-traffic",
          "name": "California Highway Traffic Speeds",
          "department": "Public Data"
        },
        "region": "NoCal",
        "results": [
          {
            "road_id": "100580",
            "road": "580",
            "direction": "East",
            "avg_mph": 34.2,
            "min_mph": 12,
            "max_mph": 61,
            "sensors": 18
          }
        ]
      },
      "configured": false
    },
    {
      "id": "rental-listing-search",
      "resource": "https://agentbodega.store/api/public-data/rental-listing-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Rental Listing Search",
      "description": "Find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.",
      "longDescription": "Purpose: Find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.\nBest use: Use this when an agent needs find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: resourceId.\nOptional fields: searchSlug, maxPrice, minPrice, bedrooms, bathrooms, orderBy, limit, proxiesSx.\n\nAccepted fields:\n- resourceId (required, string): Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca.\n- searchSlug (optional, string): Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent. Constraints: default: \"apartments-for-rent\".\n- maxPrice (optional, integer): Max Price numeric value for Rental Listing Search. Constraints: min: 0. Constraints: min: 0.\n- minPrice (optional, integer): Min Price numeric value for Rental Listing Search. Constraints: min: 0. Constraints: min: 0.\n- bedrooms (optional, string): Comma-separated bedroom filter, such as 1,2,3.\n- bathrooms (optional, string): Comma-separated bathroom filter, such as 1,1.5,2.\n- orderBy (optional, string): Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\".\n- limit (optional, integer): Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100. Constraints: default: 25; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"resourceId\": \"san-francisco-ca\",\n  \"searchSlug\": \"apartments-for-rent\",\n  \"maxPrice\": 4000,\n  \"bedrooms\": \"1,2\",\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "real-estate-rentals",
      "aisle": "Real Estate Rentals",
      "shelfId": "real-estate-rentals",
      "shelf": "Real Estate Rentals",
      "offeringId": "rental-listing-search",
      "offering": "Rental Listing Search",
      "pathIds": [
        "public-data",
        "real-estate-rentals",
        "real-estate-rentals",
        "rental-listing-search"
      ],
      "pathLabels": [
        "Public Data",
        "Real Estate Rentals",
        "Real Estate Rentals",
        "Rental Listing Search"
      ],
      "taxonomyPath": "public-data.real-estate-rentals.real-estate-rentals.rental-listing-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "real-estate-rentals",
          "name": "Real Estate Rentals"
        },
        "shelf": {
          "id": "real-estate-rentals",
          "name": "Real Estate Rentals"
        },
        "offering": {
          "id": "rental-listing-search",
          "name": "Rental Listing Search"
        },
        "pathIds": [
          "public-data",
          "real-estate-rentals",
          "real-estate-rentals",
          "rental-listing-search"
        ],
        "pathLabels": [
          "Public Data",
          "Real Estate Rentals",
          "Real Estate Rentals",
          "Rental Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "rentals",
        "real-estate-rentals",
        "apartments",
        "housing",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/rental-listing-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/rental-listing-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "resourceId"
        ],
        "properties": {
          "resourceId": {
            "type": "string",
            "description": "Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca."
          },
          "searchSlug": {
            "type": "string",
            "default": "apartments-for-rent",
            "description": "Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent."
          },
          "maxPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Price numeric value for Rental Listing Search. Constraints: min: 0."
          },
          "minPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Price numeric value for Rental Listing Search. Constraints: min: 0."
          },
          "bedrooms": {
            "type": "string",
            "description": "Comma-separated bedroom filter, such as 1,2,3."
          },
          "bathrooms": {
            "type": "string",
            "description": "Comma-separated bathroom filter, such as 1,1.5,2."
          },
          "orderBy": {
            "type": "string",
            "enum": [
              "score",
              "recencyTime",
              "price"
            ],
            "default": "score",
            "description": "Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\"."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "resourceId"
        ],
        "optional": [
          "searchSlug",
          "maxPrice",
          "minPrice",
          "bedrooms",
          "bathrooms",
          "orderBy",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "resourceId",
            "type": "string",
            "required": true,
            "description": "Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca."
          },
          {
            "name": "searchSlug",
            "type": "string",
            "required": false,
            "description": "Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent.",
            "constraints": {
              "default": "apartments-for-rent"
            }
          },
          {
            "name": "maxPrice",
            "type": "integer",
            "required": false,
            "description": "Max Price numeric value for Rental Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minPrice",
            "type": "integer",
            "required": false,
            "description": "Min Price numeric value for Rental Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "bedrooms",
            "type": "string",
            "required": false,
            "description": "Comma-separated bedroom filter, such as 1,2,3."
          },
          {
            "name": "bathrooms",
            "type": "string",
            "required": false,
            "description": "Comma-separated bathroom filter, such as 1,1.5,2."
          },
          {
            "name": "orderBy",
            "type": "string",
            "required": false,
            "description": "Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\".",
            "constraints": {
              "enum": [
                "score",
                "recencyTime",
                "price"
              ],
              "default": "score"
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "resourceId": "san-francisco-ca",
          "searchSlug": "apartments-for-rent",
          "maxPrice": 4000,
          "bedrooms": "1,2",
          "limit": 10
        }
      },
      "exampleRequest": {
        "resourceId": "san-francisco-ca",
        "searchSlug": "apartments-for-rent",
        "maxPrice": 4000,
        "bedrooms": "1,2",
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "rental-listing-search",
          "name": "Rental Listing Search",
          "department": "Public Data"
        },
        "query": {
          "resource_id": "san-francisco-ca",
          "area_name": "San Francisco",
          "search_slug": "apartments-for-rent"
        },
        "results": [
          {
            "title": "NEMA",
            "street": "8 10th St",
            "city": "San Francisco",
            "state": "CA",
            "rent_min": 3750,
            "rent_max": 7925
          }
        ]
      },
      "configured": false
    },
    {
      "id": "hospital-quality-rating",
      "resource": "https://agentbodega.store/api/public-data/hospital-quality-rating",
      "type": "http",
      "method": "POST",
      "serviceName": "Hospital Quality Rating",
      "description": "Look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.",
      "longDescription": "Purpose: Look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.\nBest use: Use this when an agent needs look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: ccn, careCompareUrl, hospitalName, city, state, includeMeasures, compareTo, proxiesSx.\n\nAccepted fields:\n- ccn (optional, string): Six-digit facility id.\n- careCompareUrl (optional, string): Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls. Constraints: format: uri.\n- hospitalName (optional, string): Hospital/facility name for lookup.\n- city (optional, string): City value for Hospital Quality Rating.\n- state (optional, string): Two-letter state abbreviation for name lookup.\n- includeMeasures (optional, boolean): Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true. Constraints: default: true.\n- compareTo (optional, array): Optional extra CCNs to fetch side by side. Constraints: max items: 3.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"ccn\": \"240010\",\n  \"includeMeasures\": true\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "healthcare-quality",
      "aisle": "Healthcare Quality",
      "shelfId": "healthcare-quality",
      "shelf": "Healthcare Quality",
      "offeringId": "hospital-quality-rating",
      "offering": "Hospital Quality Rating",
      "pathIds": [
        "public-data",
        "healthcare-quality",
        "healthcare-quality",
        "hospital-quality-rating"
      ],
      "pathLabels": [
        "Public Data",
        "Healthcare Quality",
        "Healthcare Quality",
        "Hospital Quality Rating"
      ],
      "taxonomyPath": "public-data.healthcare-quality.healthcare-quality.hospital-quality-rating",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "healthcare-quality",
          "name": "Healthcare Quality"
        },
        "shelf": {
          "id": "healthcare-quality",
          "name": "Healthcare Quality"
        },
        "offering": {
          "id": "hospital-quality-rating",
          "name": "Hospital Quality Rating"
        },
        "pathIds": [
          "public-data",
          "healthcare-quality",
          "healthcare-quality",
          "hospital-quality-rating"
        ],
        "pathLabels": [
          "Public Data",
          "Healthcare Quality",
          "Healthcare Quality",
          "Hospital Quality Rating"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "hospital",
        "healthcare",
        "ratings",
        "public-records",
        "quality",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/hospital-quality-rating",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/hospital-quality-rating",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "ccn": {
            "type": "string",
            "description": "Six-digit facility id."
          },
          "careCompareUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls."
          },
          "hospitalName": {
            "type": "string",
            "description": "Hospital/facility name for lookup."
          },
          "city": {
            "type": "string",
            "description": "City value for Hospital Quality Rating."
          },
          "state": {
            "type": "string",
            "description": "Two-letter state abbreviation for name lookup."
          },
          "includeMeasures": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true."
          },
          "compareTo": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "type": "string",
              "description": "Compare To item value for Hospital Quality Rating."
            },
            "description": "Optional extra CCNs to fetch side by side."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "ccn",
          "careCompareUrl",
          "hospitalName",
          "city",
          "state",
          "includeMeasures",
          "compareTo",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "ccn",
            "type": "string",
            "required": false,
            "description": "Six-digit facility id."
          },
          {
            "name": "careCompareUrl",
            "type": "string",
            "required": false,
            "description": "Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "hospitalName",
            "type": "string",
            "required": false,
            "description": "Hospital/facility name for lookup."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "City value for Hospital Quality Rating."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Two-letter state abbreviation for name lookup."
          },
          {
            "name": "includeMeasures",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "compareTo",
            "type": "array",
            "required": false,
            "description": "Optional extra CCNs to fetch side by side.",
            "constraints": {
              "maxItems": 3
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "ccn": "240010",
          "includeMeasures": true
        }
      },
      "exampleRequest": {
        "ccn": "240010",
        "includeMeasures": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "hospital-quality-rating",
          "name": "Hospital Quality Rating",
          "department": "Public Data"
        },
        "result": {
          "ccn": "240010",
          "facility_name": "MAYO CLINIC HOSPITAL ROCHESTER",
          "state": "MN",
          "overall_rating": "5",
          "measures": {
            "hcahps": [],
            "complications_and_deaths": []
          }
        }
      },
      "configured": false
    },
    {
      "id": "school-quality-rating",
      "resource": "https://agentbodega.store/api/public-data/school-quality-rating",
      "type": "http",
      "method": "POST",
      "serviceName": "School Quality Rating Lookup",
      "description": "Look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.",
      "longDescription": "Purpose: Look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.\nBest use: Use this when an agent needs look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: schoolUrl, schoolName, city, state, includeCatchment, proxiesSx.\n\nAccepted fields:\n- schoolUrl (optional, string): Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls. Constraints: format: uri.\n- schoolName (optional, string): School name to resolve.\n- city (optional, string): City value for School Quality Rating Lookup.\n- state (optional, string): State value for School Quality Rating Lookup.\n- includeCatchment (optional, boolean): Include catchment GeoJSON when present. Large polygons are omitted by default. Constraints: default: false.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"schoolName\": \"Sylvia Mendez Elementary\",\n  \"city\": \"Berkeley\",\n  \"state\": \"CA\"\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "education-quality",
      "aisle": "Education Quality",
      "shelfId": "education-quality",
      "shelf": "Education Quality",
      "offeringId": "school-quality-rating",
      "offering": "School Quality Rating Lookup",
      "pathIds": [
        "public-data",
        "education-quality",
        "education-quality",
        "school-quality-rating"
      ],
      "pathLabels": [
        "Public Data",
        "Education Quality",
        "Education Quality",
        "School Quality Rating Lookup"
      ],
      "taxonomyPath": "public-data.education-quality.education-quality.school-quality-rating",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "education-quality",
          "name": "Education Quality"
        },
        "shelf": {
          "id": "education-quality",
          "name": "Education Quality"
        },
        "offering": {
          "id": "school-quality-rating",
          "name": "School Quality Rating Lookup"
        },
        "pathIds": [
          "public-data",
          "education-quality",
          "education-quality",
          "school-quality-rating"
        ],
        "pathLabels": [
          "Public Data",
          "Education Quality",
          "Education Quality",
          "School Quality Rating Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "schools",
        "ratings",
        "real-estate",
        "education",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/school-quality-rating",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/school-quality-rating",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "schoolUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls."
          },
          "schoolName": {
            "type": "string",
            "description": "School name to resolve."
          },
          "city": {
            "type": "string",
            "description": "City value for School Quality Rating Lookup."
          },
          "state": {
            "type": "string",
            "description": "State value for School Quality Rating Lookup."
          },
          "includeCatchment": {
            "type": "boolean",
            "default": false,
            "description": "Include catchment GeoJSON when present. Large polygons are omitted by default."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "schoolUrl",
          "schoolName",
          "city",
          "state",
          "includeCatchment",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "schoolUrl",
            "type": "string",
            "required": false,
            "description": "Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "schoolName",
            "type": "string",
            "required": false,
            "description": "School name to resolve."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "City value for School Quality Rating Lookup."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "State value for School Quality Rating Lookup."
          },
          {
            "name": "includeCatchment",
            "type": "boolean",
            "required": false,
            "description": "Include catchment GeoJSON when present. Large polygons are omitted by default.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "schoolName": "Sylvia Mendez Elementary",
          "city": "Berkeley",
          "state": "CA"
        }
      },
      "exampleRequest": {
        "schoolName": "Sylvia Mendez Elementary",
        "city": "Berkeley",
        "state": "CA"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "school-quality-rating",
          "name": "School Quality Rating Lookup",
          "department": "Public Data"
        },
        "result": {
          "name": "Sylvia Mendez Elementary",
          "school_id": "078571861",
          "great_schools_rating": 7,
          "grades_served": "K-5",
          "enrollment": 379,
          "district": {
            "name": "Berkeley Unified School District"
          }
        }
      },
      "configured": false
    },
    {
      "id": "home-comparable-sales",
      "resource": "https://agentbodega.store/api/public-data/home-comparable-sales",
      "type": "http",
      "method": "POST",
      "serviceName": "Home Comparable Sales",
      "description": "Return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.",
      "longDescription": "Purpose: Return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.\nBest use: Use this when an agent needs return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: regionId, regionType, market, lat, lon, radiusMiles, soldWithinDays, minPrice, maxPrice, minBeds, maxBeds, minBaths, maxBaths, limit, proxiesSx.\n\nAccepted fields:\n- regionId (optional, string): Market region id, such as city id or ZIP region id.\n- regionType (optional, integer): Market region type. Common values: 2 for ZIP, 6 for city. Constraints: default: 6.\n- market (optional, string): Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston.\n- lat (optional, number): Subject latitude for a bounded-radius polygon search.\n- lon (optional, number): Subject longitude for a bounded-radius polygon search.\n- radiusMiles (optional, number): Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25. Constraints: default: 1; min: 0.1; max: 25.\n- soldWithinDays (optional, integer): Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180.\n- minPrice (optional, integer): Min Price numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxPrice (optional, integer): Max Price numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- minBeds (optional, integer): Min Beds numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxBeds (optional, integer): Max Beds numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- minBaths (optional, number): Min Baths numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxBaths (optional, number): Max Baths numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- limit (optional, integer): Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50. Constraints: default: 10; min: 1; max: 50.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"regionId\": \"17151\",\n  \"regionType\": 6,\n  \"market\": \"sanfrancisco\",\n  \"soldWithinDays\": 180,\n  \"minBeds\": 2,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "real-estate-comps",
      "aisle": "Real Estate Comps",
      "shelfId": "real-estate-comps",
      "shelf": "Real Estate Comps",
      "offeringId": "home-comparable-sales",
      "offering": "Home Comparable Sales",
      "pathIds": [
        "public-data",
        "real-estate-comps",
        "real-estate-comps",
        "home-comparable-sales"
      ],
      "pathLabels": [
        "Public Data",
        "Real Estate Comps",
        "Real Estate Comps",
        "Home Comparable Sales"
      ],
      "taxonomyPath": "public-data.real-estate-comps.real-estate-comps.home-comparable-sales",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "real-estate-comps",
          "name": "Real Estate Comps"
        },
        "shelf": {
          "id": "real-estate-comps",
          "name": "Real Estate Comps"
        },
        "offering": {
          "id": "home-comparable-sales",
          "name": "Home Comparable Sales"
        },
        "pathIds": [
          "public-data",
          "real-estate-comps",
          "real-estate-comps",
          "home-comparable-sales"
        ],
        "pathLabels": [
          "Public Data",
          "Real Estate Comps",
          "Real Estate Comps",
          "Home Comparable Sales"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "comparable-sales",
        "real-estate",
        "sold-comps",
        "valuation",
        "public-data",
        "redfin",
        "redfin-comps"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/home-comparable-sales",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/home-comparable-sales",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "regionId": {
            "type": "string",
            "description": "Market region id, such as city id or ZIP region id."
          },
          "regionType": {
            "type": "integer",
            "default": 6,
            "description": "Market region type. Common values: 2 for ZIP, 6 for city."
          },
          "market": {
            "type": "string",
            "description": "Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston."
          },
          "lat": {
            "type": "number",
            "description": "Subject latitude for a bounded-radius polygon search."
          },
          "lon": {
            "type": "number",
            "description": "Subject longitude for a bounded-radius polygon search."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 0.1,
            "maximum": 25,
            "default": 1,
            "description": "Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25."
          },
          "soldWithinDays": {
            "type": "integer",
            "enum": [
              30,
              90,
              180,
              365,
              730,
              1095
            ],
            "default": 180,
            "description": "Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180."
          },
          "minPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Price numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Price numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "minBeds": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Beds numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxBeds": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Beds numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "minBaths": {
            "type": "number",
            "minimum": 0,
            "description": "Min Baths numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxBaths": {
            "type": "number",
            "minimum": 0,
            "description": "Max Baths numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "regionId",
          "regionType",
          "market",
          "lat",
          "lon",
          "radiusMiles",
          "soldWithinDays",
          "minPrice",
          "maxPrice",
          "minBeds",
          "maxBeds",
          "minBaths",
          "maxBaths",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "regionId",
            "type": "string",
            "required": false,
            "description": "Market region id, such as city id or ZIP region id."
          },
          {
            "name": "regionType",
            "type": "integer",
            "required": false,
            "description": "Market region type. Common values: 2 for ZIP, 6 for city.",
            "constraints": {
              "default": 6
            }
          },
          {
            "name": "market",
            "type": "string",
            "required": false,
            "description": "Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston."
          },
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Subject latitude for a bounded-radius polygon search."
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Subject longitude for a bounded-radius polygon search."
          },
          {
            "name": "radiusMiles",
            "type": "number",
            "required": false,
            "description": "Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25.",
            "constraints": {
              "default": 1,
              "minimum": 0.1,
              "maximum": 25
            }
          },
          {
            "name": "soldWithinDays",
            "type": "integer",
            "required": false,
            "description": "Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180.",
            "constraints": {
              "enum": [
                30,
                90,
                180,
                365,
                730,
                1095
              ],
              "default": 180
            }
          },
          {
            "name": "minPrice",
            "type": "integer",
            "required": false,
            "description": "Min Price numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxPrice",
            "type": "integer",
            "required": false,
            "description": "Max Price numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minBeds",
            "type": "integer",
            "required": false,
            "description": "Min Beds numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxBeds",
            "type": "integer",
            "required": false,
            "description": "Max Beds numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minBaths",
            "type": "number",
            "required": false,
            "description": "Min Baths numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxBaths",
            "type": "number",
            "required": false,
            "description": "Max Baths numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "regionId": "17151",
          "regionType": 6,
          "market": "sanfrancisco",
          "soldWithinDays": 180,
          "minBeds": 2,
          "limit": 10
        }
      },
      "exampleRequest": {
        "regionId": "17151",
        "regionType": 6,
        "market": "sanfrancisco",
        "soldWithinDays": 180,
        "minBeds": 2,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "home-comparable-sales",
          "name": "Home Comparable Sales",
          "department": "Public Data"
        },
        "result": {
          "subject": {
            "region_id": "17151",
            "market": "sanfrancisco"
          },
          "comps": [
            {
              "address": "123 Example St",
              "price": 1275000,
              "beds": 3,
              "baths": 2,
              "sqft": 1420,
              "sold_date": "2026-05-15"
            }
          ]
        }
      },
      "configured": false
    },
    {
      "id": "volunteer-opportunity-search",
      "resource": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Volunteer Opportunity Search",
      "description": "Search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.",
      "longDescription": "Purpose: Search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.\nBest use: Use this when an agent needs search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, opportunityUrl, lat, lon, radiusMiles, remote, categories, page, limit, proxiesSx.\n\nAccepted fields:\n- query (optional, string): Search text.\n- opportunityUrl (optional, string): Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls. Constraints: format: uri.\n- lat (optional, number): Lat numeric value for Volunteer Opportunity Search.\n- lon (optional, number): Lon numeric value for Volunteer Opportunity Search.\n- radiusMiles (optional, number): Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250. Constraints: default: 25; min: 1; max: 250.\n- remote (optional, boolean): Filter for remote/virtual opportunities.\n- categories (optional, array): Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT. Constraints: max items: 8.\n- page (optional, integer): Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100. Constraints: default: 0; min: 0; max: 100.\n- limit (optional, integer): Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100. Constraints: default: 20; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"query\": \"food bank\",\n  \"lat\": 40.7128,\n  \"lon\": -74.006,\n  \"radiusMiles\": 25,\n  \"categories\": [\n    \"HUNGER_FOOD_SECURITY\"\n  ],\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "civic-opportunities",
      "aisle": "Civic Opportunities",
      "shelfId": "civic-opportunities",
      "shelf": "Civic Opportunities",
      "offeringId": "volunteer-opportunity-search",
      "offering": "Volunteer Opportunity Search",
      "pathIds": [
        "public-data",
        "civic-opportunities",
        "civic-opportunities",
        "volunteer-opportunity-search"
      ],
      "pathLabels": [
        "Public Data",
        "Civic Opportunities",
        "Civic Opportunities",
        "Volunteer Opportunity Search"
      ],
      "taxonomyPath": "public-data.civic-opportunities.civic-opportunities.volunteer-opportunity-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "civic-opportunities",
          "name": "Civic Opportunities"
        },
        "shelf": {
          "id": "civic-opportunities",
          "name": "Civic Opportunities"
        },
        "offering": {
          "id": "volunteer-opportunity-search",
          "name": "Volunteer Opportunity Search"
        },
        "pathIds": [
          "public-data",
          "civic-opportunities",
          "civic-opportunities",
          "volunteer-opportunity-search"
        ],
        "pathLabels": [
          "Public Data",
          "Civic Opportunities",
          "Civic Opportunities",
          "Volunteer Opportunity Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "volunteering",
        "opportunities",
        "civic",
        "nonprofit",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search text."
          },
          "opportunityUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls."
          },
          "lat": {
            "type": "number",
            "description": "Lat numeric value for Volunteer Opportunity Search."
          },
          "lon": {
            "type": "number",
            "description": "Lon numeric value for Volunteer Opportunity Search."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 1,
            "maximum": 250,
            "default": 25,
            "description": "Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250."
          },
          "remote": {
            "type": "boolean",
            "description": "Filter for remote/virtual opportunities."
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Categories item value for Volunteer Opportunity Search."
            },
            "maxItems": 8,
            "description": "Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT."
          },
          "page": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "default": 0,
            "description": "Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "description": "Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "opportunityUrl",
          "lat",
          "lon",
          "radiusMiles",
          "remote",
          "categories",
          "page",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Search text."
          },
          {
            "name": "opportunityUrl",
            "type": "string",
            "required": false,
            "description": "Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Lat numeric value for Volunteer Opportunity Search."
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Lon numeric value for Volunteer Opportunity Search."
          },
          {
            "name": "radiusMiles",
            "type": "number",
            "required": false,
            "description": "Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 250
            }
          },
          {
            "name": "remote",
            "type": "boolean",
            "required": false,
            "description": "Filter for remote/virtual opportunities."
          },
          {
            "name": "categories",
            "type": "array",
            "required": false,
            "description": "Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT.",
            "constraints": {
              "maxItems": 8
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100.",
            "constraints": {
              "default": 0,
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "food bank",
          "lat": 40.7128,
          "lon": -74.006,
          "radiusMiles": 25,
          "categories": [
            "HUNGER_FOOD_SECURITY"
          ],
          "limit": 10
        }
      },
      "exampleRequest": {
        "query": "food bank",
        "lat": 40.7128,
        "lon": -74.006,
        "radiusMiles": 25,
        "categories": [
          "HUNGER_FOOD_SECURITY"
        ],
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "volunteer-opportunity-search",
          "name": "Volunteer Opportunity Search",
          "department": "Public Data"
        },
        "total": 128,
        "results": [
          {
            "id": "abc123",
            "title": "Pack meals for neighbors",
            "organization": "Example Food Bank",
            "location": {
              "city": "New York",
              "state": "NY"
            },
            "remote": false
          }
        ]
      },
      "configured": false
    },
    {
      "id": "us-weather-forecast",
      "resource": "https://agentbodega.store/api/public-data/us-weather-forecast",
      "type": "http",
      "method": "POST",
      "serviceName": "US Weather Forecast",
      "description": "Return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.",
      "longDescription": "Purpose: Return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.\nBest use: Use this when an agent needs return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: lat, lon, zip, city, state, location, includeCurrent, includeHourly, includeAlerts, includeOffice, hourlyLimit, dailyLimit, proxiesSx.\n\nAccepted fields:\n- lat (optional, number): Latitude for a US point. Must be paired with lon. Constraints: min: -90; max: 90.\n- lon (optional, number): Longitude for a US point. Must be paired with lat. Constraints: min: -180; max: 180.\n- zip (optional, string): US ZIP code to geocode before forecast lookup.\n- city (optional, string): US city name. Pair with state for best geocoding.\n- state (optional, string): US state name or two-letter abbreviation for city lookup.\n- location (optional, string): Free-form US place query when lat/lon, zip, or city/state are not supplied.\n- includeCurrent (optional, boolean): Fetch the nearest station's latest observation. Constraints: default: true.\n- includeHourly (optional, boolean): Fetch the hourly forecast. Constraints: default: true.\n- includeAlerts (optional, boolean): Fetch active watches, warnings, and advisories for the point. Constraints: default: true.\n- includeOffice (optional, boolean): Fetch forecast-center metadata such as name, phone, and email when available. Constraints: default: false.\n- hourlyLimit (optional, integer): Maximum hourly periods to return. Constraints: default: 24; min: 1; max: 72.\n- dailyLimit (optional, integer): Maximum multi-day forecast periods to return. Constraints: default: 14; min: 1; max: 14.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"city\": \"Boulder\",\n  \"state\": \"CO\",\n  \"hourlyLimit\": 24,\n  \"includeAlerts\": true\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "weather",
      "aisle": "Weather",
      "shelfId": "weather",
      "shelf": "Weather",
      "offeringId": "us-weather-forecast",
      "offering": "US Weather Forecast",
      "pathIds": [
        "public-data",
        "weather",
        "weather",
        "us-weather-forecast"
      ],
      "pathLabels": [
        "Public Data",
        "Weather",
        "Weather",
        "US Weather Forecast"
      ],
      "taxonomyPath": "public-data.weather.weather.us-weather-forecast",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "weather",
          "name": "Weather"
        },
        "shelf": {
          "id": "weather",
          "name": "Weather"
        },
        "offering": {
          "id": "us-weather-forecast",
          "name": "US Weather Forecast"
        },
        "pathIds": [
          "public-data",
          "weather",
          "weather",
          "us-weather-forecast"
        ],
        "pathLabels": [
          "Public Data",
          "Weather",
          "Weather",
          "US Weather Forecast"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "weather",
        "forecast",
        "alerts",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/us-weather-forecast",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/us-weather-forecast",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Latitude for a US point. Must be paired with lon."
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude for a US point. Must be paired with lat."
          },
          "zip": {
            "type": "string",
            "description": "US ZIP code to geocode before forecast lookup."
          },
          "city": {
            "type": "string",
            "description": "US city name. Pair with state for best geocoding."
          },
          "state": {
            "type": "string",
            "description": "US state name or two-letter abbreviation for city lookup."
          },
          "location": {
            "type": "string",
            "description": "Free-form US place query when lat/lon, zip, or city/state are not supplied."
          },
          "includeCurrent": {
            "type": "boolean",
            "default": true,
            "description": "Fetch the nearest station's latest observation."
          },
          "includeHourly": {
            "type": "boolean",
            "default": true,
            "description": "Fetch the hourly forecast."
          },
          "includeAlerts": {
            "type": "boolean",
            "default": true,
            "description": "Fetch active watches, warnings, and advisories for the point."
          },
          "includeOffice": {
            "type": "boolean",
            "default": false,
            "description": "Fetch forecast-center metadata such as name, phone, and email when available."
          },
          "hourlyLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 72,
            "default": 24,
            "description": "Maximum hourly periods to return."
          },
          "dailyLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 14,
            "default": 14,
            "description": "Maximum multi-day forecast periods to return."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "lat",
          "lon",
          "zip",
          "city",
          "state",
          "location",
          "includeCurrent",
          "includeHourly",
          "includeAlerts",
          "includeOffice",
          "hourlyLimit",
          "dailyLimit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Latitude for a US point. Must be paired with lon.",
            "constraints": {
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Longitude for a US point. Must be paired with lat.",
            "constraints": {
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "zip",
            "type": "string",
            "required": false,
            "description": "US ZIP code to geocode before forecast lookup."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "US city name. Pair with state for best geocoding."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "US state name or two-letter abbreviation for city lookup."
          },
          {
            "name": "location",
            "type": "string",
            "required": false,
            "description": "Free-form US place query when lat/lon, zip, or city/state are not supplied."
          },
          {
            "name": "includeCurrent",
            "type": "boolean",
            "required": false,
            "description": "Fetch the nearest station's latest observation.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeHourly",
            "type": "boolean",
            "required": false,
            "description": "Fetch the hourly forecast.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeAlerts",
            "type": "boolean",
            "required": false,
            "description": "Fetch active watches, warnings, and advisories for the point.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeOffice",
            "type": "boolean",
            "required": false,
            "description": "Fetch forecast-center metadata such as name, phone, and email when available.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "hourlyLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum hourly periods to return.",
            "constraints": {
              "default": 24,
              "minimum": 1,
              "maximum": 72
            }
          },
          {
            "name": "dailyLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum multi-day forecast periods to return.",
            "constraints": {
              "default": 14,
              "minimum": 1,
              "maximum": 14
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "city": "Boulder",
          "state": "CO",
          "hourlyLimit": 24,
          "includeAlerts": true
        }
      },
      "exampleRequest": {
        "city": "Boulder",
        "state": "CO",
        "hourlyLimit": 24,
        "includeAlerts": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "us-weather-forecast",
          "name": "US Weather Forecast",
          "department": "Public Data"
        },
        "location": {
          "input": "Boulder, CO",
          "lat": 40.015,
          "lon": -105.2705,
          "relative_location": {
            "city": "Boulder",
            "state": "CO"
          },
          "time_zone": "America/Denver"
        },
        "grid": {
          "wfo": "BOU",
          "gridX": 54,
          "gridY": 74
        },
        "current_observation": {
          "station_id": "KBDU",
          "text_description": "Mostly Cloudy",
          "temperature_f": 71.6
        },
        "forecast_multi_day": [
          {
            "name": "Tonight",
            "temperature": 54,
            "temperature_unit": "F",
            "short_forecast": "Partly Cloudy"
          }
        ],
        "forecast_hourly": [
          {
            "start_time": "2026-07-03T18:00:00-06:00",
            "temperature": 72,
            "temperature_unit": "F",
            "short_forecast": "Sunny"
          }
        ],
        "alerts": []
      },
      "configured": false
    },
    {
      "id": "official-status-check",
      "resource": "https://agentbodega.store/api/status/check",
      "type": "http",
      "method": "POST",
      "serviceName": "Official Service Status Check",
      "description": "Check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.",
      "longDescription": "Purpose: Check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.\nBest use: Use this when an agent needs check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: service.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- service (required, string): Service id from /api/status/catalog, for example github or gitlab.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Official Service Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"service\": \"github\",\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "utility",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "status-checks",
      "aisle": "Status Checks",
      "offeringId": "official-status-check",
      "offering": "Official Service Status Check",
      "pathIds": [
        "official-status",
        "status-checks",
        "official-status-check"
      ],
      "pathLabels": [
        "Status & Infra",
        "Status Checks",
        "Official Service Status Check"
      ],
      "taxonomyPath": "official-status.status-checks.official-status-check",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "status-checks",
          "name": "Status Checks"
        },
        "offering": {
          "id": "official-status-check",
          "name": "Official Service Status Check"
        },
        "pathIds": [
          "official-status",
          "status-checks",
          "official-status-check"
        ],
        "pathLabels": [
          "Status & Infra",
          "Status Checks",
          "Official Service Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "github",
        "gitlab",
        "deploy-readiness",
        "incident-response",
        "agent-tools"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/check",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/check",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "service"
        ],
        "properties": {
          "service": {
            "type": "string",
            "description": "Service id from /api/status/catalog, for example github or gitlab."
          },
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Official Service Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Official Service Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "service"
        ],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "service",
            "type": "string",
            "required": true,
            "description": "Service id from /api/status/catalog, for example github or gitlab."
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Official Service Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "service": "github",
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "service": "github",
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "id": "github",
          "name": "GitHub"
        },
        "ok": true,
        "status": "operational",
        "label": "All Systems Operational",
        "source": {
          "type": "managed-status-source",
          "cached": false,
          "stale": false
        }
      },
      "configured": false
    },
    {
      "id": "cloud-status-check",
      "resource": "https://agentbodega.store/api/cloud/status/check",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Provider Status Check",
      "description": "Check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.",
      "longDescription": "Purpose: Check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.\nBest use: Use this when an agent needs check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: provider.\nOptional fields: service, product, region, location, includeHistory, includeHealthy, incidentLimit.\n\nAccepted fields:\n- provider (required, string): Cloud provider id. Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\".\n- service (optional, string): Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke.\n- product (optional, string): GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine.\n- region (optional, string): Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global.\n- location (optional, string): Provider location alias. Treated the same as region.\n- includeHistory (optional, boolean): Return recent/resolved historical incidents when the provider source exposes them. Constraints: default: false.\n- includeHealthy (optional, boolean): Include healthy/noisy rows. Default responses focus on degraded or relevant incidents. Constraints: default: false.\n- incidentLimit (optional, integer): Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20. Constraints: default: 5; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"provider\": \"aws\",\n  \"service\": \"lambda\",\n  \"region\": \"us-east-1\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "utility",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "provider-status",
      "aisle": "Provider Status",
      "shelfId": "single-unit",
      "shelf": "Single Unit",
      "offeringId": "cloud-status-check",
      "offering": "Cloud Provider Status Check",
      "pathIds": [
        "cloud-status",
        "provider-status",
        "single-unit",
        "cloud-status-check"
      ],
      "pathLabels": [
        "Cloud Status",
        "Provider Status",
        "Single Unit",
        "Cloud Provider Status Check"
      ],
      "taxonomyPath": "cloud-status.provider-status.single-unit.cloud-status-check",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "provider-status",
          "name": "Provider Status"
        },
        "shelf": {
          "id": "single-unit",
          "name": "Single Unit"
        },
        "offering": {
          "id": "cloud-status-check",
          "name": "Cloud Provider Status Check"
        },
        "pathIds": [
          "cloud-status",
          "provider-status",
          "single-unit",
          "cloud-status-check"
        ],
        "pathLabels": [
          "Cloud Status",
          "Provider Status",
          "Single Unit",
          "Cloud Provider Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/check",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/check",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "provider"
        ],
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "aws",
              "gcp",
              "azure",
              "digitalocean",
              "linode"
            ],
            "description": "Cloud provider id."
          },
          "service": {
            "type": "string",
            "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
          },
          "product": {
            "type": "string",
            "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
          },
          "region": {
            "type": "string",
            "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
          },
          "location": {
            "type": "string",
            "description": "Provider location alias. Treated the same as region."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Return recent/resolved historical incidents when the provider source exposes them."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Include healthy/noisy rows. Default responses focus on degraded or relevant incidents."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "provider"
        ],
        "optional": [
          "service",
          "product",
          "region",
          "location",
          "includeHistory",
          "includeHealthy",
          "incidentLimit"
        ],
        "fields": [
          {
            "name": "provider",
            "type": "string",
            "required": true,
            "description": "Cloud provider id.",
            "constraints": {
              "enum": [
                "aws",
                "gcp",
                "azure",
                "digitalocean",
                "linode"
              ]
            }
          },
          {
            "name": "service",
            "type": "string",
            "required": false,
            "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
          },
          {
            "name": "product",
            "type": "string",
            "required": false,
            "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
          },
          {
            "name": "region",
            "type": "string",
            "required": false,
            "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
          },
          {
            "name": "location",
            "type": "string",
            "required": false,
            "description": "Provider location alias. Treated the same as region."
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Return recent/resolved historical incidents when the provider source exposes them.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Include healthy/noisy rows. Default responses focus on degraded or relevant incidents.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "provider": "aws",
          "service": "lambda",
          "region": "us-east-1",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "provider": "aws",
        "service": "lambda",
        "region": "us-east-1",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "provider": {
          "id": "aws",
          "name": "AWS"
        },
        "status": "operational",
        "summary": "No broad-impact incident matched the requested unit.",
        "incidents": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-summary",
      "resource": "https://agentbodega.store/api/cloud/status/summary",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Provider Status Summary",
      "description": "Summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.",
      "longDescription": "Purpose: Summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.\nBest use: Use this when an agent needs summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: provider, includeHistory, includeHealthy, incidentLimit.\n\nAccepted fields:\n- provider (optional, string): Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\".\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false. Constraints: default: false.\n- incidentLimit (optional, integer): Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20. Constraints: default: 5; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"provider\": \"all\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "http-json",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "incident-summaries",
      "aisle": "Incident Summaries",
      "shelfId": "single-unit",
      "shelf": "Single Unit",
      "offeringId": "cloud-status-summary",
      "offering": "Cloud Provider Status Summary",
      "pathIds": [
        "cloud-status",
        "incident-summaries",
        "single-unit",
        "cloud-status-summary"
      ],
      "pathLabels": [
        "Cloud Status",
        "Incident Summaries",
        "Single Unit",
        "Cloud Provider Status Summary"
      ],
      "taxonomyPath": "cloud-status.incident-summaries.single-unit.cloud-status-summary",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "incident-summaries",
          "name": "Incident Summaries"
        },
        "shelf": {
          "id": "single-unit",
          "name": "Single Unit"
        },
        "offering": {
          "id": "cloud-status-summary",
          "name": "Cloud Provider Status Summary"
        },
        "pathIds": [
          "cloud-status",
          "incident-summaries",
          "single-unit",
          "cloud-status-summary"
        ],
        "pathLabels": [
          "Cloud Status",
          "Incident Summaries",
          "Single Unit",
          "Cloud Provider Status Summary"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "summary",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/summary",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/summary",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "aws",
              "gcp",
              "azure",
              "digitalocean",
              "linode",
              "all"
            ],
            "default": "all",
            "description": "Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\"."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "provider",
          "includeHistory",
          "includeHealthy",
          "incidentLimit"
        ],
        "fields": [
          {
            "name": "provider",
            "type": "string",
            "required": false,
            "description": "Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\".",
            "constraints": {
              "enum": [
                "aws",
                "gcp",
                "azure",
                "digitalocean",
                "linode",
                "all"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "provider": "all",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "provider": "all",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "provider": "all",
        "summary": {
          "worstStatus": "operational",
          "checkedProviders": 5
        },
        "incidents": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-bundle",
      "resource": "https://agentbodega.store/api/cloud/status/bundle",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Status Small Bundle",
      "description": "Check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.",
      "longDescription": "Purpose: Check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.\nBest use: Use this when an agent needs check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: bundle, targets, includeHistory, includeHealthy.\n\nAccepted fields:\n- bundle (optional, string): Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\".\n- targets (optional, array): Optional explicit cloud checks. Bundle price covers up to five normalized units. Constraints: min items: 1; max items: 5. Array items accept: provider, service, product, region, location.\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"bundle\": \"cloud-core\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "utility",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "cloud-bundles",
      "aisle": "Cloud Bundles",
      "shelfId": "multi-unit",
      "shelf": "Multi Unit",
      "offeringId": "cloud-status-bundle",
      "offering": "Cloud Status Small Bundle",
      "pathIds": [
        "cloud-status",
        "cloud-bundles",
        "multi-unit",
        "cloud-status-bundle"
      ],
      "pathLabels": [
        "Cloud Status",
        "Cloud Bundles",
        "Multi Unit",
        "Cloud Status Small Bundle"
      ],
      "taxonomyPath": "cloud-status.cloud-bundles.multi-unit.cloud-status-bundle",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "cloud-bundles",
          "name": "Cloud Bundles"
        },
        "shelf": {
          "id": "multi-unit",
          "name": "Multi Unit"
        },
        "offering": {
          "id": "cloud-status-bundle",
          "name": "Cloud Status Small Bundle"
        },
        "pathIds": [
          "cloud-status",
          "cloud-bundles",
          "multi-unit",
          "cloud-status-bundle"
        ],
        "pathLabels": [
          "Cloud Status",
          "Cloud Bundles",
          "Multi Unit",
          "Cloud Status Small Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "bundle",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/bundle",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/bundle",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "string",
            "enum": [
              "cloud-core",
              "aws-webapp",
              "gcp-ai-app",
              "azure-saas",
              "do-core",
              "linode-core"
            ],
            "default": "cloud-core",
            "description": "Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\"."
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "aws",
                    "gcp",
                    "azure",
                    "digitalocean",
                    "linode"
                  ],
                  "description": "Cloud provider id."
                },
                "service": {
                  "type": "string",
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                "product": {
                  "type": "string",
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                "region": {
                  "type": "string",
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                "location": {
                  "type": "string",
                  "description": "Provider location alias. Treated the same as region."
                }
              },
              "additionalProperties": false,
              "description": "Targets item object for configuring Cloud Status Small Bundle."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "Optional explicit cloud checks. Bundle price covers up to five normalized units."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "bundle",
          "targets",
          "includeHistory",
          "includeHealthy"
        ],
        "fields": [
          {
            "name": "bundle",
            "type": "string",
            "required": false,
            "description": "Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\".",
            "constraints": {
              "enum": [
                "cloud-core",
                "aws-webapp",
                "gcp-ai-app",
                "azure-saas",
                "do-core",
                "linode-core"
              ],
              "default": "cloud-core"
            }
          },
          {
            "name": "targets",
            "type": "array",
            "required": false,
            "description": "Optional explicit cloud checks. Bundle price covers up to five normalized units.",
            "constraints": {
              "minItems": 1,
              "maxItems": 5
            },
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "fields": [
                {
                  "name": "provider",
                  "type": "string",
                  "required": true,
                  "description": "Cloud provider id.",
                  "constraints": {
                    "enum": [
                      "aws",
                      "gcp",
                      "azure",
                      "digitalocean",
                      "linode"
                    ]
                  }
                },
                {
                  "name": "service",
                  "type": "string",
                  "required": false,
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                {
                  "name": "product",
                  "type": "string",
                  "required": false,
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                {
                  "name": "region",
                  "type": "string",
                  "required": false,
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                {
                  "name": "location",
                  "type": "string",
                  "required": false,
                  "description": "Provider location alias. Treated the same as region."
                }
              ]
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "bundle": "cloud-core",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "bundle": "cloud-core",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "cloud-core",
          "units": 4
        },
        "summary": {
          "worstStatus": "operational",
          "degraded": 0
        },
        "results": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-stack",
      "resource": "https://agentbodega.store/api/cloud/status/stack",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Stack Status Bundle",
      "description": "Check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.",
      "longDescription": "Purpose: Check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.\nBest use: Use this when an agent needs check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: targets.\nOptional fields: includeHistory, includeHealthy.\n\nAccepted fields:\n- targets (required, array): Caller-selected cloud checks. Stack price covers up to twelve normalized units. Constraints: min items: 3; max items: 12. Array items accept: provider, service, product, region, location.\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"targets\": [\n    {\n      \"provider\": \"aws\",\n      \"service\": \"lambda\",\n      \"region\": \"us-east-1\"\n    },\n    {\n      \"provider\": \"aws\",\n      \"service\": \"s3\",\n      \"region\": \"us-east-1\"\n    },\n    {\n      \"provider\": \"gcp\",\n      \"product\": \"cloud-run\",\n      \"location\": \"us-central1\"\n    },\n    {\n      \"provider\": \"azure\",\n      \"service\": \"app-service\",\n      \"region\": \"eastus\"\n    }\n  ],\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "http-json",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "cloud-bundles",
      "aisle": "Cloud Bundles",
      "shelfId": "multi-unit",
      "shelf": "Multi Unit",
      "offeringId": "cloud-status-stack",
      "offering": "Cloud Stack Status Bundle",
      "pathIds": [
        "cloud-status",
        "cloud-bundles",
        "multi-unit",
        "cloud-status-stack"
      ],
      "pathLabels": [
        "Cloud Status",
        "Cloud Bundles",
        "Multi Unit",
        "Cloud Stack Status Bundle"
      ],
      "taxonomyPath": "cloud-status.cloud-bundles.multi-unit.cloud-status-stack",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "cloud-bundles",
          "name": "Cloud Bundles"
        },
        "shelf": {
          "id": "multi-unit",
          "name": "Multi Unit"
        },
        "offering": {
          "id": "cloud-status-stack",
          "name": "Cloud Stack Status Bundle"
        },
        "pathIds": [
          "cloud-status",
          "cloud-bundles",
          "multi-unit",
          "cloud-status-stack"
        ],
        "pathLabels": [
          "Cloud Status",
          "Cloud Bundles",
          "Multi Unit",
          "Cloud Stack Status Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "custom-stack",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/stack",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/stack",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "targets"
        ],
        "properties": {
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "aws",
                    "gcp",
                    "azure",
                    "digitalocean",
                    "linode"
                  ],
                  "description": "Cloud provider id."
                },
                "service": {
                  "type": "string",
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                "product": {
                  "type": "string",
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                "region": {
                  "type": "string",
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                "location": {
                  "type": "string",
                  "description": "Provider location alias. Treated the same as region."
                }
              },
              "additionalProperties": false,
              "description": "Targets item object for configuring Cloud Stack Status Bundle."
            },
            "minItems": 3,
            "maxItems": 12,
            "description": "Caller-selected cloud checks. Stack price covers up to twelve normalized units."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "targets"
        ],
        "optional": [
          "includeHistory",
          "includeHealthy"
        ],
        "fields": [
          {
            "name": "targets",
            "type": "array",
            "required": true,
            "description": "Caller-selected cloud checks. Stack price covers up to twelve normalized units.",
            "constraints": {
              "minItems": 3,
              "maxItems": 12
            },
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "fields": [
                {
                  "name": "provider",
                  "type": "string",
                  "required": true,
                  "description": "Cloud provider id.",
                  "constraints": {
                    "enum": [
                      "aws",
                      "gcp",
                      "azure",
                      "digitalocean",
                      "linode"
                    ]
                  }
                },
                {
                  "name": "service",
                  "type": "string",
                  "required": false,
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                {
                  "name": "product",
                  "type": "string",
                  "required": false,
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                {
                  "name": "region",
                  "type": "string",
                  "required": false,
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                {
                  "name": "location",
                  "type": "string",
                  "required": false,
                  "description": "Provider location alias. Treated the same as region."
                }
              ]
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "targets": [
            {
              "provider": "aws",
              "service": "lambda",
              "region": "us-east-1"
            },
            {
              "provider": "aws",
              "service": "s3",
              "region": "us-east-1"
            },
            {
              "provider": "gcp",
              "product": "cloud-run",
              "location": "us-central1"
            },
            {
              "provider": "azure",
              "service": "app-service",
              "region": "eastus"
            }
          ],
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "targets": [
          {
            "provider": "aws",
            "service": "lambda",
            "region": "us-east-1"
          },
          {
            "provider": "aws",
            "service": "s3",
            "region": "us-east-1"
          },
          {
            "provider": "gcp",
            "product": "cloud-run",
            "location": "us-central1"
          },
          {
            "provider": "azure",
            "service": "app-service",
            "region": "eastus"
          }
        ],
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "custom-stack",
          "units": 5
        },
        "summary": {
          "worstStatus": "operational",
          "degraded": 0
        },
        "results": []
      },
      "configured": false
    },
    {
      "id": "status-bundle-check",
      "resource": "https://agentbodega.store/api/status/bundle",
      "type": "http",
      "method": "POST",
      "serviceName": "Vibe Deploy Readiness Bundle",
      "description": "Check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.",
      "longDescription": "Purpose: Check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.\nBest use: Use this when an agent needs check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: bundle, services, includeComponents.\n\nAccepted fields:\n- bundle (optional, string): Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\".\n- services (optional, array): Optional explicit service ids from /api/status/catalog. Constraints: min items: 1; max items: 20.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"bundle\": \"vibe-deploy-readiness\",\n  \"includeComponents\": false\n}\n```",
      "category": "agent-utilities",
      "kind": "utility",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "status-bundle-check",
      "offering": "Vibe Deploy Readiness Bundle",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "status-bundle-check"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Vibe Deploy Readiness Bundle"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.status-bundle-check",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "status-bundle-check",
          "name": "Vibe Deploy Readiness Bundle"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "status-bundle-check"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Vibe Deploy Readiness Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "deploy-readiness",
        "github",
        "gitlab",
        "vercel",
        "supabase",
        "openai"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bundle",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bundle",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "string",
            "enum": [
              "vibe-deploy-readiness",
              "ai-app-stack",
              "source-and-ci",
              "deploy-platforms",
              "all"
            ],
            "default": "vibe-deploy-readiness",
            "description": "Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\"."
          },
          "services": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Services item value for Vibe Deploy Readiness Bundle."
            },
            "minItems": 1,
            "maxItems": 20,
            "description": "Optional explicit service ids from /api/status/catalog."
          },
          "includeComponents": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "bundle",
          "services",
          "includeComponents"
        ],
        "fields": [
          {
            "name": "bundle",
            "type": "string",
            "required": false,
            "description": "Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\".",
            "constraints": {
              "enum": [
                "vibe-deploy-readiness",
                "ai-app-stack",
                "source-and-ci",
                "deploy-platforms",
                "all"
              ],
              "default": "vibe-deploy-readiness"
            }
          },
          {
            "name": "services",
            "type": "array",
            "required": false,
            "description": "Optional explicit service ids from /api/status/catalog.",
            "constraints": {
              "minItems": 1,
              "maxItems": 20
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "bundle": "vibe-deploy-readiness",
          "includeComponents": false
        }
      },
      "exampleRequest": {
        "bundle": "vibe-deploy-readiness",
        "includeComponents": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "vibe-deploy-readiness"
        },
        "summary": {
          "status": "operational"
        },
        "results": [
          {
            "service": {
              "id": "github"
            },
            "status": "operational"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "status-stack-bundle",
      "resource": "https://agentbodega.store/api/status/stack",
      "type": "http",
      "method": "POST",
      "serviceName": "Custom Stack Status Bundle",
      "description": "Check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.",
      "longDescription": "Purpose: Check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.\nBest use: Use this when an agent needs check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: services.\nOptional fields: includeComponents.\n\nAccepted fields:\n- services (required, array): Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host. Constraints: min items: 3; max items: 20.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"services\": [\n    \"github\",\n    \"npm\",\n    \"vercel\",\n    \"supabase\",\n    \"openai\"\n  ],\n  \"includeComponents\": false\n}\n```",
      "category": "agent-utilities",
      "kind": "utility",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "status-stack-bundle",
      "offering": "Custom Stack Status Bundle",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "status-stack-bundle"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Custom Stack Status Bundle"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.status-stack-bundle",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "status-stack-bundle",
          "name": "Custom Stack Status Bundle"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "status-stack-bundle"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Custom Stack Status Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "custom-stack",
        "deploy-readiness",
        "github",
        "vercel",
        "supabase",
        "openai"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/stack",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/stack",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "services"
        ],
        "properties": {
          "services": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Services item value for Custom Stack Status Bundle."
            },
            "minItems": 3,
            "maxItems": 20,
            "description": "Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host."
          },
          "includeComponents": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "services"
        ],
        "optional": [
          "includeComponents"
        ],
        "fields": [
          {
            "name": "services",
            "type": "array",
            "required": true,
            "description": "Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host.",
            "constraints": {
              "minItems": 3,
              "maxItems": 20
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "services": [
            "github",
            "npm",
            "vercel",
            "supabase",
            "openai"
          ],
          "includeComponents": false
        }
      },
      "exampleRequest": {
        "services": [
          "github",
          "npm",
          "vercel",
          "supabase",
          "openai"
        ],
        "includeComponents": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "vibe-deploy-readiness"
        },
        "summary": {
          "status": "operational"
        },
        "results": [
          {
            "service": {
              "id": "github"
            },
            "status": "operational"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "official-status-github",
      "resource": "https://agentbodega.store/api/status/github",
      "type": "http",
      "method": "POST",
      "serviceName": "GitHub Status Check",
      "description": "Check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for GitHub Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "github",
      "shelf": "Github",
      "offeringId": "official-status-github",
      "offering": "GitHub Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "github",
        "official-status-github"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Github",
        "GitHub Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.github.official-status-github",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "github",
          "name": "Github"
        },
        "offering": {
          "id": "official-status-github",
          "name": "GitHub Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "github",
          "official-status-github"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Github",
          "GitHub Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "github",
        "git",
        "ci",
        "packages",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/github",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/github",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for GitHub Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for GitHub Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for GitHub Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "GitHub Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-gitlab",
      "resource": "https://agentbodega.store/api/status/gitlab",
      "type": "http",
      "method": "POST",
      "serviceName": "GitLab Status Check",
      "description": "Check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for GitLab Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "gitlab",
      "shelf": "Gitlab",
      "offeringId": "official-status-gitlab",
      "offering": "GitLab Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "gitlab",
        "official-status-gitlab"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Gitlab",
        "GitLab Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.gitlab.official-status-gitlab",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "gitlab",
          "name": "Gitlab"
        },
        "offering": {
          "id": "official-status-gitlab",
          "name": "GitLab Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "gitlab",
          "official-status-gitlab"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Gitlab",
          "GitLab Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "gitlab",
        "git",
        "ci",
        "packages",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/gitlab",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/gitlab",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for GitLab Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for GitLab Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for GitLab Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "GitLab Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-bitbucket",
      "resource": "https://agentbodega.store/api/status/bitbucket",
      "type": "http",
      "method": "POST",
      "serviceName": "Bitbucket Status Check",
      "description": "Check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "bitbucket",
      "shelf": "Bitbucket",
      "offeringId": "official-status-bitbucket",
      "offering": "Bitbucket Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "bitbucket",
        "official-status-bitbucket"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Bitbucket",
        "Bitbucket Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.bitbucket.official-status-bitbucket",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "bitbucket",
          "name": "Bitbucket"
        },
        "offering": {
          "id": "official-status-bitbucket",
          "name": "Bitbucket Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "bitbucket",
          "official-status-bitbucket"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Bitbucket",
          "Bitbucket Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "bitbucket",
        "git",
        "ci",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bitbucket",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bitbucket",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Bitbucket Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Bitbucket Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-npm",
      "resource": "https://agentbodega.store/api/status/npm",
      "type": "http",
      "method": "POST",
      "serviceName": "npm Status Check",
      "description": "Check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for npm Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "npm",
      "shelf": "Npm",
      "offeringId": "official-status-npm",
      "offering": "npm Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "npm",
        "official-status-npm"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Npm",
        "npm Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.npm.official-status-npm",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "npm",
          "name": "Npm"
        },
        "offering": {
          "id": "official-status-npm",
          "name": "npm Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "npm",
          "official-status-npm"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Npm",
          "npm Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "npm",
        "node",
        "packages",
        "registry",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/npm",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/npm",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for npm Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for npm Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for npm Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "npm Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-vercel",
      "resource": "https://agentbodega.store/api/status/vercel",
      "type": "http",
      "method": "POST",
      "serviceName": "Vercel Status Check",
      "description": "Check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Vercel Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "vercel",
      "shelf": "Vercel",
      "offeringId": "official-status-vercel",
      "offering": "Vercel Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "vercel",
        "official-status-vercel"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Vercel",
        "Vercel Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.vercel.official-status-vercel",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "vercel",
          "name": "Vercel"
        },
        "offering": {
          "id": "official-status-vercel",
          "name": "Vercel Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "vercel",
          "official-status-vercel"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Vercel",
          "Vercel Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "vercel",
        "deploy",
        "hosting",
        "nextjs",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/vercel",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/vercel",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Vercel Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Vercel Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Vercel Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Vercel Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-netlify",
      "resource": "https://agentbodega.store/api/status/netlify",
      "type": "http",
      "method": "POST",
      "serviceName": "Netlify Status Check",
      "description": "Check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Netlify Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "netlify",
      "shelf": "Netlify",
      "offeringId": "official-status-netlify",
      "offering": "Netlify Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "netlify",
        "official-status-netlify"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Netlify",
        "Netlify Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.netlify.official-status-netlify",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "netlify",
          "name": "Netlify"
        },
        "offering": {
          "id": "official-status-netlify",
          "name": "Netlify Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "netlify",
          "official-status-netlify"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Netlify",
          "Netlify Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "netlify",
        "deploy",
        "hosting",
        "functions",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/netlify",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/netlify",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Netlify Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Netlify Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Netlify Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Netlify Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-render",
      "resource": "https://agentbodega.store/api/status/render",
      "type": "http",
      "method": "POST",
      "serviceName": "Render Status Check",
      "description": "Check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Render Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "render",
      "shelf": "Render",
      "offeringId": "official-status-render",
      "offering": "Render Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "render",
        "official-status-render"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Render",
        "Render Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.render.official-status-render",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "render",
          "name": "Render"
        },
        "offering": {
          "id": "official-status-render",
          "name": "Render Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "render",
          "official-status-render"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Render",
          "Render Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "render",
        "deploy",
        "hosting",
        "postgres",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/render",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/render",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Render Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Render Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Render Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Render Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-fly",
      "resource": "https://agentbodega.store/api/status/fly",
      "type": "http",
      "method": "POST",
      "serviceName": "Fly.io Status Check",
      "description": "Check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "fly",
      "shelf": "Fly",
      "offeringId": "official-status-fly",
      "offering": "Fly.io Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "fly",
        "official-status-fly"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Fly",
        "Fly.io Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.fly.official-status-fly",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "fly",
          "name": "Fly"
        },
        "offering": {
          "id": "official-status-fly",
          "name": "Fly.io Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "fly",
          "official-status-fly"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Fly",
          "Fly.io Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "fly",
        "flyio",
        "deploy",
        "hosting",
        "edge",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/fly",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/fly",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Fly.io Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Fly.io Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-railway",
      "resource": "https://agentbodega.store/api/status/railway",
      "type": "http",
      "method": "POST",
      "serviceName": "Railway Status Check",
      "description": "Check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Railway Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "railway",
      "shelf": "Railway",
      "offeringId": "official-status-railway",
      "offering": "Railway Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "railway",
        "official-status-railway"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Railway",
        "Railway Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.railway.official-status-railway",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "railway",
          "name": "Railway"
        },
        "offering": {
          "id": "official-status-railway",
          "name": "Railway Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "railway",
          "official-status-railway"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Railway",
          "Railway Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "railway",
        "deploy",
        "hosting",
        "builds",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/railway",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/railway",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Railway Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Railway Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Railway Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Railway Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-coinbase",
      "resource": "https://agentbodega.store/api/status/coinbase",
      "type": "http",
      "method": "POST",
      "serviceName": "Coinbase Status Check",
      "description": "Check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "coinbase",
      "shelf": "Coinbase",
      "offeringId": "official-status-coinbase",
      "offering": "Coinbase Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "coinbase",
        "official-status-coinbase"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Coinbase",
        "Coinbase Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.coinbase.official-status-coinbase",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "coinbase",
          "name": "Coinbase"
        },
        "offering": {
          "id": "official-status-coinbase",
          "name": "Coinbase Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "coinbase",
          "official-status-coinbase"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Coinbase",
          "Coinbase Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "coinbase",
        "crypto",
        "payments",
        "wallet",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/coinbase",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/coinbase",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Coinbase Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Coinbase Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-cursor",
      "resource": "https://agentbodega.store/api/status/cursor",
      "type": "http",
      "method": "POST",
      "serviceName": "Cursor Status Check",
      "description": "Check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Cursor Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "cursor",
      "shelf": "Cursor",
      "offeringId": "official-status-cursor",
      "offering": "Cursor Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "cursor",
        "official-status-cursor"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Cursor",
        "Cursor Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.cursor.official-status-cursor",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "cursor",
          "name": "Cursor"
        },
        "offering": {
          "id": "official-status-cursor",
          "name": "Cursor Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "cursor",
          "official-status-cursor"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Cursor",
          "Cursor Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cursor",
        "ai",
        "editor",
        "ide",
        "developer-tools",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/cursor",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/cursor",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Cursor Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Cursor Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Cursor Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Cursor Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-bambulab",
      "resource": "https://agentbodega.store/api/status/bambulab",
      "type": "http",
      "method": "POST",
      "serviceName": "Bambu Lab Status Check",
      "description": "Check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "bambulab",
      "shelf": "Bambulab",
      "offeringId": "official-status-bambulab",
      "offering": "Bambu Lab Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "bambulab",
        "official-status-bambulab"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Bambulab",
        "Bambu Lab Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.bambulab.official-status-bambulab",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "bambulab",
          "name": "Bambulab"
        },
        "offering": {
          "id": "official-status-bambulab",
          "name": "Bambu Lab Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "bambulab",
          "official-status-bambulab"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Bambulab",
          "Bambu Lab Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "bambu-lab",
        "3d-printing",
        "hardware",
        "iot",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bambulab",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bambulab",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Bambu Lab Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Bambu Lab Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-ring",
      "resource": "https://agentbodega.store/api/status/ring",
      "type": "http",
      "method": "POST",
      "serviceName": "Ring Status Check",
      "description": "Check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Ring Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "ring",
      "shelf": "Ring",
      "offeringId": "official-status-ring",
      "offering": "Ring Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "ring",
        "official-status-ring"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Ring",
        "Ring Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.ring.official-status-ring",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "ring",
          "name": "Ring"
        },
        "offering": {
          "id": "official-status-ring",
          "name": "Ring Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "ring",
          "official-status-ring"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Ring",
          "Ring Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "ring",
        "iot",
        "security",
        "camera",
        "smart-home",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/ring",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/ring",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Ring Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Ring Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Ring Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Ring Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-cloudflare",
      "resource": "https://agentbodega.store/api/status/cloudflare",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloudflare Status Check",
      "description": "Check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "cloudflare",
      "shelf": "Cloudflare",
      "offeringId": "official-status-cloudflare",
      "offering": "Cloudflare Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "cloudflare",
        "official-status-cloudflare"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Cloudflare",
        "Cloudflare Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.cloudflare.official-status-cloudflare",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "cloudflare",
          "name": "Cloudflare"
        },
        "offering": {
          "id": "official-status-cloudflare",
          "name": "Cloudflare Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "cloudflare",
          "official-status-cloudflare"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Cloudflare",
          "Cloudflare Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloudflare",
        "dns",
        "cdn",
        "workers",
        "edge",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/cloudflare",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/cloudflare",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Cloudflare Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Cloudflare Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-supabase",
      "resource": "https://agentbodega.store/api/status/supabase",
      "type": "http",
      "method": "POST",
      "serviceName": "Supabase Status Check",
      "description": "Check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Supabase Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "supabase",
      "shelf": "Supabase",
      "offeringId": "official-status-supabase",
      "offering": "Supabase Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "supabase",
        "official-status-supabase"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Supabase",
        "Supabase Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.supabase.official-status-supabase",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "supabase",
          "name": "Supabase"
        },
        "offering": {
          "id": "official-status-supabase",
          "name": "Supabase Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "supabase",
          "official-status-supabase"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Supabase",
          "Supabase Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "supabase",
        "postgres",
        "auth",
        "storage",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/supabase",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/supabase",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Supabase Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Supabase Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Supabase Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Supabase Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-convex",
      "resource": "https://agentbodega.store/api/status/convex",
      "type": "http",
      "method": "POST",
      "serviceName": "Convex Status Check",
      "description": "Check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Convex Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "convex",
      "shelf": "Convex",
      "offeringId": "official-status-convex",
      "offering": "Convex Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "convex",
        "official-status-convex"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Convex",
        "Convex Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.convex.official-status-convex",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "convex",
          "name": "Convex"
        },
        "offering": {
          "id": "official-status-convex",
          "name": "Convex Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "convex",
          "official-status-convex"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Convex",
          "Convex Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "convex",
        "backend",
        "database",
        "realtime",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/convex",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/convex",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Convex Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Convex Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Convex Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Convex Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-clerk",
      "resource": "https://agentbodega.store/api/status/clerk",
      "type": "http",
      "method": "POST",
      "serviceName": "Clerk Status Check",
      "description": "Check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Clerk Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "clerk",
      "shelf": "Clerk",
      "offeringId": "official-status-clerk",
      "offering": "Clerk Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "clerk",
        "official-status-clerk"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Clerk",
        "Clerk Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.clerk.official-status-clerk",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "clerk",
          "name": "Clerk"
        },
        "offering": {
          "id": "official-status-clerk",
          "name": "Clerk Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "clerk",
          "official-status-clerk"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Clerk",
          "Clerk Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "clerk",
        "auth",
        "identity",
        "sessions",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/clerk",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/clerk",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Clerk Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Clerk Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Clerk Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Clerk Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-openai",
      "resource": "https://agentbodega.store/api/status/openai",
      "type": "http",
      "method": "POST",
      "serviceName": "OpenAI Status Check",
      "description": "Check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "openai",
      "shelf": "Openai",
      "offeringId": "official-status-openai",
      "offering": "OpenAI Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "openai",
        "official-status-openai"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Openai",
        "OpenAI Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.openai.official-status-openai",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "openai",
          "name": "Openai"
        },
        "offering": {
          "id": "official-status-openai",
          "name": "OpenAI Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "openai",
          "official-status-openai"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Openai",
          "OpenAI Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "openai",
        "ai",
        "llm",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/openai",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/openai",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for OpenAI Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "OpenAI Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-anthropic",
      "resource": "https://agentbodega.store/api/status/anthropic",
      "type": "http",
      "method": "POST",
      "serviceName": "Anthropic Claude Status Check",
      "description": "Check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "anthropic",
      "shelf": "Anthropic",
      "offeringId": "official-status-anthropic",
      "offering": "Anthropic Claude Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "anthropic",
        "official-status-anthropic"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Anthropic",
        "Anthropic Claude Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.anthropic.official-status-anthropic",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "anthropic",
          "name": "Anthropic"
        },
        "offering": {
          "id": "official-status-anthropic",
          "name": "Anthropic Claude Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "anthropic",
          "official-status-anthropic"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Anthropic",
          "Anthropic Claude Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "anthropic",
        "claude",
        "ai",
        "llm",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/anthropic",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/anthropic",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Anthropic Claude Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Anthropic Claude Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "domain-launch-check",
      "resource": "https://agentbodega.store/api/check/domain",
      "type": "http",
      "method": "POST",
      "serviceName": "DNS SSL Email Launch Check",
      "description": "Check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.",
      "longDescription": "Purpose: Check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.\nBest use: Use this when an agent needs check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: domain.\nOptional fields: dkimSelectors.\n\nAccepted fields:\n- domain (required, string): Domain name to inspect, without a URL scheme. Constraints: min length: 1.\n- dkimSelectors (optional, array): Optional DKIM selectors to check, such as google or selector1. Constraints: max items: 10.\n\nExample request body:\n```json\n{\n  \"domain\": \"example.com\",\n  \"dkimSelectors\": [\n    \"google\",\n    \"selector1\"\n  ]\n}\n```",
      "category": "launch-checks",
      "kind": "utility",
      "departmentId": "launch-checks",
      "department": "Launch Checks",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "domain-launch-check",
      "offering": "DNS SSL Email Launch Check",
      "pathIds": [
        "launch-checks",
        "readiness-audits",
        "utility",
        "domain-launch-check"
      ],
      "pathLabels": [
        "Launch Checks",
        "Readiness Audits",
        "Utility",
        "DNS SSL Email Launch Check"
      ],
      "taxonomyPath": "launch-checks.readiness-audits.utility.domain-launch-check",
      "layout": {
        "department": {
          "id": "launch-checks",
          "name": "Launch Checks"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "domain-launch-check",
          "name": "DNS SSL Email Launch Check"
        },
        "pathIds": [
          "launch-checks",
          "readiness-audits",
          "utility",
          "domain-launch-check"
        ],
        "pathLabels": [
          "Launch Checks",
          "Readiness Audits",
          "Utility",
          "DNS SSL Email Launch Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "dns",
        "ssl",
        "email",
        "deliverability",
        "launch-check"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/domain",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/domain",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "domain"
        ],
        "properties": {
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Domain name to inspect, without a URL scheme."
          },
          "dkimSelectors": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Dkim Selectors item value for DNS SSL Email Launch Check."
            },
            "maxItems": 10,
            "description": "Optional DKIM selectors to check, such as google or selector1."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "domain"
        ],
        "optional": [
          "dkimSelectors"
        ],
        "fields": [
          {
            "name": "domain",
            "type": "string",
            "required": true,
            "description": "Domain name to inspect, without a URL scheme.",
            "constraints": {
              "minLength": 1
            }
          },
          {
            "name": "dkimSelectors",
            "type": "array",
            "required": false,
            "description": "Optional DKIM selectors to check, such as google or selector1.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "domain": "example.com",
          "dkimSelectors": [
            "google",
            "selector1"
          ]
        }
      },
      "exampleRequest": {
        "domain": "example.com",
        "dkimSelectors": [
          "google",
          "selector1"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "domain": "example.com",
        "summary": {
          "status": "pass",
          "score": 92
        },
        "checks": [
          {
            "name": "https",
            "status": "pass"
          },
          {
            "name": "spf",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "hosted-artifact",
      "resource": "https://agentbodega.store/api/artifacts",
      "type": "http",
      "method": "POST",
      "serviceName": "Temporary Hosted Artifact",
      "description": "Create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.",
      "longDescription": "Purpose: Create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.\nBest use: Use this when an agent needs create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: kind, content.\nOptional fields: contentType, ttlSeconds, filename.\n\nAccepted fields:\n- kind (required, string): Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\".\n- content (required, any): Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json.\n- contentType (optional, string): Optional MIME type override.\n- ttlSeconds (optional, integer): Artifact lifetime in seconds. Constraints: default: 86400; min: 60; max: 604800.\n- filename (optional, string): Optional display filename. Constraints: max length: 120.\n\nExample request body:\n```json\n{\n  \"kind\": \"json\",\n  \"content\": {\n    \"ok\": true,\n    \"message\": \"hello agent\"\n  },\n  \"ttlSeconds\": 3600\n}\n```",
      "category": "agent-utilities",
      "kind": "http-json",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "hosted-artifact",
      "offering": "Temporary Hosted Artifact",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "hosted-artifact"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Temporary Hosted Artifact"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.hosted-artifact",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "hosted-artifact",
          "name": "Temporary Hosted Artifact"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "hosted-artifact"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Temporary Hosted Artifact"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "artifact-hosting",
        "webhook-bin",
        "signed-url",
        "agent-tools"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/artifacts",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/artifacts",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "kind",
          "content"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "text",
              "json",
              "svg",
              "redirect"
            ],
            "description": "Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\"."
          },
          "content": {
            "description": "Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json."
          },
          "contentType": {
            "type": "string",
            "description": "Optional MIME type override."
          },
          "ttlSeconds": {
            "type": "integer",
            "minimum": 60,
            "maximum": 604800,
            "default": 86400,
            "description": "Artifact lifetime in seconds."
          },
          "filename": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional display filename."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "kind",
          "content"
        ],
        "optional": [
          "contentType",
          "ttlSeconds",
          "filename"
        ],
        "fields": [
          {
            "name": "kind",
            "type": "string",
            "required": true,
            "description": "Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\".",
            "constraints": {
              "enum": [
                "text",
                "json",
                "svg",
                "redirect"
              ]
            }
          },
          {
            "name": "content",
            "type": "any",
            "required": true,
            "description": "Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json."
          },
          {
            "name": "contentType",
            "type": "string",
            "required": false,
            "description": "Optional MIME type override."
          },
          {
            "name": "ttlSeconds",
            "type": "integer",
            "required": false,
            "description": "Artifact lifetime in seconds.",
            "constraints": {
              "default": 86400,
              "minimum": 60,
              "maximum": 604800
            }
          },
          {
            "name": "filename",
            "type": "string",
            "required": false,
            "description": "Optional display filename.",
            "constraints": {
              "maxLength": 120
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "kind": "json",
          "content": {
            "ok": true,
            "message": "hello agent"
          },
          "ttlSeconds": 3600
        }
      },
      "exampleRequest": {
        "kind": "json",
        "content": {
          "ok": true,
          "message": "hello agent"
        },
        "ttlSeconds": 3600
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "artifactUrl",
          "expiresAt"
        ],
        "properties": {
          "artifactUrl": {
            "type": "string",
            "format": "uri"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "outputExample": {
        "artifactUrl": "signed hosted URL",
        "expiresAt": "2026-07-04T16:00:00.000Z",
        "bytes": 128
      },
      "configured": false
    },
    {
      "id": "agent-launch-audit",
      "resource": "https://agentbodega.store/api/audit/agent-launch",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Launch Audit",
      "description": "Audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.",
      "longDescription": "Purpose: Audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.\nBest use: Use this when an agent needs audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: siteType, includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Launch Audit. Constraints: format: uri. Constraints: format: uri.\n- siteType (optional, string): Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"siteType\": \"all\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-launch-audit",
      "offering": "Agent Launch Audit",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-launch-audit"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Launch Audit"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-launch-audit",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-launch-audit",
          "name": "Agent Launch Audit"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-launch-audit"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Launch Audit"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "launch-audit",
        "mcp",
        "agent-skills",
        "x402",
        "seo"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/audit/agent-launch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/audit/agent-launch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Launch Audit. Constraints: format: uri."
          },
          "siteType": {
            "type": "string",
            "enum": [
              "all",
              "content",
              "api"
            ],
            "default": "all",
            "description": "Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "siteType",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Launch Audit. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "siteType",
            "type": "string",
            "required": false,
            "description": "Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "content",
                "api"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "siteType": "all",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "siteType": "all",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 86,
          "verdict": "agent-ready with fixes"
        },
        "checks": [
          {
            "name": "OpenAPI",
            "status": "pass"
          },
          {
            "name": "x402 discovery",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-discoverability-check",
      "resource": "https://agentbodega.store/api/check/agent-discoverability",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Discoverability Check",
      "description": "Check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.",
      "longDescription": "Purpose: Check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.\nBest use: Use this when an agent needs check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Discoverability Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-discoverability-check",
      "offering": "Agent Discoverability Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-discoverability-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Discoverability Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-discoverability-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-discoverability-check",
          "name": "Agent Discoverability Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-discoverability-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Discoverability Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "robots",
        "sitemap",
        "llms",
        "markdown",
        "link-headers"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-discoverability",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-discoverability",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Discoverability Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Discoverability Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 78
        },
        "checks": [
          {
            "name": "robots.txt",
            "status": "pass"
          },
          {
            "name": "sitemap",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-protocol-check",
      "resource": "https://agentbodega.store/api/check/agent-protocols",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Protocol Discovery Check",
      "description": "Check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.",
      "longDescription": "Purpose: Check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.\nBest use: Use this when an agent needs check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Protocol Discovery Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-protocol-check",
      "offering": "Agent Protocol Discovery Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-protocol-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Protocol Discovery Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-protocol-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-protocol-check",
          "name": "Agent Protocol Discovery Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-protocol-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Protocol Discovery Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "openapi",
        "mcp",
        "agent-skills",
        "oauth",
        "a2a",
        "webmcp"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-protocols",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-protocols",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Protocol Discovery Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Protocol Discovery Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 82
        },
        "checks": [
          {
            "name": "OpenAPI",
            "status": "pass"
          },
          {
            "name": "MCP card",
            "status": "neutral"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-commerce-check",
      "resource": "https://agentbodega.store/api/check/agent-commerce",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Commerce Check",
      "description": "Check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.",
      "longDescription": "Purpose: Check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.\nBest use: Use this when an agent needs check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Commerce Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-commerce-check",
      "offering": "Agent Commerce Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-commerce-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Commerce Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-commerce-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-commerce-check",
          "name": "Agent Commerce Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-commerce-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Commerce Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "x402",
        "mpp",
        "ucp",
        "acp",
        "commerce"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-commerce",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-commerce",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Commerce Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Commerce Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 70
        },
        "checks": [
          {
            "name": "x402",
            "status": "pass"
          },
          {
            "name": "payment hints",
            "status": "neutral"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-readiness-batch",
      "resource": "https://agentbodega.store/api/audit/agent-batch",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Readiness Batch Audit",
      "description": "Run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.",
      "longDescription": "Purpose: Run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.\nBest use: Use this when an agent needs run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: urls.\nOptional fields: scope, includeEvidence.\n\nAccepted fields:\n- urls (required, array): List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5. Constraints: min items: 1; max items: 5.\n- scope (optional, string): Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"urls\": [\n    \"https://example.com\",\n    \"https://example.org\"\n  ],\n  \"scope\": \"all\",\n  \"includeEvidence\": false\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-readiness-batch",
      "offering": "Agent Readiness Batch Audit",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-readiness-batch"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Readiness Batch Audit"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-readiness-batch",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-readiness-batch",
          "name": "Agent Readiness Batch Audit"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-readiness-batch"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Readiness Batch Audit"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "batch-audit",
        "launch-audit",
        "seo",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/audit/agent-batch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/audit/agent-batch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri",
              "description": "Urls item value for Agent Readiness Batch Audit. Constraints: format: uri."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5."
          },
          "scope": {
            "type": "string",
            "enum": [
              "all",
              "discoverability",
              "protocols",
              "commerce"
            ],
            "default": "all",
            "description": "Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "urls"
        ],
        "optional": [
          "scope",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "urls",
            "type": "array",
            "required": true,
            "description": "List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5.",
            "constraints": {
              "minItems": 1,
              "maxItems": 5
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "scope",
            "type": "string",
            "required": false,
            "description": "Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "discoverability",
                "protocols",
                "commerce"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "urls": [
            "https://example.com",
            "https://example.org"
          ],
          "scope": "all",
          "includeEvidence": false
        }
      },
      "exampleRequest": {
        "urls": [
          "https://example.com",
          "https://example.org"
        ],
        "scope": "all",
        "includeEvidence": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "compared": 3,
          "best": "example.com"
        },
        "results": [
          {
            "site": "example.com",
            "score": 86
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-ready-badge",
      "resource": "https://agentbodega.store/api/badge/agent-ready",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Ready Badge",
      "description": "Generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.",
      "longDescription": "Purpose: Generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.\nBest use: Use this when an agent needs generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: scope, includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Ready Badge. Constraints: format: uri. Constraints: format: uri.\n- scope (optional, string): Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"scope\": \"all\",\n  \"includeEvidence\": false\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-ready-badge",
      "offering": "Agent Ready Badge",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-ready-badge"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Ready Badge"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-ready-badge",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-ready-badge",
          "name": "Agent Ready Badge"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-ready-badge"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Ready Badge"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "badge",
        "svg",
        "launch-audit"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/badge/agent-ready",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/badge/agent-ready",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Ready Badge. Constraints: format: uri."
          },
          "scope": {
            "type": "string",
            "enum": [
              "all",
              "discoverability",
              "protocols",
              "commerce"
            ],
            "default": "all",
            "description": "Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "scope",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Ready Badge. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "scope",
            "type": "string",
            "required": false,
            "description": "Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "discoverability",
                "protocols",
                "commerce"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "scope": "all",
          "includeEvidence": false
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "scope": "all",
        "includeEvidence": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "score": 86,
        "badgeSvg": "<svg>...</svg>",
        "summary": {
          "verdict": "agent-ready"
        }
      },
      "configured": false
    },
    {
      "id": "x402-directory-pack",
      "resource": "https://agentbodega.store/api/package/x402-directory",
      "type": "http",
      "method": "POST",
      "serviceName": "x402 Directory Listing Pack",
      "description": "Build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.",
      "longDescription": "Purpose: Build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.\nBest use: Use this when an agent needs build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: name, tags.\n\nAccepted fields:\n- url (required, string): Url value for x402 Directory Listing Pack. Constraints: format: uri. Constraints: format: uri.\n- name (optional, string): Name value for x402 Directory Listing Pack. Constraints: max length: 80. Constraints: max length: 80.\n- tags (optional, array): List of tags values for x402 Directory Listing Pack. Constraints: max items: 12. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"name\": \"Example x402 API\",\n  \"tags\": [\n    \"x402\",\n    \"agents\"\n  ]\n}\n```",
      "category": "x402-tools",
      "kind": "http-json",
      "departmentId": "x402-tools",
      "department": "x402 Tools",
      "aisleId": "payment-discovery",
      "aisle": "Payment Discovery",
      "shelfId": "directory-packaging",
      "shelf": "Directory Packaging",
      "offeringId": "x402-directory-pack",
      "offering": "x402 Directory Listing Pack",
      "pathIds": [
        "x402-tools",
        "payment-discovery",
        "directory-packaging",
        "x402-directory-pack"
      ],
      "pathLabels": [
        "x402 Tools",
        "Payment Discovery",
        "Directory Packaging",
        "x402 Directory Listing Pack"
      ],
      "taxonomyPath": "x402-tools.payment-discovery.directory-packaging.x402-directory-pack",
      "layout": {
        "department": {
          "id": "x402-tools",
          "name": "x402 Tools"
        },
        "aisle": {
          "id": "payment-discovery",
          "name": "Payment Discovery"
        },
        "shelf": {
          "id": "directory-packaging",
          "name": "Directory Packaging"
        },
        "offering": {
          "id": "x402-directory-pack",
          "name": "x402 Directory Listing Pack"
        },
        "pathIds": [
          "x402-tools",
          "payment-discovery",
          "directory-packaging",
          "x402-directory-pack"
        ],
        "pathLabels": [
          "x402 Tools",
          "Payment Discovery",
          "Directory Packaging",
          "x402 Directory Listing Pack"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "x402",
        "directory-listing",
        "marketplace",
        "bazaar",
        "discovery"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/package/x402-directory",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/package/x402-directory",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for x402 Directory Listing Pack. Constraints: format: uri."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Name value for x402 Directory Listing Pack. Constraints: max length: 80."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Tags item value for x402 Directory Listing Pack."
            },
            "maxItems": 12,
            "description": "List of tags values for x402 Directory Listing Pack. Constraints: max items: 12."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "name",
          "tags"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for x402 Directory Listing Pack. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Name value for x402 Directory Listing Pack. Constraints: max length: 80.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "tags",
            "type": "array",
            "required": false,
            "description": "List of tags values for x402 Directory Listing Pack. Constraints: max items: 12.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "name": "Example x402 API",
          "tags": [
            "x402",
            "agents"
          ]
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "name": "Example x402 API",
        "tags": [
          "x402",
          "agents"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "listing": {
          "payableResourceCount": 12,
          "score": 91
        },
        "files": [
          {
            "name": "openapi.json"
          },
          {
            "name": "x402 discovery"
          }
        ]
      },
      "configured": false
    }
  ],
  "services": [
    {
      "id": "x402-inspector",
      "resource": "https://agentbodega.store/api/inspect/x402",
      "type": "http",
      "method": "POST",
      "serviceName": "x402 Endpoint Inspector",
      "description": "Inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.",
      "longDescription": "Purpose: Inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.\nBest use: Use this when an agent needs inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: method, headers, body, timeoutMs.\n\nAccepted fields:\n- url (required, string): Url value for x402 Endpoint Inspector. Constraints: format: uri. Constraints: format: uri.\n- method (optional, string): Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\".\n- headers (optional, object): Headers object for configuring x402 Endpoint Inspector.\n- body (optional, object): Body object for configuring x402 Endpoint Inspector.\n- timeoutMs (optional, integer): Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000. Constraints: default: 5000; min: 500; max: 8000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com/api/paid\"\n}\n```",
      "category": "x402-tools",
      "kind": "http-json",
      "departmentId": "x402-tools",
      "department": "x402 Tools",
      "aisleId": "payment-discovery",
      "aisle": "Payment Discovery",
      "shelfId": "endpoint-inspection",
      "shelf": "Endpoint Inspection",
      "offeringId": "x402-inspector",
      "offering": "x402 Endpoint Inspector",
      "pathIds": [
        "x402-tools",
        "payment-discovery",
        "endpoint-inspection",
        "x402-inspector"
      ],
      "pathLabels": [
        "x402 Tools",
        "Payment Discovery",
        "Endpoint Inspection",
        "x402 Endpoint Inspector"
      ],
      "taxonomyPath": "x402-tools.payment-discovery.endpoint-inspection.x402-inspector",
      "layout": {
        "department": {
          "id": "x402-tools",
          "name": "x402 Tools"
        },
        "aisle": {
          "id": "payment-discovery",
          "name": "Payment Discovery"
        },
        "shelf": {
          "id": "endpoint-inspection",
          "name": "Endpoint Inspection"
        },
        "offering": {
          "id": "x402-inspector",
          "name": "x402 Endpoint Inspector"
        },
        "pathIds": [
          "x402-tools",
          "payment-discovery",
          "endpoint-inspection",
          "x402-inspector"
        ],
        "pathLabels": [
          "x402 Tools",
          "Payment Discovery",
          "Endpoint Inspection",
          "x402 Endpoint Inspector"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "x402",
        "inspection",
        "agent-tools",
        "bazaar",
        "openapi"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/inspect/x402",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/inspect/x402",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for x402 Endpoint Inspector. Constraints: format: uri."
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "HEAD",
              "POST"
            ],
            "default": "GET",
            "description": "Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\"."
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Headers object for configuring x402 Endpoint Inspector."
          },
          "body": {
            "type": "object",
            "additionalProperties": true,
            "description": "Body object for configuring x402 Endpoint Inspector."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 500,
            "maximum": 8000,
            "default": 5000,
            "description": "Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "method",
          "headers",
          "body",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for x402 Endpoint Inspector. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "method",
            "type": "string",
            "required": false,
            "description": "Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\".",
            "constraints": {
              "enum": [
                "GET",
                "HEAD",
                "POST"
              ],
              "default": "GET"
            }
          },
          {
            "name": "headers",
            "type": "object",
            "required": false,
            "description": "Headers object for configuring x402 Endpoint Inspector."
          },
          {
            "name": "body",
            "type": "object",
            "required": false,
            "description": "Body object for configuring x402 Endpoint Inspector."
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000.",
            "constraints": {
              "default": 5000,
              "minimum": 500,
              "maximum": 8000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com/api/paid"
        }
      },
      "exampleRequest": {
        "url": "https://example.com/api/paid"
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "paymentRequired": true,
        "status": 402,
        "metadataQuality": {
          "score": 100
        },
        "discovery": {
          "x402": {
            "status": 200
          },
          "openapi": {
            "status": 200
          }
        }
      },
      "configured": false
    },
    {
      "id": "public-data-catalog",
      "resource": "https://agentbodega.store/api/public-data/catalog",
      "type": "http",
      "method": "POST",
      "serviceName": "Public Data Catalog",
      "description": "Return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.",
      "longDescription": "Purpose: Return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.\nBest use: Use this when an agent needs return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, category, name, includeSchemas, limit.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against endpoint name, title, category, description, tags, and path.\n- category (optional, string): Optional Public Data department/category to return. Constraints: accepted values: \"catalog\", \"workflow-bundles\", \"cached-results\", \"recurring-monitoring\", \"discovery-verification\", \"data-enrichment\", \"marketplace-listings\", \"real-estate-rentals\", \"ecommerce-products-reviews\", \"health-prices\", \"jobs-hiring\", \"facebook-data\", \"social-video-intelligence\", \"news\", \"public-records\".\n- name (optional, string): Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads.\n- includeSchemas (optional, boolean): Include each endpoint's full input and output schemas. Constraints: default: true.\n- limit (optional, integer): Maximum number of endpoints to return after filters. Constraints: default: 28; min: 1; max: 50.\n\nExample request body:\n```json\n{\n  \"category\": \"public-records\",\n  \"includeSchemas\": true,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "department-catalog",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "catalog",
      "aisle": "Catalog",
      "shelfId": "catalog",
      "shelf": "Catalog",
      "offeringId": "public-data-catalog",
      "offering": "Public Data Catalog",
      "pathIds": [
        "public-data",
        "catalog",
        "catalog",
        "public-data-catalog"
      ],
      "pathLabels": [
        "Public Data",
        "Catalog",
        "Catalog",
        "Public Data Catalog"
      ],
      "taxonomyPath": "public-data.catalog.catalog.public-data-catalog",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "catalog",
          "name": "Catalog"
        },
        "shelf": {
          "id": "catalog",
          "name": "Catalog"
        },
        "offering": {
          "id": "public-data-catalog",
          "name": "Public Data Catalog"
        },
        "pathIds": [
          "public-data",
          "catalog",
          "catalog",
          "public-data-catalog"
        ],
        "pathLabels": [
          "Public Data",
          "Catalog",
          "Catalog",
          "Public Data Catalog"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data-department",
        "public-data",
        "catalog",
        "marketplace-listings",
        "real-estate",
        "ecommerce",
        "facebook-data",
        "jobs",
        "public-records",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/catalog",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/catalog",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Optional text filter matched against endpoint name, title, category, description, tags, and path."
          },
          "category": {
            "type": "string",
            "enum": [
              "catalog",
              "workflow-bundles",
              "cached-results",
              "recurring-monitoring",
              "discovery-verification",
              "data-enrichment",
              "marketplace-listings",
              "real-estate-rentals",
              "ecommerce-products-reviews",
              "health-prices",
              "jobs-hiring",
              "facebook-data",
              "social-video-intelligence",
              "news",
              "public-records"
            ],
            "description": "Optional Public Data department/category to return."
          },
          "name": {
            "type": "string",
            "description": "Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads."
          },
          "includeSchemas": {
            "type": "boolean",
            "default": true,
            "description": "Include each endpoint's full input and output schemas."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 28,
            "description": "Maximum number of endpoints to return after filters."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "category",
          "name",
          "includeSchemas",
          "limit"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against endpoint name, title, category, description, tags, and path."
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional Public Data department/category to return.",
            "constraints": {
              "enum": [
                "catalog",
                "workflow-bundles",
                "cached-results",
                "recurring-monitoring",
                "discovery-verification",
                "data-enrichment",
                "marketplace-listings",
                "real-estate-rentals",
                "ecommerce-products-reviews",
                "health-prices",
                "jobs-hiring",
                "facebook-data",
                "social-video-intelligence",
                "news",
                "public-records"
              ]
            }
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads."
          },
          {
            "name": "includeSchemas",
            "type": "boolean",
            "required": false,
            "description": "Include each endpoint's full input and output schemas.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum number of endpoints to return after filters.",
            "constraints": {
              "default": 28,
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "category": "public-records",
          "includeSchemas": true,
          "limit": 10
        }
      },
      "exampleRequest": {
        "category": "public-records",
        "includeSchemas": true,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "department",
          "categories",
          "endpoints"
        ],
        "properties": {
          "department": {
            "type": "object",
            "additionalProperties": true
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "department": {
          "name": "AgentBodega Public Data Department",
          "department": "Public Data"
        },
        "categories": [
          {
            "category": "public-records",
            "count": 3
          }
        ],
        "endpoints": [
          {
            "name": "osha-violations-scraper",
            "category": "public-records",
            "price": {
              "mode": "dynamic"
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "social-media-catalog",
      "resource": "https://agentbodega.store/api/social-media/catalog",
      "type": "http",
      "method": "POST",
      "serviceName": "Social Media Department Catalog",
      "description": "Return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.",
      "longDescription": "Purpose: Return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.\nBest use: Use this when an agent needs return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: platform, query, includeSchemas, includeExternalPattern, includeCoverageMap, limit.\n\nAccepted fields:\n- platform (optional, string): Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department. Constraints: accepted values: \"all\", \"x\", \"twitter\", \"tiktok\", \"instagram\", \"facebook\", \"reddit\", \"youtube\", \"linkedin\", \"threads\", \"bluesky\", \"pinterest\", \"twitch\", \"snapchat\", \"github\", \"spotify\", \"soundcloud\", \"rumble\", \"truthsocial\", \"web\", \"amazon\", \"inference\", \"ads\", \"link-in-bio\", \"ugc\"; default: \"all\".\n- query (optional, string): Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases.\n- includeSchemas (optional, boolean): Include full schemas for configured AgentBodega social data endpoints. Constraints: default: true.\n- includeExternalPattern (optional, boolean): Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources. Constraints: default: true.\n- includeCoverageMap (optional, boolean): Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources. Constraints: default: true.\n- limit (optional, integer): Maximum configured endpoints and pattern rows to return. Constraints: default: 20; min: 1; max: 50.\n\nExample request body:\n```json\n{\n  \"platform\": \"all\",\n  \"includeExternalPattern\": true,\n  \"includeCoverageMap\": true,\n  \"includeSchemas\": true,\n  \"limit\": 50\n}\n```",
      "category": "social-media",
      "kind": "department-catalog",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "catalog",
      "aisle": "Catalog",
      "offeringId": "social-media-catalog",
      "offering": "Social Media Department Catalog",
      "pathIds": [
        "social-media",
        "catalog",
        "social-media-catalog"
      ],
      "pathLabels": [
        "Social Media",
        "Catalog",
        "Social Media Department Catalog"
      ],
      "taxonomyPath": "social-media.catalog.social-media-catalog",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "catalog",
          "name": "Catalog"
        },
        "offering": {
          "id": "social-media-catalog",
          "name": "Social Media Department Catalog"
        },
        "pathIds": [
          "social-media",
          "catalog",
          "social-media-catalog"
        ],
        "pathLabels": [
          "Social Media",
          "Catalog",
          "Social Media Department Catalog"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "tiktok",
        "facebook",
        "instagram",
        "reddit",
        "youtube",
        "linkedin",
        "threads",
        "bluesky",
        "pinterest",
        "twitch",
        "spotify",
        "ads",
        "ugc",
        "public-data",
        "creator-research",
        "social-listening"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/catalog",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/catalog",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "all",
              "x",
              "twitter",
              "tiktok",
              "instagram",
              "facebook",
              "reddit",
              "youtube",
              "linkedin",
              "threads",
              "bluesky",
              "pinterest",
              "twitch",
              "snapchat",
              "github",
              "spotify",
              "soundcloud",
              "rumble",
              "truthsocial",
              "web",
              "amazon",
              "inference",
              "ads",
              "link-in-bio",
              "ugc"
            ],
            "default": "all",
            "description": "Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department."
          },
          "query": {
            "type": "string",
            "description": "Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases."
          },
          "includeSchemas": {
            "type": "boolean",
            "default": true,
            "description": "Include full schemas for configured AgentBodega social data endpoints."
          },
          "includeExternalPattern": {
            "type": "boolean",
            "default": true,
            "description": "Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources."
          },
          "includeCoverageMap": {
            "type": "boolean",
            "default": true,
            "description": "Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Maximum configured endpoints and pattern rows to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "platform",
          "query",
          "includeSchemas",
          "includeExternalPattern",
          "includeCoverageMap",
          "limit"
        ],
        "fields": [
          {
            "name": "platform",
            "type": "string",
            "required": false,
            "description": "Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department.",
            "constraints": {
              "enum": [
                "all",
                "x",
                "twitter",
                "tiktok",
                "instagram",
                "facebook",
                "reddit",
                "youtube",
                "linkedin",
                "threads",
                "bluesky",
                "pinterest",
                "twitch",
                "snapchat",
                "github",
                "spotify",
                "soundcloud",
                "rumble",
                "truthsocial",
                "web",
                "amazon",
                "inference",
                "ads",
                "link-in-bio",
                "ugc"
              ],
              "default": "all"
            }
          },
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases."
          },
          {
            "name": "includeSchemas",
            "type": "boolean",
            "required": false,
            "description": "Include full schemas for configured AgentBodega social data endpoints.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeExternalPattern",
            "type": "boolean",
            "required": false,
            "description": "Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeCoverageMap",
            "type": "boolean",
            "required": false,
            "description": "Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum configured endpoints and pattern rows to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "platform": "all",
          "includeExternalPattern": true,
          "includeCoverageMap": true,
          "includeSchemas": true,
          "limit": 50
        }
      },
      "exampleRequest": {
        "platform": "all",
        "includeExternalPattern": true,
        "includeCoverageMap": true,
        "includeSchemas": true,
        "limit": 50
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "department",
          "endpoints",
          "xTwitterReadOnlyPattern",
          "socialCoveragePattern"
        ],
        "properties": {
          "department": {
            "type": "object",
            "additionalProperties": true
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "xTwitterReadOnlyPattern": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "socialCoveragePattern": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "nextSteps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "department": {
          "name": "AgentBodega Social Media Department",
          "department": "Social Media"
        },
        "endpoints": [
          {
            "name": "facebook-page-posts-scraper",
            "platform": "facebook",
            "configured": true
          }
        ],
        "xTwitterReadOnlyPattern": [
          {
            "id": "x-tweet-search",
            "status": "available",
            "priceUsd": "0.06",
            "configured": true
          }
        ],
        "socialCoveragePattern": [
          {
            "id": "tiktok-social-video",
            "status": "staged",
            "configured": false,
            "plannedProducts": [
              "profiles",
              "videos",
              "comments",
              "search"
            ]
          }
        ]
      },
      "configured": false
    },
    {
      "id": "web-search",
      "resource": "https://agentbodega.store/api/web/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Search",
      "description": "Search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.",
      "longDescription": "Purpose: Search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.\nBest use: Use this when an agent needs search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: query.\nOptional fields: limit, site, freshness, includeSnippets, timeoutMs.\n\nAccepted fields:\n- query (required, string): Natural-language search query or keyword query to run against public web results. Constraints: min length: 2; max length: 240.\n- limit (optional, integer): Maximum normalized results to return. Constraints: default: 5; min: 1; max: 10.\n- site (optional, string): Optional public domain scope, such as example.com. URL-like values are normalized to the hostname. Constraints: max length: 120.\n- freshness (optional, string): Optional freshness preference. Use any when recency is not required. Constraints: accepted values: \"any\", \"day\", \"week\", \"month\", \"year\"; default: \"any\".\n- includeSnippets (optional, boolean): Set false to omit result snippets and return titles, URLs, domains, and rank only. Constraints: default: true.\n- timeoutMs (optional, integer): Search timeout in milliseconds. Constraints: default: 6000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"query\": \"agent payment APIs\",\n  \"limit\": 5,\n  \"freshness\": \"any\",\n  \"includeSnippets\": true\n}\n```",
      "category": "search-web",
      "kind": "web-search-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "search",
      "aisle": "Search",
      "shelfId": "web-results",
      "shelf": "Web Results",
      "offeringId": "web-search",
      "offering": "Web Search",
      "pathIds": [
        "search-web",
        "search",
        "web-results",
        "web-search"
      ],
      "pathLabels": [
        "Search & Web",
        "Search",
        "Web Results",
        "Web Search"
      ],
      "taxonomyPath": "search-web.search.web-results.web-search",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "search",
          "name": "Search"
        },
        "shelf": {
          "id": "web-results",
          "name": "Web Results"
        },
        "offering": {
          "id": "web-search",
          "name": "Web Search"
        },
        "pathIds": [
          "search-web",
          "search",
          "web-results",
          "web-search"
        ],
        "pathLabels": [
          "Search & Web",
          "Search",
          "Web Results",
          "Web Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "search",
        "source-discovery",
        "citations",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 240,
            "description": "Natural-language search query or keyword query to run against public web results."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum normalized results to return."
          },
          "site": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname."
          },
          "freshness": {
            "type": "string",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "year"
            ],
            "default": "any",
            "description": "Optional freshness preference. Use any when recency is not required."
          },
          "includeSnippets": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit result snippets and return titles, URLs, domains, and rank only."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 6000,
            "description": "Search timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "query"
        ],
        "optional": [
          "limit",
          "site",
          "freshness",
          "includeSnippets",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Natural-language search query or keyword query to run against public web results.",
            "constraints": {
              "minLength": 2,
              "maxLength": 240
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized results to return.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "site",
            "type": "string",
            "required": false,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "freshness",
            "type": "string",
            "required": false,
            "description": "Optional freshness preference. Use any when recency is not required.",
            "constraints": {
              "enum": [
                "any",
                "day",
                "week",
                "month",
                "year"
              ],
              "default": "any"
            }
          },
          {
            "name": "includeSnippets",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit result snippets and return titles, URLs, domains, and rank only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Search timeout in milliseconds.",
            "constraints": {
              "default": 6000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "agent payment APIs",
          "limit": 5,
          "freshness": "any",
          "includeSnippets": true
        }
      },
      "exampleRequest": {
        "query": "agent payment APIs",
        "limit": 5,
        "freshness": "any",
        "includeSnippets": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "search",
          "results",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "search": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-search",
          "name": "Web Search",
          "department": "Search & Web"
        },
        "requested": {
          "query": "agent payment APIs",
          "site": null,
          "freshness": "any",
          "limit": 5,
          "includeSnippets": true
        },
        "source": {
          "routing": "managed-web-search",
          "upstreamDetailsDisclosed": false
        },
        "search": {
          "query": "agent payment APIs",
          "resultCount": 2,
          "checkedAt": "2026-07-07T00:00:00.000Z",
          "durationMs": 420
        },
        "results": [
          {
            "rank": 1,
            "title": "Agent Payment API Guide",
            "url": "https://example.com/agent-payments",
            "domain": "example.com",
            "snippet": "A guide to payment-enabled API calls for agents."
          },
          {
            "rank": 2,
            "title": "x402 API Examples",
            "url": "https://example.org/x402-examples",
            "domain": "example.org",
            "snippet": "Examples of HTTP 402 payment flows."
          }
        ],
        "limits": {
          "maxResults": 10,
          "timeoutMs": 6000
        }
      },
      "configured": false
    },
    {
      "id": "web-answer",
      "resource": "https://agentbodega.store/api/web/answer",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Answer",
      "description": "Answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.",
      "longDescription": "Purpose: Answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.\nBest use: Use this when an agent needs answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: query.\nOptional fields: limit, maxSources, site, freshness, answerStyle, includeSourceText, timeoutMs.\n\nAccepted fields:\n- query (required, string): Question or research task to answer from public web results. Constraints: min length: 2; max length: 240.\n- limit (optional, integer): Maximum search results to inspect before building the answer. Constraints: default: 5; min: 1; max: 10.\n- maxSources (optional, integer): Maximum result pages to fetch and cite. Constraints: default: 3; min: 1; max: 5.\n- site (optional, string): Optional public domain scope, such as example.com. URL-like values are normalized to the hostname. Constraints: max length: 120.\n- freshness (optional, string): Optional freshness preference. Use any when recency is not required. Constraints: accepted values: \"any\", \"day\", \"week\", \"month\", \"year\"; default: \"any\".\n- answerStyle (optional, string): Brief returns a shorter answer; standard includes more evidence. Constraints: accepted values: \"brief\", \"standard\"; default: \"standard\".\n- includeSourceText (optional, boolean): Set true to include short source text excerpts used for the answer. Constraints: default: false.\n- timeoutMs (optional, integer): Search and source fetch timeout in milliseconds. Constraints: default: 6000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"query\": \"What are x402 paid APIs?\",\n  \"maxSources\": 3,\n  \"answerStyle\": \"standard\",\n  \"freshness\": \"any\"\n}\n```",
      "category": "search-web",
      "kind": "web-answer-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "answer",
      "aisle": "Answer",
      "shelfId": "cited-answers",
      "shelf": "Cited Answers",
      "offeringId": "web-answer",
      "offering": "Web Answer",
      "pathIds": [
        "search-web",
        "answer",
        "cited-answers",
        "web-answer"
      ],
      "pathLabels": [
        "Search & Web",
        "Answer",
        "Cited Answers",
        "Web Answer"
      ],
      "taxonomyPath": "search-web.answer.cited-answers.web-answer",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "answer",
          "name": "Answer"
        },
        "shelf": {
          "id": "cited-answers",
          "name": "Cited Answers"
        },
        "offering": {
          "id": "web-answer",
          "name": "Web Answer"
        },
        "pathIds": [
          "search-web",
          "answer",
          "cited-answers",
          "web-answer"
        ],
        "pathLabels": [
          "Search & Web",
          "Answer",
          "Cited Answers",
          "Web Answer"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "answer",
        "citations",
        "source-grounded",
        "research",
        "summary",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/answer",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/answer",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 240,
            "description": "Question or research task to answer from public web results."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum search results to inspect before building the answer."
          },
          "maxSources": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 3,
            "description": "Maximum result pages to fetch and cite."
          },
          "site": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname."
          },
          "freshness": {
            "type": "string",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "year"
            ],
            "default": "any",
            "description": "Optional freshness preference. Use any when recency is not required."
          },
          "answerStyle": {
            "type": "string",
            "enum": [
              "brief",
              "standard"
            ],
            "default": "standard",
            "description": "Brief returns a shorter answer; standard includes more evidence."
          },
          "includeSourceText": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include short source text excerpts used for the answer."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 6000,
            "description": "Search and source fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "query"
        ],
        "optional": [
          "limit",
          "maxSources",
          "site",
          "freshness",
          "answerStyle",
          "includeSourceText",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Question or research task to answer from public web results.",
            "constraints": {
              "minLength": 2,
              "maxLength": 240
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum search results to inspect before building the answer.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "maxSources",
            "type": "integer",
            "required": false,
            "description": "Maximum result pages to fetch and cite.",
            "constraints": {
              "default": 3,
              "minimum": 1,
              "maximum": 5
            }
          },
          {
            "name": "site",
            "type": "string",
            "required": false,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "freshness",
            "type": "string",
            "required": false,
            "description": "Optional freshness preference. Use any when recency is not required.",
            "constraints": {
              "enum": [
                "any",
                "day",
                "week",
                "month",
                "year"
              ],
              "default": "any"
            }
          },
          {
            "name": "answerStyle",
            "type": "string",
            "required": false,
            "description": "Brief returns a shorter answer; standard includes more evidence.",
            "constraints": {
              "enum": [
                "brief",
                "standard"
              ],
              "default": "standard"
            }
          },
          {
            "name": "includeSourceText",
            "type": "boolean",
            "required": false,
            "description": "Set true to include short source text excerpts used for the answer.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Search and source fetch timeout in milliseconds.",
            "constraints": {
              "default": 6000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "What are x402 paid APIs?",
          "maxSources": 3,
          "answerStyle": "standard",
          "freshness": "any"
        }
      },
      "exampleRequest": {
        "query": "What are x402 paid APIs?",
        "maxSources": 3,
        "answerStyle": "standard",
        "freshness": "any"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "answer",
          "sources",
          "search",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "answer": {
            "type": "object",
            "additionalProperties": true
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "search": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-answer",
          "name": "Web Answer",
          "department": "Search & Web"
        },
        "requested": {
          "query": "What are x402 paid APIs?",
          "site": null,
          "freshness": "any",
          "limit": 5,
          "maxSources": 3,
          "answerStyle": "standard",
          "includeSourceText": false
        },
        "source": {
          "routing": "managed-web-answer",
          "upstreamDetailsDisclosed": false
        },
        "answer": {
          "summary": "x402 paid APIs are HTTP endpoints that return a payment challenge before fulfillment, then provide the requested JSON result after payment settlement.",
          "confidence": "medium",
          "method": "extractive_cited_summary",
          "generatedAt": "2026-07-07T00:00:00.000Z"
        },
        "sources": [
          {
            "rank": 1,
            "title": "x402 API Examples",
            "url": "https://example.org/x402-examples",
            "domain": "example.org",
            "snippet": "Examples of HTTP 402 payment flows.",
            "used": true
          }
        ],
        "search": {
          "resultCount": 2,
          "fetchedSources": 1,
          "checkedAt": "2026-07-07T00:00:00.000Z",
          "durationMs": 830
        },
        "limits": {
          "maxResults": 10,
          "maxSources": 5,
          "timeoutMs": 6000
        }
      },
      "configured": false
    },
    {
      "id": "jwt-inspector",
      "resource": "https://agentbodega.store/api/developer/jwt/inspect",
      "type": "http",
      "method": "POST",
      "serviceName": "JWT Inspector",
      "description": "Decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.",
      "longDescription": "Purpose: Decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.\nBest use: Use this when an agent needs decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: token.\nOptional fields: expectedIssuer, expectedAudience, now, includeRaw.\n\nAccepted fields:\n- token (required, string): Compact JWT string with three dot-separated Base64URL segments. Constraints: min length: 20; max length: 8192.\n- expectedIssuer (optional, string): Optional issuer value to compare with the token iss claim. Constraints: max length: 300.\n- expectedAudience (optional, string): Optional audience value to compare with the token aud claim. Constraints: max length: 300.\n- now (optional, integer): Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time. Constraints: min: 0.\n- includeRaw (optional, boolean): Set true to include the raw header and payload objects. The signature is never returned. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature\",\n  \"expectedIssuer\": \"https://issuer.example\",\n  \"expectedAudience\": \"agent-api\",\n  \"includeRaw\": false\n}\n```",
      "category": "developer-utilities",
      "kind": "jwt-inspection-tool",
      "departmentId": "developer-utilities",
      "department": "Developer Utilities",
      "aisleId": "jwt",
      "aisle": "JWT",
      "shelfId": "inspect",
      "shelf": "Inspect",
      "offeringId": "jwt-inspector",
      "offering": "JWT Inspector",
      "pathIds": [
        "developer-utilities",
        "jwt",
        "inspect",
        "jwt-inspector"
      ],
      "pathLabels": [
        "Developer Utilities",
        "JWT",
        "Inspect",
        "JWT Inspector"
      ],
      "taxonomyPath": "developer-utilities.jwt.inspect.jwt-inspector",
      "layout": {
        "department": {
          "id": "developer-utilities",
          "name": "Developer Utilities"
        },
        "aisle": {
          "id": "jwt",
          "name": "JWT"
        },
        "shelf": {
          "id": "inspect",
          "name": "Inspect"
        },
        "offering": {
          "id": "jwt-inspector",
          "name": "JWT Inspector"
        },
        "pathIds": [
          "developer-utilities",
          "jwt",
          "inspect",
          "jwt-inspector"
        ],
        "pathLabels": [
          "Developer Utilities",
          "JWT",
          "Inspect",
          "JWT Inspector"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "developer-utilities",
        "jwt",
        "auth-debug",
        "token-inspection",
        "api-debug",
        "security",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/developer/jwt/inspect",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/developer/jwt/inspect",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "minLength": 20,
            "maxLength": 8192,
            "description": "Compact JWT string with three dot-separated Base64URL segments."
          },
          "expectedIssuer": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional issuer value to compare with the token iss claim."
          },
          "expectedAudience": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional audience value to compare with the token aud claim."
          },
          "now": {
            "type": "integer",
            "minimum": 0,
            "description": "Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time."
          },
          "includeRaw": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include the raw header and payload objects. The signature is never returned."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "token"
        ],
        "optional": [
          "expectedIssuer",
          "expectedAudience",
          "now",
          "includeRaw"
        ],
        "fields": [
          {
            "name": "token",
            "type": "string",
            "required": true,
            "description": "Compact JWT string with three dot-separated Base64URL segments.",
            "constraints": {
              "minLength": 20,
              "maxLength": 8192
            }
          },
          {
            "name": "expectedIssuer",
            "type": "string",
            "required": false,
            "description": "Optional issuer value to compare with the token iss claim.",
            "constraints": {
              "maxLength": 300
            }
          },
          {
            "name": "expectedAudience",
            "type": "string",
            "required": false,
            "description": "Optional audience value to compare with the token aud claim.",
            "constraints": {
              "maxLength": 300
            }
          },
          {
            "name": "now",
            "type": "integer",
            "required": false,
            "description": "Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "includeRaw",
            "type": "boolean",
            "required": false,
            "description": "Set true to include the raw header and payload objects. The signature is never returned.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature",
          "expectedIssuer": "https://issuer.example",
          "expectedAudience": "agent-api",
          "includeRaw": false
        }
      },
      "exampleRequest": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature",
        "expectedIssuer": "https://issuer.example",
        "expectedAudience": "agent-api",
        "includeRaw": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "token",
          "header",
          "claims",
          "checks",
          "warnings",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "token": {
            "type": "object",
            "additionalProperties": true
          },
          "header": {
            "type": "object",
            "additionalProperties": true
          },
          "claims": {
            "type": "object",
            "additionalProperties": true
          },
          "checks": {
            "type": "object",
            "additionalProperties": true
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "jwt-inspector",
          "name": "JWT Inspector",
          "department": "Developer Utilities"
        },
        "requested": {
          "expectedIssuer": "https://issuer.example",
          "expectedAudience": "agent-api",
          "includeRaw": false
        },
        "token": {
          "format": "compact-jwt",
          "segments": 3,
          "signaturePresent": true,
          "signatureVerified": false
        },
        "header": {
          "alg": "HS256",
          "typ": "JWT"
        },
        "claims": {
          "issuer": "https://issuer.example",
          "subject": "user_123",
          "audience": [
            "agent-api"
          ],
          "expiresAt": {
            "unix": 1893456000,
            "iso": "2030-01-01T00:00:00.000Z",
            "status": "valid"
          },
          "issuedAt": {
            "unix": 1704067200,
            "iso": "2024-01-01T00:00:00.000Z"
          }
        },
        "checks": {
          "issuer": "match",
          "audience": "match",
          "expired": false,
          "notBefore": "not_present",
          "issuedAtInFuture": false
        },
        "warnings": [
          "Signature was decoded but not cryptographically verified."
        ],
        "limits": {
          "maxTokenChars": 8192
        }
      },
      "configured": false
    },
    {
      "id": "web-fetch",
      "resource": "https://agentbodega.store/api/web/fetch",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Page Fetch",
      "description": "Fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.",
      "longDescription": "Purpose: Fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.\nBest use: Use this when an agent needs fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeHtml, includeLinks, maxBytes, maxLinks, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected. Constraints: format: uri.\n- includeHtml (optional, boolean): Set true to return a truncated sanitized HTML excerpt. Constraints: default: false.\n- includeLinks (optional, boolean): Set true to extract normalized outbound and same-page links up to maxLinks. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read before truncating extraction. Constraints: default: 32768; min: 1024; max: 65536.\n- maxLinks (optional, integer): Maximum links to return when includeLinks is true. Constraints: default: 20; min: 0; max: 50.\n- timeoutMs (optional, integer): Fetch timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeLinks\": true,\n  \"maxBytes\": 32768,\n  \"maxLinks\": 10\n}\n```",
      "category": "search-web",
      "kind": "web-extraction-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "page-extraction",
      "aisle": "Page Extraction",
      "shelfId": "fetch",
      "shelf": "Fetch",
      "offeringId": "web-fetch",
      "offering": "Web Page Fetch",
      "pathIds": [
        "search-web",
        "page-extraction",
        "fetch",
        "web-fetch"
      ],
      "pathLabels": [
        "Search & Web",
        "Page Extraction",
        "Fetch",
        "Web Page Fetch"
      ],
      "taxonomyPath": "search-web.page-extraction.fetch.web-fetch",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "page-extraction",
          "name": "Page Extraction"
        },
        "shelf": {
          "id": "fetch",
          "name": "Fetch"
        },
        "offering": {
          "id": "web-fetch",
          "name": "Web Page Fetch"
        },
        "pathIds": [
          "search-web",
          "page-extraction",
          "fetch",
          "web-fetch"
        ],
        "pathLabels": [
          "Search & Web",
          "Page Extraction",
          "Fetch",
          "Web Page Fetch"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "fetch",
        "page-extraction",
        "metadata",
        "links",
        "markdown",
        "content-extraction",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/fetch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/fetch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected."
          },
          "includeHtml": {
            "type": "boolean",
            "default": false,
            "description": "Set true to return a truncated sanitized HTML excerpt."
          },
          "includeLinks": {
            "type": "boolean",
            "default": true,
            "description": "Set true to extract normalized outbound and same-page links up to maxLinks."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read before truncating extraction."
          },
          "maxLinks": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 20,
            "description": "Maximum links to return when includeLinks is true."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeHtml",
          "includeLinks",
          "maxBytes",
          "maxLinks",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeHtml",
            "type": "boolean",
            "required": false,
            "description": "Set true to return a truncated sanitized HTML excerpt.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeLinks",
            "type": "boolean",
            "required": false,
            "description": "Set true to extract normalized outbound and same-page links up to maxLinks.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read before truncating extraction.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "maxLinks",
            "type": "integer",
            "required": false,
            "description": "Maximum links to return when includeLinks is true.",
            "constraints": {
              "default": 20,
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeLinks": true,
        "maxBytes": 32768,
        "maxLinks": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "metadata",
          "text",
          "links",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true
          },
          "text": {
            "type": "object",
            "additionalProperties": true
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "htmlExcerpt": {
            "type": "string"
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-fetch",
          "name": "Web Page Fetch",
          "department": "Search & Web"
        },
        "requested": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "metadata": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonical": "https://example.com/"
        },
        "text": {
          "plain": "Example Domain\n\nThis domain is for use in illustrative examples.",
          "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples.",
          "characters": 65,
          "words": 10
        },
        "links": [
          {
            "href": "https://www.iana.org/domains/example",
            "text": "More information",
            "rel": ""
          }
        ],
        "limits": {
          "maxBytes": 32768,
          "maxLinks": 10,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "link-preview",
      "resource": "https://agentbodega.store/api/search/link-preview",
      "type": "http",
      "method": "POST",
      "serviceName": "Link Preview",
      "description": "Fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.",
      "longDescription": "Purpose: Fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.\nBest use: Use this when an agent needs fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeImage, maxBytes, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected. Constraints: format: uri.\n- includeImage (optional, boolean): Set false to omit preview image metadata while still returning title, description, and canonical URL. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read while extracting preview tags. Constraints: default: 32768; min: 1024; max: 65536.\n- timeoutMs (optional, integer): Fetch timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeImage\": true,\n  \"maxBytes\": 32768\n}\n```",
      "category": "search-web",
      "kind": "link-preview-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "page-extraction",
      "aisle": "Page Extraction",
      "shelfId": "link-preview",
      "shelf": "Link Preview",
      "offeringId": "link-preview",
      "offering": "Link Preview",
      "pathIds": [
        "search-web",
        "page-extraction",
        "link-preview",
        "link-preview"
      ],
      "pathLabels": [
        "Search & Web",
        "Page Extraction",
        "Link Preview",
        "Link Preview"
      ],
      "taxonomyPath": "search-web.page-extraction.link-preview.link-preview",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "page-extraction",
          "name": "Page Extraction"
        },
        "shelf": {
          "id": "link-preview",
          "name": "Link Preview"
        },
        "offering": {
          "id": "link-preview",
          "name": "Link Preview"
        },
        "pathIds": [
          "search-web",
          "page-extraction",
          "link-preview",
          "link-preview"
        ],
        "pathLabels": [
          "Search & Web",
          "Page Extraction",
          "Link Preview",
          "Link Preview"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "link-preview",
        "open-graph",
        "metadata",
        "page-extraction",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/search/link-preview",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/search/link-preview",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected."
          },
          "includeImage": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit preview image metadata while still returning title, description, and canonical URL."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read while extracting preview tags."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeImage",
          "maxBytes",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeImage",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit preview image metadata while still returning title, description, and canonical URL.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read while extracting preview tags.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeImage": true,
          "maxBytes": 32768
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeImage": true,
        "maxBytes": 32768
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "preview",
          "signals",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "preview": {
            "type": "object",
            "additionalProperties": true
          },
          "signals": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "link-preview",
          "name": "Link Preview",
          "department": "Search & Web"
        },
        "requested": {
          "url": "https://example.com",
          "includeImage": true,
          "maxBytes": 32768,
          "timeoutMs": 5000
        },
        "source": {
          "routing": "direct-public-fetch",
          "upstreamDetailsDisclosed": false
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "preview": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonicalUrl": "https://example.com/",
          "url": "https://example.com/",
          "domain": "example.com",
          "siteName": "",
          "type": "",
          "image": null,
          "language": "en"
        },
        "signals": {
          "title": "title",
          "description": "meta:description",
          "canonicalUrl": "link:canonical",
          "siteName": "none",
          "type": "none",
          "image": "none"
        },
        "limits": {
          "maxBytes": 32768,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "any-to-markdown",
      "resource": "https://agentbodega.store/api/documents/any-to-markdown",
      "type": "http",
      "method": "POST",
      "serviceName": "Any URL to Markdown",
      "description": "Convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.",
      "longDescription": "Purpose: Convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.\nBest use: Use this when an agent needs convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeLinks, maxBytes, maxLinks, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected. Constraints: format: uri.\n- includeLinks (optional, boolean): Set true to include normalized links that were visible in the source content. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read before truncating the markdown extraction. Constraints: default: 32768; min: 1024; max: 65536.\n- maxLinks (optional, integer): Maximum links to return when includeLinks is true. Constraints: default: 20; min: 0; max: 50.\n- timeoutMs (optional, integer): Fetch and extraction timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeLinks\": true,\n  \"maxBytes\": 32768,\n  \"maxLinks\": 10\n}\n```",
      "category": "documents-content",
      "kind": "content-extraction-tool",
      "departmentId": "documents-content",
      "department": "Documents & Content",
      "aisleId": "extraction",
      "aisle": "Extraction",
      "shelfId": "url-to-markdown",
      "shelf": "Url To Markdown",
      "offeringId": "any-to-markdown",
      "offering": "Any URL to Markdown",
      "pathIds": [
        "documents-content",
        "extraction",
        "url-to-markdown",
        "any-to-markdown"
      ],
      "pathLabels": [
        "Documents & Content",
        "Extraction",
        "Url To Markdown",
        "Any URL to Markdown"
      ],
      "taxonomyPath": "documents-content.extraction.url-to-markdown.any-to-markdown",
      "layout": {
        "department": {
          "id": "documents-content",
          "name": "Documents & Content"
        },
        "aisle": {
          "id": "extraction",
          "name": "Extraction"
        },
        "shelf": {
          "id": "url-to-markdown",
          "name": "Url To Markdown"
        },
        "offering": {
          "id": "any-to-markdown",
          "name": "Any URL to Markdown"
        },
        "pathIds": [
          "documents-content",
          "extraction",
          "url-to-markdown",
          "any-to-markdown"
        ],
        "pathLabels": [
          "Documents & Content",
          "Extraction",
          "Url To Markdown",
          "Any URL to Markdown"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "documents-content",
        "markdown",
        "content-extraction",
        "rag-prep",
        "clean-text",
        "links",
        "metadata",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/documents/any-to-markdown",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/documents/any-to-markdown",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected."
          },
          "includeLinks": {
            "type": "boolean",
            "default": true,
            "description": "Set true to include normalized links that were visible in the source content."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read before truncating the markdown extraction."
          },
          "maxLinks": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 20,
            "description": "Maximum links to return when includeLinks is true."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch and extraction timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeLinks",
          "maxBytes",
          "maxLinks",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeLinks",
            "type": "boolean",
            "required": false,
            "description": "Set true to include normalized links that were visible in the source content.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read before truncating the markdown extraction.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "maxLinks",
            "type": "integer",
            "required": false,
            "description": "Maximum links to return when includeLinks is true.",
            "constraints": {
              "default": 20,
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch and extraction timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeLinks": true,
        "maxBytes": 32768,
        "maxLinks": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "metadata",
          "text",
          "links",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true
          },
          "text": {
            "type": "object",
            "additionalProperties": true
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "any-to-markdown",
          "name": "Any URL to Markdown",
          "department": "Documents & Content"
        },
        "requested": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "metadata": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonical": "https://example.com/"
        },
        "text": {
          "plain": "Example Domain\n\nThis domain is for use in illustrative examples.",
          "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples.",
          "characters": 65,
          "words": 10
        },
        "links": [
          {
            "href": "https://www.iana.org/domains/example",
            "text": "More information",
            "rel": ""
          }
        ],
        "limits": {
          "maxBytes": 32768,
          "maxLinks": 10,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "image-format-converter",
      "resource": "https://agentbodega.store/api/media/image/convert",
      "type": "http",
      "method": "POST",
      "serviceName": "Image Format Converter",
      "description": "Create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.",
      "longDescription": "Purpose: Create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.\nBest use: Use this when an agent needs create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: imageUrl, targetFormat.\nOptional fields: width, height, fit, quality, background, filename, ttlSeconds.\n\nAccepted fields:\n- imageUrl (required, string): Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected. Constraints: format: uri.\n- targetFormat (required, string): Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend. Constraints: accepted values: \"jpg\", \"jpeg\", \"png\", \"webp\", \"avif\".\n- width (optional, integer): Optional output width in pixels. If omitted, the source width is preserved when the backend supports it. Constraints: min: 1; max: 4096.\n- height (optional, integer): Optional output height in pixels. If omitted, the source height is preserved when the backend supports it. Constraints: min: 1; max: 4096.\n- fit (optional, string): Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds. Constraints: accepted values: \"scale-down\", \"contain\", \"cover\", \"crop\", \"pad\"; default: \"scale-down\".\n- quality (optional, integer): Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded. Constraints: default: 85; min: 1; max: 95.\n- background (optional, string): Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff. Constraints: max length: 40.\n- filename (optional, string): Optional download filename. The service normalizes the extension to match targetFormat. Constraints: max length: 120.\n- ttlSeconds (optional, integer): How long the signed conversion download URL should remain usable, in seconds. Constraints: default: 3600; min: 60; max: 86400.\n\nExample request body:\n```json\n{\n  \"imageUrl\": \"https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg\",\n  \"targetFormat\": \"webp\",\n  \"width\": 800,\n  \"fit\": \"scale-down\",\n  \"quality\": 85,\n  \"ttlSeconds\": 3600\n}\n```",
      "category": "edge-ai-automation",
      "kind": "media-conversion-tool",
      "departmentId": "edge-ai-automation",
      "department": "Edge AI & Automation",
      "aisleId": "media-conversion",
      "aisle": "Media Conversion",
      "shelfId": "image-format",
      "shelf": "Image Format",
      "offeringId": "image-format-converter",
      "offering": "Image Format Converter",
      "pathIds": [
        "edge-ai-automation",
        "media-conversion",
        "image-format",
        "image-format-converter"
      ],
      "pathLabels": [
        "Edge AI & Automation",
        "Media Conversion",
        "Image Format",
        "Image Format Converter"
      ],
      "taxonomyPath": "edge-ai-automation.media-conversion.image-format.image-format-converter",
      "layout": {
        "department": {
          "id": "edge-ai-automation",
          "name": "Edge AI & Automation"
        },
        "aisle": {
          "id": "media-conversion",
          "name": "Media Conversion"
        },
        "shelf": {
          "id": "image-format",
          "name": "Image Format"
        },
        "offering": {
          "id": "image-format-converter",
          "name": "Image Format Converter"
        },
        "pathIds": [
          "edge-ai-automation",
          "media-conversion",
          "image-format",
          "image-format-converter"
        ],
        "pathLabels": [
          "Edge AI & Automation",
          "Media Conversion",
          "Image Format",
          "Image Format Converter"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "edge-ai-automation",
        "media",
        "image",
        "image-conversion",
        "heic",
        "jpg",
        "jpeg",
        "png",
        "webp",
        "avif",
        "agent-tools",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/media/image/convert",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/media/image/convert",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "imageUrl",
          "targetFormat"
        ],
        "properties": {
          "imageUrl": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected."
          },
          "targetFormat": {
            "type": "string",
            "enum": [
              "jpg",
              "jpeg",
              "png",
              "webp",
              "avif"
            ],
            "description": "Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend."
          },
          "width": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "description": "Optional output width in pixels. If omitted, the source width is preserved when the backend supports it."
          },
          "height": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "description": "Optional output height in pixels. If omitted, the source height is preserved when the backend supports it."
          },
          "fit": {
            "type": "string",
            "enum": [
              "scale-down",
              "contain",
              "cover",
              "crop",
              "pad"
            ],
            "default": "scale-down",
            "description": "Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds."
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 95,
            "default": 85,
            "description": "Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded."
          },
          "background": {
            "type": "string",
            "maxLength": 40,
            "description": "Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff."
          },
          "filename": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional download filename. The service normalizes the extension to match targetFormat."
          },
          "ttlSeconds": {
            "type": "integer",
            "minimum": 60,
            "maximum": 86400,
            "default": 3600,
            "description": "How long the signed conversion download URL should remain usable, in seconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "imageUrl",
          "targetFormat"
        ],
        "optional": [
          "width",
          "height",
          "fit",
          "quality",
          "background",
          "filename",
          "ttlSeconds"
        ],
        "fields": [
          {
            "name": "imageUrl",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "targetFormat",
            "type": "string",
            "required": true,
            "description": "Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend.",
            "constraints": {
              "enum": [
                "jpg",
                "jpeg",
                "png",
                "webp",
                "avif"
              ]
            }
          },
          {
            "name": "width",
            "type": "integer",
            "required": false,
            "description": "Optional output width in pixels. If omitted, the source width is preserved when the backend supports it.",
            "constraints": {
              "minimum": 1,
              "maximum": 4096
            }
          },
          {
            "name": "height",
            "type": "integer",
            "required": false,
            "description": "Optional output height in pixels. If omitted, the source height is preserved when the backend supports it.",
            "constraints": {
              "minimum": 1,
              "maximum": 4096
            }
          },
          {
            "name": "fit",
            "type": "string",
            "required": false,
            "description": "Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds.",
            "constraints": {
              "enum": [
                "scale-down",
                "contain",
                "cover",
                "crop",
                "pad"
              ],
              "default": "scale-down"
            }
          },
          {
            "name": "quality",
            "type": "integer",
            "required": false,
            "description": "Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded.",
            "constraints": {
              "default": 85,
              "minimum": 1,
              "maximum": 95
            }
          },
          {
            "name": "background",
            "type": "string",
            "required": false,
            "description": "Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff.",
            "constraints": {
              "maxLength": 40
            }
          },
          {
            "name": "filename",
            "type": "string",
            "required": false,
            "description": "Optional download filename. The service normalizes the extension to match targetFormat.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "ttlSeconds",
            "type": "integer",
            "required": false,
            "description": "How long the signed conversion download URL should remain usable, in seconds.",
            "constraints": {
              "default": 3600,
              "minimum": 60,
              "maximum": 86400
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
          "targetFormat": "webp",
          "width": 800,
          "fit": "scale-down",
          "quality": 85,
          "ttlSeconds": 3600
        }
      },
      "exampleRequest": {
        "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
        "targetFormat": "webp",
        "width": 800,
        "fit": "scale-down",
        "quality": 85,
        "ttlSeconds": 3600
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "conversion",
          "download",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "conversion": {
            "type": "object",
            "additionalProperties": true
          },
          "download": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "image-format-converter",
          "name": "Image Format Converter",
          "department": "Edge AI & Automation"
        },
        "requested": {
          "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
          "targetFormat": "webp",
          "width": 800,
          "fit": "scale-down",
          "quality": 85,
          "ttlSeconds": 3600
        },
        "source": {
          "contentType": "image/jpeg",
          "contentLength": 36287,
          "extension": "jpg",
          "validated": true,
          "redirectsAllowed": false
        },
        "conversion": {
          "targetFormat": "webp",
          "contentType": "image/webp",
          "filename": "JPEG_example_flower.webp"
        },
        "download": {
          "url": "https://agentbodega.store/i/signed-token",
          "method": "GET",
          "expiresAt": "2026-07-07T18:00:00.000Z"
        },
        "limits": {
          "maxSourceBytes": 10485760,
          "maxDimension": 4096,
          "maxQuality": 95,
          "maxTtlSeconds": 86400
        }
      },
      "configured": false
    },
    {
      "id": "real-estate-listings-search",
      "resource": "https://agentbodega.store/api/real-estate/listings/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Real Estate Listing Search",
      "description": "Search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.",
      "longDescription": "Purpose: Search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.\nBest use: Use this when an agent needs search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: source, mode, market, listingType, priceMin, priceMax, bedsMin, bathsMin, homeTypes, propertyType, bedrooms, sortBy, daysOnMarket, sqftMin, sqftMax, lotSizeMin, lotSizeMax, yearBuiltMin, yearBuiltMax, amenities, searchUrls, addresses, zpids, propertyIds, locationSlug, state, zipCode, maxRent, petFriendly, maxPages, filterToRequestedCity, includeSchools, includeHistory, includeDetails, smartScrape, maxResults.\n\nAccepted fields:\n- source (optional, string): Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments. Constraints: accepted values: \"auto\", \"zillow\", \"apartments\", \"realtor\"; default: \"auto\".\n- mode (optional, string): Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids. Constraints: accepted values: \"search\", \"url\", \"lookup\"; default: \"search\".\n- market (optional, string): City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX.\n- listingType (optional, string): Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\".\n- priceMin (optional, integer): Price Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- priceMax (optional, integer): Price Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- bedsMin (optional, integer): Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10. Constraints: min: 0; max: 10.\n- bathsMin (optional, integer): Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10. Constraints: min: 0; max: 10.\n- homeTypes (optional, array): List of home types values for Real Estate Listing Search. Constraints: max items: 7. Constraints: max items: 7.\n- propertyType (optional, string): Rental property type used by the Apartments-backed provider. Constraints: accepted values: \"apartments\", \"houses\", \"townhomes\", \"condos\".\n- bedrooms (optional, any): Rental bedroom filter used by the Apartments-backed provider.\n- sortBy (optional, string): Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\".\n- daysOnMarket (optional, string): Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\".\n- sqftMin (optional, integer): Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- sqftMax (optional, integer): Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- lotSizeMin (optional, integer): Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- lotSizeMax (optional, integer): Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- yearBuiltMin (optional, integer): Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030. Constraints: min: 1800; max: 2030.\n- yearBuiltMax (optional, integer): Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030. Constraints: min: 1800; max: 2030.\n- amenities (optional, array): List of amenities values for Real Estate Listing Search. Constraints: max items: 7. Constraints: max items: 7.\n- searchUrls (optional, array): Listing or search URLs for url mode. Constraints: max items: 3.\n- addresses (optional, array): Addresses for lookup mode. Constraints: max items: 10.\n- zpids (optional, array): Zillow property ids for lookup mode. Constraints: max items: 10.\n- propertyIds (optional, array): Provider property ids for lookup mode, currently used by the realtor-backed provider. Constraints: max items: 10.\n- locationSlug (optional, string): Provider-specific location slug for rental searches when city/state parsing is not enough.\n- state (optional, string): Two-letter state hint for rental searches. Constraints: min length: 2; max length: 2.\n- zipCode (optional, string): ZIP hint for rental searches.\n- maxRent (optional, integer): Maximum monthly rent. If omitted, priceMax is reused for rental searches. Constraints: min: 0.\n- petFriendly (optional, boolean): Rental search filter for pet-friendly listings. Constraints: default: false.\n- maxPages (optional, integer): Maximum rendered search pages for the Apartments-backed provider. Constraints: default: 1; min: 1; max: 2.\n- filterToRequestedCity (optional, boolean): Optional exact-city filter for Apartments-backed city searches.\n- includeSchools (optional, boolean): Include school data where the selected provider supports detail extraction. Constraints: default: true.\n- includeHistory (optional, boolean): Include price/tax history where the selected provider supports detail extraction. Constraints: default: true.\n- includeDetails (optional, boolean): Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows. Constraints: default: false.\n- smartScrape (optional, boolean): Allow the managed adapter to skip known unchanged properties where its persistent cache supports it. Constraints: default: true.\n- maxResults (optional, integer): Maximum listing rows to return. Detail-enriched calls are capped at 10 rows. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"source\": \"zillow\",\n  \"mode\": \"search\",\n  \"market\": \"Houston, TX 77008\",\n  \"listingType\": \"for_sale\",\n  \"priceMin\": 200000,\n  \"priceMax\": 500000,\n  \"bedsMin\": 3,\n  \"homeTypes\": [\n    \"houses\",\n    \"townhomes\"\n  ],\n  \"includeDetails\": false,\n  \"maxResults\": 10\n}\n```",
      "category": "real-estate",
      "kind": "real-estate-tool",
      "departmentId": "real-estate",
      "department": "Real Estate",
      "aisleId": "listing-search",
      "aisle": "Listing Search",
      "shelfId": "homes-and-rentals",
      "shelf": "Homes And Rentals",
      "offeringId": "real-estate-listings-search",
      "offering": "Real Estate Listing Search",
      "pathIds": [
        "real-estate",
        "listing-search",
        "homes-and-rentals",
        "real-estate-listings-search"
      ],
      "pathLabels": [
        "Real Estate",
        "Listing Search",
        "Homes And Rentals",
        "Real Estate Listing Search"
      ],
      "taxonomyPath": "real-estate.listing-search.homes-and-rentals.real-estate-listings-search",
      "layout": {
        "department": {
          "id": "real-estate",
          "name": "Real Estate"
        },
        "aisle": {
          "id": "listing-search",
          "name": "Listing Search"
        },
        "shelf": {
          "id": "homes-and-rentals",
          "name": "Homes And Rentals"
        },
        "offering": {
          "id": "real-estate-listings-search",
          "name": "Real Estate Listing Search"
        },
        "pathIds": [
          "real-estate",
          "listing-search",
          "homes-and-rentals",
          "real-estate-listings-search"
        ],
        "pathLabels": [
          "Real Estate",
          "Listing Search",
          "Homes And Rentals",
          "Real Estate Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "real-estate",
        "property-search",
        "home-listings",
        "housing",
        "for-sale",
        "for-rent",
        "rentals",
        "apartments",
        "apartments-com",
        "zillow",
        "realtor",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/real-estate/listings/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/real-estate/listings/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "auto",
              "zillow",
              "apartments",
              "realtor"
            ],
            "default": "auto",
            "description": "Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments."
          },
          "mode": {
            "type": "string",
            "enum": [
              "search",
              "url",
              "lookup"
            ],
            "default": "search",
            "description": "Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids."
          },
          "market": {
            "type": "string",
            "description": "City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX."
          },
          "listingType": {
            "type": "string",
            "enum": [
              "for_sale",
              "recently_sold",
              "for_rent",
              "foreclosure"
            ],
            "default": "for_sale",
            "description": "Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\"."
          },
          "priceMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Price Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "priceMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Price Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "bedsMin": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "description": "Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10."
          },
          "bathsMin": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "description": "Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10."
          },
          "homeTypes": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "string",
              "enum": [
                "houses",
                "townhomes",
                "multifamily",
                "condos",
                "land",
                "apartments",
                "manufactured"
              ],
              "description": "Home Types item filter for Real Estate Listing Search. Accepted values: \"houses\", \"townhomes\", \"multifamily\", \"condos\", \"land\", \"apartments\", \"manufactured\". Constraints: accepted values: \"houses\", \"townhomes\", \"multifamily\", \"condos\", \"land\", \"apartments\", \"manufactured\"."
            },
            "description": "List of home types values for Real Estate Listing Search. Constraints: max items: 7."
          },
          "propertyType": {
            "type": "string",
            "enum": [
              "apartments",
              "houses",
              "townhomes",
              "condos"
            ],
            "description": "Rental property type used by the Apartments-backed provider."
          },
          "bedrooms": {
            "oneOf": [
              {
                "type": "string",
                "enum": [
                  "any",
                  "studio",
                  "1",
                  "2",
                  "3",
                  "4",
                  "5+"
                ]
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 5
              }
            ],
            "description": "Rental bedroom filter used by the Apartments-backed provider."
          },
          "sortBy": {
            "type": "string",
            "enum": [
              "newest",
              "relevance",
              "pricea",
              "priced",
              "beds",
              "baths",
              "size",
              "lot",
              "zest"
            ],
            "default": "newest",
            "description": "Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\"."
          },
          "daysOnMarket": {
            "type": "string",
            "enum": [
              "",
              "1",
              "7",
              "14",
              "30",
              "90",
              "6m",
              "12m",
              "24m",
              "36m"
            ],
            "default": "",
            "description": "Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\"."
          },
          "sqftMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "sqftMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "lotSizeMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "lotSizeMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "yearBuiltMin": {
            "type": "integer",
            "minimum": 1800,
            "maximum": 2030,
            "description": "Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030."
          },
          "yearBuiltMax": {
            "type": "integer",
            "minimum": 1800,
            "maximum": 2030,
            "description": "Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030."
          },
          "amenities": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "string",
              "enum": [
                "pool",
                "ac",
                "waterfront",
                "single-story",
                "garage",
                "basement",
                "3d-tour"
              ],
              "description": "Amenities item filter for Real Estate Listing Search. Accepted values: \"pool\", \"ac\", \"waterfront\", \"single-story\", \"garage\", \"basement\", \"3d-tour\". Constraints: accepted values: \"pool\", \"ac\", \"waterfront\", \"single-story\", \"garage\", \"basement\", \"3d-tour\"."
            },
            "description": "List of amenities values for Real Estate Listing Search. Constraints: max items: 7."
          },
          "searchUrls": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "type": "string",
              "format": "uri",
              "description": "Search Urls item value for Real Estate Listing Search. Constraints: format: uri."
            },
            "description": "Listing or search URLs for url mode."
          },
          "addresses": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Addresses item value for Real Estate Listing Search."
            },
            "description": "Addresses for lookup mode."
          },
          "zpids": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Zpids item value for Real Estate Listing Search."
            },
            "description": "Zillow property ids for lookup mode."
          },
          "propertyIds": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Property Ids item value for Real Estate Listing Search."
            },
            "description": "Provider property ids for lookup mode, currently used by the realtor-backed provider."
          },
          "locationSlug": {
            "type": "string",
            "description": "Provider-specific location slug for rental searches when city/state parsing is not enough."
          },
          "state": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "description": "Two-letter state hint for rental searches."
          },
          "zipCode": {
            "type": "string",
            "description": "ZIP hint for rental searches."
          },
          "maxRent": {
            "type": "integer",
            "minimum": 0,
            "description": "Maximum monthly rent. If omitted, priceMax is reused for rental searches."
          },
          "petFriendly": {
            "type": "boolean",
            "default": false,
            "description": "Rental search filter for pet-friendly listings."
          },
          "maxPages": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2,
            "default": 1,
            "description": "Maximum rendered search pages for the Apartments-backed provider."
          },
          "filterToRequestedCity": {
            "type": "boolean",
            "description": "Optional exact-city filter for Apartments-backed city searches."
          },
          "includeSchools": {
            "type": "boolean",
            "default": true,
            "description": "Include school data where the selected provider supports detail extraction."
          },
          "includeHistory": {
            "type": "boolean",
            "default": true,
            "description": "Include price/tax history where the selected provider supports detail extraction."
          },
          "includeDetails": {
            "type": "boolean",
            "default": false,
            "description": "Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows."
          },
          "smartScrape": {
            "type": "boolean",
            "default": true,
            "description": "Allow the managed adapter to skip known unchanged properties where its persistent cache supports it."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum listing rows to return. Detail-enriched calls are capped at 10 rows."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "source",
          "mode",
          "market",
          "listingType",
          "priceMin",
          "priceMax",
          "bedsMin",
          "bathsMin",
          "homeTypes",
          "propertyType",
          "bedrooms",
          "sortBy",
          "daysOnMarket",
          "sqftMin",
          "sqftMax",
          "lotSizeMin",
          "lotSizeMax",
          "yearBuiltMin",
          "yearBuiltMax",
          "amenities",
          "searchUrls",
          "addresses",
          "zpids",
          "propertyIds",
          "locationSlug",
          "state",
          "zipCode",
          "maxRent",
          "petFriendly",
          "maxPages",
          "filterToRequestedCity",
          "includeSchools",
          "includeHistory",
          "includeDetails",
          "smartScrape",
          "maxResults"
        ],
        "fields": [
          {
            "name": "source",
            "type": "string",
            "required": false,
            "description": "Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments.",
            "constraints": {
              "enum": [
                "auto",
                "zillow",
                "apartments",
                "realtor"
              ],
              "default": "auto"
            }
          },
          {
            "name": "mode",
            "type": "string",
            "required": false,
            "description": "Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids.",
            "constraints": {
              "enum": [
                "search",
                "url",
                "lookup"
              ],
              "default": "search"
            }
          },
          {
            "name": "market",
            "type": "string",
            "required": false,
            "description": "City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX."
          },
          {
            "name": "listingType",
            "type": "string",
            "required": false,
            "description": "Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\".",
            "constraints": {
              "enum": [
                "for_sale",
                "recently_sold",
                "for_rent",
                "foreclosure"
              ],
              "default": "for_sale"
            }
          },
          {
            "name": "priceMin",
            "type": "integer",
            "required": false,
            "description": "Price Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "priceMax",
            "type": "integer",
            "required": false,
            "description": "Price Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "bedsMin",
            "type": "integer",
            "required": false,
            "description": "Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10.",
            "constraints": {
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "bathsMin",
            "type": "integer",
            "required": false,
            "description": "Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10.",
            "constraints": {
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "homeTypes",
            "type": "array",
            "required": false,
            "description": "List of home types values for Real Estate Listing Search. Constraints: max items: 7.",
            "constraints": {
              "maxItems": 7
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "propertyType",
            "type": "string",
            "required": false,
            "description": "Rental property type used by the Apartments-backed provider.",
            "constraints": {
              "enum": [
                "apartments",
                "houses",
                "townhomes",
                "condos"
              ]
            }
          },
          {
            "name": "bedrooms",
            "type": "any",
            "required": false,
            "description": "Rental bedroom filter used by the Apartments-backed provider."
          },
          {
            "name": "sortBy",
            "type": "string",
            "required": false,
            "description": "Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\".",
            "constraints": {
              "enum": [
                "newest",
                "relevance",
                "pricea",
                "priced",
                "beds",
                "baths",
                "size",
                "lot",
                "zest"
              ],
              "default": "newest"
            }
          },
          {
            "name": "daysOnMarket",
            "type": "string",
            "required": false,
            "description": "Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\".",
            "constraints": {
              "enum": [
                "",
                "1",
                "7",
                "14",
                "30",
                "90",
                "6m",
                "12m",
                "24m",
                "36m"
              ],
              "default": ""
            }
          },
          {
            "name": "sqftMin",
            "type": "integer",
            "required": false,
            "description": "Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "sqftMax",
            "type": "integer",
            "required": false,
            "description": "Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "lotSizeMin",
            "type": "integer",
            "required": false,
            "description": "Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "lotSizeMax",
            "type": "integer",
            "required": false,
            "description": "Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "yearBuiltMin",
            "type": "integer",
            "required": false,
            "description": "Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030.",
            "constraints": {
              "minimum": 1800,
              "maximum": 2030
            }
          },
          {
            "name": "yearBuiltMax",
            "type": "integer",
            "required": false,
            "description": "Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030.",
            "constraints": {
              "minimum": 1800,
              "maximum": 2030
            }
          },
          {
            "name": "amenities",
            "type": "array",
            "required": false,
            "description": "List of amenities values for Real Estate Listing Search. Constraints: max items: 7.",
            "constraints": {
              "maxItems": 7
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "searchUrls",
            "type": "array",
            "required": false,
            "description": "Listing or search URLs for url mode.",
            "constraints": {
              "maxItems": 3
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "addresses",
            "type": "array",
            "required": false,
            "description": "Addresses for lookup mode.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "zpids",
            "type": "array",
            "required": false,
            "description": "Zillow property ids for lookup mode.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "propertyIds",
            "type": "array",
            "required": false,
            "description": "Provider property ids for lookup mode, currently used by the realtor-backed provider.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "locationSlug",
            "type": "string",
            "required": false,
            "description": "Provider-specific location slug for rental searches when city/state parsing is not enough."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Two-letter state hint for rental searches.",
            "constraints": {
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "zipCode",
            "type": "string",
            "required": false,
            "description": "ZIP hint for rental searches."
          },
          {
            "name": "maxRent",
            "type": "integer",
            "required": false,
            "description": "Maximum monthly rent. If omitted, priceMax is reused for rental searches.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "petFriendly",
            "type": "boolean",
            "required": false,
            "description": "Rental search filter for pet-friendly listings.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "maxPages",
            "type": "integer",
            "required": false,
            "description": "Maximum rendered search pages for the Apartments-backed provider.",
            "constraints": {
              "default": 1,
              "minimum": 1,
              "maximum": 2
            }
          },
          {
            "name": "filterToRequestedCity",
            "type": "boolean",
            "required": false,
            "description": "Optional exact-city filter for Apartments-backed city searches."
          },
          {
            "name": "includeSchools",
            "type": "boolean",
            "required": false,
            "description": "Include school data where the selected provider supports detail extraction.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Include price/tax history where the selected provider supports detail extraction.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeDetails",
            "type": "boolean",
            "required": false,
            "description": "Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "smartScrape",
            "type": "boolean",
            "required": false,
            "description": "Allow the managed adapter to skip known unchanged properties where its persistent cache supports it.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum listing rows to return. Detail-enriched calls are capped at 10 rows.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "source": "zillow",
          "mode": "search",
          "market": "Houston, TX 77008",
          "listingType": "for_sale",
          "priceMin": 200000,
          "priceMax": 500000,
          "bedsMin": 3,
          "homeTypes": [
            "houses",
            "townhomes"
          ],
          "includeDetails": false,
          "maxResults": 10
        }
      },
      "exampleRequest": {
        "source": "zillow",
        "mode": "search",
        "market": "Houston, TX 77008",
        "listingType": "for_sale",
        "priceMin": 200000,
        "priceMax": 500000,
        "bedsMin": 3,
        "homeTypes": [
          "houses",
          "townhomes"
        ],
        "includeDetails": false,
        "maxResults": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "result_count",
          "results",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "result_count": {
            "type": "integer"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "real-estate-listings-search",
          "name": "Real Estate Listing Search",
          "department": "Real Estate"
        },
        "requested": {
          "source": "zillow",
          "mode": "search",
          "market": "Houston, TX 77008",
          "listingType": "for_sale",
          "maxResults": 10,
          "includeDetails": false
        },
        "source": {
          "selected": "zillow",
          "routing": "managed-adapter",
          "resultFreshness": "live-run",
          "upstreamDetailsDisclosed": false
        },
        "result_count": 1,
        "results": [
          {
            "source": "zillow",
            "listing_id": "27886690",
            "address": "1246 Omar St, Houston, TX 77008",
            "price_usd": 1050000,
            "beds": 4,
            "baths": 2,
            "sqft": 2454
          }
        ]
      },
      "configured": false
    },
    {
      "id": "prediction-market-search",
      "resource": "https://agentbodega.store/api/prediction-markets/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Prediction Market Search",
      "description": "Search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.",
      "longDescription": "Purpose: Search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.\nBest use: Use this when an agent needs search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, venue, activeOnly, closed, category, limit, sort, includeRules.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against market title, slug, description, outcomes, and category labels. Constraints: max length: 160.\n- venue (optional, string): Venue selector. Use managed for AgentBodega's normalized market feed. Constraints: accepted values: \"managed\", \"polymarket\"; default: \"managed\".\n- activeOnly (optional, boolean): When true, return currently active, unresolved markets only. Constraints: default: true.\n- closed (optional, boolean): Set true only when historical or resolved markets are acceptable. Constraints: default: false.\n- category (optional, string): Optional category, event, or tag filter when the caller wants a narrower market family. Constraints: max length: 80.\n- limit (optional, integer): Maximum normalized market rows to return. Constraints: default: 10; min: 1; max: 25.\n- sort (optional, string): Sort order for returned markets. Constraints: accepted values: \"volume_desc\", \"liquidity_desc\", \"newest\", \"ending_soon\"; default: \"volume_desc\".\n- includeRules (optional, boolean): Set true to include capped market rule or description text. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"query\": \"AI agents\",\n  \"category\": \"technology\",\n  \"activeOnly\": true,\n  \"limit\": 10,\n  \"sort\": \"volume_desc\",\n  \"includeRules\": false\n}\n```",
      "category": "prediction-markets",
      "kind": "market-search-tool",
      "departmentId": "prediction-markets",
      "department": "Prediction Markets",
      "aisleId": "market-search",
      "aisle": "Market Search",
      "shelfId": "search",
      "shelf": "Search",
      "offeringId": "prediction-market-search",
      "offering": "Prediction Market Search",
      "pathIds": [
        "prediction-markets",
        "market-search",
        "search",
        "prediction-market-search"
      ],
      "pathLabels": [
        "Prediction Markets",
        "Market Search",
        "Search",
        "Prediction Market Search"
      ],
      "taxonomyPath": "prediction-markets.market-search.search.prediction-market-search",
      "layout": {
        "department": {
          "id": "prediction-markets",
          "name": "Prediction Markets"
        },
        "aisle": {
          "id": "market-search",
          "name": "Market Search"
        },
        "shelf": {
          "id": "search",
          "name": "Search"
        },
        "offering": {
          "id": "prediction-market-search",
          "name": "Prediction Market Search"
        },
        "pathIds": [
          "prediction-markets",
          "market-search",
          "search",
          "prediction-market-search"
        ],
        "pathLabels": [
          "Prediction Markets",
          "Market Search",
          "Search",
          "Prediction Market Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "prediction-markets",
        "market-search",
        "markets",
        "events",
        "probabilities",
        "public-data",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/prediction-markets/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/prediction-markets/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels."
          },
          "venue": {
            "type": "string",
            "enum": [
              "managed",
              "polymarket"
            ],
            "default": "managed",
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed."
          },
          "activeOnly": {
            "type": "boolean",
            "default": true,
            "description": "When true, return currently active, unresolved markets only."
          },
          "closed": {
            "type": "boolean",
            "default": false,
            "description": "Set true only when historical or resolved markets are acceptable."
          },
          "category": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "default": 10,
            "description": "Maximum normalized market rows to return."
          },
          "sort": {
            "type": "string",
            "enum": [
              "volume_desc",
              "liquidity_desc",
              "newest",
              "ending_soon"
            ],
            "default": "volume_desc",
            "description": "Sort order for returned markets."
          },
          "includeRules": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include capped market rule or description text."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "venue",
          "activeOnly",
          "closed",
          "category",
          "limit",
          "sort",
          "includeRules"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "venue",
            "type": "string",
            "required": false,
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed.",
            "constraints": {
              "enum": [
                "managed",
                "polymarket"
              ],
              "default": "managed"
            }
          },
          {
            "name": "activeOnly",
            "type": "boolean",
            "required": false,
            "description": "When true, return currently active, unresolved markets only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "closed",
            "type": "boolean",
            "required": false,
            "description": "Set true only when historical or resolved markets are acceptable.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized market rows to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned markets.",
            "constraints": {
              "enum": [
                "volume_desc",
                "liquidity_desc",
                "newest",
                "ending_soon"
              ],
              "default": "volume_desc"
            }
          },
          {
            "name": "includeRules",
            "type": "boolean",
            "required": false,
            "description": "Set true to include capped market rule or description text.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "AI agents",
          "category": "technology",
          "activeOnly": true,
          "limit": 10,
          "sort": "volume_desc",
          "includeRules": false
        }
      },
      "exampleRequest": {
        "query": "AI agents",
        "category": "technology",
        "activeOnly": true,
        "limit": 10,
        "sort": "volume_desc",
        "includeRules": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "marketFeed",
          "count",
          "markets",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the market search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized filters and caps."
          },
          "marketFeed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Provider-neutral feed metadata and public-data boundary."
          },
          "count": {
            "type": "integer",
            "description": "Number of normalized market rows returned."
          },
          "markets": {
            "type": "array",
            "description": "Normalized prediction-market rows. These are read-only market intelligence records, not trading instructions.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable market id."
                },
                "slug": {
                  "type": "string",
                  "description": "Stable market slug when available."
                },
                "title": {
                  "type": "string",
                  "description": "Market question or title."
                },
                "url": {
                  "type": "string",
                  "description": "Public market URL when available."
                },
                "venue": {
                  "type": "string",
                  "description": "Normalized venue label."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether the market is active."
                },
                "closed": {
                  "type": "boolean",
                  "description": "Whether the market is closed or resolved."
                },
                "endsAt": {
                  "type": "string",
                  "description": "Market end timestamp when available."
                },
                "volume": {
                  "type": "number",
                  "description": "Reported all-time volume when available."
                },
                "liquidity": {
                  "type": "number",
                  "description": "Reported liquidity when available."
                },
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Outcome labels and implied prices when available."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalized category, event, or tag labels."
                },
                "rules": {
                  "type": "string",
                  "description": "Optional capped rules/description text when includeRules is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "marketFeed": {
          "type": "managed-prediction-market-feed",
          "readOnly": true,
          "noTradeExecution": true
        },
        "count": 1,
        "markets": [
          {
            "title": "Will example event happen?",
            "outcomes": [
              {
                "label": "Yes",
                "price": 0.42
              },
              {
                "label": "No",
                "price": 0.58
              }
            ],
            "volume": 125000,
            "liquidity": 32000
          }
        ]
      },
      "configured": false
    },
    {
      "id": "prediction-market-listings",
      "resource": "https://agentbodega.store/api/prediction-markets/listings",
      "type": "http",
      "method": "POST",
      "serviceName": "Prediction Market Listings",
      "description": "Return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.",
      "longDescription": "Purpose: Return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.\nBest use: Use this when an agent needs return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, venue, activeOnly, closed, category, limit, sort, includeRules.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against market title, slug, description, outcomes, and category labels. Constraints: max length: 160.\n- venue (optional, string): Venue selector. Use managed for AgentBodega's normalized market feed. Constraints: accepted values: \"managed\", \"polymarket\"; default: \"managed\".\n- activeOnly (optional, boolean): When true, return currently active, unresolved markets only. Constraints: default: true.\n- closed (optional, boolean): Set true only when historical or resolved markets are acceptable. Constraints: default: false.\n- category (optional, string): Optional category, event, or tag filter when the caller wants a narrower market family. Constraints: max length: 80.\n- limit (optional, integer): Maximum normalized market rows to return. Constraints: default: 10; min: 1; max: 25.\n- sort (optional, string): Sort order for returned markets. Constraints: accepted values: \"volume_desc\", \"liquidity_desc\", \"newest\", \"ending_soon\"; default: \"volume_desc\".\n- includeRules (optional, boolean): Set true to include capped market rule or description text. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"activeOnly\": true,\n  \"closed\": false,\n  \"limit\": 10,\n  \"sort\": \"volume_desc\",\n  \"includeRules\": false\n}\n```",
      "category": "prediction-markets",
      "kind": "market-listings-tool",
      "departmentId": "prediction-markets",
      "department": "Prediction Markets",
      "aisleId": "market-search",
      "aisle": "Market Search",
      "shelfId": "active-listings",
      "shelf": "Active Listings",
      "offeringId": "prediction-market-listings",
      "offering": "Prediction Market Listings",
      "pathIds": [
        "prediction-markets",
        "market-search",
        "active-listings",
        "prediction-market-listings"
      ],
      "pathLabels": [
        "Prediction Markets",
        "Market Search",
        "Active Listings",
        "Prediction Market Listings"
      ],
      "taxonomyPath": "prediction-markets.market-search.active-listings.prediction-market-listings",
      "layout": {
        "department": {
          "id": "prediction-markets",
          "name": "Prediction Markets"
        },
        "aisle": {
          "id": "market-search",
          "name": "Market Search"
        },
        "shelf": {
          "id": "active-listings",
          "name": "Active Listings"
        },
        "offering": {
          "id": "prediction-market-listings",
          "name": "Prediction Market Listings"
        },
        "pathIds": [
          "prediction-markets",
          "market-search",
          "active-listings",
          "prediction-market-listings"
        ],
        "pathLabels": [
          "Prediction Markets",
          "Market Search",
          "Active Listings",
          "Prediction Market Listings"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "prediction-markets",
        "market-listings",
        "markets",
        "events",
        "probabilities",
        "public-data",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/prediction-markets/listings",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/prediction-markets/listings",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels."
          },
          "venue": {
            "type": "string",
            "enum": [
              "managed",
              "polymarket"
            ],
            "default": "managed",
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed."
          },
          "activeOnly": {
            "type": "boolean",
            "default": true,
            "description": "When true, return currently active, unresolved markets only."
          },
          "closed": {
            "type": "boolean",
            "default": false,
            "description": "Set true only when historical or resolved markets are acceptable."
          },
          "category": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "default": 10,
            "description": "Maximum normalized market rows to return."
          },
          "sort": {
            "type": "string",
            "enum": [
              "volume_desc",
              "liquidity_desc",
              "newest",
              "ending_soon"
            ],
            "default": "volume_desc",
            "description": "Sort order for returned markets."
          },
          "includeRules": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include capped market rule or description text."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "venue",
          "activeOnly",
          "closed",
          "category",
          "limit",
          "sort",
          "includeRules"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "venue",
            "type": "string",
            "required": false,
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed.",
            "constraints": {
              "enum": [
                "managed",
                "polymarket"
              ],
              "default": "managed"
            }
          },
          {
            "name": "activeOnly",
            "type": "boolean",
            "required": false,
            "description": "When true, return currently active, unresolved markets only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "closed",
            "type": "boolean",
            "required": false,
            "description": "Set true only when historical or resolved markets are acceptable.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized market rows to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned markets.",
            "constraints": {
              "enum": [
                "volume_desc",
                "liquidity_desc",
                "newest",
                "ending_soon"
              ],
              "default": "volume_desc"
            }
          },
          {
            "name": "includeRules",
            "type": "boolean",
            "required": false,
            "description": "Set true to include capped market rule or description text.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "activeOnly": true,
          "closed": false,
          "limit": 10,
          "sort": "volume_desc",
          "includeRules": false
        }
      },
      "exampleRequest": {
        "activeOnly": true,
        "closed": false,
        "limit": 10,
        "sort": "volume_desc",
        "includeRules": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "marketFeed",
          "count",
          "markets",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the market search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized filters and caps."
          },
          "marketFeed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Provider-neutral feed metadata and public-data boundary."
          },
          "count": {
            "type": "integer",
            "description": "Number of normalized market rows returned."
          },
          "markets": {
            "type": "array",
            "description": "Normalized prediction-market rows. These are read-only market intelligence records, not trading instructions.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable market id."
                },
                "slug": {
                  "type": "string",
                  "description": "Stable market slug when available."
                },
                "title": {
                  "type": "string",
                  "description": "Market question or title."
                },
                "url": {
                  "type": "string",
                  "description": "Public market URL when available."
                },
                "venue": {
                  "type": "string",
                  "description": "Normalized venue label."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether the market is active."
                },
                "closed": {
                  "type": "boolean",
                  "description": "Whether the market is closed or resolved."
                },
                "endsAt": {
                  "type": "string",
                  "description": "Market end timestamp when available."
                },
                "volume": {
                  "type": "number",
                  "description": "Reported all-time volume when available."
                },
                "liquidity": {
                  "type": "number",
                  "description": "Reported liquidity when available."
                },
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Outcome labels and implied prices when available."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalized category, event, or tag labels."
                },
                "rules": {
                  "type": "string",
                  "description": "Optional capped rules/description text when includeRules is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "marketFeed": {
          "type": "managed-prediction-market-feed",
          "readOnly": true,
          "noTradeExecution": true
        },
        "count": 1,
        "markets": [
          {
            "title": "Top active example market",
            "outcomes": [
              {
                "label": "Yes",
                "price": 0.61
              },
              {
                "label": "No",
                "price": 0.39
              }
            ],
            "volume": 250000,
            "liquidity": 48000
          }
        ]
      },
      "configured": false
    },
    {
      "id": "x-user-profile",
      "resource": "https://agentbodega.store/api/social-media/x/user-profile",
      "type": "http",
      "method": "POST",
      "serviceName": "X User Profile Lookup",
      "description": "Look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.",
      "longDescription": "Purpose: Look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.\nBest use: Use this when an agent needs look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: username.\nOptional fields: none.\n\nAccepted fields:\n- username (required, string): Public username or profile URL. Leading @ is accepted and normalized. Constraints: min length: 1; max length: 80.\n\nExample request body:\n```json\n{\n  \"username\": \"OpenAI\"\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "profiles",
      "shelf": "Profiles",
      "offeringId": "x-user-profile",
      "offering": "X User Profile Lookup",
      "pathIds": [
        "social-media",
        "x-twitter",
        "profiles",
        "x-user-profile"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Profiles",
        "X User Profile Lookup"
      ],
      "taxonomyPath": "social-media.x-twitter.profiles.x-user-profile",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "profiles",
          "name": "Profiles"
        },
        "offering": {
          "id": "x-user-profile",
          "name": "X User Profile Lookup"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "profiles",
          "x-user-profile"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Profiles",
          "X User Profile Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "profile",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/user-profile",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/user-profile",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Public username or profile URL. Leading @ is accepted and normalized."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "username"
        ],
        "optional": [],
        "fields": [
          {
            "name": "username",
            "type": "string",
            "required": true,
            "description": "Public username or profile URL. Leading @ is accepted and normalized.",
            "constraints": {
              "minLength": 1,
              "maxLength": 80
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "username": "OpenAI"
        }
      },
      "exampleRequest": {
        "username": "OpenAI"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-user-profile",
          "name": "X User Profile Lookup",
          "department": "Social Media"
        },
        "requested": {
          "username": "OpenAI"
        },
        "profile": {
          "id": "44196397",
          "username": "OpenAI",
          "name": "OpenAI",
          "verified": true,
          "metrics": {
            "followers": 1000000,
            "following": 0,
            "posts": 1000
          }
        }
      },
      "configured": false
    },
    {
      "id": "x-tweet",
      "resource": "https://agentbodega.store/api/social-media/x/tweet",
      "type": "http",
      "method": "POST",
      "serviceName": "X Post Lookup",
      "description": "Look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.",
      "longDescription": "Purpose: Look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.\nBest use: Use this when an agent needs look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: tweetId, tweetUrl.\n\nAccepted fields:\n- tweetId (optional, string): Numeric public post id. Required unless tweetUrl is supplied.\n- tweetUrl (optional, string): Public post URL. Required unless tweetId is supplied. Constraints: format: uri; max length: 300.\n\nExample request body:\n```json\n{\n  \"tweetId\": \"20\"\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "posts",
      "shelf": "Posts",
      "offeringId": "x-tweet",
      "offering": "X Post Lookup",
      "pathIds": [
        "social-media",
        "x-twitter",
        "posts",
        "x-tweet"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Posts",
        "X Post Lookup"
      ],
      "taxonomyPath": "social-media.x-twitter.posts.x-tweet",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "posts",
          "name": "Posts"
        },
        "offering": {
          "id": "x-tweet",
          "name": "X Post Lookup"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "posts",
          "x-tweet"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Posts",
          "X Post Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "tweet",
        "post",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/tweet",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/tweet",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "anyOf": [
          {
            "required": [
              "tweetId"
            ]
          },
          {
            "required": [
              "tweetUrl"
            ]
          }
        ],
        "properties": {
          "tweetId": {
            "type": "string",
            "pattern": "^[0-9]{1,30}$",
            "description": "Numeric public post id. Required unless tweetUrl is supplied."
          },
          "tweetUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 300,
            "description": "Public post URL. Required unless tweetId is supplied."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "tweetId",
          "tweetUrl"
        ],
        "fields": [
          {
            "name": "tweetId",
            "type": "string",
            "required": false,
            "description": "Numeric public post id. Required unless tweetUrl is supplied."
          },
          {
            "name": "tweetUrl",
            "type": "string",
            "required": false,
            "description": "Public post URL. Required unless tweetId is supplied.",
            "constraints": {
              "format": "uri",
              "maxLength": 300
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "tweetId": "20"
        }
      },
      "exampleRequest": {
        "tweetId": "20"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-tweet",
          "name": "X Post Lookup",
          "department": "Social Media"
        },
        "requested": {
          "tweetId": "20"
        },
        "tweet": {
          "id": "20",
          "text": "Normalized public post text",
          "author": {
            "username": "jack"
          },
          "metrics": {
            "likes": 0,
            "reposts": 0,
            "replies": 0
          }
        }
      },
      "configured": false
    },
    {
      "id": "x-user-timeline",
      "resource": "https://agentbodega.store/api/social-media/x/user-timeline",
      "type": "http",
      "method": "POST",
      "serviceName": "X User Timeline",
      "description": "Return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.",
      "longDescription": "Purpose: Return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.\nBest use: Use this when an agent needs return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: username.\nOptional fields: maxResults.\n\nAccepted fields:\n- username (required, string): Public username or profile URL. Leading @ is accepted and normalized. Constraints: min length: 1; max length: 80.\n- maxResults (optional, integer): Maximum recent posts to return. Constraints: default: 20; min: 1; max: 100.\n\nExample request body:\n```json\n{\n  \"username\": \"OpenAI\",\n  \"maxResults\": 5\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "timelines",
      "shelf": "Timelines",
      "offeringId": "x-user-timeline",
      "offering": "X User Timeline",
      "pathIds": [
        "social-media",
        "x-twitter",
        "timelines",
        "x-user-timeline"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Timelines",
        "X User Timeline"
      ],
      "taxonomyPath": "social-media.x-twitter.timelines.x-user-timeline",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "timelines",
          "name": "Timelines"
        },
        "offering": {
          "id": "x-user-timeline",
          "name": "X User Timeline"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "timelines",
          "x-user-timeline"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Timelines",
          "X User Timeline"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "timeline",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/user-timeline",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/user-timeline",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Public username or profile URL. Leading @ is accepted and normalized."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "description": "Maximum recent posts to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "username"
        ],
        "optional": [
          "maxResults"
        ],
        "fields": [
          {
            "name": "username",
            "type": "string",
            "required": true,
            "description": "Public username or profile URL. Leading @ is accepted and normalized.",
            "constraints": {
              "minLength": 1,
              "maxLength": 80
            }
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum recent posts to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "username": "OpenAI",
          "maxResults": 5
        }
      },
      "exampleRequest": {
        "username": "OpenAI",
        "maxResults": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-user-timeline",
          "name": "X User Timeline",
          "department": "Social Media"
        },
        "requested": {
          "username": "OpenAI",
          "maxResults": 5
        },
        "result_count": 5,
        "results": [
          {
            "id": "1110302988",
            "text": "Normalized public post text",
            "author": {
              "username": "OpenAI"
            },
            "metrics": {
              "likes": 10,
              "reposts": 2,
              "replies": 1
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "x-tweet-search",
      "resource": "https://agentbodega.store/api/social-media/x/tweet-search",
      "type": "http",
      "method": "POST",
      "serviceName": "X Post Search",
      "description": "Search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.",
      "longDescription": "Purpose: Search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.\nBest use: Use this when an agent needs search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.\nPrice: $0.06 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, words, phrase, anyWords, noneWords, hashtags, from, to, mentioning, minReplies, minLikes, minReposts, since, until, maxResults.\n\nAccepted fields:\n- query (optional, string): Raw X/Twitter search query. If supplied, structured filter fields are ignored. Constraints: max length: 500.\n- words (optional, string): All words to include. Constraints: max length: 160.\n- phrase (optional, string): Exact phrase to include. Constraints: max length: 160.\n- anyWords (optional, array): Any of these words may match. Constraints: max items: 12.\n- noneWords (optional, array): Words to exclude. Constraints: max items: 12.\n- hashtags (optional, array): Hashtags to include, with or without #. Constraints: max items: 12.\n- from (optional, string): Only posts from this username. Constraints: max length: 80.\n- to (optional, string): Only replies to this username. Constraints: max length: 80.\n- mentioning (optional, string): Only posts mentioning this username. Constraints: max length: 80.\n- minReplies (optional, integer): Minimum reply count. Constraints: min: 0.\n- minLikes (optional, integer): Minimum like count. Constraints: min: 0.\n- minReposts (optional, integer): Minimum repost count. Constraints: min: 0.\n- since (optional, string): Start date in YYYY-MM-DD.\n- until (optional, string): End date in YYYY-MM-DD.\n- maxResults (optional, integer): Maximum posts to return. Search is capped at 20 per call. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"from\": \"OpenAI\",\n  \"words\": \"agent\",\n  \"minLikes\": 10,\n  \"maxResults\": 5\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "search",
      "shelf": "Search",
      "offeringId": "x-tweet-search",
      "offering": "X Post Search",
      "pathIds": [
        "social-media",
        "x-twitter",
        "search",
        "x-tweet-search"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Search",
        "X Post Search"
      ],
      "taxonomyPath": "social-media.x-twitter.search.x-tweet-search",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "search",
          "name": "Search"
        },
        "offering": {
          "id": "x-tweet-search",
          "name": "X Post Search"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "search",
          "x-tweet-search"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Search",
          "X Post Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "search",
        "social-listening",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/tweet-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.06"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/tweet-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "anyOf": [
          {
            "required": [
              "query"
            ]
          },
          {
            "required": [
              "words"
            ]
          },
          {
            "required": [
              "phrase"
            ]
          },
          {
            "required": [
              "hashtags"
            ]
          },
          {
            "required": [
              "from"
            ]
          }
        ],
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 500,
            "description": "Raw X/Twitter search query. If supplied, structured filter fields are ignored."
          },
          "words": {
            "type": "string",
            "maxLength": 160,
            "description": "All words to include."
          },
          "phrase": {
            "type": "string",
            "maxLength": 160,
            "description": "Exact phrase to include."
          },
          "anyWords": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "Any Words item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Any of these words may match."
          },
          "noneWords": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "None Words item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Words to exclude."
          },
          "hashtags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "Hashtags item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Hashtags to include, with or without #."
          },
          "from": {
            "type": "string",
            "maxLength": 80,
            "description": "Only posts from this username."
          },
          "to": {
            "type": "string",
            "maxLength": 80,
            "description": "Only replies to this username."
          },
          "mentioning": {
            "type": "string",
            "maxLength": 80,
            "description": "Only posts mentioning this username."
          },
          "minReplies": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum reply count."
          },
          "minLikes": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum like count."
          },
          "minReposts": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum repost count."
          },
          "since": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "Start date in YYYY-MM-DD."
          },
          "until": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "End date in YYYY-MM-DD."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum posts to return. Search is capped at 20 per call."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "words",
          "phrase",
          "anyWords",
          "noneWords",
          "hashtags",
          "from",
          "to",
          "mentioning",
          "minReplies",
          "minLikes",
          "minReposts",
          "since",
          "until",
          "maxResults"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Raw X/Twitter search query. If supplied, structured filter fields are ignored.",
            "constraints": {
              "maxLength": 500
            }
          },
          {
            "name": "words",
            "type": "string",
            "required": false,
            "description": "All words to include.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "phrase",
            "type": "string",
            "required": false,
            "description": "Exact phrase to include.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "anyWords",
            "type": "array",
            "required": false,
            "description": "Any of these words may match.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "noneWords",
            "type": "array",
            "required": false,
            "description": "Words to exclude.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "hashtags",
            "type": "array",
            "required": false,
            "description": "Hashtags to include, with or without #.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "type": "string",
            "required": false,
            "description": "Only posts from this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "to",
            "type": "string",
            "required": false,
            "description": "Only replies to this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "mentioning",
            "type": "string",
            "required": false,
            "description": "Only posts mentioning this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "minReplies",
            "type": "integer",
            "required": false,
            "description": "Minimum reply count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minLikes",
            "type": "integer",
            "required": false,
            "description": "Minimum like count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minReposts",
            "type": "integer",
            "required": false,
            "description": "Minimum repost count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "since",
            "type": "string",
            "required": false,
            "description": "Start date in YYYY-MM-DD."
          },
          {
            "name": "until",
            "type": "string",
            "required": false,
            "description": "End date in YYYY-MM-DD."
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum posts to return. Search is capped at 20 per call.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "from": "OpenAI",
          "words": "agent",
          "minLikes": 10,
          "maxResults": 5
        }
      },
      "exampleRequest": {
        "from": "OpenAI",
        "words": "agent",
        "minLikes": 10,
        "maxResults": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-tweet-search",
          "name": "X Post Search",
          "department": "Social Media"
        },
        "requested": {
          "query": "agent from:OpenAI min_faves:10",
          "maxResults": 5
        },
        "result_count": 5,
        "results": [
          {
            "id": "1110302988",
            "text": "Normalized public post text",
            "author": {
              "username": "OpenAI"
            },
            "metrics": {
              "likes": 10,
              "reposts": 2,
              "replies": 1
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "outdoor-recreation-availability",
      "resource": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
      "type": "http",
      "method": "POST",
      "serviceName": "Outdoor Recreation Availability Check",
      "description": "Check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.",
      "longDescription": "Purpose: Check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.\nBest use: Use this when an agent needs check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: resource, startDate, endDate.\nOptional fields: entityId, entityType, state, isLottery, filters, limit, includeMetadata, proxiesSx.\n\nAccepted fields:\n- resource (required, string): Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources.\n- entityId (optional, string): Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied.\n- entityType (optional, string): Optional known resource type. URLs usually imply this automatically. Constraints: accepted values: \"campground\", \"campsite\", \"permit\", \"timedentry\", \"timedentry_tour\".\n- state (optional, string): Optional state filter for name resolution, such as CA or California.\n- startDate (required, string): Start date in YYYY-MM-DD. For campgrounds this is the check-in date. Constraints: format: date.\n- endDate (required, string): End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout. Constraints: format: date.\n- isLottery (optional, boolean): For permits, request lottery quota/application state instead of post-draw/walk-up availability. Constraints: default: false.\n- filters (optional, object): Filters object for configuring Outdoor Recreation Availability Check. Object accepts: groupSize, siteType, equipment, rvLengthFt, electric, accessibility, petsAllowed, loop, availableOnly.\n- limit (optional, integer): Maximum matching sites, divisions, or slots to return. Constraints: default: 20; min: 1; max: 50.\n- includeMetadata (optional, boolean): For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available. Constraints: default: true.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"resource\": \"Upper Pines Campground\",\n  \"state\": \"CA\",\n  \"startDate\": \"2026-06-15\",\n  \"endDate\": \"2026-06-19\",\n  \"filters\": {\n    \"siteType\": \"TENT ONLY\",\n    \"groupSize\": 4,\n    \"availableOnly\": true\n  },\n  \"limit\": 5\n}\n```",
      "category": "public-data",
      "kind": "data-job",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "outdoor-recreation",
      "aisle": "Outdoor Recreation",
      "shelfId": "outdoor-recreation",
      "shelf": "Outdoor Recreation",
      "offeringId": "outdoor-recreation-availability",
      "offering": "Outdoor Recreation Availability Check",
      "pathIds": [
        "public-data",
        "outdoor-recreation",
        "outdoor-recreation",
        "outdoor-recreation-availability"
      ],
      "pathLabels": [
        "Public Data",
        "Outdoor Recreation",
        "Outdoor Recreation",
        "Outdoor Recreation Availability Check"
      ],
      "taxonomyPath": "public-data.outdoor-recreation.outdoor-recreation.outdoor-recreation-availability",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "outdoor-recreation",
          "name": "Outdoor Recreation"
        },
        "shelf": {
          "id": "outdoor-recreation",
          "name": "Outdoor Recreation"
        },
        "offering": {
          "id": "outdoor-recreation-availability",
          "name": "Outdoor Recreation Availability Check"
        },
        "pathIds": [
          "public-data",
          "outdoor-recreation",
          "outdoor-recreation",
          "outdoor-recreation-availability"
        ],
        "pathLabels": [
          "Public Data",
          "Outdoor Recreation",
          "Outdoor Recreation",
          "Outdoor Recreation Availability Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "camping",
        "permits",
        "public-data",
        "travel",
        "availability",
        "parks"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "resource",
          "startDate",
          "endDate"
        ],
        "properties": {
          "resource": {
            "type": "string",
            "description": "Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources."
          },
          "entityId": {
            "type": "string",
            "description": "Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied."
          },
          "entityType": {
            "type": "string",
            "enum": [
              "campground",
              "campsite",
              "permit",
              "timedentry",
              "timedentry_tour"
            ],
            "description": "Optional known resource type. URLs usually imply this automatically."
          },
          "state": {
            "type": "string",
            "description": "Optional state filter for name resolution, such as CA or California."
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "description": "Start date in YYYY-MM-DD. For campgrounds this is the check-in date."
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "description": "End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout."
          },
          "isLottery": {
            "type": "boolean",
            "default": false,
            "description": "For permits, request lottery quota/application state instead of post-draw/walk-up availability."
          },
          "filters": {
            "type": "object",
            "properties": {
              "groupSize": {
                "type": "integer",
                "minimum": 1,
                "description": "Group Size numeric value for Outdoor Recreation Availability Check. Constraints: min: 1."
              },
              "siteType": {
                "type": "string",
                "description": "Campground site type filter, such as tent only, RV, group, or standard."
              },
              "equipment": {
                "type": "string",
                "description": "Equipment name to match in permitted equipment, such as RV or tent."
              },
              "rvLengthFt": {
                "type": "integer",
                "minimum": 1,
                "description": "Rv Length Ft numeric value for Outdoor Recreation Availability Check. Constraints: min: 1."
              },
              "electric": {
                "type": "boolean",
                "description": "Set true to enable electric behavior for Outdoor Recreation Availability Check."
              },
              "accessibility": {
                "type": "boolean",
                "description": "Set true to enable accessibility behavior for Outdoor Recreation Availability Check."
              },
              "petsAllowed": {
                "type": "boolean",
                "description": "Set true to enable pets allowed behavior for Outdoor Recreation Availability Check."
              },
              "loop": {
                "type": "string",
                "description": "Loop value for Outdoor Recreation Availability Check."
              },
              "availableOnly": {
                "type": "boolean",
                "default": true,
                "description": "Set true to enable available only behavior for Outdoor Recreation Availability Check. Constraints: default: true."
              }
            },
            "additionalProperties": false,
            "description": "Filters object for configuring Outdoor Recreation Availability Check."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Maximum matching sites, divisions, or slots to return."
          },
          "includeMetadata": {
            "type": "boolean",
            "default": true,
            "description": "For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "resource",
          "startDate",
          "endDate"
        ],
        "optional": [
          "entityId",
          "entityType",
          "state",
          "isLottery",
          "filters",
          "limit",
          "includeMetadata",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "resource",
            "type": "string",
            "required": true,
            "description": "Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources."
          },
          {
            "name": "entityId",
            "type": "string",
            "required": false,
            "description": "Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied."
          },
          {
            "name": "entityType",
            "type": "string",
            "required": false,
            "description": "Optional known resource type. URLs usually imply this automatically.",
            "constraints": {
              "enum": [
                "campground",
                "campsite",
                "permit",
                "timedentry",
                "timedentry_tour"
              ]
            }
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Optional state filter for name resolution, such as CA or California."
          },
          {
            "name": "startDate",
            "type": "string",
            "required": true,
            "description": "Start date in YYYY-MM-DD. For campgrounds this is the check-in date.",
            "constraints": {
              "format": "date"
            }
          },
          {
            "name": "endDate",
            "type": "string",
            "required": true,
            "description": "End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout.",
            "constraints": {
              "format": "date"
            }
          },
          {
            "name": "isLottery",
            "type": "boolean",
            "required": false,
            "description": "For permits, request lottery quota/application state instead of post-draw/walk-up availability.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "filters",
            "type": "object",
            "required": false,
            "description": "Filters object for configuring Outdoor Recreation Availability Check.",
            "fields": [
              {
                "name": "groupSize",
                "type": "integer",
                "required": false,
                "description": "Group Size numeric value for Outdoor Recreation Availability Check. Constraints: min: 1.",
                "constraints": {
                  "minimum": 1
                }
              },
              {
                "name": "siteType",
                "type": "string",
                "required": false,
                "description": "Campground site type filter, such as tent only, RV, group, or standard."
              },
              {
                "name": "equipment",
                "type": "string",
                "required": false,
                "description": "Equipment name to match in permitted equipment, such as RV or tent."
              },
              {
                "name": "rvLengthFt",
                "type": "integer",
                "required": false,
                "description": "Rv Length Ft numeric value for Outdoor Recreation Availability Check. Constraints: min: 1.",
                "constraints": {
                  "minimum": 1
                }
              },
              {
                "name": "electric",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable electric behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "accessibility",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable accessibility behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "petsAllowed",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable pets allowed behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "loop",
                "type": "string",
                "required": false,
                "description": "Loop value for Outdoor Recreation Availability Check."
              },
              {
                "name": "availableOnly",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable available only behavior for Outdoor Recreation Availability Check. Constraints: default: true.",
                "constraints": {
                  "default": true
                }
              }
            ]
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum matching sites, divisions, or slots to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "includeMetadata",
            "type": "boolean",
            "required": false,
            "description": "For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "resource": "Upper Pines Campground",
          "state": "CA",
          "startDate": "2026-06-15",
          "endDate": "2026-06-19",
          "filters": {
            "siteType": "TENT ONLY",
            "groupSize": 4,
            "availableOnly": true
          },
          "limit": 5
        }
      },
      "exampleRequest": {
        "resource": "Upper Pines Campground",
        "state": "CA",
        "startDate": "2026-06-15",
        "endDate": "2026-06-19",
        "filters": {
          "siteType": "TENT ONLY",
          "groupSize": 4,
          "availableOnly": true
        },
        "limit": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "kind",
          "requested",
          "resolved",
          "checkedAt"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "campground",
              "campsite",
              "permit",
              "timedentry",
              "timedentry_tour"
            ]
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "resolved": {
            "type": "object",
            "additionalProperties": true
          },
          "sites": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "divisions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "slots": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "kind": "campground",
        "resolved": {
          "entityId": "232447",
          "entityType": "campground",
          "name": "Upper Pines Campground",
          "state": "CA"
        },
        "dateRange": {
          "checkin": "2026-06-15",
          "checkout": "2026-06-19",
          "nights": 4
        },
        "sites": [
          {
            "campsite_id": "98",
            "site_number": "040",
            "loop": "Upper Pines",
            "campsite_type": "TENT ONLY NONELECTRIC",
            "max_num_people": 6,
            "pets_allowed": "Domestic",
            "availability": {
              "2026-06-15": "Available",
              "2026-06-16": "Available",
              "2026-06-17": "Reserved",
              "2026-06-18": "Available"
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "news-headline-search",
      "resource": "https://agentbodega.store/api/public-data/news-headlines/search",
      "type": "http",
      "method": "POST",
      "serviceName": "News Headline Search",
      "description": "Search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.",
      "longDescription": "Purpose: Search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.\nBest use: Use this when an agent needs search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: topic, publisher, query, hours, limit, includeContent, minSentiment, maxSentiment, sort.\n\nAccepted fields:\n- topic (optional, string): Optional news topic filter. Use all for the full managed index. Constraints: accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\"; default: \"all\".\n- publisher (optional, string): Optional publisher/feed id filter when the caller already knows the feed label to narrow. Constraints: max length: 80.\n- query (optional, string): Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords. Constraints: max length: 160.\n- hours (optional, integer): Lookback window in hours. Defaults to the last 24 hours and is capped at 24. Constraints: default: 24; min: 1; max: 24.\n- limit (optional, integer): Maximum headline rows to return after filtering and sorting. Constraints: default: 10; min: 1; max: 50.\n- includeContent (optional, boolean): Set true to include a capped cleaned content excerpt when available. Constraints: default: false.\n- minSentiment (optional, number): Optional lower bound for compound sentiment from -1 to 1. Constraints: min: -1; max: 1.\n- maxSentiment (optional, number): Optional upper bound for compound sentiment from -1 to 1. Constraints: min: -1; max: 1.\n- sort (optional, string): Sort order for returned headlines. Constraints: accepted values: \"published_desc\", \"published_asc\", \"sentiment_desc\", \"sentiment_asc\"; default: \"published_desc\".\n\nExample request body:\n```json\n{\n  \"topic\": \"tech\",\n  \"query\": \"ai\",\n  \"hours\": 6,\n  \"limit\": 10,\n  \"sort\": \"published_desc\",\n  \"includeContent\": false\n}\n```",
      "category": "public-data",
      "kind": "news-search-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "headlines",
      "shelf": "Headlines",
      "offeringId": "news-headline-search",
      "offering": "News Headline Search",
      "pathIds": [
        "public-data",
        "news",
        "headlines",
        "news-headline-search"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Headlines",
        "News Headline Search"
      ],
      "taxonomyPath": "public-data.news.headlines.news-headline-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "headlines",
          "name": "Headlines"
        },
        "offering": {
          "id": "news-headline-search",
          "name": "News Headline Search"
        },
        "pathIds": [
          "public-data",
          "news",
          "headlines",
          "news-headline-search"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Headlines",
          "News Headline Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "headlines",
        "current-events",
        "topic-filter",
        "sentiment",
        "publisher-links",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news-headlines/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news-headlines/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "enum": [
              "all",
              "tech",
              "news",
              "business",
              "science",
              "gaming",
              "culture",
              "politics",
              "sports"
            ],
            "default": "all",
            "description": "Optional news topic filter. Use all for the full managed index."
          },
          "publisher": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional publisher/feed id filter when the caller already knows the feed label to narrow."
          },
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 24,
            "description": "Lookback window in hours. Defaults to the last 24 hours and is capped at 24."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "Maximum headline rows to return after filtering and sorting."
          },
          "includeContent": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include a capped cleaned content excerpt when available."
          },
          "minSentiment": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Optional lower bound for compound sentiment from -1 to 1."
          },
          "maxSentiment": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Optional upper bound for compound sentiment from -1 to 1."
          },
          "sort": {
            "type": "string",
            "enum": [
              "published_desc",
              "published_asc",
              "sentiment_desc",
              "sentiment_asc"
            ],
            "default": "published_desc",
            "description": "Sort order for returned headlines."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "topic",
          "publisher",
          "query",
          "hours",
          "limit",
          "includeContent",
          "minSentiment",
          "maxSentiment",
          "sort"
        ],
        "fields": [
          {
            "name": "topic",
            "type": "string",
            "required": false,
            "description": "Optional news topic filter. Use all for the full managed index.",
            "constraints": {
              "enum": [
                "all",
                "tech",
                "news",
                "business",
                "science",
                "gaming",
                "culture",
                "politics",
                "sports"
              ],
              "default": "all"
            }
          },
          {
            "name": "publisher",
            "type": "string",
            "required": false,
            "description": "Optional publisher/feed id filter when the caller already knows the feed label to narrow.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Lookback window in hours. Defaults to the last 24 hours and is capped at 24.",
            "constraints": {
              "default": 24,
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum headline rows to return after filtering and sorting.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "includeContent",
            "type": "boolean",
            "required": false,
            "description": "Set true to include a capped cleaned content excerpt when available.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "minSentiment",
            "type": "number",
            "required": false,
            "description": "Optional lower bound for compound sentiment from -1 to 1.",
            "constraints": {
              "minimum": -1,
              "maximum": 1
            }
          },
          {
            "name": "maxSentiment",
            "type": "number",
            "required": false,
            "description": "Optional upper bound for compound sentiment from -1 to 1.",
            "constraints": {
              "minimum": -1,
              "maximum": 1
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned headlines.",
            "constraints": {
              "enum": [
                "published_desc",
                "published_asc",
                "sentiment_desc",
                "sentiment_asc"
              ],
              "default": "published_desc"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "topic": "tech",
          "query": "ai",
          "hours": 6,
          "limit": 10,
          "sort": "published_desc",
          "includeContent": false
        }
      },
      "exampleRequest": {
        "topic": "tech",
        "query": "ai",
        "hours": 6,
        "limit": 10,
        "sort": "published_desc",
        "includeContent": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "feed",
          "count",
          "headlines",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when headline search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "feed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Whitelabeled managed index metadata; backend provider URLs are not disclosed."
          },
          "count": {
            "type": "integer",
            "description": "Number of headline rows returned."
          },
          "headlines": {
            "type": "array",
            "description": "Normalized headline rows.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable upstream row id or deterministic fallback."
                },
                "title": {
                  "type": "string",
                  "description": "Headline title."
                },
                "description": {
                  "type": "string",
                  "description": "Short article description or summary."
                },
                "url": {
                  "type": "string",
                  "description": "Publisher article URL."
                },
                "topic": {
                  "type": "string",
                  "description": "Assigned topic bucket."
                },
                "publisher": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Publisher/feed label when available."
                },
                "publishedAt": {
                  "type": "string",
                  "description": "Article publish timestamp when available."
                },
                "insertedAt": {
                  "type": "string",
                  "description": "Index insertion timestamp when available."
                },
                "age": {
                  "type": "string",
                  "description": "Short relative age label from the managed index."
                },
                "keywords": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Keyword labels when available."
                },
                "sentiment": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Compound, positive, negative, and neutral sentiment hints when available."
                },
                "contentText": {
                  "type": "string",
                  "description": "Optional capped cleaned content excerpt when includeContent is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for this search."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-headline-search",
          "name": "News Headline Search",
          "department": "Public Data"
        },
        "requested": {
          "topic": "tech",
          "query": "ai",
          "hours": 6,
          "limit": 10,
          "sort": "published_desc",
          "includeContent": false
        },
        "feed": {
          "type": "managed-news-index",
          "windowHours": 6,
          "upstreamDetailsDisclosed": false,
          "storyDedupeApplied": true
        },
        "count": 1,
        "headlines": [
          {
            "id": "headline_example",
            "title": "AI infrastructure startup announces new agent workflow tools",
            "description": "The company described new tools for faster agent research and data retrieval.",
            "url": "https://publisher.example/news/ai-agent-workflow-tools",
            "topic": "tech",
            "publisher": {
              "id": "publisher-example",
              "domain": "publisher.example"
            },
            "publishedAt": "2026-07-07T19:35:14.000Z",
            "insertedAt": "2026-07-07T19:36:00.000Z",
            "age": "24m",
            "keywords": [
              "AI",
              "agents",
              "workflow"
            ],
            "sentiment": {
              "compound": 0.12,
              "positive": 0.18,
              "negative": 0.02,
              "neutral": 0.8
            }
          }
        ],
        "limits": {
          "maxLimit": 50,
          "maxLookbackHours": 24,
          "maxContentChars": 1500
        }
      },
      "configured": false
    },
    {
      "id": "news-briefing-summary",
      "resource": "https://agentbodega.store/api/public-data/news-briefing/summary",
      "type": "http",
      "method": "POST",
      "serviceName": "News Briefing Summary",
      "description": "Return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.",
      "longDescription": "Purpose: Return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.\nBest use: Use this when an agent needs return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, limit.\n\nAccepted fields:\n- query (optional, string): Optional case-insensitive filter matched against briefing titles and summary text. Constraints: max length: 160.\n- limit (optional, integer): Maximum briefing items to return. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"query\": \"technology\",\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "news-briefing-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "briefings",
      "shelf": "Briefings",
      "offeringId": "news-briefing-summary",
      "offering": "News Briefing Summary",
      "pathIds": [
        "public-data",
        "news",
        "briefings",
        "news-briefing-summary"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Briefings",
        "News Briefing Summary"
      ],
      "taxonomyPath": "public-data.news.briefings.news-briefing-summary",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "briefings",
          "name": "Briefings"
        },
        "offering": {
          "id": "news-briefing-summary",
          "name": "News Briefing Summary"
        },
        "pathIds": [
          "public-data",
          "news",
          "briefings",
          "news-briefing-summary"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Briefings",
          "News Briefing Summary"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "briefing",
        "summary",
        "current-events",
        "situational-awareness",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news-briefing/summary",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news-briefing/summary",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional case-insensitive filter matched against briefing titles and summary text."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum briefing items to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "limit"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional case-insensitive filter matched against briefing titles and summary text.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum briefing items to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "technology",
          "limit": 10
        }
      },
      "exampleRequest": {
        "query": "technology",
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "briefing",
          "count",
          "items",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the briefing was parsed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "briefing": {
            "type": "object",
            "additionalProperties": true,
            "description": "Whitelabeled briefing metadata and refresh cadence."
          },
          "count": {
            "type": "integer",
            "description": "Number of briefing items returned."
          },
          "items": {
            "type": "array",
            "description": "Briefing items in source order.",
            "items": {
              "type": "object",
              "required": [
                "rank",
                "title",
                "summary"
              ],
              "properties": {
                "rank": {
                  "type": "integer",
                  "description": "One-based rank in the briefing."
                },
                "title": {
                  "type": "string",
                  "description": "Briefing topic or headline."
                },
                "summary": {
                  "type": "string",
                  "description": "Compact summary of the development."
                }
              },
              "additionalProperties": false
            }
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for this briefing fetch."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-briefing-summary",
          "name": "News Briefing Summary",
          "department": "Public Data"
        },
        "requested": {
          "query": "technology",
          "limit": 10
        },
        "briefing": {
          "window": "rolling_24h",
          "refreshCadence": "multiple-times-daily",
          "upstreamDetailsDisclosed": false
        },
        "count": 1,
        "items": [
          {
            "rank": 1,
            "title": "Technology stocks rebound",
            "summary": "Several technology names recovered after new product announcements and stronger demand commentary."
          }
        ]
      },
      "configured": false
    },
    {
      "id": "news-morning-briefing",
      "resource": "https://agentbodega.store/api/public-data/news/morning-briefing",
      "type": "http",
      "method": "POST",
      "serviceName": "Morning Briefing",
      "description": "Build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.",
      "longDescription": "Purpose: Build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.\nBest use: Use this when an agent needs build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: focus, topics, hours, maxItemsPerSection, includeCitations.\n\nAccepted fields:\n- focus (optional, string): Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name. Constraints: max length: 160.\n- topics (optional, array): Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index. Constraints: max items: 6.\n- hours (optional, integer): Lookback window in hours. Defaults to the last 12 hours and is capped at 24. Constraints: default: 12; min: 1; max: 24.\n- maxItemsPerSection (optional, integer): Maximum normalized headline rows returned in each briefing section. Constraints: default: 4; min: 1; max: 8.\n- includeCitations (optional, boolean): Set false to omit the flattened citation list while keeping URLs on section items. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"focus\": \"ai markets\",\n  \"topics\": [\n    \"news\",\n    \"business\",\n    \"tech\"\n  ],\n  \"hours\": 12,\n  \"maxItemsPerSection\": 4,\n  \"includeCitations\": true\n}\n```",
      "category": "public-data",
      "kind": "news-briefing-bundle",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "briefings",
      "shelf": "Briefings",
      "offeringId": "news-morning-briefing",
      "offering": "Morning Briefing",
      "pathIds": [
        "public-data",
        "news",
        "briefings",
        "news-morning-briefing"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Briefings",
        "Morning Briefing"
      ],
      "taxonomyPath": "public-data.news.briefings.news-morning-briefing",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "briefings",
          "name": "Briefings"
        },
        "offering": {
          "id": "news-morning-briefing",
          "name": "Morning Briefing"
        },
        "pathIds": [
          "public-data",
          "news",
          "briefings",
          "news-morning-briefing"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Briefings",
          "Morning Briefing"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "briefing",
        "morning-briefing",
        "markets",
        "ai",
        "crypto",
        "current-events",
        "citations",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news/morning-briefing",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news/morning-briefing",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "focus": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name."
          },
          "topics": {
            "type": "array",
            "maxItems": 6,
            "items": {
              "type": "string",
              "enum": [
                "all",
                "tech",
                "news",
                "business",
                "science",
                "gaming",
                "culture",
                "politics",
                "sports"
              ],
              "description": "Topics item filter for Morning Briefing. Accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\". Constraints: accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\"."
            },
            "description": "Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 12,
            "description": "Lookback window in hours. Defaults to the last 12 hours and is capped at 24."
          },
          "maxItemsPerSection": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8,
            "default": 4,
            "description": "Maximum normalized headline rows returned in each briefing section."
          },
          "includeCitations": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit the flattened citation list while keeping URLs on section items."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "focus",
          "topics",
          "hours",
          "maxItemsPerSection",
          "includeCitations"
        ],
        "fields": [
          {
            "name": "focus",
            "type": "string",
            "required": false,
            "description": "Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "topics",
            "type": "array",
            "required": false,
            "description": "Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index.",
            "constraints": {
              "maxItems": 6
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Lookback window in hours. Defaults to the last 12 hours and is capped at 24.",
            "constraints": {
              "default": 12,
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "maxItemsPerSection",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized headline rows returned in each briefing section.",
            "constraints": {
              "default": 4,
              "minimum": 1,
              "maximum": 8
            }
          },
          {
            "name": "includeCitations",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit the flattened citation list while keeping URLs on section items.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "focus": "ai markets",
          "topics": [
            "news",
            "business",
            "tech"
          ],
          "hours": 12,
          "maxItemsPerSection": 4,
          "includeCitations": true
        }
      },
      "exampleRequest": {
        "focus": "ai markets",
        "topics": [
          "news",
          "business",
          "tech"
        ],
        "hours": 12,
        "maxItemsPerSection": 4,
        "includeCitations": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "briefing",
          "sections",
          "topStories",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the briefing completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "briefing": {
            "type": "object",
            "additionalProperties": true,
            "description": "High-level bundle summary, ranking/diversity policy, section count, item count, and source-disclosure policy."
          },
          "sections": {
            "type": "array",
            "description": "Briefing sections grouped by agent-relevant intent.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "title",
                "count",
                "items"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable section id."
                },
                "title": {
                  "type": "string",
                  "description": "Human-readable section title."
                },
                "summary": {
                  "type": "string",
                  "description": "One-line summary built from the section's highest-ranked diversified items."
                },
                "count": {
                  "type": "integer",
                  "description": "Number of items in this section."
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Normalized headline rows with publisher article URLs."
                },
                "ranking": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Selection policy used for this section."
                }
              },
              "additionalProperties": true
            }
          },
          "topStories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Highest-ranked cross-section stories."
          },
          "citations": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Flattened citation list when includeCitations is true."
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this bundle route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for the briefing."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-morning-briefing",
          "name": "Morning Briefing",
          "department": "Public Data"
        },
        "requested": {
          "focus": "ai markets",
          "topics": [
            "news",
            "business",
            "tech"
          ],
          "hours": 12,
          "maxItemsPerSection": 4,
          "includeCitations": true
        },
        "briefing": {
          "mode": "managed-news-bundle",
          "summary": "Generated 8 briefing items across 4 sections.",
          "sectionCount": 4,
          "itemCount": 8,
          "upstreamDetailsDisclosed": false,
          "resultFreshness": "live",
          "pricing": {
            "model": "x402_per_call",
            "usd": "0.03"
          },
          "ranking": {
            "strategy": "dedupe_relevance_authority_freshness_source_diversity",
            "storyDedupeApplied": true,
            "sourceDiversityApplied": true,
            "maxItemsPerPublisherPerSection": 2,
            "maxTopStoriesPerPublisher": 1
          }
        },
        "sections": [
          {
            "id": "markets",
            "title": "Markets & Business",
            "summary": "Technology stocks rebound",
            "count": 1,
            "items": [
              {
                "title": "Technology stocks rebound",
                "url": "https://publisher.example/news/technology-stocks-rebound",
                "topic": "business",
                "publishedAt": "2026-07-07T12:00:00.000Z"
              }
            ],
            "ranking": {
              "strategy": "relevance_authority_freshness_diversity",
              "sourceDiversityApplied": true,
              "maxItemsPerPublisher": 2
            }
          }
        ],
        "topStories": [
          {
            "title": "AI infrastructure startup announces new agent workflow tools",
            "url": "https://publisher.example/news/ai-agent-workflow-tools",
            "topic": "tech"
          }
        ],
        "citations": [
          {
            "section": "markets",
            "title": "Technology stocks rebound",
            "url": "https://publisher.example/news/technology-stocks-rebound"
          }
        ],
        "limits": {
          "maxLookbackHours": 24,
          "maxSections": 6,
          "maxItemsPerSection": 8,
          "maxItemsPerPublisherPerSection": 2,
          "maxFetchedHeadlines": 250
        }
      },
      "configured": false
    },
    {
      "id": "classified-listing-search",
      "resource": "https://agentbodega.store/api/public-data/classified-listing-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Classified Listing Search",
      "description": "Search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.",
      "longDescription": "Purpose: Search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.\nBest use: Use this when an agent needs search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: city, category, query.\nOptional fields: sort, postal, search_distance, min_price, max_price, min_bedrooms, max_bedrooms, hasPic, bundleDuplicates, limit, proxiesSx.\n\nAccepted fields:\n- city (required, string): Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston.\n- category (required, string): Listing category abbreviation, such as sss, cta, apa, jjj, or zip.\n- query (required, string): Search text.\n- sort (optional, string): Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\".\n- postal (optional, string): Optional postal code to force geo-scoping when the caller's IP region differs from the target city.\n- search_distance (optional, integer): Optional radius in miles when postal is supplied. Constraints: min: 1; max: 500.\n- min_price (optional, integer): Min price numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- max_price (optional, integer): Max price numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- min_bedrooms (optional, integer): Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- max_bedrooms (optional, integer): Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- hasPic (optional, boolean): Set true to enable has pic behavior for Classified Listing Search.\n- bundleDuplicates (optional, boolean): Set true to enable bundle duplicates behavior for Classified Listing Search.\n- limit (optional, integer): Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100. Constraints: default: 25; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"city\": \"sfbay\",\n  \"category\": \"sss\",\n  \"query\": \"bicycle\",\n  \"sort\": \"date\",\n  \"postal\": \"94103\",\n  \"search_distance\": 25,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "marketplace-listings",
      "aisle": "Marketplace Listings",
      "shelfId": "marketplace-listings",
      "shelf": "Marketplace Listings",
      "offeringId": "classified-listing-search",
      "offering": "Classified Listing Search",
      "pathIds": [
        "public-data",
        "marketplace-listings",
        "marketplace-listings",
        "classified-listing-search"
      ],
      "pathLabels": [
        "Public Data",
        "Marketplace Listings",
        "Marketplace Listings",
        "Classified Listing Search"
      ],
      "taxonomyPath": "public-data.marketplace-listings.marketplace-listings.classified-listing-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "marketplace-listings",
          "name": "Marketplace Listings"
        },
        "shelf": {
          "id": "marketplace-listings",
          "name": "Marketplace Listings"
        },
        "offering": {
          "id": "classified-listing-search",
          "name": "Classified Listing Search"
        },
        "pathIds": [
          "public-data",
          "marketplace-listings",
          "marketplace-listings",
          "classified-listing-search"
        ],
        "pathLabels": [
          "Public Data",
          "Marketplace Listings",
          "Marketplace Listings",
          "Classified Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "classifieds",
        "marketplace-listings",
        "local-search",
        "public-data",
        "search"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/classified-listing-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/classified-listing-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "city",
          "category",
          "query"
        ],
        "properties": {
          "city": {
            "type": "string",
            "description": "Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston."
          },
          "category": {
            "type": "string",
            "description": "Listing category abbreviation, such as sss, cta, apa, jjj, or zip."
          },
          "query": {
            "type": "string",
            "description": "Search text."
          },
          "sort": {
            "type": "string",
            "enum": [
              "date",
              "rel",
              "priceasc",
              "pricedsc"
            ],
            "default": "date",
            "description": "Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\"."
          },
          "postal": {
            "type": "string",
            "description": "Optional postal code to force geo-scoping when the caller's IP region differs from the target city."
          },
          "search_distance": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "description": "Optional radius in miles when postal is supplied."
          },
          "min_price": {
            "type": "integer",
            "minimum": 0,
            "description": "Min price numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "max_price": {
            "type": "integer",
            "minimum": 0,
            "description": "Max price numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "min_bedrooms": {
            "type": "integer",
            "minimum": 0,
            "description": "Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "max_bedrooms": {
            "type": "integer",
            "minimum": 0,
            "description": "Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "hasPic": {
            "type": "boolean",
            "description": "Set true to enable has pic behavior for Classified Listing Search."
          },
          "bundleDuplicates": {
            "type": "boolean",
            "description": "Set true to enable bundle duplicates behavior for Classified Listing Search."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "city",
          "category",
          "query"
        ],
        "optional": [
          "sort",
          "postal",
          "search_distance",
          "min_price",
          "max_price",
          "min_bedrooms",
          "max_bedrooms",
          "hasPic",
          "bundleDuplicates",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "city",
            "type": "string",
            "required": true,
            "description": "Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston."
          },
          {
            "name": "category",
            "type": "string",
            "required": true,
            "description": "Listing category abbreviation, such as sss, cta, apa, jjj, or zip."
          },
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Search text."
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\".",
            "constraints": {
              "enum": [
                "date",
                "rel",
                "priceasc",
                "pricedsc"
              ],
              "default": "date"
            }
          },
          {
            "name": "postal",
            "type": "string",
            "required": false,
            "description": "Optional postal code to force geo-scoping when the caller's IP region differs from the target city."
          },
          {
            "name": "search_distance",
            "type": "integer",
            "required": false,
            "description": "Optional radius in miles when postal is supplied.",
            "constraints": {
              "minimum": 1,
              "maximum": 500
            }
          },
          {
            "name": "min_price",
            "type": "integer",
            "required": false,
            "description": "Min price numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "max_price",
            "type": "integer",
            "required": false,
            "description": "Max price numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "min_bedrooms",
            "type": "integer",
            "required": false,
            "description": "Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "max_bedrooms",
            "type": "integer",
            "required": false,
            "description": "Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "hasPic",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable has pic behavior for Classified Listing Search."
          },
          {
            "name": "bundleDuplicates",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable bundle duplicates behavior for Classified Listing Search."
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "city": "sfbay",
          "category": "sss",
          "query": "bicycle",
          "sort": "date",
          "postal": "94103",
          "search_distance": 25,
          "limit": 10
        }
      },
      "exampleRequest": {
        "city": "sfbay",
        "category": "sss",
        "query": "bicycle",
        "sort": "date",
        "postal": "94103",
        "search_distance": 25,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "classified-listing-search",
          "name": "Classified Listing Search",
          "department": "Public Data"
        },
        "total_results": 5635,
        "results": [
          {
            "posting_id": 7927446618,
            "title": "Kryptonite bike chain",
            "price": "$100",
            "location": "san leandro",
            "subarea": "eby"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "california-highway-traffic",
      "resource": "https://agentbodega.store/api/public-data/california-highway-traffic",
      "type": "http",
      "method": "POST",
      "serviceName": "California Highway Traffic Speeds",
      "description": "Return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.",
      "longDescription": "Purpose: Return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.\nBest use: Use this when an agent needs return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: region, road, direction, minMph, includeIncidents, includeSensors, limit, proxiesSx.\n\nAccepted fields:\n- region (optional, string): California traffic region. Constraints: accepted values: \"NoCal\", \"SoCal\", \"CenCal\"; default: \"NoCal\".\n- road (optional, string): Optional road/highway filter, such as 101, 580, I-80, or CA-1.\n- direction (optional, string): Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\".\n- minMph (optional, integer): Only return sections whose average speed is at or below this MPH. Constraints: min: 0.\n- includeIncidents (optional, boolean): Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true. Constraints: default: true.\n- includeSensors (optional, boolean): Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false. Constraints: default: false.\n- limit (optional, integer): Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200. Constraints: default: 100; min: 1; max: 200.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"region\": \"NoCal\",\n  \"road\": \"580\",\n  \"includeIncidents\": true,\n  \"limit\": 20\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "transportation",
      "aisle": "Transportation",
      "shelfId": "transportation",
      "shelf": "Transportation",
      "offeringId": "california-highway-traffic",
      "offering": "California Highway Traffic Speeds",
      "pathIds": [
        "public-data",
        "transportation",
        "transportation",
        "california-highway-traffic"
      ],
      "pathLabels": [
        "Public Data",
        "Transportation",
        "Transportation",
        "California Highway Traffic Speeds"
      ],
      "taxonomyPath": "public-data.transportation.transportation.california-highway-traffic",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "transportation",
          "name": "Transportation"
        },
        "shelf": {
          "id": "transportation",
          "name": "Transportation"
        },
        "offering": {
          "id": "california-highway-traffic",
          "name": "California Highway Traffic Speeds"
        },
        "pathIds": [
          "public-data",
          "transportation",
          "transportation",
          "california-highway-traffic"
        ],
        "pathLabels": [
          "Public Data",
          "Transportation",
          "Transportation",
          "California Highway Traffic Speeds"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "traffic",
        "california",
        "highways",
        "public-data",
        "transportation"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/california-highway-traffic",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/california-highway-traffic",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "region": {
            "type": "string",
            "enum": [
              "NoCal",
              "SoCal",
              "CenCal"
            ],
            "default": "NoCal",
            "description": "California traffic region."
          },
          "road": {
            "type": "string",
            "description": "Optional road/highway filter, such as 101, 580, I-80, or CA-1."
          },
          "direction": {
            "type": "string",
            "enum": [
              "North",
              "South",
              "East",
              "West"
            ],
            "description": "Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\"."
          },
          "minMph": {
            "type": "integer",
            "minimum": 0,
            "description": "Only return sections whose average speed is at or below this MPH."
          },
          "includeIncidents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true."
          },
          "includeSensors": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "default": 100,
            "description": "Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "region",
          "road",
          "direction",
          "minMph",
          "includeIncidents",
          "includeSensors",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "region",
            "type": "string",
            "required": false,
            "description": "California traffic region.",
            "constraints": {
              "enum": [
                "NoCal",
                "SoCal",
                "CenCal"
              ],
              "default": "NoCal"
            }
          },
          {
            "name": "road",
            "type": "string",
            "required": false,
            "description": "Optional road/highway filter, such as 101, 580, I-80, or CA-1."
          },
          {
            "name": "direction",
            "type": "string",
            "required": false,
            "description": "Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\".",
            "constraints": {
              "enum": [
                "North",
                "South",
                "East",
                "West"
              ]
            }
          },
          {
            "name": "minMph",
            "type": "integer",
            "required": false,
            "description": "Only return sections whose average speed is at or below this MPH.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "includeIncidents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeSensors",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200.",
            "constraints": {
              "default": 100,
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "region": "NoCal",
          "road": "580",
          "includeIncidents": true,
          "limit": 20
        }
      },
      "exampleRequest": {
        "region": "NoCal",
        "road": "580",
        "includeIncidents": true,
        "limit": 20
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "california-highway-traffic",
          "name": "California Highway Traffic Speeds",
          "department": "Public Data"
        },
        "region": "NoCal",
        "results": [
          {
            "road_id": "100580",
            "road": "580",
            "direction": "East",
            "avg_mph": 34.2,
            "min_mph": 12,
            "max_mph": 61,
            "sensors": 18
          }
        ]
      },
      "configured": false
    },
    {
      "id": "rental-listing-search",
      "resource": "https://agentbodega.store/api/public-data/rental-listing-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Rental Listing Search",
      "description": "Find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.",
      "longDescription": "Purpose: Find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.\nBest use: Use this when an agent needs find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: resourceId.\nOptional fields: searchSlug, maxPrice, minPrice, bedrooms, bathrooms, orderBy, limit, proxiesSx.\n\nAccepted fields:\n- resourceId (required, string): Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca.\n- searchSlug (optional, string): Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent. Constraints: default: \"apartments-for-rent\".\n- maxPrice (optional, integer): Max Price numeric value for Rental Listing Search. Constraints: min: 0. Constraints: min: 0.\n- minPrice (optional, integer): Min Price numeric value for Rental Listing Search. Constraints: min: 0. Constraints: min: 0.\n- bedrooms (optional, string): Comma-separated bedroom filter, such as 1,2,3.\n- bathrooms (optional, string): Comma-separated bathroom filter, such as 1,1.5,2.\n- orderBy (optional, string): Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\".\n- limit (optional, integer): Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100. Constraints: default: 25; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"resourceId\": \"san-francisco-ca\",\n  \"searchSlug\": \"apartments-for-rent\",\n  \"maxPrice\": 4000,\n  \"bedrooms\": \"1,2\",\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "real-estate-rentals",
      "aisle": "Real Estate Rentals",
      "shelfId": "real-estate-rentals",
      "shelf": "Real Estate Rentals",
      "offeringId": "rental-listing-search",
      "offering": "Rental Listing Search",
      "pathIds": [
        "public-data",
        "real-estate-rentals",
        "real-estate-rentals",
        "rental-listing-search"
      ],
      "pathLabels": [
        "Public Data",
        "Real Estate Rentals",
        "Real Estate Rentals",
        "Rental Listing Search"
      ],
      "taxonomyPath": "public-data.real-estate-rentals.real-estate-rentals.rental-listing-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "real-estate-rentals",
          "name": "Real Estate Rentals"
        },
        "shelf": {
          "id": "real-estate-rentals",
          "name": "Real Estate Rentals"
        },
        "offering": {
          "id": "rental-listing-search",
          "name": "Rental Listing Search"
        },
        "pathIds": [
          "public-data",
          "real-estate-rentals",
          "real-estate-rentals",
          "rental-listing-search"
        ],
        "pathLabels": [
          "Public Data",
          "Real Estate Rentals",
          "Real Estate Rentals",
          "Rental Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "rentals",
        "real-estate-rentals",
        "apartments",
        "housing",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/rental-listing-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/rental-listing-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "resourceId"
        ],
        "properties": {
          "resourceId": {
            "type": "string",
            "description": "Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca."
          },
          "searchSlug": {
            "type": "string",
            "default": "apartments-for-rent",
            "description": "Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent."
          },
          "maxPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Price numeric value for Rental Listing Search. Constraints: min: 0."
          },
          "minPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Price numeric value for Rental Listing Search. Constraints: min: 0."
          },
          "bedrooms": {
            "type": "string",
            "description": "Comma-separated bedroom filter, such as 1,2,3."
          },
          "bathrooms": {
            "type": "string",
            "description": "Comma-separated bathroom filter, such as 1,1.5,2."
          },
          "orderBy": {
            "type": "string",
            "enum": [
              "score",
              "recencyTime",
              "price"
            ],
            "default": "score",
            "description": "Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\"."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "resourceId"
        ],
        "optional": [
          "searchSlug",
          "maxPrice",
          "minPrice",
          "bedrooms",
          "bathrooms",
          "orderBy",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "resourceId",
            "type": "string",
            "required": true,
            "description": "Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca."
          },
          {
            "name": "searchSlug",
            "type": "string",
            "required": false,
            "description": "Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent.",
            "constraints": {
              "default": "apartments-for-rent"
            }
          },
          {
            "name": "maxPrice",
            "type": "integer",
            "required": false,
            "description": "Max Price numeric value for Rental Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minPrice",
            "type": "integer",
            "required": false,
            "description": "Min Price numeric value for Rental Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "bedrooms",
            "type": "string",
            "required": false,
            "description": "Comma-separated bedroom filter, such as 1,2,3."
          },
          {
            "name": "bathrooms",
            "type": "string",
            "required": false,
            "description": "Comma-separated bathroom filter, such as 1,1.5,2."
          },
          {
            "name": "orderBy",
            "type": "string",
            "required": false,
            "description": "Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\".",
            "constraints": {
              "enum": [
                "score",
                "recencyTime",
                "price"
              ],
              "default": "score"
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "resourceId": "san-francisco-ca",
          "searchSlug": "apartments-for-rent",
          "maxPrice": 4000,
          "bedrooms": "1,2",
          "limit": 10
        }
      },
      "exampleRequest": {
        "resourceId": "san-francisco-ca",
        "searchSlug": "apartments-for-rent",
        "maxPrice": 4000,
        "bedrooms": "1,2",
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "rental-listing-search",
          "name": "Rental Listing Search",
          "department": "Public Data"
        },
        "query": {
          "resource_id": "san-francisco-ca",
          "area_name": "San Francisco",
          "search_slug": "apartments-for-rent"
        },
        "results": [
          {
            "title": "NEMA",
            "street": "8 10th St",
            "city": "San Francisco",
            "state": "CA",
            "rent_min": 3750,
            "rent_max": 7925
          }
        ]
      },
      "configured": false
    },
    {
      "id": "hospital-quality-rating",
      "resource": "https://agentbodega.store/api/public-data/hospital-quality-rating",
      "type": "http",
      "method": "POST",
      "serviceName": "Hospital Quality Rating",
      "description": "Look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.",
      "longDescription": "Purpose: Look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.\nBest use: Use this when an agent needs look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: ccn, careCompareUrl, hospitalName, city, state, includeMeasures, compareTo, proxiesSx.\n\nAccepted fields:\n- ccn (optional, string): Six-digit facility id.\n- careCompareUrl (optional, string): Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls. Constraints: format: uri.\n- hospitalName (optional, string): Hospital/facility name for lookup.\n- city (optional, string): City value for Hospital Quality Rating.\n- state (optional, string): Two-letter state abbreviation for name lookup.\n- includeMeasures (optional, boolean): Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true. Constraints: default: true.\n- compareTo (optional, array): Optional extra CCNs to fetch side by side. Constraints: max items: 3.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"ccn\": \"240010\",\n  \"includeMeasures\": true\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "healthcare-quality",
      "aisle": "Healthcare Quality",
      "shelfId": "healthcare-quality",
      "shelf": "Healthcare Quality",
      "offeringId": "hospital-quality-rating",
      "offering": "Hospital Quality Rating",
      "pathIds": [
        "public-data",
        "healthcare-quality",
        "healthcare-quality",
        "hospital-quality-rating"
      ],
      "pathLabels": [
        "Public Data",
        "Healthcare Quality",
        "Healthcare Quality",
        "Hospital Quality Rating"
      ],
      "taxonomyPath": "public-data.healthcare-quality.healthcare-quality.hospital-quality-rating",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "healthcare-quality",
          "name": "Healthcare Quality"
        },
        "shelf": {
          "id": "healthcare-quality",
          "name": "Healthcare Quality"
        },
        "offering": {
          "id": "hospital-quality-rating",
          "name": "Hospital Quality Rating"
        },
        "pathIds": [
          "public-data",
          "healthcare-quality",
          "healthcare-quality",
          "hospital-quality-rating"
        ],
        "pathLabels": [
          "Public Data",
          "Healthcare Quality",
          "Healthcare Quality",
          "Hospital Quality Rating"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "hospital",
        "healthcare",
        "ratings",
        "public-records",
        "quality",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/hospital-quality-rating",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/hospital-quality-rating",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "ccn": {
            "type": "string",
            "description": "Six-digit facility id."
          },
          "careCompareUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls."
          },
          "hospitalName": {
            "type": "string",
            "description": "Hospital/facility name for lookup."
          },
          "city": {
            "type": "string",
            "description": "City value for Hospital Quality Rating."
          },
          "state": {
            "type": "string",
            "description": "Two-letter state abbreviation for name lookup."
          },
          "includeMeasures": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true."
          },
          "compareTo": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "type": "string",
              "description": "Compare To item value for Hospital Quality Rating."
            },
            "description": "Optional extra CCNs to fetch side by side."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "ccn",
          "careCompareUrl",
          "hospitalName",
          "city",
          "state",
          "includeMeasures",
          "compareTo",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "ccn",
            "type": "string",
            "required": false,
            "description": "Six-digit facility id."
          },
          {
            "name": "careCompareUrl",
            "type": "string",
            "required": false,
            "description": "Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "hospitalName",
            "type": "string",
            "required": false,
            "description": "Hospital/facility name for lookup."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "City value for Hospital Quality Rating."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Two-letter state abbreviation for name lookup."
          },
          {
            "name": "includeMeasures",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "compareTo",
            "type": "array",
            "required": false,
            "description": "Optional extra CCNs to fetch side by side.",
            "constraints": {
              "maxItems": 3
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "ccn": "240010",
          "includeMeasures": true
        }
      },
      "exampleRequest": {
        "ccn": "240010",
        "includeMeasures": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "hospital-quality-rating",
          "name": "Hospital Quality Rating",
          "department": "Public Data"
        },
        "result": {
          "ccn": "240010",
          "facility_name": "MAYO CLINIC HOSPITAL ROCHESTER",
          "state": "MN",
          "overall_rating": "5",
          "measures": {
            "hcahps": [],
            "complications_and_deaths": []
          }
        }
      },
      "configured": false
    },
    {
      "id": "school-quality-rating",
      "resource": "https://agentbodega.store/api/public-data/school-quality-rating",
      "type": "http",
      "method": "POST",
      "serviceName": "School Quality Rating Lookup",
      "description": "Look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.",
      "longDescription": "Purpose: Look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.\nBest use: Use this when an agent needs look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: schoolUrl, schoolName, city, state, includeCatchment, proxiesSx.\n\nAccepted fields:\n- schoolUrl (optional, string): Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls. Constraints: format: uri.\n- schoolName (optional, string): School name to resolve.\n- city (optional, string): City value for School Quality Rating Lookup.\n- state (optional, string): State value for School Quality Rating Lookup.\n- includeCatchment (optional, boolean): Include catchment GeoJSON when present. Large polygons are omitted by default. Constraints: default: false.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"schoolName\": \"Sylvia Mendez Elementary\",\n  \"city\": \"Berkeley\",\n  \"state\": \"CA\"\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "education-quality",
      "aisle": "Education Quality",
      "shelfId": "education-quality",
      "shelf": "Education Quality",
      "offeringId": "school-quality-rating",
      "offering": "School Quality Rating Lookup",
      "pathIds": [
        "public-data",
        "education-quality",
        "education-quality",
        "school-quality-rating"
      ],
      "pathLabels": [
        "Public Data",
        "Education Quality",
        "Education Quality",
        "School Quality Rating Lookup"
      ],
      "taxonomyPath": "public-data.education-quality.education-quality.school-quality-rating",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "education-quality",
          "name": "Education Quality"
        },
        "shelf": {
          "id": "education-quality",
          "name": "Education Quality"
        },
        "offering": {
          "id": "school-quality-rating",
          "name": "School Quality Rating Lookup"
        },
        "pathIds": [
          "public-data",
          "education-quality",
          "education-quality",
          "school-quality-rating"
        ],
        "pathLabels": [
          "Public Data",
          "Education Quality",
          "Education Quality",
          "School Quality Rating Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "schools",
        "ratings",
        "real-estate",
        "education",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/school-quality-rating",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/school-quality-rating",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "schoolUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls."
          },
          "schoolName": {
            "type": "string",
            "description": "School name to resolve."
          },
          "city": {
            "type": "string",
            "description": "City value for School Quality Rating Lookup."
          },
          "state": {
            "type": "string",
            "description": "State value for School Quality Rating Lookup."
          },
          "includeCatchment": {
            "type": "boolean",
            "default": false,
            "description": "Include catchment GeoJSON when present. Large polygons are omitted by default."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "schoolUrl",
          "schoolName",
          "city",
          "state",
          "includeCatchment",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "schoolUrl",
            "type": "string",
            "required": false,
            "description": "Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "schoolName",
            "type": "string",
            "required": false,
            "description": "School name to resolve."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "City value for School Quality Rating Lookup."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "State value for School Quality Rating Lookup."
          },
          {
            "name": "includeCatchment",
            "type": "boolean",
            "required": false,
            "description": "Include catchment GeoJSON when present. Large polygons are omitted by default.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "schoolName": "Sylvia Mendez Elementary",
          "city": "Berkeley",
          "state": "CA"
        }
      },
      "exampleRequest": {
        "schoolName": "Sylvia Mendez Elementary",
        "city": "Berkeley",
        "state": "CA"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "school-quality-rating",
          "name": "School Quality Rating Lookup",
          "department": "Public Data"
        },
        "result": {
          "name": "Sylvia Mendez Elementary",
          "school_id": "078571861",
          "great_schools_rating": 7,
          "grades_served": "K-5",
          "enrollment": 379,
          "district": {
            "name": "Berkeley Unified School District"
          }
        }
      },
      "configured": false
    },
    {
      "id": "home-comparable-sales",
      "resource": "https://agentbodega.store/api/public-data/home-comparable-sales",
      "type": "http",
      "method": "POST",
      "serviceName": "Home Comparable Sales",
      "description": "Return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.",
      "longDescription": "Purpose: Return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.\nBest use: Use this when an agent needs return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: regionId, regionType, market, lat, lon, radiusMiles, soldWithinDays, minPrice, maxPrice, minBeds, maxBeds, minBaths, maxBaths, limit, proxiesSx.\n\nAccepted fields:\n- regionId (optional, string): Market region id, such as city id or ZIP region id.\n- regionType (optional, integer): Market region type. Common values: 2 for ZIP, 6 for city. Constraints: default: 6.\n- market (optional, string): Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston.\n- lat (optional, number): Subject latitude for a bounded-radius polygon search.\n- lon (optional, number): Subject longitude for a bounded-radius polygon search.\n- radiusMiles (optional, number): Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25. Constraints: default: 1; min: 0.1; max: 25.\n- soldWithinDays (optional, integer): Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180.\n- minPrice (optional, integer): Min Price numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxPrice (optional, integer): Max Price numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- minBeds (optional, integer): Min Beds numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxBeds (optional, integer): Max Beds numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- minBaths (optional, number): Min Baths numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxBaths (optional, number): Max Baths numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- limit (optional, integer): Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50. Constraints: default: 10; min: 1; max: 50.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"regionId\": \"17151\",\n  \"regionType\": 6,\n  \"market\": \"sanfrancisco\",\n  \"soldWithinDays\": 180,\n  \"minBeds\": 2,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "real-estate-comps",
      "aisle": "Real Estate Comps",
      "shelfId": "real-estate-comps",
      "shelf": "Real Estate Comps",
      "offeringId": "home-comparable-sales",
      "offering": "Home Comparable Sales",
      "pathIds": [
        "public-data",
        "real-estate-comps",
        "real-estate-comps",
        "home-comparable-sales"
      ],
      "pathLabels": [
        "Public Data",
        "Real Estate Comps",
        "Real Estate Comps",
        "Home Comparable Sales"
      ],
      "taxonomyPath": "public-data.real-estate-comps.real-estate-comps.home-comparable-sales",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "real-estate-comps",
          "name": "Real Estate Comps"
        },
        "shelf": {
          "id": "real-estate-comps",
          "name": "Real Estate Comps"
        },
        "offering": {
          "id": "home-comparable-sales",
          "name": "Home Comparable Sales"
        },
        "pathIds": [
          "public-data",
          "real-estate-comps",
          "real-estate-comps",
          "home-comparable-sales"
        ],
        "pathLabels": [
          "Public Data",
          "Real Estate Comps",
          "Real Estate Comps",
          "Home Comparable Sales"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "comparable-sales",
        "real-estate",
        "sold-comps",
        "valuation",
        "public-data",
        "redfin",
        "redfin-comps"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/home-comparable-sales",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/home-comparable-sales",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "regionId": {
            "type": "string",
            "description": "Market region id, such as city id or ZIP region id."
          },
          "regionType": {
            "type": "integer",
            "default": 6,
            "description": "Market region type. Common values: 2 for ZIP, 6 for city."
          },
          "market": {
            "type": "string",
            "description": "Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston."
          },
          "lat": {
            "type": "number",
            "description": "Subject latitude for a bounded-radius polygon search."
          },
          "lon": {
            "type": "number",
            "description": "Subject longitude for a bounded-radius polygon search."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 0.1,
            "maximum": 25,
            "default": 1,
            "description": "Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25."
          },
          "soldWithinDays": {
            "type": "integer",
            "enum": [
              30,
              90,
              180,
              365,
              730,
              1095
            ],
            "default": 180,
            "description": "Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180."
          },
          "minPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Price numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Price numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "minBeds": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Beds numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxBeds": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Beds numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "minBaths": {
            "type": "number",
            "minimum": 0,
            "description": "Min Baths numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxBaths": {
            "type": "number",
            "minimum": 0,
            "description": "Max Baths numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "regionId",
          "regionType",
          "market",
          "lat",
          "lon",
          "radiusMiles",
          "soldWithinDays",
          "minPrice",
          "maxPrice",
          "minBeds",
          "maxBeds",
          "minBaths",
          "maxBaths",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "regionId",
            "type": "string",
            "required": false,
            "description": "Market region id, such as city id or ZIP region id."
          },
          {
            "name": "regionType",
            "type": "integer",
            "required": false,
            "description": "Market region type. Common values: 2 for ZIP, 6 for city.",
            "constraints": {
              "default": 6
            }
          },
          {
            "name": "market",
            "type": "string",
            "required": false,
            "description": "Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston."
          },
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Subject latitude for a bounded-radius polygon search."
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Subject longitude for a bounded-radius polygon search."
          },
          {
            "name": "radiusMiles",
            "type": "number",
            "required": false,
            "description": "Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25.",
            "constraints": {
              "default": 1,
              "minimum": 0.1,
              "maximum": 25
            }
          },
          {
            "name": "soldWithinDays",
            "type": "integer",
            "required": false,
            "description": "Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180.",
            "constraints": {
              "enum": [
                30,
                90,
                180,
                365,
                730,
                1095
              ],
              "default": 180
            }
          },
          {
            "name": "minPrice",
            "type": "integer",
            "required": false,
            "description": "Min Price numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxPrice",
            "type": "integer",
            "required": false,
            "description": "Max Price numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minBeds",
            "type": "integer",
            "required": false,
            "description": "Min Beds numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxBeds",
            "type": "integer",
            "required": false,
            "description": "Max Beds numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minBaths",
            "type": "number",
            "required": false,
            "description": "Min Baths numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxBaths",
            "type": "number",
            "required": false,
            "description": "Max Baths numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "regionId": "17151",
          "regionType": 6,
          "market": "sanfrancisco",
          "soldWithinDays": 180,
          "minBeds": 2,
          "limit": 10
        }
      },
      "exampleRequest": {
        "regionId": "17151",
        "regionType": 6,
        "market": "sanfrancisco",
        "soldWithinDays": 180,
        "minBeds": 2,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "home-comparable-sales",
          "name": "Home Comparable Sales",
          "department": "Public Data"
        },
        "result": {
          "subject": {
            "region_id": "17151",
            "market": "sanfrancisco"
          },
          "comps": [
            {
              "address": "123 Example St",
              "price": 1275000,
              "beds": 3,
              "baths": 2,
              "sqft": 1420,
              "sold_date": "2026-05-15"
            }
          ]
        }
      },
      "configured": false
    },
    {
      "id": "volunteer-opportunity-search",
      "resource": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Volunteer Opportunity Search",
      "description": "Search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.",
      "longDescription": "Purpose: Search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.\nBest use: Use this when an agent needs search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, opportunityUrl, lat, lon, radiusMiles, remote, categories, page, limit, proxiesSx.\n\nAccepted fields:\n- query (optional, string): Search text.\n- opportunityUrl (optional, string): Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls. Constraints: format: uri.\n- lat (optional, number): Lat numeric value for Volunteer Opportunity Search.\n- lon (optional, number): Lon numeric value for Volunteer Opportunity Search.\n- radiusMiles (optional, number): Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250. Constraints: default: 25; min: 1; max: 250.\n- remote (optional, boolean): Filter for remote/virtual opportunities.\n- categories (optional, array): Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT. Constraints: max items: 8.\n- page (optional, integer): Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100. Constraints: default: 0; min: 0; max: 100.\n- limit (optional, integer): Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100. Constraints: default: 20; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"query\": \"food bank\",\n  \"lat\": 40.7128,\n  \"lon\": -74.006,\n  \"radiusMiles\": 25,\n  \"categories\": [\n    \"HUNGER_FOOD_SECURITY\"\n  ],\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "civic-opportunities",
      "aisle": "Civic Opportunities",
      "shelfId": "civic-opportunities",
      "shelf": "Civic Opportunities",
      "offeringId": "volunteer-opportunity-search",
      "offering": "Volunteer Opportunity Search",
      "pathIds": [
        "public-data",
        "civic-opportunities",
        "civic-opportunities",
        "volunteer-opportunity-search"
      ],
      "pathLabels": [
        "Public Data",
        "Civic Opportunities",
        "Civic Opportunities",
        "Volunteer Opportunity Search"
      ],
      "taxonomyPath": "public-data.civic-opportunities.civic-opportunities.volunteer-opportunity-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "civic-opportunities",
          "name": "Civic Opportunities"
        },
        "shelf": {
          "id": "civic-opportunities",
          "name": "Civic Opportunities"
        },
        "offering": {
          "id": "volunteer-opportunity-search",
          "name": "Volunteer Opportunity Search"
        },
        "pathIds": [
          "public-data",
          "civic-opportunities",
          "civic-opportunities",
          "volunteer-opportunity-search"
        ],
        "pathLabels": [
          "Public Data",
          "Civic Opportunities",
          "Civic Opportunities",
          "Volunteer Opportunity Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "volunteering",
        "opportunities",
        "civic",
        "nonprofit",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search text."
          },
          "opportunityUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls."
          },
          "lat": {
            "type": "number",
            "description": "Lat numeric value for Volunteer Opportunity Search."
          },
          "lon": {
            "type": "number",
            "description": "Lon numeric value for Volunteer Opportunity Search."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 1,
            "maximum": 250,
            "default": 25,
            "description": "Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250."
          },
          "remote": {
            "type": "boolean",
            "description": "Filter for remote/virtual opportunities."
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Categories item value for Volunteer Opportunity Search."
            },
            "maxItems": 8,
            "description": "Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT."
          },
          "page": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "default": 0,
            "description": "Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "description": "Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "opportunityUrl",
          "lat",
          "lon",
          "radiusMiles",
          "remote",
          "categories",
          "page",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Search text."
          },
          {
            "name": "opportunityUrl",
            "type": "string",
            "required": false,
            "description": "Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Lat numeric value for Volunteer Opportunity Search."
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Lon numeric value for Volunteer Opportunity Search."
          },
          {
            "name": "radiusMiles",
            "type": "number",
            "required": false,
            "description": "Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 250
            }
          },
          {
            "name": "remote",
            "type": "boolean",
            "required": false,
            "description": "Filter for remote/virtual opportunities."
          },
          {
            "name": "categories",
            "type": "array",
            "required": false,
            "description": "Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT.",
            "constraints": {
              "maxItems": 8
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100.",
            "constraints": {
              "default": 0,
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "food bank",
          "lat": 40.7128,
          "lon": -74.006,
          "radiusMiles": 25,
          "categories": [
            "HUNGER_FOOD_SECURITY"
          ],
          "limit": 10
        }
      },
      "exampleRequest": {
        "query": "food bank",
        "lat": 40.7128,
        "lon": -74.006,
        "radiusMiles": 25,
        "categories": [
          "HUNGER_FOOD_SECURITY"
        ],
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "volunteer-opportunity-search",
          "name": "Volunteer Opportunity Search",
          "department": "Public Data"
        },
        "total": 128,
        "results": [
          {
            "id": "abc123",
            "title": "Pack meals for neighbors",
            "organization": "Example Food Bank",
            "location": {
              "city": "New York",
              "state": "NY"
            },
            "remote": false
          }
        ]
      },
      "configured": false
    },
    {
      "id": "us-weather-forecast",
      "resource": "https://agentbodega.store/api/public-data/us-weather-forecast",
      "type": "http",
      "method": "POST",
      "serviceName": "US Weather Forecast",
      "description": "Return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.",
      "longDescription": "Purpose: Return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.\nBest use: Use this when an agent needs return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: lat, lon, zip, city, state, location, includeCurrent, includeHourly, includeAlerts, includeOffice, hourlyLimit, dailyLimit, proxiesSx.\n\nAccepted fields:\n- lat (optional, number): Latitude for a US point. Must be paired with lon. Constraints: min: -90; max: 90.\n- lon (optional, number): Longitude for a US point. Must be paired with lat. Constraints: min: -180; max: 180.\n- zip (optional, string): US ZIP code to geocode before forecast lookup.\n- city (optional, string): US city name. Pair with state for best geocoding.\n- state (optional, string): US state name or two-letter abbreviation for city lookup.\n- location (optional, string): Free-form US place query when lat/lon, zip, or city/state are not supplied.\n- includeCurrent (optional, boolean): Fetch the nearest station's latest observation. Constraints: default: true.\n- includeHourly (optional, boolean): Fetch the hourly forecast. Constraints: default: true.\n- includeAlerts (optional, boolean): Fetch active watches, warnings, and advisories for the point. Constraints: default: true.\n- includeOffice (optional, boolean): Fetch forecast-center metadata such as name, phone, and email when available. Constraints: default: false.\n- hourlyLimit (optional, integer): Maximum hourly periods to return. Constraints: default: 24; min: 1; max: 72.\n- dailyLimit (optional, integer): Maximum multi-day forecast periods to return. Constraints: default: 14; min: 1; max: 14.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"city\": \"Boulder\",\n  \"state\": \"CO\",\n  \"hourlyLimit\": 24,\n  \"includeAlerts\": true\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "weather",
      "aisle": "Weather",
      "shelfId": "weather",
      "shelf": "Weather",
      "offeringId": "us-weather-forecast",
      "offering": "US Weather Forecast",
      "pathIds": [
        "public-data",
        "weather",
        "weather",
        "us-weather-forecast"
      ],
      "pathLabels": [
        "Public Data",
        "Weather",
        "Weather",
        "US Weather Forecast"
      ],
      "taxonomyPath": "public-data.weather.weather.us-weather-forecast",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "weather",
          "name": "Weather"
        },
        "shelf": {
          "id": "weather",
          "name": "Weather"
        },
        "offering": {
          "id": "us-weather-forecast",
          "name": "US Weather Forecast"
        },
        "pathIds": [
          "public-data",
          "weather",
          "weather",
          "us-weather-forecast"
        ],
        "pathLabels": [
          "Public Data",
          "Weather",
          "Weather",
          "US Weather Forecast"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "weather",
        "forecast",
        "alerts",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/us-weather-forecast",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/us-weather-forecast",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Latitude for a US point. Must be paired with lon."
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude for a US point. Must be paired with lat."
          },
          "zip": {
            "type": "string",
            "description": "US ZIP code to geocode before forecast lookup."
          },
          "city": {
            "type": "string",
            "description": "US city name. Pair with state for best geocoding."
          },
          "state": {
            "type": "string",
            "description": "US state name or two-letter abbreviation for city lookup."
          },
          "location": {
            "type": "string",
            "description": "Free-form US place query when lat/lon, zip, or city/state are not supplied."
          },
          "includeCurrent": {
            "type": "boolean",
            "default": true,
            "description": "Fetch the nearest station's latest observation."
          },
          "includeHourly": {
            "type": "boolean",
            "default": true,
            "description": "Fetch the hourly forecast."
          },
          "includeAlerts": {
            "type": "boolean",
            "default": true,
            "description": "Fetch active watches, warnings, and advisories for the point."
          },
          "includeOffice": {
            "type": "boolean",
            "default": false,
            "description": "Fetch forecast-center metadata such as name, phone, and email when available."
          },
          "hourlyLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 72,
            "default": 24,
            "description": "Maximum hourly periods to return."
          },
          "dailyLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 14,
            "default": 14,
            "description": "Maximum multi-day forecast periods to return."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "lat",
          "lon",
          "zip",
          "city",
          "state",
          "location",
          "includeCurrent",
          "includeHourly",
          "includeAlerts",
          "includeOffice",
          "hourlyLimit",
          "dailyLimit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Latitude for a US point. Must be paired with lon.",
            "constraints": {
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Longitude for a US point. Must be paired with lat.",
            "constraints": {
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "zip",
            "type": "string",
            "required": false,
            "description": "US ZIP code to geocode before forecast lookup."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "US city name. Pair with state for best geocoding."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "US state name or two-letter abbreviation for city lookup."
          },
          {
            "name": "location",
            "type": "string",
            "required": false,
            "description": "Free-form US place query when lat/lon, zip, or city/state are not supplied."
          },
          {
            "name": "includeCurrent",
            "type": "boolean",
            "required": false,
            "description": "Fetch the nearest station's latest observation.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeHourly",
            "type": "boolean",
            "required": false,
            "description": "Fetch the hourly forecast.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeAlerts",
            "type": "boolean",
            "required": false,
            "description": "Fetch active watches, warnings, and advisories for the point.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeOffice",
            "type": "boolean",
            "required": false,
            "description": "Fetch forecast-center metadata such as name, phone, and email when available.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "hourlyLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum hourly periods to return.",
            "constraints": {
              "default": 24,
              "minimum": 1,
              "maximum": 72
            }
          },
          {
            "name": "dailyLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum multi-day forecast periods to return.",
            "constraints": {
              "default": 14,
              "minimum": 1,
              "maximum": 14
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "city": "Boulder",
          "state": "CO",
          "hourlyLimit": 24,
          "includeAlerts": true
        }
      },
      "exampleRequest": {
        "city": "Boulder",
        "state": "CO",
        "hourlyLimit": 24,
        "includeAlerts": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "us-weather-forecast",
          "name": "US Weather Forecast",
          "department": "Public Data"
        },
        "location": {
          "input": "Boulder, CO",
          "lat": 40.015,
          "lon": -105.2705,
          "relative_location": {
            "city": "Boulder",
            "state": "CO"
          },
          "time_zone": "America/Denver"
        },
        "grid": {
          "wfo": "BOU",
          "gridX": 54,
          "gridY": 74
        },
        "current_observation": {
          "station_id": "KBDU",
          "text_description": "Mostly Cloudy",
          "temperature_f": 71.6
        },
        "forecast_multi_day": [
          {
            "name": "Tonight",
            "temperature": 54,
            "temperature_unit": "F",
            "short_forecast": "Partly Cloudy"
          }
        ],
        "forecast_hourly": [
          {
            "start_time": "2026-07-03T18:00:00-06:00",
            "temperature": 72,
            "temperature_unit": "F",
            "short_forecast": "Sunny"
          }
        ],
        "alerts": []
      },
      "configured": false
    },
    {
      "id": "official-status-check",
      "resource": "https://agentbodega.store/api/status/check",
      "type": "http",
      "method": "POST",
      "serviceName": "Official Service Status Check",
      "description": "Check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.",
      "longDescription": "Purpose: Check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.\nBest use: Use this when an agent needs check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: service.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- service (required, string): Service id from /api/status/catalog, for example github or gitlab.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Official Service Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"service\": \"github\",\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "utility",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "status-checks",
      "aisle": "Status Checks",
      "offeringId": "official-status-check",
      "offering": "Official Service Status Check",
      "pathIds": [
        "official-status",
        "status-checks",
        "official-status-check"
      ],
      "pathLabels": [
        "Status & Infra",
        "Status Checks",
        "Official Service Status Check"
      ],
      "taxonomyPath": "official-status.status-checks.official-status-check",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "status-checks",
          "name": "Status Checks"
        },
        "offering": {
          "id": "official-status-check",
          "name": "Official Service Status Check"
        },
        "pathIds": [
          "official-status",
          "status-checks",
          "official-status-check"
        ],
        "pathLabels": [
          "Status & Infra",
          "Status Checks",
          "Official Service Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "github",
        "gitlab",
        "deploy-readiness",
        "incident-response",
        "agent-tools"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/check",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/check",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "service"
        ],
        "properties": {
          "service": {
            "type": "string",
            "description": "Service id from /api/status/catalog, for example github or gitlab."
          },
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Official Service Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Official Service Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "service"
        ],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "service",
            "type": "string",
            "required": true,
            "description": "Service id from /api/status/catalog, for example github or gitlab."
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Official Service Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "service": "github",
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "service": "github",
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "id": "github",
          "name": "GitHub"
        },
        "ok": true,
        "status": "operational",
        "label": "All Systems Operational",
        "source": {
          "type": "managed-status-source",
          "cached": false,
          "stale": false
        }
      },
      "configured": false
    },
    {
      "id": "cloud-status-check",
      "resource": "https://agentbodega.store/api/cloud/status/check",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Provider Status Check",
      "description": "Check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.",
      "longDescription": "Purpose: Check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.\nBest use: Use this when an agent needs check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: provider.\nOptional fields: service, product, region, location, includeHistory, includeHealthy, incidentLimit.\n\nAccepted fields:\n- provider (required, string): Cloud provider id. Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\".\n- service (optional, string): Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke.\n- product (optional, string): GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine.\n- region (optional, string): Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global.\n- location (optional, string): Provider location alias. Treated the same as region.\n- includeHistory (optional, boolean): Return recent/resolved historical incidents when the provider source exposes them. Constraints: default: false.\n- includeHealthy (optional, boolean): Include healthy/noisy rows. Default responses focus on degraded or relevant incidents. Constraints: default: false.\n- incidentLimit (optional, integer): Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20. Constraints: default: 5; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"provider\": \"aws\",\n  \"service\": \"lambda\",\n  \"region\": \"us-east-1\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "utility",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "provider-status",
      "aisle": "Provider Status",
      "shelfId": "single-unit",
      "shelf": "Single Unit",
      "offeringId": "cloud-status-check",
      "offering": "Cloud Provider Status Check",
      "pathIds": [
        "cloud-status",
        "provider-status",
        "single-unit",
        "cloud-status-check"
      ],
      "pathLabels": [
        "Cloud Status",
        "Provider Status",
        "Single Unit",
        "Cloud Provider Status Check"
      ],
      "taxonomyPath": "cloud-status.provider-status.single-unit.cloud-status-check",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "provider-status",
          "name": "Provider Status"
        },
        "shelf": {
          "id": "single-unit",
          "name": "Single Unit"
        },
        "offering": {
          "id": "cloud-status-check",
          "name": "Cloud Provider Status Check"
        },
        "pathIds": [
          "cloud-status",
          "provider-status",
          "single-unit",
          "cloud-status-check"
        ],
        "pathLabels": [
          "Cloud Status",
          "Provider Status",
          "Single Unit",
          "Cloud Provider Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/check",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/check",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "provider"
        ],
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "aws",
              "gcp",
              "azure",
              "digitalocean",
              "linode"
            ],
            "description": "Cloud provider id."
          },
          "service": {
            "type": "string",
            "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
          },
          "product": {
            "type": "string",
            "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
          },
          "region": {
            "type": "string",
            "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
          },
          "location": {
            "type": "string",
            "description": "Provider location alias. Treated the same as region."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Return recent/resolved historical incidents when the provider source exposes them."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Include healthy/noisy rows. Default responses focus on degraded or relevant incidents."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "provider"
        ],
        "optional": [
          "service",
          "product",
          "region",
          "location",
          "includeHistory",
          "includeHealthy",
          "incidentLimit"
        ],
        "fields": [
          {
            "name": "provider",
            "type": "string",
            "required": true,
            "description": "Cloud provider id.",
            "constraints": {
              "enum": [
                "aws",
                "gcp",
                "azure",
                "digitalocean",
                "linode"
              ]
            }
          },
          {
            "name": "service",
            "type": "string",
            "required": false,
            "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
          },
          {
            "name": "product",
            "type": "string",
            "required": false,
            "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
          },
          {
            "name": "region",
            "type": "string",
            "required": false,
            "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
          },
          {
            "name": "location",
            "type": "string",
            "required": false,
            "description": "Provider location alias. Treated the same as region."
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Return recent/resolved historical incidents when the provider source exposes them.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Include healthy/noisy rows. Default responses focus on degraded or relevant incidents.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "provider": "aws",
          "service": "lambda",
          "region": "us-east-1",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "provider": "aws",
        "service": "lambda",
        "region": "us-east-1",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "provider": {
          "id": "aws",
          "name": "AWS"
        },
        "status": "operational",
        "summary": "No broad-impact incident matched the requested unit.",
        "incidents": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-summary",
      "resource": "https://agentbodega.store/api/cloud/status/summary",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Provider Status Summary",
      "description": "Summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.",
      "longDescription": "Purpose: Summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.\nBest use: Use this when an agent needs summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: provider, includeHistory, includeHealthy, incidentLimit.\n\nAccepted fields:\n- provider (optional, string): Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\".\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false. Constraints: default: false.\n- incidentLimit (optional, integer): Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20. Constraints: default: 5; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"provider\": \"all\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "http-json",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "incident-summaries",
      "aisle": "Incident Summaries",
      "shelfId": "single-unit",
      "shelf": "Single Unit",
      "offeringId": "cloud-status-summary",
      "offering": "Cloud Provider Status Summary",
      "pathIds": [
        "cloud-status",
        "incident-summaries",
        "single-unit",
        "cloud-status-summary"
      ],
      "pathLabels": [
        "Cloud Status",
        "Incident Summaries",
        "Single Unit",
        "Cloud Provider Status Summary"
      ],
      "taxonomyPath": "cloud-status.incident-summaries.single-unit.cloud-status-summary",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "incident-summaries",
          "name": "Incident Summaries"
        },
        "shelf": {
          "id": "single-unit",
          "name": "Single Unit"
        },
        "offering": {
          "id": "cloud-status-summary",
          "name": "Cloud Provider Status Summary"
        },
        "pathIds": [
          "cloud-status",
          "incident-summaries",
          "single-unit",
          "cloud-status-summary"
        ],
        "pathLabels": [
          "Cloud Status",
          "Incident Summaries",
          "Single Unit",
          "Cloud Provider Status Summary"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "summary",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/summary",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/summary",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "aws",
              "gcp",
              "azure",
              "digitalocean",
              "linode",
              "all"
            ],
            "default": "all",
            "description": "Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\"."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "provider",
          "includeHistory",
          "includeHealthy",
          "incidentLimit"
        ],
        "fields": [
          {
            "name": "provider",
            "type": "string",
            "required": false,
            "description": "Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\".",
            "constraints": {
              "enum": [
                "aws",
                "gcp",
                "azure",
                "digitalocean",
                "linode",
                "all"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "provider": "all",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "provider": "all",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "provider": "all",
        "summary": {
          "worstStatus": "operational",
          "checkedProviders": 5
        },
        "incidents": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-bundle",
      "resource": "https://agentbodega.store/api/cloud/status/bundle",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Status Small Bundle",
      "description": "Check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.",
      "longDescription": "Purpose: Check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.\nBest use: Use this when an agent needs check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: bundle, targets, includeHistory, includeHealthy.\n\nAccepted fields:\n- bundle (optional, string): Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\".\n- targets (optional, array): Optional explicit cloud checks. Bundle price covers up to five normalized units. Constraints: min items: 1; max items: 5. Array items accept: provider, service, product, region, location.\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"bundle\": \"cloud-core\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "utility",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "cloud-bundles",
      "aisle": "Cloud Bundles",
      "shelfId": "multi-unit",
      "shelf": "Multi Unit",
      "offeringId": "cloud-status-bundle",
      "offering": "Cloud Status Small Bundle",
      "pathIds": [
        "cloud-status",
        "cloud-bundles",
        "multi-unit",
        "cloud-status-bundle"
      ],
      "pathLabels": [
        "Cloud Status",
        "Cloud Bundles",
        "Multi Unit",
        "Cloud Status Small Bundle"
      ],
      "taxonomyPath": "cloud-status.cloud-bundles.multi-unit.cloud-status-bundle",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "cloud-bundles",
          "name": "Cloud Bundles"
        },
        "shelf": {
          "id": "multi-unit",
          "name": "Multi Unit"
        },
        "offering": {
          "id": "cloud-status-bundle",
          "name": "Cloud Status Small Bundle"
        },
        "pathIds": [
          "cloud-status",
          "cloud-bundles",
          "multi-unit",
          "cloud-status-bundle"
        ],
        "pathLabels": [
          "Cloud Status",
          "Cloud Bundles",
          "Multi Unit",
          "Cloud Status Small Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "bundle",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/bundle",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/bundle",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "string",
            "enum": [
              "cloud-core",
              "aws-webapp",
              "gcp-ai-app",
              "azure-saas",
              "do-core",
              "linode-core"
            ],
            "default": "cloud-core",
            "description": "Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\"."
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "aws",
                    "gcp",
                    "azure",
                    "digitalocean",
                    "linode"
                  ],
                  "description": "Cloud provider id."
                },
                "service": {
                  "type": "string",
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                "product": {
                  "type": "string",
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                "region": {
                  "type": "string",
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                "location": {
                  "type": "string",
                  "description": "Provider location alias. Treated the same as region."
                }
              },
              "additionalProperties": false,
              "description": "Targets item object for configuring Cloud Status Small Bundle."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "Optional explicit cloud checks. Bundle price covers up to five normalized units."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "bundle",
          "targets",
          "includeHistory",
          "includeHealthy"
        ],
        "fields": [
          {
            "name": "bundle",
            "type": "string",
            "required": false,
            "description": "Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\".",
            "constraints": {
              "enum": [
                "cloud-core",
                "aws-webapp",
                "gcp-ai-app",
                "azure-saas",
                "do-core",
                "linode-core"
              ],
              "default": "cloud-core"
            }
          },
          {
            "name": "targets",
            "type": "array",
            "required": false,
            "description": "Optional explicit cloud checks. Bundle price covers up to five normalized units.",
            "constraints": {
              "minItems": 1,
              "maxItems": 5
            },
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "fields": [
                {
                  "name": "provider",
                  "type": "string",
                  "required": true,
                  "description": "Cloud provider id.",
                  "constraints": {
                    "enum": [
                      "aws",
                      "gcp",
                      "azure",
                      "digitalocean",
                      "linode"
                    ]
                  }
                },
                {
                  "name": "service",
                  "type": "string",
                  "required": false,
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                {
                  "name": "product",
                  "type": "string",
                  "required": false,
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                {
                  "name": "region",
                  "type": "string",
                  "required": false,
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                {
                  "name": "location",
                  "type": "string",
                  "required": false,
                  "description": "Provider location alias. Treated the same as region."
                }
              ]
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "bundle": "cloud-core",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "bundle": "cloud-core",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "cloud-core",
          "units": 4
        },
        "summary": {
          "worstStatus": "operational",
          "degraded": 0
        },
        "results": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-stack",
      "resource": "https://agentbodega.store/api/cloud/status/stack",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Stack Status Bundle",
      "description": "Check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.",
      "longDescription": "Purpose: Check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.\nBest use: Use this when an agent needs check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: targets.\nOptional fields: includeHistory, includeHealthy.\n\nAccepted fields:\n- targets (required, array): Caller-selected cloud checks. Stack price covers up to twelve normalized units. Constraints: min items: 3; max items: 12. Array items accept: provider, service, product, region, location.\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"targets\": [\n    {\n      \"provider\": \"aws\",\n      \"service\": \"lambda\",\n      \"region\": \"us-east-1\"\n    },\n    {\n      \"provider\": \"aws\",\n      \"service\": \"s3\",\n      \"region\": \"us-east-1\"\n    },\n    {\n      \"provider\": \"gcp\",\n      \"product\": \"cloud-run\",\n      \"location\": \"us-central1\"\n    },\n    {\n      \"provider\": \"azure\",\n      \"service\": \"app-service\",\n      \"region\": \"eastus\"\n    }\n  ],\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "http-json",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "cloud-bundles",
      "aisle": "Cloud Bundles",
      "shelfId": "multi-unit",
      "shelf": "Multi Unit",
      "offeringId": "cloud-status-stack",
      "offering": "Cloud Stack Status Bundle",
      "pathIds": [
        "cloud-status",
        "cloud-bundles",
        "multi-unit",
        "cloud-status-stack"
      ],
      "pathLabels": [
        "Cloud Status",
        "Cloud Bundles",
        "Multi Unit",
        "Cloud Stack Status Bundle"
      ],
      "taxonomyPath": "cloud-status.cloud-bundles.multi-unit.cloud-status-stack",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "cloud-bundles",
          "name": "Cloud Bundles"
        },
        "shelf": {
          "id": "multi-unit",
          "name": "Multi Unit"
        },
        "offering": {
          "id": "cloud-status-stack",
          "name": "Cloud Stack Status Bundle"
        },
        "pathIds": [
          "cloud-status",
          "cloud-bundles",
          "multi-unit",
          "cloud-status-stack"
        ],
        "pathLabels": [
          "Cloud Status",
          "Cloud Bundles",
          "Multi Unit",
          "Cloud Stack Status Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "custom-stack",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/stack",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/stack",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "targets"
        ],
        "properties": {
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "aws",
                    "gcp",
                    "azure",
                    "digitalocean",
                    "linode"
                  ],
                  "description": "Cloud provider id."
                },
                "service": {
                  "type": "string",
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                "product": {
                  "type": "string",
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                "region": {
                  "type": "string",
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                "location": {
                  "type": "string",
                  "description": "Provider location alias. Treated the same as region."
                }
              },
              "additionalProperties": false,
              "description": "Targets item object for configuring Cloud Stack Status Bundle."
            },
            "minItems": 3,
            "maxItems": 12,
            "description": "Caller-selected cloud checks. Stack price covers up to twelve normalized units."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "targets"
        ],
        "optional": [
          "includeHistory",
          "includeHealthy"
        ],
        "fields": [
          {
            "name": "targets",
            "type": "array",
            "required": true,
            "description": "Caller-selected cloud checks. Stack price covers up to twelve normalized units.",
            "constraints": {
              "minItems": 3,
              "maxItems": 12
            },
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "fields": [
                {
                  "name": "provider",
                  "type": "string",
                  "required": true,
                  "description": "Cloud provider id.",
                  "constraints": {
                    "enum": [
                      "aws",
                      "gcp",
                      "azure",
                      "digitalocean",
                      "linode"
                    ]
                  }
                },
                {
                  "name": "service",
                  "type": "string",
                  "required": false,
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                {
                  "name": "product",
                  "type": "string",
                  "required": false,
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                {
                  "name": "region",
                  "type": "string",
                  "required": false,
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                {
                  "name": "location",
                  "type": "string",
                  "required": false,
                  "description": "Provider location alias. Treated the same as region."
                }
              ]
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "targets": [
            {
              "provider": "aws",
              "service": "lambda",
              "region": "us-east-1"
            },
            {
              "provider": "aws",
              "service": "s3",
              "region": "us-east-1"
            },
            {
              "provider": "gcp",
              "product": "cloud-run",
              "location": "us-central1"
            },
            {
              "provider": "azure",
              "service": "app-service",
              "region": "eastus"
            }
          ],
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "targets": [
          {
            "provider": "aws",
            "service": "lambda",
            "region": "us-east-1"
          },
          {
            "provider": "aws",
            "service": "s3",
            "region": "us-east-1"
          },
          {
            "provider": "gcp",
            "product": "cloud-run",
            "location": "us-central1"
          },
          {
            "provider": "azure",
            "service": "app-service",
            "region": "eastus"
          }
        ],
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "custom-stack",
          "units": 5
        },
        "summary": {
          "worstStatus": "operational",
          "degraded": 0
        },
        "results": []
      },
      "configured": false
    },
    {
      "id": "status-bundle-check",
      "resource": "https://agentbodega.store/api/status/bundle",
      "type": "http",
      "method": "POST",
      "serviceName": "Vibe Deploy Readiness Bundle",
      "description": "Check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.",
      "longDescription": "Purpose: Check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.\nBest use: Use this when an agent needs check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: bundle, services, includeComponents.\n\nAccepted fields:\n- bundle (optional, string): Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\".\n- services (optional, array): Optional explicit service ids from /api/status/catalog. Constraints: min items: 1; max items: 20.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"bundle\": \"vibe-deploy-readiness\",\n  \"includeComponents\": false\n}\n```",
      "category": "agent-utilities",
      "kind": "utility",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "status-bundle-check",
      "offering": "Vibe Deploy Readiness Bundle",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "status-bundle-check"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Vibe Deploy Readiness Bundle"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.status-bundle-check",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "status-bundle-check",
          "name": "Vibe Deploy Readiness Bundle"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "status-bundle-check"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Vibe Deploy Readiness Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "deploy-readiness",
        "github",
        "gitlab",
        "vercel",
        "supabase",
        "openai"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bundle",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bundle",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "string",
            "enum": [
              "vibe-deploy-readiness",
              "ai-app-stack",
              "source-and-ci",
              "deploy-platforms",
              "all"
            ],
            "default": "vibe-deploy-readiness",
            "description": "Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\"."
          },
          "services": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Services item value for Vibe Deploy Readiness Bundle."
            },
            "minItems": 1,
            "maxItems": 20,
            "description": "Optional explicit service ids from /api/status/catalog."
          },
          "includeComponents": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "bundle",
          "services",
          "includeComponents"
        ],
        "fields": [
          {
            "name": "bundle",
            "type": "string",
            "required": false,
            "description": "Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\".",
            "constraints": {
              "enum": [
                "vibe-deploy-readiness",
                "ai-app-stack",
                "source-and-ci",
                "deploy-platforms",
                "all"
              ],
              "default": "vibe-deploy-readiness"
            }
          },
          {
            "name": "services",
            "type": "array",
            "required": false,
            "description": "Optional explicit service ids from /api/status/catalog.",
            "constraints": {
              "minItems": 1,
              "maxItems": 20
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "bundle": "vibe-deploy-readiness",
          "includeComponents": false
        }
      },
      "exampleRequest": {
        "bundle": "vibe-deploy-readiness",
        "includeComponents": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "vibe-deploy-readiness"
        },
        "summary": {
          "status": "operational"
        },
        "results": [
          {
            "service": {
              "id": "github"
            },
            "status": "operational"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "status-stack-bundle",
      "resource": "https://agentbodega.store/api/status/stack",
      "type": "http",
      "method": "POST",
      "serviceName": "Custom Stack Status Bundle",
      "description": "Check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.",
      "longDescription": "Purpose: Check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.\nBest use: Use this when an agent needs check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: services.\nOptional fields: includeComponents.\n\nAccepted fields:\n- services (required, array): Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host. Constraints: min items: 3; max items: 20.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"services\": [\n    \"github\",\n    \"npm\",\n    \"vercel\",\n    \"supabase\",\n    \"openai\"\n  ],\n  \"includeComponents\": false\n}\n```",
      "category": "agent-utilities",
      "kind": "utility",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "status-stack-bundle",
      "offering": "Custom Stack Status Bundle",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "status-stack-bundle"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Custom Stack Status Bundle"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.status-stack-bundle",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "status-stack-bundle",
          "name": "Custom Stack Status Bundle"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "status-stack-bundle"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Custom Stack Status Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "custom-stack",
        "deploy-readiness",
        "github",
        "vercel",
        "supabase",
        "openai"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/stack",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/stack",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "services"
        ],
        "properties": {
          "services": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Services item value for Custom Stack Status Bundle."
            },
            "minItems": 3,
            "maxItems": 20,
            "description": "Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host."
          },
          "includeComponents": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "services"
        ],
        "optional": [
          "includeComponents"
        ],
        "fields": [
          {
            "name": "services",
            "type": "array",
            "required": true,
            "description": "Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host.",
            "constraints": {
              "minItems": 3,
              "maxItems": 20
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "services": [
            "github",
            "npm",
            "vercel",
            "supabase",
            "openai"
          ],
          "includeComponents": false
        }
      },
      "exampleRequest": {
        "services": [
          "github",
          "npm",
          "vercel",
          "supabase",
          "openai"
        ],
        "includeComponents": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "vibe-deploy-readiness"
        },
        "summary": {
          "status": "operational"
        },
        "results": [
          {
            "service": {
              "id": "github"
            },
            "status": "operational"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "official-status-github",
      "resource": "https://agentbodega.store/api/status/github",
      "type": "http",
      "method": "POST",
      "serviceName": "GitHub Status Check",
      "description": "Check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for GitHub Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "github",
      "shelf": "Github",
      "offeringId": "official-status-github",
      "offering": "GitHub Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "github",
        "official-status-github"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Github",
        "GitHub Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.github.official-status-github",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "github",
          "name": "Github"
        },
        "offering": {
          "id": "official-status-github",
          "name": "GitHub Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "github",
          "official-status-github"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Github",
          "GitHub Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "github",
        "git",
        "ci",
        "packages",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/github",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/github",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for GitHub Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for GitHub Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for GitHub Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "GitHub Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-gitlab",
      "resource": "https://agentbodega.store/api/status/gitlab",
      "type": "http",
      "method": "POST",
      "serviceName": "GitLab Status Check",
      "description": "Check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for GitLab Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "gitlab",
      "shelf": "Gitlab",
      "offeringId": "official-status-gitlab",
      "offering": "GitLab Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "gitlab",
        "official-status-gitlab"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Gitlab",
        "GitLab Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.gitlab.official-status-gitlab",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "gitlab",
          "name": "Gitlab"
        },
        "offering": {
          "id": "official-status-gitlab",
          "name": "GitLab Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "gitlab",
          "official-status-gitlab"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Gitlab",
          "GitLab Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "gitlab",
        "git",
        "ci",
        "packages",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/gitlab",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/gitlab",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for GitLab Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for GitLab Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for GitLab Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "GitLab Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-bitbucket",
      "resource": "https://agentbodega.store/api/status/bitbucket",
      "type": "http",
      "method": "POST",
      "serviceName": "Bitbucket Status Check",
      "description": "Check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "bitbucket",
      "shelf": "Bitbucket",
      "offeringId": "official-status-bitbucket",
      "offering": "Bitbucket Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "bitbucket",
        "official-status-bitbucket"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Bitbucket",
        "Bitbucket Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.bitbucket.official-status-bitbucket",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "bitbucket",
          "name": "Bitbucket"
        },
        "offering": {
          "id": "official-status-bitbucket",
          "name": "Bitbucket Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "bitbucket",
          "official-status-bitbucket"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Bitbucket",
          "Bitbucket Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "bitbucket",
        "git",
        "ci",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bitbucket",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bitbucket",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Bitbucket Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Bitbucket Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-npm",
      "resource": "https://agentbodega.store/api/status/npm",
      "type": "http",
      "method": "POST",
      "serviceName": "npm Status Check",
      "description": "Check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for npm Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "npm",
      "shelf": "Npm",
      "offeringId": "official-status-npm",
      "offering": "npm Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "npm",
        "official-status-npm"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Npm",
        "npm Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.npm.official-status-npm",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "npm",
          "name": "Npm"
        },
        "offering": {
          "id": "official-status-npm",
          "name": "npm Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "npm",
          "official-status-npm"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Npm",
          "npm Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "npm",
        "node",
        "packages",
        "registry",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/npm",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/npm",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for npm Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for npm Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for npm Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "npm Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-vercel",
      "resource": "https://agentbodega.store/api/status/vercel",
      "type": "http",
      "method": "POST",
      "serviceName": "Vercel Status Check",
      "description": "Check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Vercel Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "vercel",
      "shelf": "Vercel",
      "offeringId": "official-status-vercel",
      "offering": "Vercel Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "vercel",
        "official-status-vercel"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Vercel",
        "Vercel Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.vercel.official-status-vercel",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "vercel",
          "name": "Vercel"
        },
        "offering": {
          "id": "official-status-vercel",
          "name": "Vercel Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "vercel",
          "official-status-vercel"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Vercel",
          "Vercel Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "vercel",
        "deploy",
        "hosting",
        "nextjs",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/vercel",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/vercel",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Vercel Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Vercel Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Vercel Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Vercel Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-netlify",
      "resource": "https://agentbodega.store/api/status/netlify",
      "type": "http",
      "method": "POST",
      "serviceName": "Netlify Status Check",
      "description": "Check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Netlify Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "netlify",
      "shelf": "Netlify",
      "offeringId": "official-status-netlify",
      "offering": "Netlify Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "netlify",
        "official-status-netlify"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Netlify",
        "Netlify Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.netlify.official-status-netlify",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "netlify",
          "name": "Netlify"
        },
        "offering": {
          "id": "official-status-netlify",
          "name": "Netlify Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "netlify",
          "official-status-netlify"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Netlify",
          "Netlify Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "netlify",
        "deploy",
        "hosting",
        "functions",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/netlify",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/netlify",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Netlify Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Netlify Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Netlify Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Netlify Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-render",
      "resource": "https://agentbodega.store/api/status/render",
      "type": "http",
      "method": "POST",
      "serviceName": "Render Status Check",
      "description": "Check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Render Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "render",
      "shelf": "Render",
      "offeringId": "official-status-render",
      "offering": "Render Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "render",
        "official-status-render"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Render",
        "Render Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.render.official-status-render",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "render",
          "name": "Render"
        },
        "offering": {
          "id": "official-status-render",
          "name": "Render Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "render",
          "official-status-render"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Render",
          "Render Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "render",
        "deploy",
        "hosting",
        "postgres",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/render",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/render",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Render Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Render Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Render Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Render Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-fly",
      "resource": "https://agentbodega.store/api/status/fly",
      "type": "http",
      "method": "POST",
      "serviceName": "Fly.io Status Check",
      "description": "Check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "fly",
      "shelf": "Fly",
      "offeringId": "official-status-fly",
      "offering": "Fly.io Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "fly",
        "official-status-fly"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Fly",
        "Fly.io Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.fly.official-status-fly",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "fly",
          "name": "Fly"
        },
        "offering": {
          "id": "official-status-fly",
          "name": "Fly.io Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "fly",
          "official-status-fly"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Fly",
          "Fly.io Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "fly",
        "flyio",
        "deploy",
        "hosting",
        "edge",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/fly",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/fly",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Fly.io Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Fly.io Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-railway",
      "resource": "https://agentbodega.store/api/status/railway",
      "type": "http",
      "method": "POST",
      "serviceName": "Railway Status Check",
      "description": "Check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Railway Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "railway",
      "shelf": "Railway",
      "offeringId": "official-status-railway",
      "offering": "Railway Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "railway",
        "official-status-railway"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Railway",
        "Railway Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.railway.official-status-railway",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "railway",
          "name": "Railway"
        },
        "offering": {
          "id": "official-status-railway",
          "name": "Railway Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "railway",
          "official-status-railway"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Railway",
          "Railway Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "railway",
        "deploy",
        "hosting",
        "builds",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/railway",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/railway",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Railway Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Railway Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Railway Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Railway Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-coinbase",
      "resource": "https://agentbodega.store/api/status/coinbase",
      "type": "http",
      "method": "POST",
      "serviceName": "Coinbase Status Check",
      "description": "Check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "coinbase",
      "shelf": "Coinbase",
      "offeringId": "official-status-coinbase",
      "offering": "Coinbase Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "coinbase",
        "official-status-coinbase"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Coinbase",
        "Coinbase Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.coinbase.official-status-coinbase",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "coinbase",
          "name": "Coinbase"
        },
        "offering": {
          "id": "official-status-coinbase",
          "name": "Coinbase Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "coinbase",
          "official-status-coinbase"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Coinbase",
          "Coinbase Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "coinbase",
        "crypto",
        "payments",
        "wallet",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/coinbase",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/coinbase",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Coinbase Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Coinbase Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-cursor",
      "resource": "https://agentbodega.store/api/status/cursor",
      "type": "http",
      "method": "POST",
      "serviceName": "Cursor Status Check",
      "description": "Check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Cursor Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "cursor",
      "shelf": "Cursor",
      "offeringId": "official-status-cursor",
      "offering": "Cursor Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "cursor",
        "official-status-cursor"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Cursor",
        "Cursor Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.cursor.official-status-cursor",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "cursor",
          "name": "Cursor"
        },
        "offering": {
          "id": "official-status-cursor",
          "name": "Cursor Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "cursor",
          "official-status-cursor"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Cursor",
          "Cursor Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cursor",
        "ai",
        "editor",
        "ide",
        "developer-tools",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/cursor",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/cursor",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Cursor Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Cursor Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Cursor Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Cursor Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-bambulab",
      "resource": "https://agentbodega.store/api/status/bambulab",
      "type": "http",
      "method": "POST",
      "serviceName": "Bambu Lab Status Check",
      "description": "Check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "bambulab",
      "shelf": "Bambulab",
      "offeringId": "official-status-bambulab",
      "offering": "Bambu Lab Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "bambulab",
        "official-status-bambulab"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Bambulab",
        "Bambu Lab Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.bambulab.official-status-bambulab",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "bambulab",
          "name": "Bambulab"
        },
        "offering": {
          "id": "official-status-bambulab",
          "name": "Bambu Lab Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "bambulab",
          "official-status-bambulab"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Bambulab",
          "Bambu Lab Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "bambu-lab",
        "3d-printing",
        "hardware",
        "iot",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bambulab",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bambulab",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Bambu Lab Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Bambu Lab Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-ring",
      "resource": "https://agentbodega.store/api/status/ring",
      "type": "http",
      "method": "POST",
      "serviceName": "Ring Status Check",
      "description": "Check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Ring Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "ring",
      "shelf": "Ring",
      "offeringId": "official-status-ring",
      "offering": "Ring Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "ring",
        "official-status-ring"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Ring",
        "Ring Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.ring.official-status-ring",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "ring",
          "name": "Ring"
        },
        "offering": {
          "id": "official-status-ring",
          "name": "Ring Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "ring",
          "official-status-ring"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Ring",
          "Ring Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "ring",
        "iot",
        "security",
        "camera",
        "smart-home",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/ring",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/ring",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Ring Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Ring Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Ring Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Ring Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-cloudflare",
      "resource": "https://agentbodega.store/api/status/cloudflare",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloudflare Status Check",
      "description": "Check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "cloudflare",
      "shelf": "Cloudflare",
      "offeringId": "official-status-cloudflare",
      "offering": "Cloudflare Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "cloudflare",
        "official-status-cloudflare"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Cloudflare",
        "Cloudflare Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.cloudflare.official-status-cloudflare",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "cloudflare",
          "name": "Cloudflare"
        },
        "offering": {
          "id": "official-status-cloudflare",
          "name": "Cloudflare Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "cloudflare",
          "official-status-cloudflare"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Cloudflare",
          "Cloudflare Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloudflare",
        "dns",
        "cdn",
        "workers",
        "edge",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/cloudflare",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/cloudflare",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Cloudflare Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Cloudflare Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-supabase",
      "resource": "https://agentbodega.store/api/status/supabase",
      "type": "http",
      "method": "POST",
      "serviceName": "Supabase Status Check",
      "description": "Check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Supabase Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "supabase",
      "shelf": "Supabase",
      "offeringId": "official-status-supabase",
      "offering": "Supabase Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "supabase",
        "official-status-supabase"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Supabase",
        "Supabase Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.supabase.official-status-supabase",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "supabase",
          "name": "Supabase"
        },
        "offering": {
          "id": "official-status-supabase",
          "name": "Supabase Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "supabase",
          "official-status-supabase"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Supabase",
          "Supabase Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "supabase",
        "postgres",
        "auth",
        "storage",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/supabase",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/supabase",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Supabase Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Supabase Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Supabase Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Supabase Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-convex",
      "resource": "https://agentbodega.store/api/status/convex",
      "type": "http",
      "method": "POST",
      "serviceName": "Convex Status Check",
      "description": "Check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Convex Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "convex",
      "shelf": "Convex",
      "offeringId": "official-status-convex",
      "offering": "Convex Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "convex",
        "official-status-convex"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Convex",
        "Convex Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.convex.official-status-convex",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "convex",
          "name": "Convex"
        },
        "offering": {
          "id": "official-status-convex",
          "name": "Convex Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "convex",
          "official-status-convex"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Convex",
          "Convex Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "convex",
        "backend",
        "database",
        "realtime",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/convex",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/convex",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Convex Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Convex Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Convex Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Convex Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-clerk",
      "resource": "https://agentbodega.store/api/status/clerk",
      "type": "http",
      "method": "POST",
      "serviceName": "Clerk Status Check",
      "description": "Check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Clerk Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "clerk",
      "shelf": "Clerk",
      "offeringId": "official-status-clerk",
      "offering": "Clerk Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "clerk",
        "official-status-clerk"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Clerk",
        "Clerk Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.clerk.official-status-clerk",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "clerk",
          "name": "Clerk"
        },
        "offering": {
          "id": "official-status-clerk",
          "name": "Clerk Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "clerk",
          "official-status-clerk"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Clerk",
          "Clerk Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "clerk",
        "auth",
        "identity",
        "sessions",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/clerk",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/clerk",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Clerk Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Clerk Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Clerk Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Clerk Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-openai",
      "resource": "https://agentbodega.store/api/status/openai",
      "type": "http",
      "method": "POST",
      "serviceName": "OpenAI Status Check",
      "description": "Check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "openai",
      "shelf": "Openai",
      "offeringId": "official-status-openai",
      "offering": "OpenAI Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "openai",
        "official-status-openai"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Openai",
        "OpenAI Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.openai.official-status-openai",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "openai",
          "name": "Openai"
        },
        "offering": {
          "id": "official-status-openai",
          "name": "OpenAI Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "openai",
          "official-status-openai"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Openai",
          "OpenAI Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "openai",
        "ai",
        "llm",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/openai",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/openai",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for OpenAI Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "OpenAI Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-anthropic",
      "resource": "https://agentbodega.store/api/status/anthropic",
      "type": "http",
      "method": "POST",
      "serviceName": "Anthropic Claude Status Check",
      "description": "Check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "anthropic",
      "shelf": "Anthropic",
      "offeringId": "official-status-anthropic",
      "offering": "Anthropic Claude Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "anthropic",
        "official-status-anthropic"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Anthropic",
        "Anthropic Claude Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.anthropic.official-status-anthropic",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "anthropic",
          "name": "Anthropic"
        },
        "offering": {
          "id": "official-status-anthropic",
          "name": "Anthropic Claude Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "anthropic",
          "official-status-anthropic"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Anthropic",
          "Anthropic Claude Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "anthropic",
        "claude",
        "ai",
        "llm",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/anthropic",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/anthropic",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Anthropic Claude Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Anthropic Claude Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "domain-launch-check",
      "resource": "https://agentbodega.store/api/check/domain",
      "type": "http",
      "method": "POST",
      "serviceName": "DNS SSL Email Launch Check",
      "description": "Check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.",
      "longDescription": "Purpose: Check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.\nBest use: Use this when an agent needs check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: domain.\nOptional fields: dkimSelectors.\n\nAccepted fields:\n- domain (required, string): Domain name to inspect, without a URL scheme. Constraints: min length: 1.\n- dkimSelectors (optional, array): Optional DKIM selectors to check, such as google or selector1. Constraints: max items: 10.\n\nExample request body:\n```json\n{\n  \"domain\": \"example.com\",\n  \"dkimSelectors\": [\n    \"google\",\n    \"selector1\"\n  ]\n}\n```",
      "category": "launch-checks",
      "kind": "utility",
      "departmentId": "launch-checks",
      "department": "Launch Checks",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "domain-launch-check",
      "offering": "DNS SSL Email Launch Check",
      "pathIds": [
        "launch-checks",
        "readiness-audits",
        "utility",
        "domain-launch-check"
      ],
      "pathLabels": [
        "Launch Checks",
        "Readiness Audits",
        "Utility",
        "DNS SSL Email Launch Check"
      ],
      "taxonomyPath": "launch-checks.readiness-audits.utility.domain-launch-check",
      "layout": {
        "department": {
          "id": "launch-checks",
          "name": "Launch Checks"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "domain-launch-check",
          "name": "DNS SSL Email Launch Check"
        },
        "pathIds": [
          "launch-checks",
          "readiness-audits",
          "utility",
          "domain-launch-check"
        ],
        "pathLabels": [
          "Launch Checks",
          "Readiness Audits",
          "Utility",
          "DNS SSL Email Launch Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "dns",
        "ssl",
        "email",
        "deliverability",
        "launch-check"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/domain",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/domain",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "domain"
        ],
        "properties": {
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Domain name to inspect, without a URL scheme."
          },
          "dkimSelectors": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Dkim Selectors item value for DNS SSL Email Launch Check."
            },
            "maxItems": 10,
            "description": "Optional DKIM selectors to check, such as google or selector1."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "domain"
        ],
        "optional": [
          "dkimSelectors"
        ],
        "fields": [
          {
            "name": "domain",
            "type": "string",
            "required": true,
            "description": "Domain name to inspect, without a URL scheme.",
            "constraints": {
              "minLength": 1
            }
          },
          {
            "name": "dkimSelectors",
            "type": "array",
            "required": false,
            "description": "Optional DKIM selectors to check, such as google or selector1.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "domain": "example.com",
          "dkimSelectors": [
            "google",
            "selector1"
          ]
        }
      },
      "exampleRequest": {
        "domain": "example.com",
        "dkimSelectors": [
          "google",
          "selector1"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "domain": "example.com",
        "summary": {
          "status": "pass",
          "score": 92
        },
        "checks": [
          {
            "name": "https",
            "status": "pass"
          },
          {
            "name": "spf",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "hosted-artifact",
      "resource": "https://agentbodega.store/api/artifacts",
      "type": "http",
      "method": "POST",
      "serviceName": "Temporary Hosted Artifact",
      "description": "Create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.",
      "longDescription": "Purpose: Create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.\nBest use: Use this when an agent needs create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: kind, content.\nOptional fields: contentType, ttlSeconds, filename.\n\nAccepted fields:\n- kind (required, string): Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\".\n- content (required, any): Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json.\n- contentType (optional, string): Optional MIME type override.\n- ttlSeconds (optional, integer): Artifact lifetime in seconds. Constraints: default: 86400; min: 60; max: 604800.\n- filename (optional, string): Optional display filename. Constraints: max length: 120.\n\nExample request body:\n```json\n{\n  \"kind\": \"json\",\n  \"content\": {\n    \"ok\": true,\n    \"message\": \"hello agent\"\n  },\n  \"ttlSeconds\": 3600\n}\n```",
      "category": "agent-utilities",
      "kind": "http-json",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "hosted-artifact",
      "offering": "Temporary Hosted Artifact",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "hosted-artifact"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Temporary Hosted Artifact"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.hosted-artifact",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "hosted-artifact",
          "name": "Temporary Hosted Artifact"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "hosted-artifact"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Temporary Hosted Artifact"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "artifact-hosting",
        "webhook-bin",
        "signed-url",
        "agent-tools"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/artifacts",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/artifacts",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "kind",
          "content"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "text",
              "json",
              "svg",
              "redirect"
            ],
            "description": "Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\"."
          },
          "content": {
            "description": "Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json."
          },
          "contentType": {
            "type": "string",
            "description": "Optional MIME type override."
          },
          "ttlSeconds": {
            "type": "integer",
            "minimum": 60,
            "maximum": 604800,
            "default": 86400,
            "description": "Artifact lifetime in seconds."
          },
          "filename": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional display filename."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "kind",
          "content"
        ],
        "optional": [
          "contentType",
          "ttlSeconds",
          "filename"
        ],
        "fields": [
          {
            "name": "kind",
            "type": "string",
            "required": true,
            "description": "Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\".",
            "constraints": {
              "enum": [
                "text",
                "json",
                "svg",
                "redirect"
              ]
            }
          },
          {
            "name": "content",
            "type": "any",
            "required": true,
            "description": "Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json."
          },
          {
            "name": "contentType",
            "type": "string",
            "required": false,
            "description": "Optional MIME type override."
          },
          {
            "name": "ttlSeconds",
            "type": "integer",
            "required": false,
            "description": "Artifact lifetime in seconds.",
            "constraints": {
              "default": 86400,
              "minimum": 60,
              "maximum": 604800
            }
          },
          {
            "name": "filename",
            "type": "string",
            "required": false,
            "description": "Optional display filename.",
            "constraints": {
              "maxLength": 120
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "kind": "json",
          "content": {
            "ok": true,
            "message": "hello agent"
          },
          "ttlSeconds": 3600
        }
      },
      "exampleRequest": {
        "kind": "json",
        "content": {
          "ok": true,
          "message": "hello agent"
        },
        "ttlSeconds": 3600
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "artifactUrl",
          "expiresAt"
        ],
        "properties": {
          "artifactUrl": {
            "type": "string",
            "format": "uri"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "outputExample": {
        "artifactUrl": "signed hosted URL",
        "expiresAt": "2026-07-04T16:00:00.000Z",
        "bytes": 128
      },
      "configured": false
    },
    {
      "id": "agent-launch-audit",
      "resource": "https://agentbodega.store/api/audit/agent-launch",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Launch Audit",
      "description": "Audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.",
      "longDescription": "Purpose: Audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.\nBest use: Use this when an agent needs audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: siteType, includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Launch Audit. Constraints: format: uri. Constraints: format: uri.\n- siteType (optional, string): Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"siteType\": \"all\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-launch-audit",
      "offering": "Agent Launch Audit",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-launch-audit"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Launch Audit"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-launch-audit",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-launch-audit",
          "name": "Agent Launch Audit"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-launch-audit"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Launch Audit"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "launch-audit",
        "mcp",
        "agent-skills",
        "x402",
        "seo"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/audit/agent-launch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/audit/agent-launch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Launch Audit. Constraints: format: uri."
          },
          "siteType": {
            "type": "string",
            "enum": [
              "all",
              "content",
              "api"
            ],
            "default": "all",
            "description": "Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "siteType",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Launch Audit. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "siteType",
            "type": "string",
            "required": false,
            "description": "Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "content",
                "api"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "siteType": "all",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "siteType": "all",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 86,
          "verdict": "agent-ready with fixes"
        },
        "checks": [
          {
            "name": "OpenAPI",
            "status": "pass"
          },
          {
            "name": "x402 discovery",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-discoverability-check",
      "resource": "https://agentbodega.store/api/check/agent-discoverability",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Discoverability Check",
      "description": "Check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.",
      "longDescription": "Purpose: Check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.\nBest use: Use this when an agent needs check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Discoverability Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-discoverability-check",
      "offering": "Agent Discoverability Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-discoverability-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Discoverability Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-discoverability-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-discoverability-check",
          "name": "Agent Discoverability Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-discoverability-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Discoverability Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "robots",
        "sitemap",
        "llms",
        "markdown",
        "link-headers"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-discoverability",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-discoverability",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Discoverability Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Discoverability Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 78
        },
        "checks": [
          {
            "name": "robots.txt",
            "status": "pass"
          },
          {
            "name": "sitemap",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-protocol-check",
      "resource": "https://agentbodega.store/api/check/agent-protocols",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Protocol Discovery Check",
      "description": "Check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.",
      "longDescription": "Purpose: Check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.\nBest use: Use this when an agent needs check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Protocol Discovery Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-protocol-check",
      "offering": "Agent Protocol Discovery Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-protocol-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Protocol Discovery Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-protocol-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-protocol-check",
          "name": "Agent Protocol Discovery Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-protocol-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Protocol Discovery Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "openapi",
        "mcp",
        "agent-skills",
        "oauth",
        "a2a",
        "webmcp"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-protocols",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-protocols",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Protocol Discovery Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Protocol Discovery Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 82
        },
        "checks": [
          {
            "name": "OpenAPI",
            "status": "pass"
          },
          {
            "name": "MCP card",
            "status": "neutral"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-commerce-check",
      "resource": "https://agentbodega.store/api/check/agent-commerce",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Commerce Check",
      "description": "Check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.",
      "longDescription": "Purpose: Check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.\nBest use: Use this when an agent needs check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Commerce Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-commerce-check",
      "offering": "Agent Commerce Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-commerce-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Commerce Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-commerce-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-commerce-check",
          "name": "Agent Commerce Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-commerce-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Commerce Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "x402",
        "mpp",
        "ucp",
        "acp",
        "commerce"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-commerce",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-commerce",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Commerce Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Commerce Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 70
        },
        "checks": [
          {
            "name": "x402",
            "status": "pass"
          },
          {
            "name": "payment hints",
            "status": "neutral"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-readiness-batch",
      "resource": "https://agentbodega.store/api/audit/agent-batch",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Readiness Batch Audit",
      "description": "Run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.",
      "longDescription": "Purpose: Run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.\nBest use: Use this when an agent needs run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: urls.\nOptional fields: scope, includeEvidence.\n\nAccepted fields:\n- urls (required, array): List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5. Constraints: min items: 1; max items: 5.\n- scope (optional, string): Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"urls\": [\n    \"https://example.com\",\n    \"https://example.org\"\n  ],\n  \"scope\": \"all\",\n  \"includeEvidence\": false\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-readiness-batch",
      "offering": "Agent Readiness Batch Audit",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-readiness-batch"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Readiness Batch Audit"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-readiness-batch",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-readiness-batch",
          "name": "Agent Readiness Batch Audit"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-readiness-batch"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Readiness Batch Audit"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "batch-audit",
        "launch-audit",
        "seo",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/audit/agent-batch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/audit/agent-batch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri",
              "description": "Urls item value for Agent Readiness Batch Audit. Constraints: format: uri."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5."
          },
          "scope": {
            "type": "string",
            "enum": [
              "all",
              "discoverability",
              "protocols",
              "commerce"
            ],
            "default": "all",
            "description": "Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "urls"
        ],
        "optional": [
          "scope",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "urls",
            "type": "array",
            "required": true,
            "description": "List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5.",
            "constraints": {
              "minItems": 1,
              "maxItems": 5
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "scope",
            "type": "string",
            "required": false,
            "description": "Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "discoverability",
                "protocols",
                "commerce"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "urls": [
            "https://example.com",
            "https://example.org"
          ],
          "scope": "all",
          "includeEvidence": false
        }
      },
      "exampleRequest": {
        "urls": [
          "https://example.com",
          "https://example.org"
        ],
        "scope": "all",
        "includeEvidence": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "compared": 3,
          "best": "example.com"
        },
        "results": [
          {
            "site": "example.com",
            "score": 86
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-ready-badge",
      "resource": "https://agentbodega.store/api/badge/agent-ready",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Ready Badge",
      "description": "Generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.",
      "longDescription": "Purpose: Generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.\nBest use: Use this when an agent needs generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: scope, includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Ready Badge. Constraints: format: uri. Constraints: format: uri.\n- scope (optional, string): Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"scope\": \"all\",\n  \"includeEvidence\": false\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-ready-badge",
      "offering": "Agent Ready Badge",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-ready-badge"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Ready Badge"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-ready-badge",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-ready-badge",
          "name": "Agent Ready Badge"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-ready-badge"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Ready Badge"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "badge",
        "svg",
        "launch-audit"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/badge/agent-ready",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/badge/agent-ready",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Ready Badge. Constraints: format: uri."
          },
          "scope": {
            "type": "string",
            "enum": [
              "all",
              "discoverability",
              "protocols",
              "commerce"
            ],
            "default": "all",
            "description": "Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "scope",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Ready Badge. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "scope",
            "type": "string",
            "required": false,
            "description": "Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "discoverability",
                "protocols",
                "commerce"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "scope": "all",
          "includeEvidence": false
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "scope": "all",
        "includeEvidence": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "score": 86,
        "badgeSvg": "<svg>...</svg>",
        "summary": {
          "verdict": "agent-ready"
        }
      },
      "configured": false
    },
    {
      "id": "x402-directory-pack",
      "resource": "https://agentbodega.store/api/package/x402-directory",
      "type": "http",
      "method": "POST",
      "serviceName": "x402 Directory Listing Pack",
      "description": "Build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.",
      "longDescription": "Purpose: Build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.\nBest use: Use this when an agent needs build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: name, tags.\n\nAccepted fields:\n- url (required, string): Url value for x402 Directory Listing Pack. Constraints: format: uri. Constraints: format: uri.\n- name (optional, string): Name value for x402 Directory Listing Pack. Constraints: max length: 80. Constraints: max length: 80.\n- tags (optional, array): List of tags values for x402 Directory Listing Pack. Constraints: max items: 12. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"name\": \"Example x402 API\",\n  \"tags\": [\n    \"x402\",\n    \"agents\"\n  ]\n}\n```",
      "category": "x402-tools",
      "kind": "http-json",
      "departmentId": "x402-tools",
      "department": "x402 Tools",
      "aisleId": "payment-discovery",
      "aisle": "Payment Discovery",
      "shelfId": "directory-packaging",
      "shelf": "Directory Packaging",
      "offeringId": "x402-directory-pack",
      "offering": "x402 Directory Listing Pack",
      "pathIds": [
        "x402-tools",
        "payment-discovery",
        "directory-packaging",
        "x402-directory-pack"
      ],
      "pathLabels": [
        "x402 Tools",
        "Payment Discovery",
        "Directory Packaging",
        "x402 Directory Listing Pack"
      ],
      "taxonomyPath": "x402-tools.payment-discovery.directory-packaging.x402-directory-pack",
      "layout": {
        "department": {
          "id": "x402-tools",
          "name": "x402 Tools"
        },
        "aisle": {
          "id": "payment-discovery",
          "name": "Payment Discovery"
        },
        "shelf": {
          "id": "directory-packaging",
          "name": "Directory Packaging"
        },
        "offering": {
          "id": "x402-directory-pack",
          "name": "x402 Directory Listing Pack"
        },
        "pathIds": [
          "x402-tools",
          "payment-discovery",
          "directory-packaging",
          "x402-directory-pack"
        ],
        "pathLabels": [
          "x402 Tools",
          "Payment Discovery",
          "Directory Packaging",
          "x402 Directory Listing Pack"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "x402",
        "directory-listing",
        "marketplace",
        "bazaar",
        "discovery"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/package/x402-directory",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/package/x402-directory",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for x402 Directory Listing Pack. Constraints: format: uri."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Name value for x402 Directory Listing Pack. Constraints: max length: 80."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Tags item value for x402 Directory Listing Pack."
            },
            "maxItems": 12,
            "description": "List of tags values for x402 Directory Listing Pack. Constraints: max items: 12."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "name",
          "tags"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for x402 Directory Listing Pack. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Name value for x402 Directory Listing Pack. Constraints: max length: 80.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "tags",
            "type": "array",
            "required": false,
            "description": "List of tags values for x402 Directory Listing Pack. Constraints: max items: 12.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "name": "Example x402 API",
          "tags": [
            "x402",
            "agents"
          ]
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "name": "Example x402 API",
        "tags": [
          "x402",
          "agents"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "listing": {
          "payableResourceCount": 12,
          "score": 91
        },
        "files": [
          {
            "name": "openapi.json"
          },
          {
            "name": "x402 discovery"
          }
        ]
      },
      "configured": false
    }
  ],
  "endpoints": [
    {
      "id": "x402-inspector",
      "resource": "https://agentbodega.store/api/inspect/x402",
      "type": "http",
      "method": "POST",
      "serviceName": "x402 Endpoint Inspector",
      "description": "Inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.",
      "longDescription": "Purpose: Inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.\nBest use: Use this when an agent needs inspect a URL for x402 payment challenges, payable metadata, discovery links, OpenAPI, MCP, Agent Skills, and Bazaar-readiness signals.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: method, headers, body, timeoutMs.\n\nAccepted fields:\n- url (required, string): Url value for x402 Endpoint Inspector. Constraints: format: uri. Constraints: format: uri.\n- method (optional, string): Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\".\n- headers (optional, object): Headers object for configuring x402 Endpoint Inspector.\n- body (optional, object): Body object for configuring x402 Endpoint Inspector.\n- timeoutMs (optional, integer): Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000. Constraints: default: 5000; min: 500; max: 8000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com/api/paid\"\n}\n```",
      "category": "x402-tools",
      "kind": "http-json",
      "departmentId": "x402-tools",
      "department": "x402 Tools",
      "aisleId": "payment-discovery",
      "aisle": "Payment Discovery",
      "shelfId": "endpoint-inspection",
      "shelf": "Endpoint Inspection",
      "offeringId": "x402-inspector",
      "offering": "x402 Endpoint Inspector",
      "pathIds": [
        "x402-tools",
        "payment-discovery",
        "endpoint-inspection",
        "x402-inspector"
      ],
      "pathLabels": [
        "x402 Tools",
        "Payment Discovery",
        "Endpoint Inspection",
        "x402 Endpoint Inspector"
      ],
      "taxonomyPath": "x402-tools.payment-discovery.endpoint-inspection.x402-inspector",
      "layout": {
        "department": {
          "id": "x402-tools",
          "name": "x402 Tools"
        },
        "aisle": {
          "id": "payment-discovery",
          "name": "Payment Discovery"
        },
        "shelf": {
          "id": "endpoint-inspection",
          "name": "Endpoint Inspection"
        },
        "offering": {
          "id": "x402-inspector",
          "name": "x402 Endpoint Inspector"
        },
        "pathIds": [
          "x402-tools",
          "payment-discovery",
          "endpoint-inspection",
          "x402-inspector"
        ],
        "pathLabels": [
          "x402 Tools",
          "Payment Discovery",
          "Endpoint Inspection",
          "x402 Endpoint Inspector"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "x402",
        "inspection",
        "agent-tools",
        "bazaar",
        "openapi"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/inspect/x402",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/inspect/x402",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for x402 Endpoint Inspector. Constraints: format: uri."
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "HEAD",
              "POST"
            ],
            "default": "GET",
            "description": "Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\"."
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Headers object for configuring x402 Endpoint Inspector."
          },
          "body": {
            "type": "object",
            "additionalProperties": true,
            "description": "Body object for configuring x402 Endpoint Inspector."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 500,
            "maximum": 8000,
            "default": 5000,
            "description": "Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "method",
          "headers",
          "body",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for x402 Endpoint Inspector. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "method",
            "type": "string",
            "required": false,
            "description": "Method filter for x402 Endpoint Inspector. Accepted values: \"GET\", \"HEAD\", \"POST\". Constraints: accepted values: \"GET\", \"HEAD\", \"POST\"; default: \"GET\".",
            "constraints": {
              "enum": [
                "GET",
                "HEAD",
                "POST"
              ],
              "default": "GET"
            }
          },
          {
            "name": "headers",
            "type": "object",
            "required": false,
            "description": "Headers object for configuring x402 Endpoint Inspector."
          },
          {
            "name": "body",
            "type": "object",
            "required": false,
            "description": "Body object for configuring x402 Endpoint Inspector."
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Timeout Ms numeric value for x402 Endpoint Inspector. Constraints: default: 5000; min: 500; max: 8000.",
            "constraints": {
              "default": 5000,
              "minimum": 500,
              "maximum": 8000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com/api/paid"
        }
      },
      "exampleRequest": {
        "url": "https://example.com/api/paid"
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "paymentRequired": true,
        "status": 402,
        "metadataQuality": {
          "score": 100
        },
        "discovery": {
          "x402": {
            "status": 200
          },
          "openapi": {
            "status": 200
          }
        }
      },
      "configured": false
    },
    {
      "id": "public-data-catalog",
      "resource": "https://agentbodega.store/api/public-data/catalog",
      "type": "http",
      "method": "POST",
      "serviceName": "Public Data Catalog",
      "description": "Return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.",
      "longDescription": "Purpose: Return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.\nBest use: Use this when an agent needs return AgentBodega's Public Data department offerings grouped by category with full input/output schemas, prices, route paths, and workflow guidance.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, category, name, includeSchemas, limit.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against endpoint name, title, category, description, tags, and path.\n- category (optional, string): Optional Public Data department/category to return. Constraints: accepted values: \"catalog\", \"workflow-bundles\", \"cached-results\", \"recurring-monitoring\", \"discovery-verification\", \"data-enrichment\", \"marketplace-listings\", \"real-estate-rentals\", \"ecommerce-products-reviews\", \"health-prices\", \"jobs-hiring\", \"facebook-data\", \"social-video-intelligence\", \"news\", \"public-records\".\n- name (optional, string): Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads.\n- includeSchemas (optional, boolean): Include each endpoint's full input and output schemas. Constraints: default: true.\n- limit (optional, integer): Maximum number of endpoints to return after filters. Constraints: default: 28; min: 1; max: 50.\n\nExample request body:\n```json\n{\n  \"category\": \"public-records\",\n  \"includeSchemas\": true,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "department-catalog",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "catalog",
      "aisle": "Catalog",
      "shelfId": "catalog",
      "shelf": "Catalog",
      "offeringId": "public-data-catalog",
      "offering": "Public Data Catalog",
      "pathIds": [
        "public-data",
        "catalog",
        "catalog",
        "public-data-catalog"
      ],
      "pathLabels": [
        "Public Data",
        "Catalog",
        "Catalog",
        "Public Data Catalog"
      ],
      "taxonomyPath": "public-data.catalog.catalog.public-data-catalog",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "catalog",
          "name": "Catalog"
        },
        "shelf": {
          "id": "catalog",
          "name": "Catalog"
        },
        "offering": {
          "id": "public-data-catalog",
          "name": "Public Data Catalog"
        },
        "pathIds": [
          "public-data",
          "catalog",
          "catalog",
          "public-data-catalog"
        ],
        "pathLabels": [
          "Public Data",
          "Catalog",
          "Catalog",
          "Public Data Catalog"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data-department",
        "public-data",
        "catalog",
        "marketplace-listings",
        "real-estate",
        "ecommerce",
        "facebook-data",
        "jobs",
        "public-records",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/catalog",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/catalog",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Optional text filter matched against endpoint name, title, category, description, tags, and path."
          },
          "category": {
            "type": "string",
            "enum": [
              "catalog",
              "workflow-bundles",
              "cached-results",
              "recurring-monitoring",
              "discovery-verification",
              "data-enrichment",
              "marketplace-listings",
              "real-estate-rentals",
              "ecommerce-products-reviews",
              "health-prices",
              "jobs-hiring",
              "facebook-data",
              "social-video-intelligence",
              "news",
              "public-records"
            ],
            "description": "Optional Public Data department/category to return."
          },
          "name": {
            "type": "string",
            "description": "Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads."
          },
          "includeSchemas": {
            "type": "boolean",
            "default": true,
            "description": "Include each endpoint's full input and output schemas."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 28,
            "description": "Maximum number of endpoints to return after filters."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "category",
          "name",
          "includeSchemas",
          "limit"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against endpoint name, title, category, description, tags, and path."
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional Public Data department/category to return.",
            "constraints": {
              "enum": [
                "catalog",
                "workflow-bundles",
                "cached-results",
                "recurring-monitoring",
                "discovery-verification",
                "data-enrichment",
                "marketplace-listings",
                "real-estate-rentals",
                "ecommerce-products-reviews",
                "health-prices",
                "jobs-hiring",
                "facebook-data",
                "social-video-intelligence",
                "news",
                "public-records"
              ]
            }
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Optional exact endpoint name, such as osha-violations-scraper or marketplace-leads."
          },
          {
            "name": "includeSchemas",
            "type": "boolean",
            "required": false,
            "description": "Include each endpoint's full input and output schemas.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum number of endpoints to return after filters.",
            "constraints": {
              "default": 28,
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "category": "public-records",
          "includeSchemas": true,
          "limit": 10
        }
      },
      "exampleRequest": {
        "category": "public-records",
        "includeSchemas": true,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "department",
          "categories",
          "endpoints"
        ],
        "properties": {
          "department": {
            "type": "object",
            "additionalProperties": true
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "department": {
          "name": "AgentBodega Public Data Department",
          "department": "Public Data"
        },
        "categories": [
          {
            "category": "public-records",
            "count": 3
          }
        ],
        "endpoints": [
          {
            "name": "osha-violations-scraper",
            "category": "public-records",
            "price": {
              "mode": "dynamic"
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "social-media-catalog",
      "resource": "https://agentbodega.store/api/social-media/catalog",
      "type": "http",
      "method": "POST",
      "serviceName": "Social Media Department Catalog",
      "description": "Return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.",
      "longDescription": "Purpose: Return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.\nBest use: Use this when an agent needs return AgentBodega's Social Media department: configured public social/video data routes plus available and staged coverage families for social, creator, video, audio, ad-library, and UGC research products.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: platform, query, includeSchemas, includeExternalPattern, includeCoverageMap, limit.\n\nAccepted fields:\n- platform (optional, string): Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department. Constraints: accepted values: \"all\", \"x\", \"twitter\", \"tiktok\", \"instagram\", \"facebook\", \"reddit\", \"youtube\", \"linkedin\", \"threads\", \"bluesky\", \"pinterest\", \"twitch\", \"snapchat\", \"github\", \"spotify\", \"soundcloud\", \"rumble\", \"truthsocial\", \"web\", \"amazon\", \"inference\", \"ads\", \"link-in-bio\", \"ugc\"; default: \"all\".\n- query (optional, string): Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases.\n- includeSchemas (optional, boolean): Include full schemas for configured AgentBodega social data endpoints. Constraints: default: true.\n- includeExternalPattern (optional, boolean): Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources. Constraints: default: true.\n- includeCoverageMap (optional, boolean): Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources. Constraints: default: true.\n- limit (optional, integer): Maximum configured endpoints and pattern rows to return. Constraints: default: 20; min: 1; max: 50.\n\nExample request body:\n```json\n{\n  \"platform\": \"all\",\n  \"includeExternalPattern\": true,\n  \"includeCoverageMap\": true,\n  \"includeSchemas\": true,\n  \"limit\": 50\n}\n```",
      "category": "social-media",
      "kind": "department-catalog",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "catalog",
      "aisle": "Catalog",
      "offeringId": "social-media-catalog",
      "offering": "Social Media Department Catalog",
      "pathIds": [
        "social-media",
        "catalog",
        "social-media-catalog"
      ],
      "pathLabels": [
        "Social Media",
        "Catalog",
        "Social Media Department Catalog"
      ],
      "taxonomyPath": "social-media.catalog.social-media-catalog",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "catalog",
          "name": "Catalog"
        },
        "offering": {
          "id": "social-media-catalog",
          "name": "Social Media Department Catalog"
        },
        "pathIds": [
          "social-media",
          "catalog",
          "social-media-catalog"
        ],
        "pathLabels": [
          "Social Media",
          "Catalog",
          "Social Media Department Catalog"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "tiktok",
        "facebook",
        "instagram",
        "reddit",
        "youtube",
        "linkedin",
        "threads",
        "bluesky",
        "pinterest",
        "twitch",
        "spotify",
        "ads",
        "ugc",
        "public-data",
        "creator-research",
        "social-listening"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/catalog",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/catalog",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "all",
              "x",
              "twitter",
              "tiktok",
              "instagram",
              "facebook",
              "reddit",
              "youtube",
              "linkedin",
              "threads",
              "bluesky",
              "pinterest",
              "twitch",
              "snapchat",
              "github",
              "spotify",
              "soundcloud",
              "rumble",
              "truthsocial",
              "web",
              "amazon",
              "inference",
              "ads",
              "link-in-bio",
              "ugc"
            ],
            "default": "all",
            "description": "Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department."
          },
          "query": {
            "type": "string",
            "description": "Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases."
          },
          "includeSchemas": {
            "type": "boolean",
            "default": true,
            "description": "Include full schemas for configured AgentBodega social data endpoints."
          },
          "includeExternalPattern": {
            "type": "boolean",
            "default": true,
            "description": "Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources."
          },
          "includeCoverageMap": {
            "type": "boolean",
            "default": true,
            "description": "Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Maximum configured endpoints and pattern rows to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "platform",
          "query",
          "includeSchemas",
          "includeExternalPattern",
          "includeCoverageMap",
          "limit"
        ],
        "fields": [
          {
            "name": "platform",
            "type": "string",
            "required": false,
            "description": "Optional platform or product-family focus. Use x or twitter for X/Twitter, ugc for creator research, ads for ad-library intelligence, or all for the full Social Media department.",
            "constraints": {
              "enum": [
                "all",
                "x",
                "twitter",
                "tiktok",
                "instagram",
                "facebook",
                "reddit",
                "youtube",
                "linkedin",
                "threads",
                "bluesky",
                "pinterest",
                "twitch",
                "snapchat",
                "github",
                "spotify",
                "soundcloud",
                "rumble",
                "truthsocial",
                "web",
                "amazon",
                "inference",
                "ads",
                "link-in-bio",
                "ugc"
              ],
              "default": "all"
            }
          },
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against platform, endpoint title, category, description, tags, and X/Twitter use cases."
          },
          {
            "name": "includeSchemas",
            "type": "boolean",
            "required": false,
            "description": "Include full schemas for configured AgentBodega social data endpoints.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeExternalPattern",
            "type": "boolean",
            "required": false,
            "description": "Include read-only X/Twitter product specs. Rows with configured false are staged and are not advertised as payable resources.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeCoverageMap",
            "type": "boolean",
            "required": false,
            "description": "Include white-labeled Social Media coverage families, including staged platform/product families that are not yet payable resources.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum configured endpoints and pattern rows to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "platform": "all",
          "includeExternalPattern": true,
          "includeCoverageMap": true,
          "includeSchemas": true,
          "limit": 50
        }
      },
      "exampleRequest": {
        "platform": "all",
        "includeExternalPattern": true,
        "includeCoverageMap": true,
        "includeSchemas": true,
        "limit": 50
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "department",
          "endpoints",
          "xTwitterReadOnlyPattern",
          "socialCoveragePattern"
        ],
        "properties": {
          "department": {
            "type": "object",
            "additionalProperties": true
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "xTwitterReadOnlyPattern": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "socialCoveragePattern": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "nextSteps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "department": {
          "name": "AgentBodega Social Media Department",
          "department": "Social Media"
        },
        "endpoints": [
          {
            "name": "facebook-page-posts-scraper",
            "platform": "facebook",
            "configured": true
          }
        ],
        "xTwitterReadOnlyPattern": [
          {
            "id": "x-tweet-search",
            "status": "available",
            "priceUsd": "0.06",
            "configured": true
          }
        ],
        "socialCoveragePattern": [
          {
            "id": "tiktok-social-video",
            "status": "staged",
            "configured": false,
            "plannedProducts": [
              "profiles",
              "videos",
              "comments",
              "search"
            ]
          }
        ]
      },
      "configured": false
    },
    {
      "id": "web-search",
      "resource": "https://agentbodega.store/api/web/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Search",
      "description": "Search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.",
      "longDescription": "Purpose: Search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.\nBest use: Use this when an agent needs search the public web and return normalized, source-neutral results with titles, URLs, domains, snippets, freshness controls, and strict result caps for agent research workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: query.\nOptional fields: limit, site, freshness, includeSnippets, timeoutMs.\n\nAccepted fields:\n- query (required, string): Natural-language search query or keyword query to run against public web results. Constraints: min length: 2; max length: 240.\n- limit (optional, integer): Maximum normalized results to return. Constraints: default: 5; min: 1; max: 10.\n- site (optional, string): Optional public domain scope, such as example.com. URL-like values are normalized to the hostname. Constraints: max length: 120.\n- freshness (optional, string): Optional freshness preference. Use any when recency is not required. Constraints: accepted values: \"any\", \"day\", \"week\", \"month\", \"year\"; default: \"any\".\n- includeSnippets (optional, boolean): Set false to omit result snippets and return titles, URLs, domains, and rank only. Constraints: default: true.\n- timeoutMs (optional, integer): Search timeout in milliseconds. Constraints: default: 6000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"query\": \"agent payment APIs\",\n  \"limit\": 5,\n  \"freshness\": \"any\",\n  \"includeSnippets\": true\n}\n```",
      "category": "search-web",
      "kind": "web-search-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "search",
      "aisle": "Search",
      "shelfId": "web-results",
      "shelf": "Web Results",
      "offeringId": "web-search",
      "offering": "Web Search",
      "pathIds": [
        "search-web",
        "search",
        "web-results",
        "web-search"
      ],
      "pathLabels": [
        "Search & Web",
        "Search",
        "Web Results",
        "Web Search"
      ],
      "taxonomyPath": "search-web.search.web-results.web-search",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "search",
          "name": "Search"
        },
        "shelf": {
          "id": "web-results",
          "name": "Web Results"
        },
        "offering": {
          "id": "web-search",
          "name": "Web Search"
        },
        "pathIds": [
          "search-web",
          "search",
          "web-results",
          "web-search"
        ],
        "pathLabels": [
          "Search & Web",
          "Search",
          "Web Results",
          "Web Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "search",
        "source-discovery",
        "citations",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 240,
            "description": "Natural-language search query or keyword query to run against public web results."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum normalized results to return."
          },
          "site": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname."
          },
          "freshness": {
            "type": "string",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "year"
            ],
            "default": "any",
            "description": "Optional freshness preference. Use any when recency is not required."
          },
          "includeSnippets": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit result snippets and return titles, URLs, domains, and rank only."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 6000,
            "description": "Search timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "query"
        ],
        "optional": [
          "limit",
          "site",
          "freshness",
          "includeSnippets",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Natural-language search query or keyword query to run against public web results.",
            "constraints": {
              "minLength": 2,
              "maxLength": 240
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized results to return.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "site",
            "type": "string",
            "required": false,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "freshness",
            "type": "string",
            "required": false,
            "description": "Optional freshness preference. Use any when recency is not required.",
            "constraints": {
              "enum": [
                "any",
                "day",
                "week",
                "month",
                "year"
              ],
              "default": "any"
            }
          },
          {
            "name": "includeSnippets",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit result snippets and return titles, URLs, domains, and rank only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Search timeout in milliseconds.",
            "constraints": {
              "default": 6000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "agent payment APIs",
          "limit": 5,
          "freshness": "any",
          "includeSnippets": true
        }
      },
      "exampleRequest": {
        "query": "agent payment APIs",
        "limit": 5,
        "freshness": "any",
        "includeSnippets": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "search",
          "results",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "search": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-search",
          "name": "Web Search",
          "department": "Search & Web"
        },
        "requested": {
          "query": "agent payment APIs",
          "site": null,
          "freshness": "any",
          "limit": 5,
          "includeSnippets": true
        },
        "source": {
          "routing": "managed-web-search",
          "upstreamDetailsDisclosed": false
        },
        "search": {
          "query": "agent payment APIs",
          "resultCount": 2,
          "checkedAt": "2026-07-07T00:00:00.000Z",
          "durationMs": 420
        },
        "results": [
          {
            "rank": 1,
            "title": "Agent Payment API Guide",
            "url": "https://example.com/agent-payments",
            "domain": "example.com",
            "snippet": "A guide to payment-enabled API calls for agents."
          },
          {
            "rank": 2,
            "title": "x402 API Examples",
            "url": "https://example.org/x402-examples",
            "domain": "example.org",
            "snippet": "Examples of HTTP 402 payment flows."
          }
        ],
        "limits": {
          "maxResults": 10,
          "timeoutMs": 6000
        }
      },
      "configured": false
    },
    {
      "id": "web-answer",
      "resource": "https://agentbodega.store/api/web/answer",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Answer",
      "description": "Answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.",
      "longDescription": "Purpose: Answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.\nBest use: Use this when an agent needs answer a public-web research question with cited source URLs, concise extractive evidence, confidence, source fetch status, and strict search/source caps.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: query.\nOptional fields: limit, maxSources, site, freshness, answerStyle, includeSourceText, timeoutMs.\n\nAccepted fields:\n- query (required, string): Question or research task to answer from public web results. Constraints: min length: 2; max length: 240.\n- limit (optional, integer): Maximum search results to inspect before building the answer. Constraints: default: 5; min: 1; max: 10.\n- maxSources (optional, integer): Maximum result pages to fetch and cite. Constraints: default: 3; min: 1; max: 5.\n- site (optional, string): Optional public domain scope, such as example.com. URL-like values are normalized to the hostname. Constraints: max length: 120.\n- freshness (optional, string): Optional freshness preference. Use any when recency is not required. Constraints: accepted values: \"any\", \"day\", \"week\", \"month\", \"year\"; default: \"any\".\n- answerStyle (optional, string): Brief returns a shorter answer; standard includes more evidence. Constraints: accepted values: \"brief\", \"standard\"; default: \"standard\".\n- includeSourceText (optional, boolean): Set true to include short source text excerpts used for the answer. Constraints: default: false.\n- timeoutMs (optional, integer): Search and source fetch timeout in milliseconds. Constraints: default: 6000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"query\": \"What are x402 paid APIs?\",\n  \"maxSources\": 3,\n  \"answerStyle\": \"standard\",\n  \"freshness\": \"any\"\n}\n```",
      "category": "search-web",
      "kind": "web-answer-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "answer",
      "aisle": "Answer",
      "shelfId": "cited-answers",
      "shelf": "Cited Answers",
      "offeringId": "web-answer",
      "offering": "Web Answer",
      "pathIds": [
        "search-web",
        "answer",
        "cited-answers",
        "web-answer"
      ],
      "pathLabels": [
        "Search & Web",
        "Answer",
        "Cited Answers",
        "Web Answer"
      ],
      "taxonomyPath": "search-web.answer.cited-answers.web-answer",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "answer",
          "name": "Answer"
        },
        "shelf": {
          "id": "cited-answers",
          "name": "Cited Answers"
        },
        "offering": {
          "id": "web-answer",
          "name": "Web Answer"
        },
        "pathIds": [
          "search-web",
          "answer",
          "cited-answers",
          "web-answer"
        ],
        "pathLabels": [
          "Search & Web",
          "Answer",
          "Cited Answers",
          "Web Answer"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "answer",
        "citations",
        "source-grounded",
        "research",
        "summary",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/answer",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/answer",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 240,
            "description": "Question or research task to answer from public web results."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum search results to inspect before building the answer."
          },
          "maxSources": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 3,
            "description": "Maximum result pages to fetch and cite."
          },
          "site": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname."
          },
          "freshness": {
            "type": "string",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "year"
            ],
            "default": "any",
            "description": "Optional freshness preference. Use any when recency is not required."
          },
          "answerStyle": {
            "type": "string",
            "enum": [
              "brief",
              "standard"
            ],
            "default": "standard",
            "description": "Brief returns a shorter answer; standard includes more evidence."
          },
          "includeSourceText": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include short source text excerpts used for the answer."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 6000,
            "description": "Search and source fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "query"
        ],
        "optional": [
          "limit",
          "maxSources",
          "site",
          "freshness",
          "answerStyle",
          "includeSourceText",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Question or research task to answer from public web results.",
            "constraints": {
              "minLength": 2,
              "maxLength": 240
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum search results to inspect before building the answer.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "maxSources",
            "type": "integer",
            "required": false,
            "description": "Maximum result pages to fetch and cite.",
            "constraints": {
              "default": 3,
              "minimum": 1,
              "maximum": 5
            }
          },
          {
            "name": "site",
            "type": "string",
            "required": false,
            "description": "Optional public domain scope, such as example.com. URL-like values are normalized to the hostname.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "freshness",
            "type": "string",
            "required": false,
            "description": "Optional freshness preference. Use any when recency is not required.",
            "constraints": {
              "enum": [
                "any",
                "day",
                "week",
                "month",
                "year"
              ],
              "default": "any"
            }
          },
          {
            "name": "answerStyle",
            "type": "string",
            "required": false,
            "description": "Brief returns a shorter answer; standard includes more evidence.",
            "constraints": {
              "enum": [
                "brief",
                "standard"
              ],
              "default": "standard"
            }
          },
          {
            "name": "includeSourceText",
            "type": "boolean",
            "required": false,
            "description": "Set true to include short source text excerpts used for the answer.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Search and source fetch timeout in milliseconds.",
            "constraints": {
              "default": 6000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "What are x402 paid APIs?",
          "maxSources": 3,
          "answerStyle": "standard",
          "freshness": "any"
        }
      },
      "exampleRequest": {
        "query": "What are x402 paid APIs?",
        "maxSources": 3,
        "answerStyle": "standard",
        "freshness": "any"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "answer",
          "sources",
          "search",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "answer": {
            "type": "object",
            "additionalProperties": true
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "search": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-answer",
          "name": "Web Answer",
          "department": "Search & Web"
        },
        "requested": {
          "query": "What are x402 paid APIs?",
          "site": null,
          "freshness": "any",
          "limit": 5,
          "maxSources": 3,
          "answerStyle": "standard",
          "includeSourceText": false
        },
        "source": {
          "routing": "managed-web-answer",
          "upstreamDetailsDisclosed": false
        },
        "answer": {
          "summary": "x402 paid APIs are HTTP endpoints that return a payment challenge before fulfillment, then provide the requested JSON result after payment settlement.",
          "confidence": "medium",
          "method": "extractive_cited_summary",
          "generatedAt": "2026-07-07T00:00:00.000Z"
        },
        "sources": [
          {
            "rank": 1,
            "title": "x402 API Examples",
            "url": "https://example.org/x402-examples",
            "domain": "example.org",
            "snippet": "Examples of HTTP 402 payment flows.",
            "used": true
          }
        ],
        "search": {
          "resultCount": 2,
          "fetchedSources": 1,
          "checkedAt": "2026-07-07T00:00:00.000Z",
          "durationMs": 830
        },
        "limits": {
          "maxResults": 10,
          "maxSources": 5,
          "timeoutMs": 6000
        }
      },
      "configured": false
    },
    {
      "id": "jwt-inspector",
      "resource": "https://agentbodega.store/api/developer/jwt/inspect",
      "type": "http",
      "method": "POST",
      "serviceName": "JWT Inspector",
      "description": "Decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.",
      "longDescription": "Purpose: Decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.\nBest use: Use this when an agent needs decode one compact JWT without requiring a secret and return normalized header, claim timing, issuer and audience checks, signature presence, warnings, and safe debugging guidance for agent and API workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: token.\nOptional fields: expectedIssuer, expectedAudience, now, includeRaw.\n\nAccepted fields:\n- token (required, string): Compact JWT string with three dot-separated Base64URL segments. Constraints: min length: 20; max length: 8192.\n- expectedIssuer (optional, string): Optional issuer value to compare with the token iss claim. Constraints: max length: 300.\n- expectedAudience (optional, string): Optional audience value to compare with the token aud claim. Constraints: max length: 300.\n- now (optional, integer): Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time. Constraints: min: 0.\n- includeRaw (optional, boolean): Set true to include the raw header and payload objects. The signature is never returned. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature\",\n  \"expectedIssuer\": \"https://issuer.example\",\n  \"expectedAudience\": \"agent-api\",\n  \"includeRaw\": false\n}\n```",
      "category": "developer-utilities",
      "kind": "jwt-inspection-tool",
      "departmentId": "developer-utilities",
      "department": "Developer Utilities",
      "aisleId": "jwt",
      "aisle": "JWT",
      "shelfId": "inspect",
      "shelf": "Inspect",
      "offeringId": "jwt-inspector",
      "offering": "JWT Inspector",
      "pathIds": [
        "developer-utilities",
        "jwt",
        "inspect",
        "jwt-inspector"
      ],
      "pathLabels": [
        "Developer Utilities",
        "JWT",
        "Inspect",
        "JWT Inspector"
      ],
      "taxonomyPath": "developer-utilities.jwt.inspect.jwt-inspector",
      "layout": {
        "department": {
          "id": "developer-utilities",
          "name": "Developer Utilities"
        },
        "aisle": {
          "id": "jwt",
          "name": "JWT"
        },
        "shelf": {
          "id": "inspect",
          "name": "Inspect"
        },
        "offering": {
          "id": "jwt-inspector",
          "name": "JWT Inspector"
        },
        "pathIds": [
          "developer-utilities",
          "jwt",
          "inspect",
          "jwt-inspector"
        ],
        "pathLabels": [
          "Developer Utilities",
          "JWT",
          "Inspect",
          "JWT Inspector"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "developer-utilities",
        "jwt",
        "auth-debug",
        "token-inspection",
        "api-debug",
        "security",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/developer/jwt/inspect",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/developer/jwt/inspect",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "minLength": 20,
            "maxLength": 8192,
            "description": "Compact JWT string with three dot-separated Base64URL segments."
          },
          "expectedIssuer": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional issuer value to compare with the token iss claim."
          },
          "expectedAudience": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional audience value to compare with the token aud claim."
          },
          "now": {
            "type": "integer",
            "minimum": 0,
            "description": "Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time."
          },
          "includeRaw": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include the raw header and payload objects. The signature is never returned."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "token"
        ],
        "optional": [
          "expectedIssuer",
          "expectedAudience",
          "now",
          "includeRaw"
        ],
        "fields": [
          {
            "name": "token",
            "type": "string",
            "required": true,
            "description": "Compact JWT string with three dot-separated Base64URL segments.",
            "constraints": {
              "minLength": 20,
              "maxLength": 8192
            }
          },
          {
            "name": "expectedIssuer",
            "type": "string",
            "required": false,
            "description": "Optional issuer value to compare with the token iss claim.",
            "constraints": {
              "maxLength": 300
            }
          },
          {
            "name": "expectedAudience",
            "type": "string",
            "required": false,
            "description": "Optional audience value to compare with the token aud claim.",
            "constraints": {
              "maxLength": 300
            }
          },
          {
            "name": "now",
            "type": "integer",
            "required": false,
            "description": "Optional Unix timestamp in seconds for exp, nbf, and iat checks. Defaults to current time.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "includeRaw",
            "type": "boolean",
            "required": false,
            "description": "Set true to include the raw header and payload objects. The signature is never returned.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature",
          "expectedIssuer": "https://issuer.example",
          "expectedAudience": "agent-api",
          "includeRaw": false
        }
      },
      "exampleRequest": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiYXVkIjoiYWdlbnQtYXBpIiwic3ViIjoidXNlcl8xMjMiLCJleHAiOjE4OTM0NTYwMDAsImlhdCI6MTcwNDA2NzIwMH0.signature",
        "expectedIssuer": "https://issuer.example",
        "expectedAudience": "agent-api",
        "includeRaw": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "token",
          "header",
          "claims",
          "checks",
          "warnings",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "token": {
            "type": "object",
            "additionalProperties": true
          },
          "header": {
            "type": "object",
            "additionalProperties": true
          },
          "claims": {
            "type": "object",
            "additionalProperties": true
          },
          "checks": {
            "type": "object",
            "additionalProperties": true
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "jwt-inspector",
          "name": "JWT Inspector",
          "department": "Developer Utilities"
        },
        "requested": {
          "expectedIssuer": "https://issuer.example",
          "expectedAudience": "agent-api",
          "includeRaw": false
        },
        "token": {
          "format": "compact-jwt",
          "segments": 3,
          "signaturePresent": true,
          "signatureVerified": false
        },
        "header": {
          "alg": "HS256",
          "typ": "JWT"
        },
        "claims": {
          "issuer": "https://issuer.example",
          "subject": "user_123",
          "audience": [
            "agent-api"
          ],
          "expiresAt": {
            "unix": 1893456000,
            "iso": "2030-01-01T00:00:00.000Z",
            "status": "valid"
          },
          "issuedAt": {
            "unix": 1704067200,
            "iso": "2024-01-01T00:00:00.000Z"
          }
        },
        "checks": {
          "issuer": "match",
          "audience": "match",
          "expired": false,
          "notBefore": "not_present",
          "issuedAtInFuture": false
        },
        "warnings": [
          "Signature was decoded but not cryptographically verified."
        ],
        "limits": {
          "maxTokenChars": 8192
        }
      },
      "configured": false
    },
    {
      "id": "web-fetch",
      "resource": "https://agentbodega.store/api/web/fetch",
      "type": "http",
      "method": "POST",
      "serviceName": "Web Page Fetch",
      "description": "Fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.",
      "longDescription": "Purpose: Fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.\nBest use: Use this when an agent needs fetch one public URL and return normalized page metadata, cleaned text, markdown, links, status, content type, and extraction limits for agent workflows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeHtml, includeLinks, maxBytes, maxLinks, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected. Constraints: format: uri.\n- includeHtml (optional, boolean): Set true to return a truncated sanitized HTML excerpt. Constraints: default: false.\n- includeLinks (optional, boolean): Set true to extract normalized outbound and same-page links up to maxLinks. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read before truncating extraction. Constraints: default: 32768; min: 1024; max: 65536.\n- maxLinks (optional, integer): Maximum links to return when includeLinks is true. Constraints: default: 20; min: 0; max: 50.\n- timeoutMs (optional, integer): Fetch timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeLinks\": true,\n  \"maxBytes\": 32768,\n  \"maxLinks\": 10\n}\n```",
      "category": "search-web",
      "kind": "web-extraction-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "page-extraction",
      "aisle": "Page Extraction",
      "shelfId": "fetch",
      "shelf": "Fetch",
      "offeringId": "web-fetch",
      "offering": "Web Page Fetch",
      "pathIds": [
        "search-web",
        "page-extraction",
        "fetch",
        "web-fetch"
      ],
      "pathLabels": [
        "Search & Web",
        "Page Extraction",
        "Fetch",
        "Web Page Fetch"
      ],
      "taxonomyPath": "search-web.page-extraction.fetch.web-fetch",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "page-extraction",
          "name": "Page Extraction"
        },
        "shelf": {
          "id": "fetch",
          "name": "Fetch"
        },
        "offering": {
          "id": "web-fetch",
          "name": "Web Page Fetch"
        },
        "pathIds": [
          "search-web",
          "page-extraction",
          "fetch",
          "web-fetch"
        ],
        "pathLabels": [
          "Search & Web",
          "Page Extraction",
          "Fetch",
          "Web Page Fetch"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "fetch",
        "page-extraction",
        "metadata",
        "links",
        "markdown",
        "content-extraction",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/web/fetch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/web/fetch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected."
          },
          "includeHtml": {
            "type": "boolean",
            "default": false,
            "description": "Set true to return a truncated sanitized HTML excerpt."
          },
          "includeLinks": {
            "type": "boolean",
            "default": true,
            "description": "Set true to extract normalized outbound and same-page links up to maxLinks."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read before truncating extraction."
          },
          "maxLinks": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 20,
            "description": "Maximum links to return when includeLinks is true."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeHtml",
          "includeLinks",
          "maxBytes",
          "maxLinks",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to fetch. Local, private, and non-web schemes are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeHtml",
            "type": "boolean",
            "required": false,
            "description": "Set true to return a truncated sanitized HTML excerpt.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeLinks",
            "type": "boolean",
            "required": false,
            "description": "Set true to extract normalized outbound and same-page links up to maxLinks.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read before truncating extraction.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "maxLinks",
            "type": "integer",
            "required": false,
            "description": "Maximum links to return when includeLinks is true.",
            "constraints": {
              "default": 20,
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeLinks": true,
        "maxBytes": 32768,
        "maxLinks": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "metadata",
          "text",
          "links",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true
          },
          "text": {
            "type": "object",
            "additionalProperties": true
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "htmlExcerpt": {
            "type": "string"
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "web-fetch",
          "name": "Web Page Fetch",
          "department": "Search & Web"
        },
        "requested": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "metadata": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonical": "https://example.com/"
        },
        "text": {
          "plain": "Example Domain\n\nThis domain is for use in illustrative examples.",
          "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples.",
          "characters": 65,
          "words": 10
        },
        "links": [
          {
            "href": "https://www.iana.org/domains/example",
            "text": "More information",
            "rel": ""
          }
        ],
        "limits": {
          "maxBytes": 32768,
          "maxLinks": 10,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "link-preview",
      "resource": "https://agentbodega.store/api/search/link-preview",
      "type": "http",
      "method": "POST",
      "serviceName": "Link Preview",
      "description": "Fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.",
      "longDescription": "Purpose: Fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.\nBest use: Use this when an agent needs fetch one public URL and return compact source-neutral preview metadata: title, description, canonical URL, site name, type, image URL when present, and which HTML signals supplied each field.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeImage, maxBytes, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected. Constraints: format: uri.\n- includeImage (optional, boolean): Set false to omit preview image metadata while still returning title, description, and canonical URL. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read while extracting preview tags. Constraints: default: 32768; min: 1024; max: 65536.\n- timeoutMs (optional, integer): Fetch timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeImage\": true,\n  \"maxBytes\": 32768\n}\n```",
      "category": "search-web",
      "kind": "link-preview-tool",
      "departmentId": "search-web",
      "department": "Search & Web",
      "aisleId": "page-extraction",
      "aisle": "Page Extraction",
      "shelfId": "link-preview",
      "shelf": "Link Preview",
      "offeringId": "link-preview",
      "offering": "Link Preview",
      "pathIds": [
        "search-web",
        "page-extraction",
        "link-preview",
        "link-preview"
      ],
      "pathLabels": [
        "Search & Web",
        "Page Extraction",
        "Link Preview",
        "Link Preview"
      ],
      "taxonomyPath": "search-web.page-extraction.link-preview.link-preview",
      "layout": {
        "department": {
          "id": "search-web",
          "name": "Search & Web"
        },
        "aisle": {
          "id": "page-extraction",
          "name": "Page Extraction"
        },
        "shelf": {
          "id": "link-preview",
          "name": "Link Preview"
        },
        "offering": {
          "id": "link-preview",
          "name": "Link Preview"
        },
        "pathIds": [
          "search-web",
          "page-extraction",
          "link-preview",
          "link-preview"
        ],
        "pathLabels": [
          "Search & Web",
          "Page Extraction",
          "Link Preview",
          "Link Preview"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "search-web",
        "web",
        "link-preview",
        "open-graph",
        "metadata",
        "page-extraction",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/search/link-preview",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/search/link-preview",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected."
          },
          "includeImage": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit preview image metadata while still returning title, description, and canonical URL."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read while extracting preview tags."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeImage",
          "maxBytes",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to preview. Local, private, credentialed, and non-web URLs are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeImage",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit preview image metadata while still returning title, description, and canonical URL.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read while extracting preview tags.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeImage": true,
          "maxBytes": 32768
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeImage": true,
        "maxBytes": 32768
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "preview",
          "signals",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "preview": {
            "type": "object",
            "additionalProperties": true
          },
          "signals": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "link-preview",
          "name": "Link Preview",
          "department": "Search & Web"
        },
        "requested": {
          "url": "https://example.com",
          "includeImage": true,
          "maxBytes": 32768,
          "timeoutMs": 5000
        },
        "source": {
          "routing": "direct-public-fetch",
          "upstreamDetailsDisclosed": false
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "preview": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonicalUrl": "https://example.com/",
          "url": "https://example.com/",
          "domain": "example.com",
          "siteName": "",
          "type": "",
          "image": null,
          "language": "en"
        },
        "signals": {
          "title": "title",
          "description": "meta:description",
          "canonicalUrl": "link:canonical",
          "siteName": "none",
          "type": "none",
          "image": "none"
        },
        "limits": {
          "maxBytes": 32768,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "any-to-markdown",
      "resource": "https://agentbodega.store/api/documents/any-to-markdown",
      "type": "http",
      "method": "POST",
      "serviceName": "Any URL to Markdown",
      "description": "Convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.",
      "longDescription": "Purpose: Convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.\nBest use: Use this when an agent needs convert one public URL into cleaned markdown with page metadata, normalized links, byte limits, truncation flags, and text statistics for RAG, notes, and agent content workflows.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeLinks, maxBytes, maxLinks, timeoutMs.\n\nAccepted fields:\n- url (required, string): Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected. Constraints: format: uri.\n- includeLinks (optional, boolean): Set true to include normalized links that were visible in the source content. Constraints: default: true.\n- maxBytes (optional, integer): Maximum response body bytes to read before truncating the markdown extraction. Constraints: default: 32768; min: 1024; max: 65536.\n- maxLinks (optional, integer): Maximum links to return when includeLinks is true. Constraints: default: 20; min: 0; max: 50.\n- timeoutMs (optional, integer): Fetch and extraction timeout in milliseconds. Constraints: default: 5000; min: 1000; max: 10000.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeLinks\": true,\n  \"maxBytes\": 32768,\n  \"maxLinks\": 10\n}\n```",
      "category": "documents-content",
      "kind": "content-extraction-tool",
      "departmentId": "documents-content",
      "department": "Documents & Content",
      "aisleId": "extraction",
      "aisle": "Extraction",
      "shelfId": "url-to-markdown",
      "shelf": "Url To Markdown",
      "offeringId": "any-to-markdown",
      "offering": "Any URL to Markdown",
      "pathIds": [
        "documents-content",
        "extraction",
        "url-to-markdown",
        "any-to-markdown"
      ],
      "pathLabels": [
        "Documents & Content",
        "Extraction",
        "Url To Markdown",
        "Any URL to Markdown"
      ],
      "taxonomyPath": "documents-content.extraction.url-to-markdown.any-to-markdown",
      "layout": {
        "department": {
          "id": "documents-content",
          "name": "Documents & Content"
        },
        "aisle": {
          "id": "extraction",
          "name": "Extraction"
        },
        "shelf": {
          "id": "url-to-markdown",
          "name": "Url To Markdown"
        },
        "offering": {
          "id": "any-to-markdown",
          "name": "Any URL to Markdown"
        },
        "pathIds": [
          "documents-content",
          "extraction",
          "url-to-markdown",
          "any-to-markdown"
        ],
        "pathLabels": [
          "Documents & Content",
          "Extraction",
          "Url To Markdown",
          "Any URL to Markdown"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "documents-content",
        "markdown",
        "content-extraction",
        "rag-prep",
        "clean-text",
        "links",
        "metadata",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/documents/any-to-markdown",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/documents/any-to-markdown",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected."
          },
          "includeLinks": {
            "type": "boolean",
            "default": true,
            "description": "Set true to include normalized links that were visible in the source content."
          },
          "maxBytes": {
            "type": "integer",
            "minimum": 1024,
            "maximum": 65536,
            "default": 32768,
            "description": "Maximum response body bytes to read before truncating the markdown extraction."
          },
          "maxLinks": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 20,
            "description": "Maximum links to return when includeLinks is true."
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 10000,
            "default": 5000,
            "description": "Fetch and extraction timeout in milliseconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeLinks",
          "maxBytes",
          "maxLinks",
          "timeoutMs"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS URL to convert into clean markdown. Local, private, and non-web schemes are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeLinks",
            "type": "boolean",
            "required": false,
            "description": "Set true to include normalized links that were visible in the source content.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxBytes",
            "type": "integer",
            "required": false,
            "description": "Maximum response body bytes to read before truncating the markdown extraction.",
            "constraints": {
              "default": 32768,
              "minimum": 1024,
              "maximum": 65536
            }
          },
          {
            "name": "maxLinks",
            "type": "integer",
            "required": false,
            "description": "Maximum links to return when includeLinks is true.",
            "constraints": {
              "default": 20,
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "timeoutMs",
            "type": "integer",
            "required": false,
            "description": "Fetch and extraction timeout in milliseconds.",
            "constraints": {
              "default": 5000,
              "minimum": 1000,
              "maximum": 10000
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeLinks": true,
        "maxBytes": 32768,
        "maxLinks": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "fetched",
          "metadata",
          "text",
          "links",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "fetched": {
            "type": "object",
            "additionalProperties": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true
          },
          "text": {
            "type": "object",
            "additionalProperties": true
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "any-to-markdown",
          "name": "Any URL to Markdown",
          "department": "Documents & Content"
        },
        "requested": {
          "url": "https://example.com",
          "includeLinks": true,
          "maxBytes": 32768,
          "maxLinks": 10
        },
        "fetched": {
          "finalUrl": "https://example.com/",
          "status": 200,
          "ok": true,
          "contentType": "text/html; charset=utf-8",
          "truncated": false
        },
        "metadata": {
          "title": "Example Domain",
          "description": "Example page for documentation.",
          "canonical": "https://example.com/"
        },
        "text": {
          "plain": "Example Domain\n\nThis domain is for use in illustrative examples.",
          "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples.",
          "characters": 65,
          "words": 10
        },
        "links": [
          {
            "href": "https://www.iana.org/domains/example",
            "text": "More information",
            "rel": ""
          }
        ],
        "limits": {
          "maxBytes": 32768,
          "maxLinks": 10,
          "timeoutMs": 5000
        }
      },
      "configured": false
    },
    {
      "id": "image-format-converter",
      "resource": "https://agentbodega.store/api/media/image/convert",
      "type": "http",
      "method": "POST",
      "serviceName": "Image Format Converter",
      "description": "Create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.",
      "longDescription": "Purpose: Create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.\nBest use: Use this when an agent needs create a short-lived signed download URL that converts one public image into JPG, PNG, WebP, or AVIF with capped size, fit, quality, and TTL controls. Useful for HEIC-to-JPG-style agent workflows without exposing backend media infrastructure.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: imageUrl, targetFormat.\nOptional fields: width, height, fit, quality, background, filename, ttlSeconds.\n\nAccepted fields:\n- imageUrl (required, string): Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected. Constraints: format: uri.\n- targetFormat (required, string): Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend. Constraints: accepted values: \"jpg\", \"jpeg\", \"png\", \"webp\", \"avif\".\n- width (optional, integer): Optional output width in pixels. If omitted, the source width is preserved when the backend supports it. Constraints: min: 1; max: 4096.\n- height (optional, integer): Optional output height in pixels. If omitted, the source height is preserved when the backend supports it. Constraints: min: 1; max: 4096.\n- fit (optional, string): Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds. Constraints: accepted values: \"scale-down\", \"contain\", \"cover\", \"crop\", \"pad\"; default: \"scale-down\".\n- quality (optional, integer): Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded. Constraints: default: 85; min: 1; max: 95.\n- background (optional, string): Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff. Constraints: max length: 40.\n- filename (optional, string): Optional download filename. The service normalizes the extension to match targetFormat. Constraints: max length: 120.\n- ttlSeconds (optional, integer): How long the signed conversion download URL should remain usable, in seconds. Constraints: default: 3600; min: 60; max: 86400.\n\nExample request body:\n```json\n{\n  \"imageUrl\": \"https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg\",\n  \"targetFormat\": \"webp\",\n  \"width\": 800,\n  \"fit\": \"scale-down\",\n  \"quality\": 85,\n  \"ttlSeconds\": 3600\n}\n```",
      "category": "edge-ai-automation",
      "kind": "media-conversion-tool",
      "departmentId": "edge-ai-automation",
      "department": "Edge AI & Automation",
      "aisleId": "media-conversion",
      "aisle": "Media Conversion",
      "shelfId": "image-format",
      "shelf": "Image Format",
      "offeringId": "image-format-converter",
      "offering": "Image Format Converter",
      "pathIds": [
        "edge-ai-automation",
        "media-conversion",
        "image-format",
        "image-format-converter"
      ],
      "pathLabels": [
        "Edge AI & Automation",
        "Media Conversion",
        "Image Format",
        "Image Format Converter"
      ],
      "taxonomyPath": "edge-ai-automation.media-conversion.image-format.image-format-converter",
      "layout": {
        "department": {
          "id": "edge-ai-automation",
          "name": "Edge AI & Automation"
        },
        "aisle": {
          "id": "media-conversion",
          "name": "Media Conversion"
        },
        "shelf": {
          "id": "image-format",
          "name": "Image Format"
        },
        "offering": {
          "id": "image-format-converter",
          "name": "Image Format Converter"
        },
        "pathIds": [
          "edge-ai-automation",
          "media-conversion",
          "image-format",
          "image-format-converter"
        ],
        "pathLabels": [
          "Edge AI & Automation",
          "Media Conversion",
          "Image Format",
          "Image Format Converter"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "edge-ai-automation",
        "media",
        "image",
        "image-conversion",
        "heic",
        "jpg",
        "jpeg",
        "png",
        "webp",
        "avif",
        "agent-tools",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/media/image/convert",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/media/image/convert",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "imageUrl",
          "targetFormat"
        ],
        "properties": {
          "imageUrl": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected."
          },
          "targetFormat": {
            "type": "string",
            "enum": [
              "jpg",
              "jpeg",
              "png",
              "webp",
              "avif"
            ],
            "description": "Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend."
          },
          "width": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "description": "Optional output width in pixels. If omitted, the source width is preserved when the backend supports it."
          },
          "height": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "description": "Optional output height in pixels. If omitted, the source height is preserved when the backend supports it."
          },
          "fit": {
            "type": "string",
            "enum": [
              "scale-down",
              "contain",
              "cover",
              "crop",
              "pad"
            ],
            "default": "scale-down",
            "description": "Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds."
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 95,
            "default": 85,
            "description": "Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded."
          },
          "background": {
            "type": "string",
            "maxLength": 40,
            "description": "Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff."
          },
          "filename": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional download filename. The service normalizes the extension to match targetFormat."
          },
          "ttlSeconds": {
            "type": "integer",
            "minimum": 60,
            "maximum": 86400,
            "default": 3600,
            "description": "How long the signed conversion download URL should remain usable, in seconds."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "imageUrl",
          "targetFormat"
        ],
        "optional": [
          "width",
          "height",
          "fit",
          "quality",
          "background",
          "filename",
          "ttlSeconds"
        ],
        "fields": [
          {
            "name": "imageUrl",
            "type": "string",
            "required": true,
            "description": "Public HTTP or HTTPS image URL to convert. Local, private, credentialed, intranet, and redirecting URLs are rejected.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "targetFormat",
            "type": "string",
            "required": true,
            "description": "Output image format. Use jpg or jpeg for HEIC-to-JPG-style conversion; png, webp, and avif are also accepted when supported by the image backend.",
            "constraints": {
              "enum": [
                "jpg",
                "jpeg",
                "png",
                "webp",
                "avif"
              ]
            }
          },
          {
            "name": "width",
            "type": "integer",
            "required": false,
            "description": "Optional output width in pixels. If omitted, the source width is preserved when the backend supports it.",
            "constraints": {
              "minimum": 1,
              "maximum": 4096
            }
          },
          {
            "name": "height",
            "type": "integer",
            "required": false,
            "description": "Optional output height in pixels. If omitted, the source height is preserved when the backend supports it.",
            "constraints": {
              "minimum": 1,
              "maximum": 4096
            }
          },
          {
            "name": "fit",
            "type": "string",
            "required": false,
            "description": "Resize mode used when width or height is supplied. scale-down preserves the image unless it is larger than the requested bounds.",
            "constraints": {
              "enum": [
                "scale-down",
                "contain",
                "cover",
                "crop",
                "pad"
              ],
              "default": "scale-down"
            }
          },
          {
            "name": "quality",
            "type": "integer",
            "required": false,
            "description": "Output quality for lossy formats. Values above 95 are rejected to keep route cost and response size bounded.",
            "constraints": {
              "default": 85,
              "minimum": 1,
              "maximum": 95
            }
          },
          {
            "name": "background",
            "type": "string",
            "required": false,
            "description": "Optional CSS color used by padded or transparent-to-JPEG conversions, for example #ffffff.",
            "constraints": {
              "maxLength": 40
            }
          },
          {
            "name": "filename",
            "type": "string",
            "required": false,
            "description": "Optional download filename. The service normalizes the extension to match targetFormat.",
            "constraints": {
              "maxLength": 120
            }
          },
          {
            "name": "ttlSeconds",
            "type": "integer",
            "required": false,
            "description": "How long the signed conversion download URL should remain usable, in seconds.",
            "constraints": {
              "default": 3600,
              "minimum": 60,
              "maximum": 86400
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
          "targetFormat": "webp",
          "width": 800,
          "fit": "scale-down",
          "quality": 85,
          "ttlSeconds": 3600
        }
      },
      "exampleRequest": {
        "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
        "targetFormat": "webp",
        "width": 800,
        "fit": "scale-down",
        "quality": 85,
        "ttlSeconds": 3600
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "source",
          "conversion",
          "download",
          "limits"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "conversion": {
            "type": "object",
            "additionalProperties": true
          },
          "download": {
            "type": "object",
            "additionalProperties": true
          },
          "limits": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "image-format-converter",
          "name": "Image Format Converter",
          "department": "Edge AI & Automation"
        },
        "requested": {
          "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JPEG_example_flower.jpg",
          "targetFormat": "webp",
          "width": 800,
          "fit": "scale-down",
          "quality": 85,
          "ttlSeconds": 3600
        },
        "source": {
          "contentType": "image/jpeg",
          "contentLength": 36287,
          "extension": "jpg",
          "validated": true,
          "redirectsAllowed": false
        },
        "conversion": {
          "targetFormat": "webp",
          "contentType": "image/webp",
          "filename": "JPEG_example_flower.webp"
        },
        "download": {
          "url": "https://agentbodega.store/i/signed-token",
          "method": "GET",
          "expiresAt": "2026-07-07T18:00:00.000Z"
        },
        "limits": {
          "maxSourceBytes": 10485760,
          "maxDimension": 4096,
          "maxQuality": 95,
          "maxTtlSeconds": 86400
        }
      },
      "configured": false
    },
    {
      "id": "real-estate-listings-search",
      "resource": "https://agentbodega.store/api/real-estate/listings/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Real Estate Listing Search",
      "description": "Search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.",
      "longDescription": "Purpose: Search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.\nBest use: Use this when an agent needs search public home and rental listings by market, listing type, price, beds, amenities, URL, address, or property id. Uses managed fulfillment for Zillow, Apartments, and realtor-compatible requests.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: source, mode, market, listingType, priceMin, priceMax, bedsMin, bathsMin, homeTypes, propertyType, bedrooms, sortBy, daysOnMarket, sqftMin, sqftMax, lotSizeMin, lotSizeMax, yearBuiltMin, yearBuiltMax, amenities, searchUrls, addresses, zpids, propertyIds, locationSlug, state, zipCode, maxRent, petFriendly, maxPages, filterToRequestedCity, includeSchools, includeHistory, includeDetails, smartScrape, maxResults.\n\nAccepted fields:\n- source (optional, string): Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments. Constraints: accepted values: \"auto\", \"zillow\", \"apartments\", \"realtor\"; default: \"auto\".\n- mode (optional, string): Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids. Constraints: accepted values: \"search\", \"url\", \"lookup\"; default: \"search\".\n- market (optional, string): City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX.\n- listingType (optional, string): Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\".\n- priceMin (optional, integer): Price Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- priceMax (optional, integer): Price Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- bedsMin (optional, integer): Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10. Constraints: min: 0; max: 10.\n- bathsMin (optional, integer): Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10. Constraints: min: 0; max: 10.\n- homeTypes (optional, array): List of home types values for Real Estate Listing Search. Constraints: max items: 7. Constraints: max items: 7.\n- propertyType (optional, string): Rental property type used by the Apartments-backed provider. Constraints: accepted values: \"apartments\", \"houses\", \"townhomes\", \"condos\".\n- bedrooms (optional, any): Rental bedroom filter used by the Apartments-backed provider.\n- sortBy (optional, string): Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\".\n- daysOnMarket (optional, string): Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\".\n- sqftMin (optional, integer): Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- sqftMax (optional, integer): Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- lotSizeMin (optional, integer): Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- lotSizeMax (optional, integer): Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0. Constraints: min: 0.\n- yearBuiltMin (optional, integer): Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030. Constraints: min: 1800; max: 2030.\n- yearBuiltMax (optional, integer): Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030. Constraints: min: 1800; max: 2030.\n- amenities (optional, array): List of amenities values for Real Estate Listing Search. Constraints: max items: 7. Constraints: max items: 7.\n- searchUrls (optional, array): Listing or search URLs for url mode. Constraints: max items: 3.\n- addresses (optional, array): Addresses for lookup mode. Constraints: max items: 10.\n- zpids (optional, array): Zillow property ids for lookup mode. Constraints: max items: 10.\n- propertyIds (optional, array): Provider property ids for lookup mode, currently used by the realtor-backed provider. Constraints: max items: 10.\n- locationSlug (optional, string): Provider-specific location slug for rental searches when city/state parsing is not enough.\n- state (optional, string): Two-letter state hint for rental searches. Constraints: min length: 2; max length: 2.\n- zipCode (optional, string): ZIP hint for rental searches.\n- maxRent (optional, integer): Maximum monthly rent. If omitted, priceMax is reused for rental searches. Constraints: min: 0.\n- petFriendly (optional, boolean): Rental search filter for pet-friendly listings. Constraints: default: false.\n- maxPages (optional, integer): Maximum rendered search pages for the Apartments-backed provider. Constraints: default: 1; min: 1; max: 2.\n- filterToRequestedCity (optional, boolean): Optional exact-city filter for Apartments-backed city searches.\n- includeSchools (optional, boolean): Include school data where the selected provider supports detail extraction. Constraints: default: true.\n- includeHistory (optional, boolean): Include price/tax history where the selected provider supports detail extraction. Constraints: default: true.\n- includeDetails (optional, boolean): Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows. Constraints: default: false.\n- smartScrape (optional, boolean): Allow the managed adapter to skip known unchanged properties where its persistent cache supports it. Constraints: default: true.\n- maxResults (optional, integer): Maximum listing rows to return. Detail-enriched calls are capped at 10 rows. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"source\": \"zillow\",\n  \"mode\": \"search\",\n  \"market\": \"Houston, TX 77008\",\n  \"listingType\": \"for_sale\",\n  \"priceMin\": 200000,\n  \"priceMax\": 500000,\n  \"bedsMin\": 3,\n  \"homeTypes\": [\n    \"houses\",\n    \"townhomes\"\n  ],\n  \"includeDetails\": false,\n  \"maxResults\": 10\n}\n```",
      "category": "real-estate",
      "kind": "real-estate-tool",
      "departmentId": "real-estate",
      "department": "Real Estate",
      "aisleId": "listing-search",
      "aisle": "Listing Search",
      "shelfId": "homes-and-rentals",
      "shelf": "Homes And Rentals",
      "offeringId": "real-estate-listings-search",
      "offering": "Real Estate Listing Search",
      "pathIds": [
        "real-estate",
        "listing-search",
        "homes-and-rentals",
        "real-estate-listings-search"
      ],
      "pathLabels": [
        "Real Estate",
        "Listing Search",
        "Homes And Rentals",
        "Real Estate Listing Search"
      ],
      "taxonomyPath": "real-estate.listing-search.homes-and-rentals.real-estate-listings-search",
      "layout": {
        "department": {
          "id": "real-estate",
          "name": "Real Estate"
        },
        "aisle": {
          "id": "listing-search",
          "name": "Listing Search"
        },
        "shelf": {
          "id": "homes-and-rentals",
          "name": "Homes And Rentals"
        },
        "offering": {
          "id": "real-estate-listings-search",
          "name": "Real Estate Listing Search"
        },
        "pathIds": [
          "real-estate",
          "listing-search",
          "homes-and-rentals",
          "real-estate-listings-search"
        ],
        "pathLabels": [
          "Real Estate",
          "Listing Search",
          "Homes And Rentals",
          "Real Estate Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "real-estate",
        "property-search",
        "home-listings",
        "housing",
        "for-sale",
        "for-rent",
        "rentals",
        "apartments",
        "apartments-com",
        "zillow",
        "realtor",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/real-estate/listings/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/real-estate/listings/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "auto",
              "zillow",
              "apartments",
              "realtor"
            ],
            "default": "auto",
            "description": "Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments."
          },
          "mode": {
            "type": "string",
            "enum": [
              "search",
              "url",
              "lookup"
            ],
            "default": "search",
            "description": "Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids."
          },
          "market": {
            "type": "string",
            "description": "City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX."
          },
          "listingType": {
            "type": "string",
            "enum": [
              "for_sale",
              "recently_sold",
              "for_rent",
              "foreclosure"
            ],
            "default": "for_sale",
            "description": "Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\"."
          },
          "priceMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Price Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "priceMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Price Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "bedsMin": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "description": "Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10."
          },
          "bathsMin": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "description": "Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10."
          },
          "homeTypes": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "string",
              "enum": [
                "houses",
                "townhomes",
                "multifamily",
                "condos",
                "land",
                "apartments",
                "manufactured"
              ],
              "description": "Home Types item filter for Real Estate Listing Search. Accepted values: \"houses\", \"townhomes\", \"multifamily\", \"condos\", \"land\", \"apartments\", \"manufactured\". Constraints: accepted values: \"houses\", \"townhomes\", \"multifamily\", \"condos\", \"land\", \"apartments\", \"manufactured\"."
            },
            "description": "List of home types values for Real Estate Listing Search. Constraints: max items: 7."
          },
          "propertyType": {
            "type": "string",
            "enum": [
              "apartments",
              "houses",
              "townhomes",
              "condos"
            ],
            "description": "Rental property type used by the Apartments-backed provider."
          },
          "bedrooms": {
            "oneOf": [
              {
                "type": "string",
                "enum": [
                  "any",
                  "studio",
                  "1",
                  "2",
                  "3",
                  "4",
                  "5+"
                ]
              },
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 5
              }
            ],
            "description": "Rental bedroom filter used by the Apartments-backed provider."
          },
          "sortBy": {
            "type": "string",
            "enum": [
              "newest",
              "relevance",
              "pricea",
              "priced",
              "beds",
              "baths",
              "size",
              "lot",
              "zest"
            ],
            "default": "newest",
            "description": "Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\"."
          },
          "daysOnMarket": {
            "type": "string",
            "enum": [
              "",
              "1",
              "7",
              "14",
              "30",
              "90",
              "6m",
              "12m",
              "24m",
              "36m"
            ],
            "default": "",
            "description": "Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\"."
          },
          "sqftMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "sqftMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "lotSizeMin": {
            "type": "integer",
            "minimum": 0,
            "description": "Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "lotSizeMax": {
            "type": "integer",
            "minimum": 0,
            "description": "Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0."
          },
          "yearBuiltMin": {
            "type": "integer",
            "minimum": 1800,
            "maximum": 2030,
            "description": "Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030."
          },
          "yearBuiltMax": {
            "type": "integer",
            "minimum": 1800,
            "maximum": 2030,
            "description": "Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030."
          },
          "amenities": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "string",
              "enum": [
                "pool",
                "ac",
                "waterfront",
                "single-story",
                "garage",
                "basement",
                "3d-tour"
              ],
              "description": "Amenities item filter for Real Estate Listing Search. Accepted values: \"pool\", \"ac\", \"waterfront\", \"single-story\", \"garage\", \"basement\", \"3d-tour\". Constraints: accepted values: \"pool\", \"ac\", \"waterfront\", \"single-story\", \"garage\", \"basement\", \"3d-tour\"."
            },
            "description": "List of amenities values for Real Estate Listing Search. Constraints: max items: 7."
          },
          "searchUrls": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "type": "string",
              "format": "uri",
              "description": "Search Urls item value for Real Estate Listing Search. Constraints: format: uri."
            },
            "description": "Listing or search URLs for url mode."
          },
          "addresses": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Addresses item value for Real Estate Listing Search."
            },
            "description": "Addresses for lookup mode."
          },
          "zpids": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Zpids item value for Real Estate Listing Search."
            },
            "description": "Zillow property ids for lookup mode."
          },
          "propertyIds": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "description": "Property Ids item value for Real Estate Listing Search."
            },
            "description": "Provider property ids for lookup mode, currently used by the realtor-backed provider."
          },
          "locationSlug": {
            "type": "string",
            "description": "Provider-specific location slug for rental searches when city/state parsing is not enough."
          },
          "state": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "description": "Two-letter state hint for rental searches."
          },
          "zipCode": {
            "type": "string",
            "description": "ZIP hint for rental searches."
          },
          "maxRent": {
            "type": "integer",
            "minimum": 0,
            "description": "Maximum monthly rent. If omitted, priceMax is reused for rental searches."
          },
          "petFriendly": {
            "type": "boolean",
            "default": false,
            "description": "Rental search filter for pet-friendly listings."
          },
          "maxPages": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2,
            "default": 1,
            "description": "Maximum rendered search pages for the Apartments-backed provider."
          },
          "filterToRequestedCity": {
            "type": "boolean",
            "description": "Optional exact-city filter for Apartments-backed city searches."
          },
          "includeSchools": {
            "type": "boolean",
            "default": true,
            "description": "Include school data where the selected provider supports detail extraction."
          },
          "includeHistory": {
            "type": "boolean",
            "default": true,
            "description": "Include price/tax history where the selected provider supports detail extraction."
          },
          "includeDetails": {
            "type": "boolean",
            "default": false,
            "description": "Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows."
          },
          "smartScrape": {
            "type": "boolean",
            "default": true,
            "description": "Allow the managed adapter to skip known unchanged properties where its persistent cache supports it."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum listing rows to return. Detail-enriched calls are capped at 10 rows."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "source",
          "mode",
          "market",
          "listingType",
          "priceMin",
          "priceMax",
          "bedsMin",
          "bathsMin",
          "homeTypes",
          "propertyType",
          "bedrooms",
          "sortBy",
          "daysOnMarket",
          "sqftMin",
          "sqftMax",
          "lotSizeMin",
          "lotSizeMax",
          "yearBuiltMin",
          "yearBuiltMax",
          "amenities",
          "searchUrls",
          "addresses",
          "zpids",
          "propertyIds",
          "locationSlug",
          "state",
          "zipCode",
          "maxRent",
          "petFriendly",
          "maxPages",
          "filterToRequestedCity",
          "includeSchools",
          "includeHistory",
          "includeDetails",
          "smartScrape",
          "maxResults"
        ],
        "fields": [
          {
            "name": "source",
            "type": "string",
            "required": false,
            "description": "Optional source preference. auto routes broad home search to Zillow and apartment rental search to Apartments.",
            "constraints": {
              "enum": [
                "auto",
                "zillow",
                "apartments",
                "realtor"
              ],
              "default": "auto"
            }
          },
          {
            "name": "mode",
            "type": "string",
            "required": false,
            "description": "Search by market, use one or more listing/search URLs, or look up specific addresses/provider property ids.",
            "constraints": {
              "enum": [
                "search",
                "url",
                "lookup"
              ],
              "default": "search"
            }
          },
          {
            "name": "market",
            "type": "string",
            "required": false,
            "description": "City, ZIP, or neighborhood, such as Houston, TX 77008 or Montrose Houston TX."
          },
          {
            "name": "listingType",
            "type": "string",
            "required": false,
            "description": "Listing Type filter for Real Estate Listing Search. Accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\". Constraints: accepted values: \"for_sale\", \"recently_sold\", \"for_rent\", \"foreclosure\"; default: \"for_sale\".",
            "constraints": {
              "enum": [
                "for_sale",
                "recently_sold",
                "for_rent",
                "foreclosure"
              ],
              "default": "for_sale"
            }
          },
          {
            "name": "priceMin",
            "type": "integer",
            "required": false,
            "description": "Price Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "priceMax",
            "type": "integer",
            "required": false,
            "description": "Price Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "bedsMin",
            "type": "integer",
            "required": false,
            "description": "Beds Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10.",
            "constraints": {
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "bathsMin",
            "type": "integer",
            "required": false,
            "description": "Baths Min numeric value for Real Estate Listing Search. Constraints: min: 0; max: 10.",
            "constraints": {
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "homeTypes",
            "type": "array",
            "required": false,
            "description": "List of home types values for Real Estate Listing Search. Constraints: max items: 7.",
            "constraints": {
              "maxItems": 7
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "propertyType",
            "type": "string",
            "required": false,
            "description": "Rental property type used by the Apartments-backed provider.",
            "constraints": {
              "enum": [
                "apartments",
                "houses",
                "townhomes",
                "condos"
              ]
            }
          },
          {
            "name": "bedrooms",
            "type": "any",
            "required": false,
            "description": "Rental bedroom filter used by the Apartments-backed provider."
          },
          {
            "name": "sortBy",
            "type": "string",
            "required": false,
            "description": "Sort By filter for Real Estate Listing Search. Accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\". Constraints: accepted values: \"newest\", \"relevance\", \"pricea\", \"priced\", \"beds\", \"baths\", \"size\", \"lot\", \"zest\"; default: \"newest\".",
            "constraints": {
              "enum": [
                "newest",
                "relevance",
                "pricea",
                "priced",
                "beds",
                "baths",
                "size",
                "lot",
                "zest"
              ],
              "default": "newest"
            }
          },
          {
            "name": "daysOnMarket",
            "type": "string",
            "required": false,
            "description": "Days On Market filter for Real Estate Listing Search. Accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\". Constraints: accepted values: \"\", \"1\", \"7\", \"14\", \"30\", \"90\", \"6m\", \"12m\", \"24m\", \"36m\"; default: \"\".",
            "constraints": {
              "enum": [
                "",
                "1",
                "7",
                "14",
                "30",
                "90",
                "6m",
                "12m",
                "24m",
                "36m"
              ],
              "default": ""
            }
          },
          {
            "name": "sqftMin",
            "type": "integer",
            "required": false,
            "description": "Sqft Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "sqftMax",
            "type": "integer",
            "required": false,
            "description": "Sqft Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "lotSizeMin",
            "type": "integer",
            "required": false,
            "description": "Lot Size Min numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "lotSizeMax",
            "type": "integer",
            "required": false,
            "description": "Lot Size Max numeric value for Real Estate Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "yearBuiltMin",
            "type": "integer",
            "required": false,
            "description": "Year Built Min numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030.",
            "constraints": {
              "minimum": 1800,
              "maximum": 2030
            }
          },
          {
            "name": "yearBuiltMax",
            "type": "integer",
            "required": false,
            "description": "Year Built Max numeric value for Real Estate Listing Search. Constraints: min: 1800; max: 2030.",
            "constraints": {
              "minimum": 1800,
              "maximum": 2030
            }
          },
          {
            "name": "amenities",
            "type": "array",
            "required": false,
            "description": "List of amenities values for Real Estate Listing Search. Constraints: max items: 7.",
            "constraints": {
              "maxItems": 7
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "searchUrls",
            "type": "array",
            "required": false,
            "description": "Listing or search URLs for url mode.",
            "constraints": {
              "maxItems": 3
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "addresses",
            "type": "array",
            "required": false,
            "description": "Addresses for lookup mode.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "zpids",
            "type": "array",
            "required": false,
            "description": "Zillow property ids for lookup mode.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "propertyIds",
            "type": "array",
            "required": false,
            "description": "Provider property ids for lookup mode, currently used by the realtor-backed provider.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "locationSlug",
            "type": "string",
            "required": false,
            "description": "Provider-specific location slug for rental searches when city/state parsing is not enough."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Two-letter state hint for rental searches.",
            "constraints": {
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "zipCode",
            "type": "string",
            "required": false,
            "description": "ZIP hint for rental searches."
          },
          {
            "name": "maxRent",
            "type": "integer",
            "required": false,
            "description": "Maximum monthly rent. If omitted, priceMax is reused for rental searches.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "petFriendly",
            "type": "boolean",
            "required": false,
            "description": "Rental search filter for pet-friendly listings.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "maxPages",
            "type": "integer",
            "required": false,
            "description": "Maximum rendered search pages for the Apartments-backed provider.",
            "constraints": {
              "default": 1,
              "minimum": 1,
              "maximum": 2
            }
          },
          {
            "name": "filterToRequestedCity",
            "type": "boolean",
            "required": false,
            "description": "Optional exact-city filter for Apartments-backed city searches."
          },
          {
            "name": "includeSchools",
            "type": "boolean",
            "required": false,
            "description": "Include school data where the selected provider supports detail extraction.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Include price/tax history where the selected provider supports detail extraction.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeDetails",
            "type": "boolean",
            "required": false,
            "description": "Fetch detail-page fields such as description, agent/broker fields, photos, price history, and tax history. Detail-enriched calls are capped at 10 rows.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "smartScrape",
            "type": "boolean",
            "required": false,
            "description": "Allow the managed adapter to skip known unchanged properties where its persistent cache supports it.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum listing rows to return. Detail-enriched calls are capped at 10 rows.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "source": "zillow",
          "mode": "search",
          "market": "Houston, TX 77008",
          "listingType": "for_sale",
          "priceMin": 200000,
          "priceMax": 500000,
          "bedsMin": 3,
          "homeTypes": [
            "houses",
            "townhomes"
          ],
          "includeDetails": false,
          "maxResults": 10
        }
      },
      "exampleRequest": {
        "source": "zillow",
        "mode": "search",
        "market": "Houston, TX 77008",
        "listingType": "for_sale",
        "priceMin": 200000,
        "priceMax": 500000,
        "bedsMin": 3,
        "homeTypes": [
          "houses",
          "townhomes"
        ],
        "includeDetails": false,
        "maxResults": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "result_count",
          "results",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "result_count": {
            "type": "integer"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "source": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "real-estate-listings-search",
          "name": "Real Estate Listing Search",
          "department": "Real Estate"
        },
        "requested": {
          "source": "zillow",
          "mode": "search",
          "market": "Houston, TX 77008",
          "listingType": "for_sale",
          "maxResults": 10,
          "includeDetails": false
        },
        "source": {
          "selected": "zillow",
          "routing": "managed-adapter",
          "resultFreshness": "live-run",
          "upstreamDetailsDisclosed": false
        },
        "result_count": 1,
        "results": [
          {
            "source": "zillow",
            "listing_id": "27886690",
            "address": "1246 Omar St, Houston, TX 77008",
            "price_usd": 1050000,
            "beds": 4,
            "baths": 2,
            "sqft": 2454
          }
        ]
      },
      "configured": false
    },
    {
      "id": "prediction-market-search",
      "resource": "https://agentbodega.store/api/prediction-markets/search",
      "type": "http",
      "method": "POST",
      "serviceName": "Prediction Market Search",
      "description": "Search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.",
      "longDescription": "Purpose: Search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.\nBest use: Use this when an agent needs search active or historical public prediction markets by keyword, category, venue, liquidity, volume, and end date; returns normalized read-only market rows with outcomes, prices, and source-neutral feed metadata.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, venue, activeOnly, closed, category, limit, sort, includeRules.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against market title, slug, description, outcomes, and category labels. Constraints: max length: 160.\n- venue (optional, string): Venue selector. Use managed for AgentBodega's normalized market feed. Constraints: accepted values: \"managed\", \"polymarket\"; default: \"managed\".\n- activeOnly (optional, boolean): When true, return currently active, unresolved markets only. Constraints: default: true.\n- closed (optional, boolean): Set true only when historical or resolved markets are acceptable. Constraints: default: false.\n- category (optional, string): Optional category, event, or tag filter when the caller wants a narrower market family. Constraints: max length: 80.\n- limit (optional, integer): Maximum normalized market rows to return. Constraints: default: 10; min: 1; max: 25.\n- sort (optional, string): Sort order for returned markets. Constraints: accepted values: \"volume_desc\", \"liquidity_desc\", \"newest\", \"ending_soon\"; default: \"volume_desc\".\n- includeRules (optional, boolean): Set true to include capped market rule or description text. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"query\": \"AI agents\",\n  \"category\": \"technology\",\n  \"activeOnly\": true,\n  \"limit\": 10,\n  \"sort\": \"volume_desc\",\n  \"includeRules\": false\n}\n```",
      "category": "prediction-markets",
      "kind": "market-search-tool",
      "departmentId": "prediction-markets",
      "department": "Prediction Markets",
      "aisleId": "market-search",
      "aisle": "Market Search",
      "shelfId": "search",
      "shelf": "Search",
      "offeringId": "prediction-market-search",
      "offering": "Prediction Market Search",
      "pathIds": [
        "prediction-markets",
        "market-search",
        "search",
        "prediction-market-search"
      ],
      "pathLabels": [
        "Prediction Markets",
        "Market Search",
        "Search",
        "Prediction Market Search"
      ],
      "taxonomyPath": "prediction-markets.market-search.search.prediction-market-search",
      "layout": {
        "department": {
          "id": "prediction-markets",
          "name": "Prediction Markets"
        },
        "aisle": {
          "id": "market-search",
          "name": "Market Search"
        },
        "shelf": {
          "id": "search",
          "name": "Search"
        },
        "offering": {
          "id": "prediction-market-search",
          "name": "Prediction Market Search"
        },
        "pathIds": [
          "prediction-markets",
          "market-search",
          "search",
          "prediction-market-search"
        ],
        "pathLabels": [
          "Prediction Markets",
          "Market Search",
          "Search",
          "Prediction Market Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "prediction-markets",
        "market-search",
        "markets",
        "events",
        "probabilities",
        "public-data",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/prediction-markets/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/prediction-markets/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels."
          },
          "venue": {
            "type": "string",
            "enum": [
              "managed",
              "polymarket"
            ],
            "default": "managed",
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed."
          },
          "activeOnly": {
            "type": "boolean",
            "default": true,
            "description": "When true, return currently active, unresolved markets only."
          },
          "closed": {
            "type": "boolean",
            "default": false,
            "description": "Set true only when historical or resolved markets are acceptable."
          },
          "category": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "default": 10,
            "description": "Maximum normalized market rows to return."
          },
          "sort": {
            "type": "string",
            "enum": [
              "volume_desc",
              "liquidity_desc",
              "newest",
              "ending_soon"
            ],
            "default": "volume_desc",
            "description": "Sort order for returned markets."
          },
          "includeRules": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include capped market rule or description text."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "venue",
          "activeOnly",
          "closed",
          "category",
          "limit",
          "sort",
          "includeRules"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "venue",
            "type": "string",
            "required": false,
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed.",
            "constraints": {
              "enum": [
                "managed",
                "polymarket"
              ],
              "default": "managed"
            }
          },
          {
            "name": "activeOnly",
            "type": "boolean",
            "required": false,
            "description": "When true, return currently active, unresolved markets only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "closed",
            "type": "boolean",
            "required": false,
            "description": "Set true only when historical or resolved markets are acceptable.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized market rows to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned markets.",
            "constraints": {
              "enum": [
                "volume_desc",
                "liquidity_desc",
                "newest",
                "ending_soon"
              ],
              "default": "volume_desc"
            }
          },
          {
            "name": "includeRules",
            "type": "boolean",
            "required": false,
            "description": "Set true to include capped market rule or description text.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "AI agents",
          "category": "technology",
          "activeOnly": true,
          "limit": 10,
          "sort": "volume_desc",
          "includeRules": false
        }
      },
      "exampleRequest": {
        "query": "AI agents",
        "category": "technology",
        "activeOnly": true,
        "limit": 10,
        "sort": "volume_desc",
        "includeRules": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "marketFeed",
          "count",
          "markets",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the market search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized filters and caps."
          },
          "marketFeed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Provider-neutral feed metadata and public-data boundary."
          },
          "count": {
            "type": "integer",
            "description": "Number of normalized market rows returned."
          },
          "markets": {
            "type": "array",
            "description": "Normalized prediction-market rows. These are read-only market intelligence records, not trading instructions.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable market id."
                },
                "slug": {
                  "type": "string",
                  "description": "Stable market slug when available."
                },
                "title": {
                  "type": "string",
                  "description": "Market question or title."
                },
                "url": {
                  "type": "string",
                  "description": "Public market URL when available."
                },
                "venue": {
                  "type": "string",
                  "description": "Normalized venue label."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether the market is active."
                },
                "closed": {
                  "type": "boolean",
                  "description": "Whether the market is closed or resolved."
                },
                "endsAt": {
                  "type": "string",
                  "description": "Market end timestamp when available."
                },
                "volume": {
                  "type": "number",
                  "description": "Reported all-time volume when available."
                },
                "liquidity": {
                  "type": "number",
                  "description": "Reported liquidity when available."
                },
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Outcome labels and implied prices when available."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalized category, event, or tag labels."
                },
                "rules": {
                  "type": "string",
                  "description": "Optional capped rules/description text when includeRules is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "marketFeed": {
          "type": "managed-prediction-market-feed",
          "readOnly": true,
          "noTradeExecution": true
        },
        "count": 1,
        "markets": [
          {
            "title": "Will example event happen?",
            "outcomes": [
              {
                "label": "Yes",
                "price": 0.42
              },
              {
                "label": "No",
                "price": 0.58
              }
            ],
            "volume": 125000,
            "liquidity": 32000
          }
        ]
      },
      "configured": false
    },
    {
      "id": "prediction-market-listings",
      "resource": "https://agentbodega.store/api/prediction-markets/listings",
      "type": "http",
      "method": "POST",
      "serviceName": "Prediction Market Listings",
      "description": "Return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.",
      "longDescription": "Purpose: Return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.\nBest use: Use this when an agent needs return fresh public prediction-market listings sorted by volume, liquidity, newest, or ending soon with capped rows, normalized outcomes, category labels, and no trade execution.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, venue, activeOnly, closed, category, limit, sort, includeRules.\n\nAccepted fields:\n- query (optional, string): Optional text filter matched against market title, slug, description, outcomes, and category labels. Constraints: max length: 160.\n- venue (optional, string): Venue selector. Use managed for AgentBodega's normalized market feed. Constraints: accepted values: \"managed\", \"polymarket\"; default: \"managed\".\n- activeOnly (optional, boolean): When true, return currently active, unresolved markets only. Constraints: default: true.\n- closed (optional, boolean): Set true only when historical or resolved markets are acceptable. Constraints: default: false.\n- category (optional, string): Optional category, event, or tag filter when the caller wants a narrower market family. Constraints: max length: 80.\n- limit (optional, integer): Maximum normalized market rows to return. Constraints: default: 10; min: 1; max: 25.\n- sort (optional, string): Sort order for returned markets. Constraints: accepted values: \"volume_desc\", \"liquidity_desc\", \"newest\", \"ending_soon\"; default: \"volume_desc\".\n- includeRules (optional, boolean): Set true to include capped market rule or description text. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"activeOnly\": true,\n  \"closed\": false,\n  \"limit\": 10,\n  \"sort\": \"volume_desc\",\n  \"includeRules\": false\n}\n```",
      "category": "prediction-markets",
      "kind": "market-listings-tool",
      "departmentId": "prediction-markets",
      "department": "Prediction Markets",
      "aisleId": "market-search",
      "aisle": "Market Search",
      "shelfId": "active-listings",
      "shelf": "Active Listings",
      "offeringId": "prediction-market-listings",
      "offering": "Prediction Market Listings",
      "pathIds": [
        "prediction-markets",
        "market-search",
        "active-listings",
        "prediction-market-listings"
      ],
      "pathLabels": [
        "Prediction Markets",
        "Market Search",
        "Active Listings",
        "Prediction Market Listings"
      ],
      "taxonomyPath": "prediction-markets.market-search.active-listings.prediction-market-listings",
      "layout": {
        "department": {
          "id": "prediction-markets",
          "name": "Prediction Markets"
        },
        "aisle": {
          "id": "market-search",
          "name": "Market Search"
        },
        "shelf": {
          "id": "active-listings",
          "name": "Active Listings"
        },
        "offering": {
          "id": "prediction-market-listings",
          "name": "Prediction Market Listings"
        },
        "pathIds": [
          "prediction-markets",
          "market-search",
          "active-listings",
          "prediction-market-listings"
        ],
        "pathLabels": [
          "Prediction Markets",
          "Market Search",
          "Active Listings",
          "Prediction Market Listings"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "prediction-markets",
        "market-listings",
        "markets",
        "events",
        "probabilities",
        "public-data",
        "research",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/prediction-markets/listings",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/prediction-markets/listings",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels."
          },
          "venue": {
            "type": "string",
            "enum": [
              "managed",
              "polymarket"
            ],
            "default": "managed",
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed."
          },
          "activeOnly": {
            "type": "boolean",
            "default": true,
            "description": "When true, return currently active, unresolved markets only."
          },
          "closed": {
            "type": "boolean",
            "default": false,
            "description": "Set true only when historical or resolved markets are acceptable."
          },
          "category": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "default": 10,
            "description": "Maximum normalized market rows to return."
          },
          "sort": {
            "type": "string",
            "enum": [
              "volume_desc",
              "liquidity_desc",
              "newest",
              "ending_soon"
            ],
            "default": "volume_desc",
            "description": "Sort order for returned markets."
          },
          "includeRules": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include capped market rule or description text."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "venue",
          "activeOnly",
          "closed",
          "category",
          "limit",
          "sort",
          "includeRules"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional text filter matched against market title, slug, description, outcomes, and category labels.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "venue",
            "type": "string",
            "required": false,
            "description": "Venue selector. Use managed for AgentBodega's normalized market feed.",
            "constraints": {
              "enum": [
                "managed",
                "polymarket"
              ],
              "default": "managed"
            }
          },
          {
            "name": "activeOnly",
            "type": "boolean",
            "required": false,
            "description": "When true, return currently active, unresolved markets only.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "closed",
            "type": "boolean",
            "required": false,
            "description": "Set true only when historical or resolved markets are acceptable.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "category",
            "type": "string",
            "required": false,
            "description": "Optional category, event, or tag filter when the caller wants a narrower market family.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized market rows to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned markets.",
            "constraints": {
              "enum": [
                "volume_desc",
                "liquidity_desc",
                "newest",
                "ending_soon"
              ],
              "default": "volume_desc"
            }
          },
          {
            "name": "includeRules",
            "type": "boolean",
            "required": false,
            "description": "Set true to include capped market rule or description text.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "activeOnly": true,
          "closed": false,
          "limit": 10,
          "sort": "volume_desc",
          "includeRules": false
        }
      },
      "exampleRequest": {
        "activeOnly": true,
        "closed": false,
        "limit": 10,
        "sort": "volume_desc",
        "includeRules": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "marketFeed",
          "count",
          "markets",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the market search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized filters and caps."
          },
          "marketFeed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Provider-neutral feed metadata and public-data boundary."
          },
          "count": {
            "type": "integer",
            "description": "Number of normalized market rows returned."
          },
          "markets": {
            "type": "array",
            "description": "Normalized prediction-market rows. These are read-only market intelligence records, not trading instructions.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable market id."
                },
                "slug": {
                  "type": "string",
                  "description": "Stable market slug when available."
                },
                "title": {
                  "type": "string",
                  "description": "Market question or title."
                },
                "url": {
                  "type": "string",
                  "description": "Public market URL when available."
                },
                "venue": {
                  "type": "string",
                  "description": "Normalized venue label."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether the market is active."
                },
                "closed": {
                  "type": "boolean",
                  "description": "Whether the market is closed or resolved."
                },
                "endsAt": {
                  "type": "string",
                  "description": "Market end timestamp when available."
                },
                "volume": {
                  "type": "number",
                  "description": "Reported all-time volume when available."
                },
                "liquidity": {
                  "type": "number",
                  "description": "Reported liquidity when available."
                },
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Outcome labels and implied prices when available."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalized category, event, or tag labels."
                },
                "rules": {
                  "type": "string",
                  "description": "Optional capped rules/description text when includeRules is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "marketFeed": {
          "type": "managed-prediction-market-feed",
          "readOnly": true,
          "noTradeExecution": true
        },
        "count": 1,
        "markets": [
          {
            "title": "Top active example market",
            "outcomes": [
              {
                "label": "Yes",
                "price": 0.61
              },
              {
                "label": "No",
                "price": 0.39
              }
            ],
            "volume": 250000,
            "liquidity": 48000
          }
        ]
      },
      "configured": false
    },
    {
      "id": "x-user-profile",
      "resource": "https://agentbodega.store/api/social-media/x/user-profile",
      "type": "http",
      "method": "POST",
      "serviceName": "X User Profile Lookup",
      "description": "Look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.",
      "longDescription": "Purpose: Look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.\nBest use: Use this when an agent needs look up a public X/Twitter profile by username and return normalized account metadata, public metrics, verification state, bio, and profile image metadata.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: username.\nOptional fields: none.\n\nAccepted fields:\n- username (required, string): Public username or profile URL. Leading @ is accepted and normalized. Constraints: min length: 1; max length: 80.\n\nExample request body:\n```json\n{\n  \"username\": \"OpenAI\"\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "profiles",
      "shelf": "Profiles",
      "offeringId": "x-user-profile",
      "offering": "X User Profile Lookup",
      "pathIds": [
        "social-media",
        "x-twitter",
        "profiles",
        "x-user-profile"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Profiles",
        "X User Profile Lookup"
      ],
      "taxonomyPath": "social-media.x-twitter.profiles.x-user-profile",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "profiles",
          "name": "Profiles"
        },
        "offering": {
          "id": "x-user-profile",
          "name": "X User Profile Lookup"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "profiles",
          "x-user-profile"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Profiles",
          "X User Profile Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "profile",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/user-profile",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/user-profile",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Public username or profile URL. Leading @ is accepted and normalized."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "username"
        ],
        "optional": [],
        "fields": [
          {
            "name": "username",
            "type": "string",
            "required": true,
            "description": "Public username or profile URL. Leading @ is accepted and normalized.",
            "constraints": {
              "minLength": 1,
              "maxLength": 80
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "username": "OpenAI"
        }
      },
      "exampleRequest": {
        "username": "OpenAI"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-user-profile",
          "name": "X User Profile Lookup",
          "department": "Social Media"
        },
        "requested": {
          "username": "OpenAI"
        },
        "profile": {
          "id": "44196397",
          "username": "OpenAI",
          "name": "OpenAI",
          "verified": true,
          "metrics": {
            "followers": 1000000,
            "following": 0,
            "posts": 1000
          }
        }
      },
      "configured": false
    },
    {
      "id": "x-tweet",
      "resource": "https://agentbodega.store/api/social-media/x/tweet",
      "type": "http",
      "method": "POST",
      "serviceName": "X Post Lookup",
      "description": "Look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.",
      "longDescription": "Purpose: Look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.\nBest use: Use this when an agent needs look up one public X/Twitter post by numeric id or post URL and return normalized text, author, created time, language, and public engagement metrics.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: tweetId, tweetUrl.\n\nAccepted fields:\n- tweetId (optional, string): Numeric public post id. Required unless tweetUrl is supplied.\n- tweetUrl (optional, string): Public post URL. Required unless tweetId is supplied. Constraints: format: uri; max length: 300.\n\nExample request body:\n```json\n{\n  \"tweetId\": \"20\"\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "posts",
      "shelf": "Posts",
      "offeringId": "x-tweet",
      "offering": "X Post Lookup",
      "pathIds": [
        "social-media",
        "x-twitter",
        "posts",
        "x-tweet"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Posts",
        "X Post Lookup"
      ],
      "taxonomyPath": "social-media.x-twitter.posts.x-tweet",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "posts",
          "name": "Posts"
        },
        "offering": {
          "id": "x-tweet",
          "name": "X Post Lookup"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "posts",
          "x-tweet"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Posts",
          "X Post Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "tweet",
        "post",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/tweet",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/tweet",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "anyOf": [
          {
            "required": [
              "tweetId"
            ]
          },
          {
            "required": [
              "tweetUrl"
            ]
          }
        ],
        "properties": {
          "tweetId": {
            "type": "string",
            "pattern": "^[0-9]{1,30}$",
            "description": "Numeric public post id. Required unless tweetUrl is supplied."
          },
          "tweetUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 300,
            "description": "Public post URL. Required unless tweetId is supplied."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "tweetId",
          "tweetUrl"
        ],
        "fields": [
          {
            "name": "tweetId",
            "type": "string",
            "required": false,
            "description": "Numeric public post id. Required unless tweetUrl is supplied."
          },
          {
            "name": "tweetUrl",
            "type": "string",
            "required": false,
            "description": "Public post URL. Required unless tweetId is supplied.",
            "constraints": {
              "format": "uri",
              "maxLength": 300
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "tweetId": "20"
        }
      },
      "exampleRequest": {
        "tweetId": "20"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-tweet",
          "name": "X Post Lookup",
          "department": "Social Media"
        },
        "requested": {
          "tweetId": "20"
        },
        "tweet": {
          "id": "20",
          "text": "Normalized public post text",
          "author": {
            "username": "jack"
          },
          "metrics": {
            "likes": 0,
            "reposts": 0,
            "replies": 0
          }
        }
      },
      "configured": false
    },
    {
      "id": "x-user-timeline",
      "resource": "https://agentbodega.store/api/social-media/x/user-timeline",
      "type": "http",
      "method": "POST",
      "serviceName": "X User Timeline",
      "description": "Return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.",
      "longDescription": "Purpose: Return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.\nBest use: Use this when an agent needs return recent public posts for a username with normalized post ids, text, author metadata, created time, language, and public engagement metrics.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: username.\nOptional fields: maxResults.\n\nAccepted fields:\n- username (required, string): Public username or profile URL. Leading @ is accepted and normalized. Constraints: min length: 1; max length: 80.\n- maxResults (optional, integer): Maximum recent posts to return. Constraints: default: 20; min: 1; max: 100.\n\nExample request body:\n```json\n{\n  \"username\": \"OpenAI\",\n  \"maxResults\": 5\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "timelines",
      "shelf": "Timelines",
      "offeringId": "x-user-timeline",
      "offering": "X User Timeline",
      "pathIds": [
        "social-media",
        "x-twitter",
        "timelines",
        "x-user-timeline"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Timelines",
        "X User Timeline"
      ],
      "taxonomyPath": "social-media.x-twitter.timelines.x-user-timeline",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "timelines",
          "name": "Timelines"
        },
        "offering": {
          "id": "x-user-timeline",
          "name": "X User Timeline"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "timelines",
          "x-user-timeline"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Timelines",
          "X User Timeline"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "timeline",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/user-timeline",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/user-timeline",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Public username or profile URL. Leading @ is accepted and normalized."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "description": "Maximum recent posts to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "username"
        ],
        "optional": [
          "maxResults"
        ],
        "fields": [
          {
            "name": "username",
            "type": "string",
            "required": true,
            "description": "Public username or profile URL. Leading @ is accepted and normalized.",
            "constraints": {
              "minLength": 1,
              "maxLength": 80
            }
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum recent posts to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "username": "OpenAI",
          "maxResults": 5
        }
      },
      "exampleRequest": {
        "username": "OpenAI",
        "maxResults": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-user-timeline",
          "name": "X User Timeline",
          "department": "Social Media"
        },
        "requested": {
          "username": "OpenAI",
          "maxResults": 5
        },
        "result_count": 5,
        "results": [
          {
            "id": "1110302988",
            "text": "Normalized public post text",
            "author": {
              "username": "OpenAI"
            },
            "metrics": {
              "likes": 10,
              "reposts": 2,
              "replies": 1
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "x-tweet-search",
      "resource": "https://agentbodega.store/api/social-media/x/tweet-search",
      "type": "http",
      "method": "POST",
      "serviceName": "X Post Search",
      "description": "Search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.",
      "longDescription": "Purpose: Search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.\nBest use: Use this when an agent needs search public X/Twitter posts with a raw query or bounded structured filters such as words, exact phrase, hashtags, author, mention target, engagement thresholds, and date range.\nPrice: $0.06 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, words, phrase, anyWords, noneWords, hashtags, from, to, mentioning, minReplies, minLikes, minReposts, since, until, maxResults.\n\nAccepted fields:\n- query (optional, string): Raw X/Twitter search query. If supplied, structured filter fields are ignored. Constraints: max length: 500.\n- words (optional, string): All words to include. Constraints: max length: 160.\n- phrase (optional, string): Exact phrase to include. Constraints: max length: 160.\n- anyWords (optional, array): Any of these words may match. Constraints: max items: 12.\n- noneWords (optional, array): Words to exclude. Constraints: max items: 12.\n- hashtags (optional, array): Hashtags to include, with or without #. Constraints: max items: 12.\n- from (optional, string): Only posts from this username. Constraints: max length: 80.\n- to (optional, string): Only replies to this username. Constraints: max length: 80.\n- mentioning (optional, string): Only posts mentioning this username. Constraints: max length: 80.\n- minReplies (optional, integer): Minimum reply count. Constraints: min: 0.\n- minLikes (optional, integer): Minimum like count. Constraints: min: 0.\n- minReposts (optional, integer): Minimum repost count. Constraints: min: 0.\n- since (optional, string): Start date in YYYY-MM-DD.\n- until (optional, string): End date in YYYY-MM-DD.\n- maxResults (optional, integer): Maximum posts to return. Search is capped at 20 per call. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"from\": \"OpenAI\",\n  \"words\": \"agent\",\n  \"minLikes\": 10,\n  \"maxResults\": 5\n}\n```",
      "category": "social-media",
      "kind": "social-data-tool",
      "departmentId": "social-media",
      "department": "Social Media",
      "aisleId": "x-twitter",
      "aisle": "X/Twitter",
      "shelfId": "search",
      "shelf": "Search",
      "offeringId": "x-tweet-search",
      "offering": "X Post Search",
      "pathIds": [
        "social-media",
        "x-twitter",
        "search",
        "x-tweet-search"
      ],
      "pathLabels": [
        "Social Media",
        "X/Twitter",
        "Search",
        "X Post Search"
      ],
      "taxonomyPath": "social-media.x-twitter.search.x-tweet-search",
      "layout": {
        "department": {
          "id": "social-media",
          "name": "Social Media"
        },
        "aisle": {
          "id": "x-twitter",
          "name": "X/Twitter"
        },
        "shelf": {
          "id": "search",
          "name": "Search"
        },
        "offering": {
          "id": "x-tweet-search",
          "name": "X Post Search"
        },
        "pathIds": [
          "social-media",
          "x-twitter",
          "search",
          "x-tweet-search"
        ],
        "pathLabels": [
          "Social Media",
          "X/Twitter",
          "Search",
          "X Post Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "social-media",
        "x",
        "twitter",
        "search",
        "social-listening",
        "creator-research",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/social-media/x/tweet-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.06"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/social-media/x/tweet-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "anyOf": [
          {
            "required": [
              "query"
            ]
          },
          {
            "required": [
              "words"
            ]
          },
          {
            "required": [
              "phrase"
            ]
          },
          {
            "required": [
              "hashtags"
            ]
          },
          {
            "required": [
              "from"
            ]
          }
        ],
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 500,
            "description": "Raw X/Twitter search query. If supplied, structured filter fields are ignored."
          },
          "words": {
            "type": "string",
            "maxLength": 160,
            "description": "All words to include."
          },
          "phrase": {
            "type": "string",
            "maxLength": 160,
            "description": "Exact phrase to include."
          },
          "anyWords": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "Any Words item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Any of these words may match."
          },
          "noneWords": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "None Words item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Words to exclude."
          },
          "hashtags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80,
              "description": "Hashtags item value for X Post Search. Constraints: max length: 80."
            },
            "maxItems": 12,
            "description": "Hashtags to include, with or without #."
          },
          "from": {
            "type": "string",
            "maxLength": 80,
            "description": "Only posts from this username."
          },
          "to": {
            "type": "string",
            "maxLength": 80,
            "description": "Only replies to this username."
          },
          "mentioning": {
            "type": "string",
            "maxLength": 80,
            "description": "Only posts mentioning this username."
          },
          "minReplies": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum reply count."
          },
          "minLikes": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum like count."
          },
          "minReposts": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum repost count."
          },
          "since": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "Start date in YYYY-MM-DD."
          },
          "until": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "End date in YYYY-MM-DD."
          },
          "maxResults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum posts to return. Search is capped at 20 per call."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "words",
          "phrase",
          "anyWords",
          "noneWords",
          "hashtags",
          "from",
          "to",
          "mentioning",
          "minReplies",
          "minLikes",
          "minReposts",
          "since",
          "until",
          "maxResults"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Raw X/Twitter search query. If supplied, structured filter fields are ignored.",
            "constraints": {
              "maxLength": 500
            }
          },
          {
            "name": "words",
            "type": "string",
            "required": false,
            "description": "All words to include.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "phrase",
            "type": "string",
            "required": false,
            "description": "Exact phrase to include.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "anyWords",
            "type": "array",
            "required": false,
            "description": "Any of these words may match.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "noneWords",
            "type": "array",
            "required": false,
            "description": "Words to exclude.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "hashtags",
            "type": "array",
            "required": false,
            "description": "Hashtags to include, with or without #.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "type": "string",
            "required": false,
            "description": "Only posts from this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "to",
            "type": "string",
            "required": false,
            "description": "Only replies to this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "mentioning",
            "type": "string",
            "required": false,
            "description": "Only posts mentioning this username.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "minReplies",
            "type": "integer",
            "required": false,
            "description": "Minimum reply count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minLikes",
            "type": "integer",
            "required": false,
            "description": "Minimum like count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minReposts",
            "type": "integer",
            "required": false,
            "description": "Minimum repost count.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "since",
            "type": "string",
            "required": false,
            "description": "Start date in YYYY-MM-DD."
          },
          {
            "name": "until",
            "type": "string",
            "required": false,
            "description": "End date in YYYY-MM-DD."
          },
          {
            "name": "maxResults",
            "type": "integer",
            "required": false,
            "description": "Maximum posts to return. Search is capped at 20 per call.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "from": "OpenAI",
          "words": "agent",
          "minLikes": 10,
          "maxResults": 5
        }
      },
      "exampleRequest": {
        "from": "OpenAI",
        "words": "agent",
        "minLikes": 10,
        "maxResults": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "profile": {
            "type": "object",
            "additionalProperties": true
          },
          "tweet": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result_count": {
            "type": "integer"
          },
          "meta": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "x-tweet-search",
          "name": "X Post Search",
          "department": "Social Media"
        },
        "requested": {
          "query": "agent from:OpenAI min_faves:10",
          "maxResults": 5
        },
        "result_count": 5,
        "results": [
          {
            "id": "1110302988",
            "text": "Normalized public post text",
            "author": {
              "username": "OpenAI"
            },
            "metrics": {
              "likes": 10,
              "reposts": 2,
              "replies": 1
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "outdoor-recreation-availability",
      "resource": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
      "type": "http",
      "method": "POST",
      "serviceName": "Outdoor Recreation Availability Check",
      "description": "Check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.",
      "longDescription": "Purpose: Check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.\nBest use: Use this when an agent needs check live public recreation availability for campgrounds, campsites, permits, lotteries, tours, and timed-entry resources over a bounded date range.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: resource, startDate, endDate.\nOptional fields: entityId, entityType, state, isLottery, filters, limit, includeMetadata, proxiesSx.\n\nAccepted fields:\n- resource (required, string): Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources.\n- entityId (optional, string): Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied.\n- entityType (optional, string): Optional known resource type. URLs usually imply this automatically. Constraints: accepted values: \"campground\", \"campsite\", \"permit\", \"timedentry\", \"timedentry_tour\".\n- state (optional, string): Optional state filter for name resolution, such as CA or California.\n- startDate (required, string): Start date in YYYY-MM-DD. For campgrounds this is the check-in date. Constraints: format: date.\n- endDate (required, string): End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout. Constraints: format: date.\n- isLottery (optional, boolean): For permits, request lottery quota/application state instead of post-draw/walk-up availability. Constraints: default: false.\n- filters (optional, object): Filters object for configuring Outdoor Recreation Availability Check. Object accepts: groupSize, siteType, equipment, rvLengthFt, electric, accessibility, petsAllowed, loop, availableOnly.\n- limit (optional, integer): Maximum matching sites, divisions, or slots to return. Constraints: default: 20; min: 1; max: 50.\n- includeMetadata (optional, boolean): For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available. Constraints: default: true.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"resource\": \"Upper Pines Campground\",\n  \"state\": \"CA\",\n  \"startDate\": \"2026-06-15\",\n  \"endDate\": \"2026-06-19\",\n  \"filters\": {\n    \"siteType\": \"TENT ONLY\",\n    \"groupSize\": 4,\n    \"availableOnly\": true\n  },\n  \"limit\": 5\n}\n```",
      "category": "public-data",
      "kind": "data-job",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "outdoor-recreation",
      "aisle": "Outdoor Recreation",
      "shelfId": "outdoor-recreation",
      "shelf": "Outdoor Recreation",
      "offeringId": "outdoor-recreation-availability",
      "offering": "Outdoor Recreation Availability Check",
      "pathIds": [
        "public-data",
        "outdoor-recreation",
        "outdoor-recreation",
        "outdoor-recreation-availability"
      ],
      "pathLabels": [
        "Public Data",
        "Outdoor Recreation",
        "Outdoor Recreation",
        "Outdoor Recreation Availability Check"
      ],
      "taxonomyPath": "public-data.outdoor-recreation.outdoor-recreation.outdoor-recreation-availability",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "outdoor-recreation",
          "name": "Outdoor Recreation"
        },
        "shelf": {
          "id": "outdoor-recreation",
          "name": "Outdoor Recreation"
        },
        "offering": {
          "id": "outdoor-recreation-availability",
          "name": "Outdoor Recreation Availability Check"
        },
        "pathIds": [
          "public-data",
          "outdoor-recreation",
          "outdoor-recreation",
          "outdoor-recreation-availability"
        ],
        "pathLabels": [
          "Public Data",
          "Outdoor Recreation",
          "Outdoor Recreation",
          "Outdoor Recreation Availability Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "camping",
        "permits",
        "public-data",
        "travel",
        "availability",
        "parks"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/outdoor-recreation-availability",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "resource",
          "startDate",
          "endDate"
        ],
        "properties": {
          "resource": {
            "type": "string",
            "description": "Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources."
          },
          "entityId": {
            "type": "string",
            "description": "Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied."
          },
          "entityType": {
            "type": "string",
            "enum": [
              "campground",
              "campsite",
              "permit",
              "timedentry",
              "timedentry_tour"
            ],
            "description": "Optional known resource type. URLs usually imply this automatically."
          },
          "state": {
            "type": "string",
            "description": "Optional state filter for name resolution, such as CA or California."
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "description": "Start date in YYYY-MM-DD. For campgrounds this is the check-in date."
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "description": "End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout."
          },
          "isLottery": {
            "type": "boolean",
            "default": false,
            "description": "For permits, request lottery quota/application state instead of post-draw/walk-up availability."
          },
          "filters": {
            "type": "object",
            "properties": {
              "groupSize": {
                "type": "integer",
                "minimum": 1,
                "description": "Group Size numeric value for Outdoor Recreation Availability Check. Constraints: min: 1."
              },
              "siteType": {
                "type": "string",
                "description": "Campground site type filter, such as tent only, RV, group, or standard."
              },
              "equipment": {
                "type": "string",
                "description": "Equipment name to match in permitted equipment, such as RV or tent."
              },
              "rvLengthFt": {
                "type": "integer",
                "minimum": 1,
                "description": "Rv Length Ft numeric value for Outdoor Recreation Availability Check. Constraints: min: 1."
              },
              "electric": {
                "type": "boolean",
                "description": "Set true to enable electric behavior for Outdoor Recreation Availability Check."
              },
              "accessibility": {
                "type": "boolean",
                "description": "Set true to enable accessibility behavior for Outdoor Recreation Availability Check."
              },
              "petsAllowed": {
                "type": "boolean",
                "description": "Set true to enable pets allowed behavior for Outdoor Recreation Availability Check."
              },
              "loop": {
                "type": "string",
                "description": "Loop value for Outdoor Recreation Availability Check."
              },
              "availableOnly": {
                "type": "boolean",
                "default": true,
                "description": "Set true to enable available only behavior for Outdoor Recreation Availability Check. Constraints: default: true."
              }
            },
            "additionalProperties": false,
            "description": "Filters object for configuring Outdoor Recreation Availability Check."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Maximum matching sites, divisions, or slots to return."
          },
          "includeMetadata": {
            "type": "boolean",
            "default": true,
            "description": "For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "resource",
          "startDate",
          "endDate"
        ],
        "optional": [
          "entityId",
          "entityType",
          "state",
          "isLottery",
          "filters",
          "limit",
          "includeMetadata",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "resource",
            "type": "string",
            "required": true,
            "description": "Outdoor recreation resource name or canonical reservation URL. Supports campground, campsite, permit, lottery, timed-entry, and tour resources."
          },
          {
            "name": "entityId",
            "type": "string",
            "required": false,
            "description": "Optional known facility, campsite, permit, or timed-entry id. Skips name resolution when supplied."
          },
          {
            "name": "entityType",
            "type": "string",
            "required": false,
            "description": "Optional known resource type. URLs usually imply this automatically.",
            "constraints": {
              "enum": [
                "campground",
                "campsite",
                "permit",
                "timedentry",
                "timedentry_tour"
              ]
            }
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Optional state filter for name resolution, such as CA or California."
          },
          {
            "name": "startDate",
            "type": "string",
            "required": true,
            "description": "Start date in YYYY-MM-DD. For campgrounds this is the check-in date.",
            "constraints": {
              "format": "date"
            }
          },
          {
            "name": "endDate",
            "type": "string",
            "required": true,
            "description": "End date in YYYY-MM-DD. For campgrounds this is the checkout date; returned availability covers nights before checkout.",
            "constraints": {
              "format": "date"
            }
          },
          {
            "name": "isLottery",
            "type": "boolean",
            "required": false,
            "description": "For permits, request lottery quota/application state instead of post-draw/walk-up availability.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "filters",
            "type": "object",
            "required": false,
            "description": "Filters object for configuring Outdoor Recreation Availability Check.",
            "fields": [
              {
                "name": "groupSize",
                "type": "integer",
                "required": false,
                "description": "Group Size numeric value for Outdoor Recreation Availability Check. Constraints: min: 1.",
                "constraints": {
                  "minimum": 1
                }
              },
              {
                "name": "siteType",
                "type": "string",
                "required": false,
                "description": "Campground site type filter, such as tent only, RV, group, or standard."
              },
              {
                "name": "equipment",
                "type": "string",
                "required": false,
                "description": "Equipment name to match in permitted equipment, such as RV or tent."
              },
              {
                "name": "rvLengthFt",
                "type": "integer",
                "required": false,
                "description": "Rv Length Ft numeric value for Outdoor Recreation Availability Check. Constraints: min: 1.",
                "constraints": {
                  "minimum": 1
                }
              },
              {
                "name": "electric",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable electric behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "accessibility",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable accessibility behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "petsAllowed",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable pets allowed behavior for Outdoor Recreation Availability Check."
              },
              {
                "name": "loop",
                "type": "string",
                "required": false,
                "description": "Loop value for Outdoor Recreation Availability Check."
              },
              {
                "name": "availableOnly",
                "type": "boolean",
                "required": false,
                "description": "Set true to enable available only behavior for Outdoor Recreation Availability Check. Constraints: default: true.",
                "constraints": {
                  "default": true
                }
              }
            ]
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum matching sites, divisions, or slots to return.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "includeMetadata",
            "type": "boolean",
            "required": false,
            "description": "For campgrounds/campsites, include site/facility metadata such as equipment, accessibility, pet policy, and fees when available.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "resource": "Upper Pines Campground",
          "state": "CA",
          "startDate": "2026-06-15",
          "endDate": "2026-06-19",
          "filters": {
            "siteType": "TENT ONLY",
            "groupSize": 4,
            "availableOnly": true
          },
          "limit": 5
        }
      },
      "exampleRequest": {
        "resource": "Upper Pines Campground",
        "state": "CA",
        "startDate": "2026-06-15",
        "endDate": "2026-06-19",
        "filters": {
          "siteType": "TENT ONLY",
          "groupSize": 4,
          "availableOnly": true
        },
        "limit": 5
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "kind",
          "requested",
          "resolved",
          "checkedAt"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "campground",
              "campsite",
              "permit",
              "timedentry",
              "timedentry_tour"
            ]
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "resolved": {
            "type": "object",
            "additionalProperties": true
          },
          "sites": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "divisions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "slots": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "kind": "campground",
        "resolved": {
          "entityId": "232447",
          "entityType": "campground",
          "name": "Upper Pines Campground",
          "state": "CA"
        },
        "dateRange": {
          "checkin": "2026-06-15",
          "checkout": "2026-06-19",
          "nights": 4
        },
        "sites": [
          {
            "campsite_id": "98",
            "site_number": "040",
            "loop": "Upper Pines",
            "campsite_type": "TENT ONLY NONELECTRIC",
            "max_num_people": 6,
            "pets_allowed": "Domestic",
            "availability": {
              "2026-06-15": "Available",
              "2026-06-16": "Available",
              "2026-06-17": "Reserved",
              "2026-06-18": "Available"
            }
          }
        ]
      },
      "configured": false
    },
    {
      "id": "news-headline-search",
      "resource": "https://agentbodega.store/api/public-data/news-headlines/search",
      "type": "http",
      "method": "POST",
      "serviceName": "News Headline Search",
      "description": "Search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.",
      "longDescription": "Purpose: Search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.\nBest use: Use this when an agent needs search a managed public news index by topic, publisher label, lookback window, keyword query, sentiment bounds, and sort order; returns normalized headline rows with publisher article URLs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: topic, publisher, query, hours, limit, includeContent, minSentiment, maxSentiment, sort.\n\nAccepted fields:\n- topic (optional, string): Optional news topic filter. Use all for the full managed index. Constraints: accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\"; default: \"all\".\n- publisher (optional, string): Optional publisher/feed id filter when the caller already knows the feed label to narrow. Constraints: max length: 80.\n- query (optional, string): Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords. Constraints: max length: 160.\n- hours (optional, integer): Lookback window in hours. Defaults to the last 24 hours and is capped at 24. Constraints: default: 24; min: 1; max: 24.\n- limit (optional, integer): Maximum headline rows to return after filtering and sorting. Constraints: default: 10; min: 1; max: 50.\n- includeContent (optional, boolean): Set true to include a capped cleaned content excerpt when available. Constraints: default: false.\n- minSentiment (optional, number): Optional lower bound for compound sentiment from -1 to 1. Constraints: min: -1; max: 1.\n- maxSentiment (optional, number): Optional upper bound for compound sentiment from -1 to 1. Constraints: min: -1; max: 1.\n- sort (optional, string): Sort order for returned headlines. Constraints: accepted values: \"published_desc\", \"published_asc\", \"sentiment_desc\", \"sentiment_asc\"; default: \"published_desc\".\n\nExample request body:\n```json\n{\n  \"topic\": \"tech\",\n  \"query\": \"ai\",\n  \"hours\": 6,\n  \"limit\": 10,\n  \"sort\": \"published_desc\",\n  \"includeContent\": false\n}\n```",
      "category": "public-data",
      "kind": "news-search-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "headlines",
      "shelf": "Headlines",
      "offeringId": "news-headline-search",
      "offering": "News Headline Search",
      "pathIds": [
        "public-data",
        "news",
        "headlines",
        "news-headline-search"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Headlines",
        "News Headline Search"
      ],
      "taxonomyPath": "public-data.news.headlines.news-headline-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "headlines",
          "name": "Headlines"
        },
        "offering": {
          "id": "news-headline-search",
          "name": "News Headline Search"
        },
        "pathIds": [
          "public-data",
          "news",
          "headlines",
          "news-headline-search"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Headlines",
          "News Headline Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "headlines",
        "current-events",
        "topic-filter",
        "sentiment",
        "publisher-links",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news-headlines/search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news-headlines/search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "enum": [
              "all",
              "tech",
              "news",
              "business",
              "science",
              "gaming",
              "culture",
              "politics",
              "sports"
            ],
            "default": "all",
            "description": "Optional news topic filter. Use all for the full managed index."
          },
          "publisher": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional publisher/feed id filter when the caller already knows the feed label to narrow."
          },
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 24,
            "description": "Lookback window in hours. Defaults to the last 24 hours and is capped at 24."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "Maximum headline rows to return after filtering and sorting."
          },
          "includeContent": {
            "type": "boolean",
            "default": false,
            "description": "Set true to include a capped cleaned content excerpt when available."
          },
          "minSentiment": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Optional lower bound for compound sentiment from -1 to 1."
          },
          "maxSentiment": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Optional upper bound for compound sentiment from -1 to 1."
          },
          "sort": {
            "type": "string",
            "enum": [
              "published_desc",
              "published_asc",
              "sentiment_desc",
              "sentiment_asc"
            ],
            "default": "published_desc",
            "description": "Sort order for returned headlines."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "topic",
          "publisher",
          "query",
          "hours",
          "limit",
          "includeContent",
          "minSentiment",
          "maxSentiment",
          "sort"
        ],
        "fields": [
          {
            "name": "topic",
            "type": "string",
            "required": false,
            "description": "Optional news topic filter. Use all for the full managed index.",
            "constraints": {
              "enum": [
                "all",
                "tech",
                "news",
                "business",
                "science",
                "gaming",
                "culture",
                "politics",
                "sports"
              ],
              "default": "all"
            }
          },
          {
            "name": "publisher",
            "type": "string",
            "required": false,
            "description": "Optional publisher/feed id filter when the caller already knows the feed label to narrow.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional case-insensitive text filter matched against title, description, topic, publisher id, URL, and keywords.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Lookback window in hours. Defaults to the last 24 hours and is capped at 24.",
            "constraints": {
              "default": 24,
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum headline rows to return after filtering and sorting.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "includeContent",
            "type": "boolean",
            "required": false,
            "description": "Set true to include a capped cleaned content excerpt when available.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "minSentiment",
            "type": "number",
            "required": false,
            "description": "Optional lower bound for compound sentiment from -1 to 1.",
            "constraints": {
              "minimum": -1,
              "maximum": 1
            }
          },
          {
            "name": "maxSentiment",
            "type": "number",
            "required": false,
            "description": "Optional upper bound for compound sentiment from -1 to 1.",
            "constraints": {
              "minimum": -1,
              "maximum": 1
            }
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort order for returned headlines.",
            "constraints": {
              "enum": [
                "published_desc",
                "published_asc",
                "sentiment_desc",
                "sentiment_asc"
              ],
              "default": "published_desc"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "topic": "tech",
          "query": "ai",
          "hours": 6,
          "limit": 10,
          "sort": "published_desc",
          "includeContent": false
        }
      },
      "exampleRequest": {
        "topic": "tech",
        "query": "ai",
        "hours": 6,
        "limit": 10,
        "sort": "published_desc",
        "includeContent": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "feed",
          "count",
          "headlines",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when headline search completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "feed": {
            "type": "object",
            "additionalProperties": true,
            "description": "Whitelabeled managed index metadata; backend provider URLs are not disclosed."
          },
          "count": {
            "type": "integer",
            "description": "Number of headline rows returned."
          },
          "headlines": {
            "type": "array",
            "description": "Normalized headline rows.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable upstream row id or deterministic fallback."
                },
                "title": {
                  "type": "string",
                  "description": "Headline title."
                },
                "description": {
                  "type": "string",
                  "description": "Short article description or summary."
                },
                "url": {
                  "type": "string",
                  "description": "Publisher article URL."
                },
                "topic": {
                  "type": "string",
                  "description": "Assigned topic bucket."
                },
                "publisher": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Publisher/feed label when available."
                },
                "publishedAt": {
                  "type": "string",
                  "description": "Article publish timestamp when available."
                },
                "insertedAt": {
                  "type": "string",
                  "description": "Index insertion timestamp when available."
                },
                "age": {
                  "type": "string",
                  "description": "Short relative age label from the managed index."
                },
                "keywords": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Keyword labels when available."
                },
                "sentiment": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Compound, positive, negative, and neutral sentiment hints when available."
                },
                "contentText": {
                  "type": "string",
                  "description": "Optional capped cleaned content excerpt when includeContent is true."
                }
              },
              "additionalProperties": true
            }
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for this search."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-headline-search",
          "name": "News Headline Search",
          "department": "Public Data"
        },
        "requested": {
          "topic": "tech",
          "query": "ai",
          "hours": 6,
          "limit": 10,
          "sort": "published_desc",
          "includeContent": false
        },
        "feed": {
          "type": "managed-news-index",
          "windowHours": 6,
          "upstreamDetailsDisclosed": false,
          "storyDedupeApplied": true
        },
        "count": 1,
        "headlines": [
          {
            "id": "headline_example",
            "title": "AI infrastructure startup announces new agent workflow tools",
            "description": "The company described new tools for faster agent research and data retrieval.",
            "url": "https://publisher.example/news/ai-agent-workflow-tools",
            "topic": "tech",
            "publisher": {
              "id": "publisher-example",
              "domain": "publisher.example"
            },
            "publishedAt": "2026-07-07T19:35:14.000Z",
            "insertedAt": "2026-07-07T19:36:00.000Z",
            "age": "24m",
            "keywords": [
              "AI",
              "agents",
              "workflow"
            ],
            "sentiment": {
              "compound": 0.12,
              "positive": 0.18,
              "negative": 0.02,
              "neutral": 0.8
            }
          }
        ],
        "limits": {
          "maxLimit": 50,
          "maxLookbackHours": 24,
          "maxContentChars": 1500
        }
      },
      "configured": false
    },
    {
      "id": "news-briefing-summary",
      "resource": "https://agentbodega.store/api/public-data/news-briefing/summary",
      "type": "http",
      "method": "POST",
      "serviceName": "News Briefing Summary",
      "description": "Return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.",
      "longDescription": "Purpose: Return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.\nBest use: Use this when an agent needs return a compact rolling public-news briefing with ranked items, titles, and summaries; supports a small text filter and capped item count for fast agent context.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, limit.\n\nAccepted fields:\n- query (optional, string): Optional case-insensitive filter matched against briefing titles and summary text. Constraints: max length: 160.\n- limit (optional, integer): Maximum briefing items to return. Constraints: default: 10; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"query\": \"technology\",\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "news-briefing-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "briefings",
      "shelf": "Briefings",
      "offeringId": "news-briefing-summary",
      "offering": "News Briefing Summary",
      "pathIds": [
        "public-data",
        "news",
        "briefings",
        "news-briefing-summary"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Briefings",
        "News Briefing Summary"
      ],
      "taxonomyPath": "public-data.news.briefings.news-briefing-summary",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "briefings",
          "name": "Briefings"
        },
        "offering": {
          "id": "news-briefing-summary",
          "name": "News Briefing Summary"
        },
        "pathIds": [
          "public-data",
          "news",
          "briefings",
          "news-briefing-summary"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Briefings",
          "News Briefing Summary"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "briefing",
        "summary",
        "current-events",
        "situational-awareness",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news-briefing/summary",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news-briefing/summary",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional case-insensitive filter matched against briefing titles and summary text."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10,
            "description": "Maximum briefing items to return."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "limit"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Optional case-insensitive filter matched against briefing titles and summary text.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Maximum briefing items to return.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "technology",
          "limit": 10
        }
      },
      "exampleRequest": {
        "query": "technology",
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "briefing",
          "count",
          "items",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the briefing was parsed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "briefing": {
            "type": "object",
            "additionalProperties": true,
            "description": "Whitelabeled briefing metadata and refresh cadence."
          },
          "count": {
            "type": "integer",
            "description": "Number of briefing items returned."
          },
          "items": {
            "type": "array",
            "description": "Briefing items in source order.",
            "items": {
              "type": "object",
              "required": [
                "rank",
                "title",
                "summary"
              ],
              "properties": {
                "rank": {
                  "type": "integer",
                  "description": "One-based rank in the briefing."
                },
                "title": {
                  "type": "string",
                  "description": "Briefing topic or headline."
                },
                "summary": {
                  "type": "string",
                  "description": "Compact summary of the development."
                }
              },
              "additionalProperties": false
            }
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for this briefing fetch."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-briefing-summary",
          "name": "News Briefing Summary",
          "department": "Public Data"
        },
        "requested": {
          "query": "technology",
          "limit": 10
        },
        "briefing": {
          "window": "rolling_24h",
          "refreshCadence": "multiple-times-daily",
          "upstreamDetailsDisclosed": false
        },
        "count": 1,
        "items": [
          {
            "rank": 1,
            "title": "Technology stocks rebound",
            "summary": "Several technology names recovered after new product announcements and stronger demand commentary."
          }
        ]
      },
      "configured": false
    },
    {
      "id": "news-morning-briefing",
      "resource": "https://agentbodega.store/api/public-data/news/morning-briefing",
      "type": "http",
      "method": "POST",
      "serviceName": "Morning Briefing",
      "description": "Build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.",
      "longDescription": "Purpose: Build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.\nBest use: Use this when an agent needs build a source-neutral morning briefing from managed public news signals, grouped into agent-ready sections such as global news, markets, AI/technology, crypto, and science with citations and caps.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: focus, topics, hours, maxItemsPerSection, includeCitations.\n\nAccepted fields:\n- focus (optional, string): Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name. Constraints: max length: 160.\n- topics (optional, array): Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index. Constraints: max items: 6.\n- hours (optional, integer): Lookback window in hours. Defaults to the last 12 hours and is capped at 24. Constraints: default: 12; min: 1; max: 24.\n- maxItemsPerSection (optional, integer): Maximum normalized headline rows returned in each briefing section. Constraints: default: 4; min: 1; max: 8.\n- includeCitations (optional, boolean): Set false to omit the flattened citation list while keeping URLs on section items. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"focus\": \"ai markets\",\n  \"topics\": [\n    \"news\",\n    \"business\",\n    \"tech\"\n  ],\n  \"hours\": 12,\n  \"maxItemsPerSection\": 4,\n  \"includeCitations\": true\n}\n```",
      "category": "public-data",
      "kind": "news-briefing-bundle",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "news",
      "aisle": "News",
      "shelfId": "briefings",
      "shelf": "Briefings",
      "offeringId": "news-morning-briefing",
      "offering": "Morning Briefing",
      "pathIds": [
        "public-data",
        "news",
        "briefings",
        "news-morning-briefing"
      ],
      "pathLabels": [
        "Public Data",
        "News",
        "Briefings",
        "Morning Briefing"
      ],
      "taxonomyPath": "public-data.news.briefings.news-morning-briefing",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "news",
          "name": "News"
        },
        "shelf": {
          "id": "briefings",
          "name": "Briefings"
        },
        "offering": {
          "id": "news-morning-briefing",
          "name": "Morning Briefing"
        },
        "pathIds": [
          "public-data",
          "news",
          "briefings",
          "news-morning-briefing"
        ],
        "pathLabels": [
          "Public Data",
          "News",
          "Briefings",
          "Morning Briefing"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "public-data",
        "news",
        "briefing",
        "morning-briefing",
        "markets",
        "ai",
        "crypto",
        "current-events",
        "citations",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/news/morning-briefing",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/news/morning-briefing",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "focus": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name."
          },
          "topics": {
            "type": "array",
            "maxItems": 6,
            "items": {
              "type": "string",
              "enum": [
                "all",
                "tech",
                "news",
                "business",
                "science",
                "gaming",
                "culture",
                "politics",
                "sports"
              ],
              "description": "Topics item filter for Morning Briefing. Accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\". Constraints: accepted values: \"all\", \"tech\", \"news\", \"business\", \"science\", \"gaming\", \"culture\", \"politics\", \"sports\"."
            },
            "description": "Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 12,
            "description": "Lookback window in hours. Defaults to the last 12 hours and is capped at 24."
          },
          "maxItemsPerSection": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8,
            "default": 4,
            "description": "Maximum normalized headline rows returned in each briefing section."
          },
          "includeCitations": {
            "type": "boolean",
            "default": true,
            "description": "Set false to omit the flattened citation list while keeping URLs on section items."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "focus",
          "topics",
          "hours",
          "maxItemsPerSection",
          "includeCitations"
        ],
        "fields": [
          {
            "name": "focus",
            "type": "string",
            "required": false,
            "description": "Optional focus phrase for the briefing, such as AI, crypto, markets, elections, or a company name.",
            "constraints": {
              "maxLength": 160
            }
          },
          {
            "name": "topics",
            "type": "array",
            "required": false,
            "description": "Optional topic buckets to emphasize. Defaults to news, business, tech, and science. Use all to let AgentBodega select from the full index.",
            "constraints": {
              "maxItems": 6
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Lookback window in hours. Defaults to the last 12 hours and is capped at 24.",
            "constraints": {
              "default": 12,
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "maxItemsPerSection",
            "type": "integer",
            "required": false,
            "description": "Maximum normalized headline rows returned in each briefing section.",
            "constraints": {
              "default": 4,
              "minimum": 1,
              "maximum": 8
            }
          },
          {
            "name": "includeCitations",
            "type": "boolean",
            "required": false,
            "description": "Set false to omit the flattened citation list while keeping URLs on section items.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "focus": "ai markets",
          "topics": [
            "news",
            "business",
            "tech"
          ],
          "hours": 12,
          "maxItemsPerSection": 4,
          "includeCitations": true
        }
      },
      "exampleRequest": {
        "focus": "ai markets",
        "topics": [
          "news",
          "business",
          "tech"
        ],
        "hours": 12,
        "maxItemsPerSection": 4,
        "includeCitations": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "briefing",
          "sections",
          "topStories",
          "limits",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "True when the briefing completed."
          },
          "tool": {
            "type": "object",
            "additionalProperties": true,
            "description": "AgentBodega tool metadata."
          },
          "requested": {
            "type": "object",
            "additionalProperties": true,
            "description": "Normalized request filters and caps."
          },
          "briefing": {
            "type": "object",
            "additionalProperties": true,
            "description": "High-level bundle summary, ranking/diversity policy, section count, item count, and source-disclosure policy."
          },
          "sections": {
            "type": "array",
            "description": "Briefing sections grouped by agent-relevant intent.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "title",
                "count",
                "items"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable section id."
                },
                "title": {
                  "type": "string",
                  "description": "Human-readable section title."
                },
                "summary": {
                  "type": "string",
                  "description": "One-line summary built from the section's highest-ranked diversified items."
                },
                "count": {
                  "type": "integer",
                  "description": "Number of items in this section."
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Normalized headline rows with publisher article URLs."
                },
                "ranking": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Selection policy used for this section."
                }
              },
              "additionalProperties": true
            }
          },
          "topStories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Highest-ranked cross-section stories."
          },
          "citations": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Flattened citation list when includeCitations is true."
          },
          "limits": {
            "type": "object",
            "additionalProperties": true,
            "description": "Published caps for this bundle route."
          },
          "checkedAt": {
            "type": "string",
            "description": "Server-side ISO timestamp for the briefing."
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "news-morning-briefing",
          "name": "Morning Briefing",
          "department": "Public Data"
        },
        "requested": {
          "focus": "ai markets",
          "topics": [
            "news",
            "business",
            "tech"
          ],
          "hours": 12,
          "maxItemsPerSection": 4,
          "includeCitations": true
        },
        "briefing": {
          "mode": "managed-news-bundle",
          "summary": "Generated 8 briefing items across 4 sections.",
          "sectionCount": 4,
          "itemCount": 8,
          "upstreamDetailsDisclosed": false,
          "resultFreshness": "live",
          "pricing": {
            "model": "x402_per_call",
            "usd": "0.03"
          },
          "ranking": {
            "strategy": "dedupe_relevance_authority_freshness_source_diversity",
            "storyDedupeApplied": true,
            "sourceDiversityApplied": true,
            "maxItemsPerPublisherPerSection": 2,
            "maxTopStoriesPerPublisher": 1
          }
        },
        "sections": [
          {
            "id": "markets",
            "title": "Markets & Business",
            "summary": "Technology stocks rebound",
            "count": 1,
            "items": [
              {
                "title": "Technology stocks rebound",
                "url": "https://publisher.example/news/technology-stocks-rebound",
                "topic": "business",
                "publishedAt": "2026-07-07T12:00:00.000Z"
              }
            ],
            "ranking": {
              "strategy": "relevance_authority_freshness_diversity",
              "sourceDiversityApplied": true,
              "maxItemsPerPublisher": 2
            }
          }
        ],
        "topStories": [
          {
            "title": "AI infrastructure startup announces new agent workflow tools",
            "url": "https://publisher.example/news/ai-agent-workflow-tools",
            "topic": "tech"
          }
        ],
        "citations": [
          {
            "section": "markets",
            "title": "Technology stocks rebound",
            "url": "https://publisher.example/news/technology-stocks-rebound"
          }
        ],
        "limits": {
          "maxLookbackHours": 24,
          "maxSections": 6,
          "maxItemsPerSection": 8,
          "maxItemsPerPublisherPerSection": 2,
          "maxFetchedHeadlines": 250
        }
      },
      "configured": false
    },
    {
      "id": "classified-listing-search",
      "resource": "https://agentbodega.store/api/public-data/classified-listing-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Classified Listing Search",
      "description": "Search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.",
      "longDescription": "Purpose: Search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.\nBest use: Use this when an agent needs search public classified listings by market area, category, query, and common marketplace filters; returns normalized posting titles, prices, locations, dates, and ids without exposing collection URLs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: city, category, query.\nOptional fields: sort, postal, search_distance, min_price, max_price, min_bedrooms, max_bedrooms, hasPic, bundleDuplicates, limit, proxiesSx.\n\nAccepted fields:\n- city (required, string): Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston.\n- category (required, string): Listing category abbreviation, such as sss, cta, apa, jjj, or zip.\n- query (required, string): Search text.\n- sort (optional, string): Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\".\n- postal (optional, string): Optional postal code to force geo-scoping when the caller's IP region differs from the target city.\n- search_distance (optional, integer): Optional radius in miles when postal is supplied. Constraints: min: 1; max: 500.\n- min_price (optional, integer): Min price numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- max_price (optional, integer): Max price numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- min_bedrooms (optional, integer): Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- max_bedrooms (optional, integer): Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0. Constraints: min: 0.\n- hasPic (optional, boolean): Set true to enable has pic behavior for Classified Listing Search.\n- bundleDuplicates (optional, boolean): Set true to enable bundle duplicates behavior for Classified Listing Search.\n- limit (optional, integer): Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100. Constraints: default: 25; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"city\": \"sfbay\",\n  \"category\": \"sss\",\n  \"query\": \"bicycle\",\n  \"sort\": \"date\",\n  \"postal\": \"94103\",\n  \"search_distance\": 25,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "marketplace-listings",
      "aisle": "Marketplace Listings",
      "shelfId": "marketplace-listings",
      "shelf": "Marketplace Listings",
      "offeringId": "classified-listing-search",
      "offering": "Classified Listing Search",
      "pathIds": [
        "public-data",
        "marketplace-listings",
        "marketplace-listings",
        "classified-listing-search"
      ],
      "pathLabels": [
        "Public Data",
        "Marketplace Listings",
        "Marketplace Listings",
        "Classified Listing Search"
      ],
      "taxonomyPath": "public-data.marketplace-listings.marketplace-listings.classified-listing-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "marketplace-listings",
          "name": "Marketplace Listings"
        },
        "shelf": {
          "id": "marketplace-listings",
          "name": "Marketplace Listings"
        },
        "offering": {
          "id": "classified-listing-search",
          "name": "Classified Listing Search"
        },
        "pathIds": [
          "public-data",
          "marketplace-listings",
          "marketplace-listings",
          "classified-listing-search"
        ],
        "pathLabels": [
          "Public Data",
          "Marketplace Listings",
          "Marketplace Listings",
          "Classified Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "classifieds",
        "marketplace-listings",
        "local-search",
        "public-data",
        "search"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/classified-listing-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/classified-listing-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "city",
          "category",
          "query"
        ],
        "properties": {
          "city": {
            "type": "string",
            "description": "Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston."
          },
          "category": {
            "type": "string",
            "description": "Listing category abbreviation, such as sss, cta, apa, jjj, or zip."
          },
          "query": {
            "type": "string",
            "description": "Search text."
          },
          "sort": {
            "type": "string",
            "enum": [
              "date",
              "rel",
              "priceasc",
              "pricedsc"
            ],
            "default": "date",
            "description": "Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\"."
          },
          "postal": {
            "type": "string",
            "description": "Optional postal code to force geo-scoping when the caller's IP region differs from the target city."
          },
          "search_distance": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "description": "Optional radius in miles when postal is supplied."
          },
          "min_price": {
            "type": "integer",
            "minimum": 0,
            "description": "Min price numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "max_price": {
            "type": "integer",
            "minimum": 0,
            "description": "Max price numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "min_bedrooms": {
            "type": "integer",
            "minimum": 0,
            "description": "Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "max_bedrooms": {
            "type": "integer",
            "minimum": 0,
            "description": "Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0."
          },
          "hasPic": {
            "type": "boolean",
            "description": "Set true to enable has pic behavior for Classified Listing Search."
          },
          "bundleDuplicates": {
            "type": "boolean",
            "description": "Set true to enable bundle duplicates behavior for Classified Listing Search."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "city",
          "category",
          "query"
        ],
        "optional": [
          "sort",
          "postal",
          "search_distance",
          "min_price",
          "max_price",
          "min_bedrooms",
          "max_bedrooms",
          "hasPic",
          "bundleDuplicates",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "city",
            "type": "string",
            "required": true,
            "description": "Market area id, such as sfbay, newyork, losangeles, seattle, chicago, or boston."
          },
          {
            "name": "category",
            "type": "string",
            "required": true,
            "description": "Listing category abbreviation, such as sss, cta, apa, jjj, or zip."
          },
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Search text."
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "Sort filter for Classified Listing Search. Accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\". Constraints: accepted values: \"date\", \"rel\", \"priceasc\", \"pricedsc\"; default: \"date\".",
            "constraints": {
              "enum": [
                "date",
                "rel",
                "priceasc",
                "pricedsc"
              ],
              "default": "date"
            }
          },
          {
            "name": "postal",
            "type": "string",
            "required": false,
            "description": "Optional postal code to force geo-scoping when the caller's IP region differs from the target city."
          },
          {
            "name": "search_distance",
            "type": "integer",
            "required": false,
            "description": "Optional radius in miles when postal is supplied.",
            "constraints": {
              "minimum": 1,
              "maximum": 500
            }
          },
          {
            "name": "min_price",
            "type": "integer",
            "required": false,
            "description": "Min price numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "max_price",
            "type": "integer",
            "required": false,
            "description": "Max price numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "min_bedrooms",
            "type": "integer",
            "required": false,
            "description": "Min bedrooms numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "max_bedrooms",
            "type": "integer",
            "required": false,
            "description": "Max bedrooms numeric value for Classified Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "hasPic",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable has pic behavior for Classified Listing Search."
          },
          {
            "name": "bundleDuplicates",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable bundle duplicates behavior for Classified Listing Search."
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Classified Listing Search. Constraints: default: 25; min: 1; max: 100.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "city": "sfbay",
          "category": "sss",
          "query": "bicycle",
          "sort": "date",
          "postal": "94103",
          "search_distance": 25,
          "limit": 10
        }
      },
      "exampleRequest": {
        "city": "sfbay",
        "category": "sss",
        "query": "bicycle",
        "sort": "date",
        "postal": "94103",
        "search_distance": 25,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "classified-listing-search",
          "name": "Classified Listing Search",
          "department": "Public Data"
        },
        "total_results": 5635,
        "results": [
          {
            "posting_id": 7927446618,
            "title": "Kryptonite bike chain",
            "price": "$100",
            "location": "san leandro",
            "subarea": "eby"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "california-highway-traffic",
      "resource": "https://agentbodega.store/api/public-data/california-highway-traffic",
      "type": "http",
      "method": "POST",
      "serviceName": "California Highway Traffic Speeds",
      "description": "Return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.",
      "longDescription": "Purpose: Return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.\nBest use: Use this when an agent needs return live California highway speed snapshots grouped by road and direction, with optional incident and sensor detail, without exposing collection endpoints.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: region, road, direction, minMph, includeIncidents, includeSensors, limit, proxiesSx.\n\nAccepted fields:\n- region (optional, string): California traffic region. Constraints: accepted values: \"NoCal\", \"SoCal\", \"CenCal\"; default: \"NoCal\".\n- road (optional, string): Optional road/highway filter, such as 101, 580, I-80, or CA-1.\n- direction (optional, string): Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\".\n- minMph (optional, integer): Only return sections whose average speed is at or below this MPH. Constraints: min: 0.\n- includeIncidents (optional, boolean): Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true. Constraints: default: true.\n- includeSensors (optional, boolean): Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false. Constraints: default: false.\n- limit (optional, integer): Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200. Constraints: default: 100; min: 1; max: 200.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"region\": \"NoCal\",\n  \"road\": \"580\",\n  \"includeIncidents\": true,\n  \"limit\": 20\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "transportation",
      "aisle": "Transportation",
      "shelfId": "transportation",
      "shelf": "Transportation",
      "offeringId": "california-highway-traffic",
      "offering": "California Highway Traffic Speeds",
      "pathIds": [
        "public-data",
        "transportation",
        "transportation",
        "california-highway-traffic"
      ],
      "pathLabels": [
        "Public Data",
        "Transportation",
        "Transportation",
        "California Highway Traffic Speeds"
      ],
      "taxonomyPath": "public-data.transportation.transportation.california-highway-traffic",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "transportation",
          "name": "Transportation"
        },
        "shelf": {
          "id": "transportation",
          "name": "Transportation"
        },
        "offering": {
          "id": "california-highway-traffic",
          "name": "California Highway Traffic Speeds"
        },
        "pathIds": [
          "public-data",
          "transportation",
          "transportation",
          "california-highway-traffic"
        ],
        "pathLabels": [
          "Public Data",
          "Transportation",
          "Transportation",
          "California Highway Traffic Speeds"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "traffic",
        "california",
        "highways",
        "public-data",
        "transportation"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/california-highway-traffic",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/california-highway-traffic",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "region": {
            "type": "string",
            "enum": [
              "NoCal",
              "SoCal",
              "CenCal"
            ],
            "default": "NoCal",
            "description": "California traffic region."
          },
          "road": {
            "type": "string",
            "description": "Optional road/highway filter, such as 101, 580, I-80, or CA-1."
          },
          "direction": {
            "type": "string",
            "enum": [
              "North",
              "South",
              "East",
              "West"
            ],
            "description": "Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\"."
          },
          "minMph": {
            "type": "integer",
            "minimum": 0,
            "description": "Only return sections whose average speed is at or below this MPH."
          },
          "includeIncidents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true."
          },
          "includeSensors": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "default": 100,
            "description": "Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "region",
          "road",
          "direction",
          "minMph",
          "includeIncidents",
          "includeSensors",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "region",
            "type": "string",
            "required": false,
            "description": "California traffic region.",
            "constraints": {
              "enum": [
                "NoCal",
                "SoCal",
                "CenCal"
              ],
              "default": "NoCal"
            }
          },
          {
            "name": "road",
            "type": "string",
            "required": false,
            "description": "Optional road/highway filter, such as 101, 580, I-80, or CA-1."
          },
          {
            "name": "direction",
            "type": "string",
            "required": false,
            "description": "Direction filter for California Highway Traffic Speeds. Accepted values: \"North\", \"South\", \"East\", \"West\". Constraints: accepted values: \"North\", \"South\", \"East\", \"West\".",
            "constraints": {
              "enum": [
                "North",
                "South",
                "East",
                "West"
              ]
            }
          },
          {
            "name": "minMph",
            "type": "integer",
            "required": false,
            "description": "Only return sections whose average speed is at or below this MPH.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "includeIncidents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include incidents behavior for California Highway Traffic Speeds. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeSensors",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include sensors behavior for California Highway Traffic Speeds. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for California Highway Traffic Speeds. Constraints: default: 100; min: 1; max: 200.",
            "constraints": {
              "default": 100,
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "region": "NoCal",
          "road": "580",
          "includeIncidents": true,
          "limit": 20
        }
      },
      "exampleRequest": {
        "region": "NoCal",
        "road": "580",
        "includeIncidents": true,
        "limit": 20
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "california-highway-traffic",
          "name": "California Highway Traffic Speeds",
          "department": "Public Data"
        },
        "region": "NoCal",
        "results": [
          {
            "road_id": "100580",
            "road": "580",
            "direction": "East",
            "avg_mph": 34.2,
            "min_mph": 12,
            "max_mph": 61,
            "sensors": 18
          }
        ]
      },
      "configured": false
    },
    {
      "id": "rental-listing-search",
      "resource": "https://agentbodega.store/api/public-data/rental-listing-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Rental Listing Search",
      "description": "Find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.",
      "longDescription": "Purpose: Find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.\nBest use: Use this when an agent needs find public rental listings by market resource id, rental category, price, bedrooms, bathrooms, and result limit; returns normalized rental/building records without collection links.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: resourceId.\nOptional fields: searchSlug, maxPrice, minPrice, bedrooms, bathrooms, orderBy, limit, proxiesSx.\n\nAccepted fields:\n- resourceId (required, string): Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca.\n- searchSlug (optional, string): Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent. Constraints: default: \"apartments-for-rent\".\n- maxPrice (optional, integer): Max Price numeric value for Rental Listing Search. Constraints: min: 0. Constraints: min: 0.\n- minPrice (optional, integer): Min Price numeric value for Rental Listing Search. Constraints: min: 0. Constraints: min: 0.\n- bedrooms (optional, string): Comma-separated bedroom filter, such as 1,2,3.\n- bathrooms (optional, string): Comma-separated bathroom filter, such as 1,1.5,2.\n- orderBy (optional, string): Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\".\n- limit (optional, integer): Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100. Constraints: default: 25; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"resourceId\": \"san-francisco-ca\",\n  \"searchSlug\": \"apartments-for-rent\",\n  \"maxPrice\": 4000,\n  \"bedrooms\": \"1,2\",\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "real-estate-rentals",
      "aisle": "Real Estate Rentals",
      "shelfId": "real-estate-rentals",
      "shelf": "Real Estate Rentals",
      "offeringId": "rental-listing-search",
      "offering": "Rental Listing Search",
      "pathIds": [
        "public-data",
        "real-estate-rentals",
        "real-estate-rentals",
        "rental-listing-search"
      ],
      "pathLabels": [
        "Public Data",
        "Real Estate Rentals",
        "Real Estate Rentals",
        "Rental Listing Search"
      ],
      "taxonomyPath": "public-data.real-estate-rentals.real-estate-rentals.rental-listing-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "real-estate-rentals",
          "name": "Real Estate Rentals"
        },
        "shelf": {
          "id": "real-estate-rentals",
          "name": "Real Estate Rentals"
        },
        "offering": {
          "id": "rental-listing-search",
          "name": "Rental Listing Search"
        },
        "pathIds": [
          "public-data",
          "real-estate-rentals",
          "real-estate-rentals",
          "rental-listing-search"
        ],
        "pathLabels": [
          "Public Data",
          "Real Estate Rentals",
          "Real Estate Rentals",
          "Rental Listing Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "rentals",
        "real-estate-rentals",
        "apartments",
        "housing",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/rental-listing-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/rental-listing-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "resourceId"
        ],
        "properties": {
          "resourceId": {
            "type": "string",
            "description": "Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca."
          },
          "searchSlug": {
            "type": "string",
            "default": "apartments-for-rent",
            "description": "Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent."
          },
          "maxPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Price numeric value for Rental Listing Search. Constraints: min: 0."
          },
          "minPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Price numeric value for Rental Listing Search. Constraints: min: 0."
          },
          "bedrooms": {
            "type": "string",
            "description": "Comma-separated bedroom filter, such as 1,2,3."
          },
          "bathrooms": {
            "type": "string",
            "description": "Comma-separated bathroom filter, such as 1,1.5,2."
          },
          "orderBy": {
            "type": "string",
            "enum": [
              "score",
              "recencyTime",
              "price"
            ],
            "default": "score",
            "description": "Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\"."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "resourceId"
        ],
        "optional": [
          "searchSlug",
          "maxPrice",
          "minPrice",
          "bedrooms",
          "bathrooms",
          "orderBy",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "resourceId",
            "type": "string",
            "required": true,
            "description": "Market resource slug or id, such as san-francisco-ca, new-york-ny, brooklyn-new-york-ny, or 94110-ca."
          },
          {
            "name": "searchSlug",
            "type": "string",
            "required": false,
            "description": "Rental search slug, such as apartments-for-rent, houses-for-rent, condos-for-rent, townhomes-for-rent, or rooms-for-rent.",
            "constraints": {
              "default": "apartments-for-rent"
            }
          },
          {
            "name": "maxPrice",
            "type": "integer",
            "required": false,
            "description": "Max Price numeric value for Rental Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minPrice",
            "type": "integer",
            "required": false,
            "description": "Min Price numeric value for Rental Listing Search. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "bedrooms",
            "type": "string",
            "required": false,
            "description": "Comma-separated bedroom filter, such as 1,2,3."
          },
          {
            "name": "bathrooms",
            "type": "string",
            "required": false,
            "description": "Comma-separated bathroom filter, such as 1,1.5,2."
          },
          {
            "name": "orderBy",
            "type": "string",
            "required": false,
            "description": "Order By filter for Rental Listing Search. Accepted values: \"score\", \"recencyTime\", \"price\". Constraints: accepted values: \"score\", \"recencyTime\", \"price\"; default: \"score\".",
            "constraints": {
              "enum": [
                "score",
                "recencyTime",
                "price"
              ],
              "default": "score"
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Rental Listing Search. Constraints: default: 25; min: 1; max: 100.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "resourceId": "san-francisco-ca",
          "searchSlug": "apartments-for-rent",
          "maxPrice": 4000,
          "bedrooms": "1,2",
          "limit": 10
        }
      },
      "exampleRequest": {
        "resourceId": "san-francisco-ca",
        "searchSlug": "apartments-for-rent",
        "maxPrice": 4000,
        "bedrooms": "1,2",
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "rental-listing-search",
          "name": "Rental Listing Search",
          "department": "Public Data"
        },
        "query": {
          "resource_id": "san-francisco-ca",
          "area_name": "San Francisco",
          "search_slug": "apartments-for-rent"
        },
        "results": [
          {
            "title": "NEMA",
            "street": "8 10th St",
            "city": "San Francisco",
            "state": "CA",
            "rent_min": 3750,
            "rent_max": 7925
          }
        ]
      },
      "configured": false
    },
    {
      "id": "hospital-quality-rating",
      "resource": "https://agentbodega.store/api/public-data/hospital-quality-rating",
      "type": "http",
      "method": "POST",
      "serviceName": "Hospital Quality Rating",
      "description": "Look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.",
      "longDescription": "Purpose: Look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.\nBest use: Use this when an agent needs look up public hospital quality metadata by facility id or hospital name/state, including overall star rating and selected measure rows.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: ccn, careCompareUrl, hospitalName, city, state, includeMeasures, compareTo, proxiesSx.\n\nAccepted fields:\n- ccn (optional, string): Six-digit facility id.\n- careCompareUrl (optional, string): Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls. Constraints: format: uri.\n- hospitalName (optional, string): Hospital/facility name for lookup.\n- city (optional, string): City value for Hospital Quality Rating.\n- state (optional, string): Two-letter state abbreviation for name lookup.\n- includeMeasures (optional, boolean): Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true. Constraints: default: true.\n- compareTo (optional, array): Optional extra CCNs to fetch side by side. Constraints: max items: 3.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"ccn\": \"240010\",\n  \"includeMeasures\": true\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "healthcare-quality",
      "aisle": "Healthcare Quality",
      "shelfId": "healthcare-quality",
      "shelf": "Healthcare Quality",
      "offeringId": "hospital-quality-rating",
      "offering": "Hospital Quality Rating",
      "pathIds": [
        "public-data",
        "healthcare-quality",
        "healthcare-quality",
        "hospital-quality-rating"
      ],
      "pathLabels": [
        "Public Data",
        "Healthcare Quality",
        "Healthcare Quality",
        "Hospital Quality Rating"
      ],
      "taxonomyPath": "public-data.healthcare-quality.healthcare-quality.hospital-quality-rating",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "healthcare-quality",
          "name": "Healthcare Quality"
        },
        "shelf": {
          "id": "healthcare-quality",
          "name": "Healthcare Quality"
        },
        "offering": {
          "id": "hospital-quality-rating",
          "name": "Hospital Quality Rating"
        },
        "pathIds": [
          "public-data",
          "healthcare-quality",
          "healthcare-quality",
          "hospital-quality-rating"
        ],
        "pathLabels": [
          "Public Data",
          "Healthcare Quality",
          "Healthcare Quality",
          "Hospital Quality Rating"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "hospital",
        "healthcare",
        "ratings",
        "public-records",
        "quality",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/hospital-quality-rating",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/hospital-quality-rating",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "ccn": {
            "type": "string",
            "description": "Six-digit facility id."
          },
          "careCompareUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls."
          },
          "hospitalName": {
            "type": "string",
            "description": "Hospital/facility name for lookup."
          },
          "city": {
            "type": "string",
            "description": "City value for Hospital Quality Rating."
          },
          "state": {
            "type": "string",
            "description": "Two-letter state abbreviation for name lookup."
          },
          "includeMeasures": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true."
          },
          "compareTo": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "type": "string",
              "description": "Compare To item value for Hospital Quality Rating."
            },
            "description": "Optional extra CCNs to fetch side by side."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "ccn",
          "careCompareUrl",
          "hospitalName",
          "city",
          "state",
          "includeMeasures",
          "compareTo",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "ccn",
            "type": "string",
            "required": false,
            "description": "Six-digit facility id."
          },
          {
            "name": "careCompareUrl",
            "type": "string",
            "required": false,
            "description": "Optional hospital detail URL containing the facility id. Prefer ccn or hospitalName/state for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "hospitalName",
            "type": "string",
            "required": false,
            "description": "Hospital/facility name for lookup."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "City value for Hospital Quality Rating."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "Two-letter state abbreviation for name lookup."
          },
          {
            "name": "includeMeasures",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include measures behavior for Hospital Quality Rating. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "compareTo",
            "type": "array",
            "required": false,
            "description": "Optional extra CCNs to fetch side by side.",
            "constraints": {
              "maxItems": 3
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "ccn": "240010",
          "includeMeasures": true
        }
      },
      "exampleRequest": {
        "ccn": "240010",
        "includeMeasures": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "hospital-quality-rating",
          "name": "Hospital Quality Rating",
          "department": "Public Data"
        },
        "result": {
          "ccn": "240010",
          "facility_name": "MAYO CLINIC HOSPITAL ROCHESTER",
          "state": "MN",
          "overall_rating": "5",
          "measures": {
            "hcahps": [],
            "complications_and_deaths": []
          }
        }
      },
      "configured": false
    },
    {
      "id": "school-quality-rating",
      "resource": "https://agentbodega.store/api/public-data/school-quality-rating",
      "type": "http",
      "method": "POST",
      "serviceName": "School Quality Rating Lookup",
      "description": "Look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.",
      "longDescription": "Purpose: Look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.\nBest use: Use this when an agent needs look up public school rating data by school name/city/state, returning rating, grades, enrollment, district, address, and ids.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: schoolUrl, schoolName, city, state, includeCatchment, proxiesSx.\n\nAccepted fields:\n- schoolUrl (optional, string): Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls. Constraints: format: uri.\n- schoolName (optional, string): School name to resolve.\n- city (optional, string): City value for School Quality Rating Lookup.\n- state (optional, string): State value for School Quality Rating Lookup.\n- includeCatchment (optional, boolean): Include catchment GeoJSON when present. Large polygons are omitted by default. Constraints: default: false.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"schoolName\": \"Sylvia Mendez Elementary\",\n  \"city\": \"Berkeley\",\n  \"state\": \"CA\"\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "education-quality",
      "aisle": "Education Quality",
      "shelfId": "education-quality",
      "shelf": "Education Quality",
      "offeringId": "school-quality-rating",
      "offering": "School Quality Rating Lookup",
      "pathIds": [
        "public-data",
        "education-quality",
        "education-quality",
        "school-quality-rating"
      ],
      "pathLabels": [
        "Public Data",
        "Education Quality",
        "Education Quality",
        "School Quality Rating Lookup"
      ],
      "taxonomyPath": "public-data.education-quality.education-quality.school-quality-rating",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "education-quality",
          "name": "Education Quality"
        },
        "shelf": {
          "id": "education-quality",
          "name": "Education Quality"
        },
        "offering": {
          "id": "school-quality-rating",
          "name": "School Quality Rating Lookup"
        },
        "pathIds": [
          "public-data",
          "education-quality",
          "education-quality",
          "school-quality-rating"
        ],
        "pathLabels": [
          "Public Data",
          "Education Quality",
          "Education Quality",
          "School Quality Rating Lookup"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "schools",
        "ratings",
        "real-estate",
        "education",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/school-quality-rating",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/school-quality-rating",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "schoolUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls."
          },
          "schoolName": {
            "type": "string",
            "description": "School name to resolve."
          },
          "city": {
            "type": "string",
            "description": "City value for School Quality Rating Lookup."
          },
          "state": {
            "type": "string",
            "description": "State value for School Quality Rating Lookup."
          },
          "includeCatchment": {
            "type": "boolean",
            "default": false,
            "description": "Include catchment GeoJSON when present. Large polygons are omitted by default."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "schoolUrl",
          "schoolName",
          "city",
          "state",
          "includeCatchment",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "schoolUrl",
            "type": "string",
            "required": false,
            "description": "Optional school detail URL. Prefer schoolName/city/state for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "schoolName",
            "type": "string",
            "required": false,
            "description": "School name to resolve."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "City value for School Quality Rating Lookup."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "State value for School Quality Rating Lookup."
          },
          {
            "name": "includeCatchment",
            "type": "boolean",
            "required": false,
            "description": "Include catchment GeoJSON when present. Large polygons are omitted by default.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "schoolName": "Sylvia Mendez Elementary",
          "city": "Berkeley",
          "state": "CA"
        }
      },
      "exampleRequest": {
        "schoolName": "Sylvia Mendez Elementary",
        "city": "Berkeley",
        "state": "CA"
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "school-quality-rating",
          "name": "School Quality Rating Lookup",
          "department": "Public Data"
        },
        "result": {
          "name": "Sylvia Mendez Elementary",
          "school_id": "078571861",
          "great_schools_rating": 7,
          "grades_served": "K-5",
          "enrollment": 379,
          "district": {
            "name": "Berkeley Unified School District"
          }
        }
      },
      "configured": false
    },
    {
      "id": "home-comparable-sales",
      "resource": "https://agentbodega.store/api/public-data/home-comparable-sales",
      "type": "http",
      "method": "POST",
      "serviceName": "Home Comparable Sales",
      "description": "Return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.",
      "longDescription": "Purpose: Return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.\nBest use: Use this when an agent needs return best-effort recent sold comparable sales for a region or lat/lon search, with normalized property attributes and no source links.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: regionId, regionType, market, lat, lon, radiusMiles, soldWithinDays, minPrice, maxPrice, minBeds, maxBeds, minBaths, maxBaths, limit, proxiesSx.\n\nAccepted fields:\n- regionId (optional, string): Market region id, such as city id or ZIP region id.\n- regionType (optional, integer): Market region type. Common values: 2 for ZIP, 6 for city. Constraints: default: 6.\n- market (optional, string): Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston.\n- lat (optional, number): Subject latitude for a bounded-radius polygon search.\n- lon (optional, number): Subject longitude for a bounded-radius polygon search.\n- radiusMiles (optional, number): Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25. Constraints: default: 1; min: 0.1; max: 25.\n- soldWithinDays (optional, integer): Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180.\n- minPrice (optional, integer): Min Price numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxPrice (optional, integer): Max Price numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- minBeds (optional, integer): Min Beds numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxBeds (optional, integer): Max Beds numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- minBaths (optional, number): Min Baths numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- maxBaths (optional, number): Max Baths numeric value for Home Comparable Sales. Constraints: min: 0. Constraints: min: 0.\n- limit (optional, integer): Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50. Constraints: default: 10; min: 1; max: 50.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"regionId\": \"17151\",\n  \"regionType\": 6,\n  \"market\": \"sanfrancisco\",\n  \"soldWithinDays\": 180,\n  \"minBeds\": 2,\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "real-estate-comps",
      "aisle": "Real Estate Comps",
      "shelfId": "real-estate-comps",
      "shelf": "Real Estate Comps",
      "offeringId": "home-comparable-sales",
      "offering": "Home Comparable Sales",
      "pathIds": [
        "public-data",
        "real-estate-comps",
        "real-estate-comps",
        "home-comparable-sales"
      ],
      "pathLabels": [
        "Public Data",
        "Real Estate Comps",
        "Real Estate Comps",
        "Home Comparable Sales"
      ],
      "taxonomyPath": "public-data.real-estate-comps.real-estate-comps.home-comparable-sales",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "real-estate-comps",
          "name": "Real Estate Comps"
        },
        "shelf": {
          "id": "real-estate-comps",
          "name": "Real Estate Comps"
        },
        "offering": {
          "id": "home-comparable-sales",
          "name": "Home Comparable Sales"
        },
        "pathIds": [
          "public-data",
          "real-estate-comps",
          "real-estate-comps",
          "home-comparable-sales"
        ],
        "pathLabels": [
          "Public Data",
          "Real Estate Comps",
          "Real Estate Comps",
          "Home Comparable Sales"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "comparable-sales",
        "real-estate",
        "sold-comps",
        "valuation",
        "public-data",
        "redfin",
        "redfin-comps"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/home-comparable-sales",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/home-comparable-sales",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "regionId": {
            "type": "string",
            "description": "Market region id, such as city id or ZIP region id."
          },
          "regionType": {
            "type": "integer",
            "default": 6,
            "description": "Market region type. Common values: 2 for ZIP, 6 for city."
          },
          "market": {
            "type": "string",
            "description": "Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston."
          },
          "lat": {
            "type": "number",
            "description": "Subject latitude for a bounded-radius polygon search."
          },
          "lon": {
            "type": "number",
            "description": "Subject longitude for a bounded-radius polygon search."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 0.1,
            "maximum": 25,
            "default": 1,
            "description": "Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25."
          },
          "soldWithinDays": {
            "type": "integer",
            "enum": [
              30,
              90,
              180,
              365,
              730,
              1095
            ],
            "default": 180,
            "description": "Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180."
          },
          "minPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Price numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxPrice": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Price numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "minBeds": {
            "type": "integer",
            "minimum": 0,
            "description": "Min Beds numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxBeds": {
            "type": "integer",
            "minimum": 0,
            "description": "Max Beds numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "minBaths": {
            "type": "number",
            "minimum": 0,
            "description": "Min Baths numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "maxBaths": {
            "type": "number",
            "minimum": 0,
            "description": "Max Baths numeric value for Home Comparable Sales. Constraints: min: 0."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "regionId",
          "regionType",
          "market",
          "lat",
          "lon",
          "radiusMiles",
          "soldWithinDays",
          "minPrice",
          "maxPrice",
          "minBeds",
          "maxBeds",
          "minBaths",
          "maxBaths",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "regionId",
            "type": "string",
            "required": false,
            "description": "Market region id, such as city id or ZIP region id."
          },
          {
            "name": "regionType",
            "type": "integer",
            "required": false,
            "description": "Market region type. Common values: 2 for ZIP, 6 for city.",
            "constraints": {
              "default": 6
            }
          },
          {
            "name": "market",
            "type": "string",
            "required": false,
            "description": "Market slug, such as sanfrancisco, losangeles, seattle, chicago, newyork, or boston."
          },
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Subject latitude for a bounded-radius polygon search."
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Subject longitude for a bounded-radius polygon search."
          },
          {
            "name": "radiusMiles",
            "type": "number",
            "required": false,
            "description": "Radius Miles numeric value for Home Comparable Sales. Constraints: default: 1; min: 0.1; max: 25.",
            "constraints": {
              "default": 1,
              "minimum": 0.1,
              "maximum": 25
            }
          },
          {
            "name": "soldWithinDays",
            "type": "integer",
            "required": false,
            "description": "Sold Within Days filter for Home Comparable Sales. Accepted values: 30, 90, 180, 365, 730, 1095. Constraints: accepted values: 30, 90, 180, 365, 730, 1095; default: 180.",
            "constraints": {
              "enum": [
                30,
                90,
                180,
                365,
                730,
                1095
              ],
              "default": 180
            }
          },
          {
            "name": "minPrice",
            "type": "integer",
            "required": false,
            "description": "Min Price numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxPrice",
            "type": "integer",
            "required": false,
            "description": "Max Price numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minBeds",
            "type": "integer",
            "required": false,
            "description": "Min Beds numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxBeds",
            "type": "integer",
            "required": false,
            "description": "Max Beds numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "minBaths",
            "type": "number",
            "required": false,
            "description": "Min Baths numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "maxBaths",
            "type": "number",
            "required": false,
            "description": "Max Baths numeric value for Home Comparable Sales. Constraints: min: 0.",
            "constraints": {
              "minimum": 0
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Home Comparable Sales. Constraints: default: 10; min: 1; max: 50.",
            "constraints": {
              "default": 10,
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "regionId": "17151",
          "regionType": 6,
          "market": "sanfrancisco",
          "soldWithinDays": 180,
          "minBeds": 2,
          "limit": 10
        }
      },
      "exampleRequest": {
        "regionId": "17151",
        "regionType": 6,
        "market": "sanfrancisco",
        "soldWithinDays": 180,
        "minBeds": 2,
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "home-comparable-sales",
          "name": "Home Comparable Sales",
          "department": "Public Data"
        },
        "result": {
          "subject": {
            "region_id": "17151",
            "market": "sanfrancisco"
          },
          "comps": [
            {
              "address": "123 Example St",
              "price": 1275000,
              "beds": 3,
              "baths": 2,
              "sqft": 1420,
              "sold_date": "2026-05-15"
            }
          ]
        }
      },
      "configured": false
    },
    {
      "id": "volunteer-opportunity-search",
      "resource": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
      "type": "http",
      "method": "POST",
      "serviceName": "Volunteer Opportunity Search",
      "description": "Search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.",
      "longDescription": "Purpose: Search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.\nBest use: Use this when an agent needs search public volunteer opportunities by query, cause, remote/local mode, lat/lon, radius, page, and result limit.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: query, opportunityUrl, lat, lon, radiusMiles, remote, categories, page, limit, proxiesSx.\n\nAccepted fields:\n- query (optional, string): Search text.\n- opportunityUrl (optional, string): Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls. Constraints: format: uri.\n- lat (optional, number): Lat numeric value for Volunteer Opportunity Search.\n- lon (optional, number): Lon numeric value for Volunteer Opportunity Search.\n- radiusMiles (optional, number): Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250. Constraints: default: 25; min: 1; max: 250.\n- remote (optional, boolean): Filter for remote/virtual opportunities.\n- categories (optional, array): Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT. Constraints: max items: 8.\n- page (optional, integer): Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100. Constraints: default: 0; min: 0; max: 100.\n- limit (optional, integer): Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100. Constraints: default: 20; min: 1; max: 100.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"query\": \"food bank\",\n  \"lat\": 40.7128,\n  \"lon\": -74.006,\n  \"radiusMiles\": 25,\n  \"categories\": [\n    \"HUNGER_FOOD_SECURITY\"\n  ],\n  \"limit\": 10\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "civic-opportunities",
      "aisle": "Civic Opportunities",
      "shelfId": "civic-opportunities",
      "shelf": "Civic Opportunities",
      "offeringId": "volunteer-opportunity-search",
      "offering": "Volunteer Opportunity Search",
      "pathIds": [
        "public-data",
        "civic-opportunities",
        "civic-opportunities",
        "volunteer-opportunity-search"
      ],
      "pathLabels": [
        "Public Data",
        "Civic Opportunities",
        "Civic Opportunities",
        "Volunteer Opportunity Search"
      ],
      "taxonomyPath": "public-data.civic-opportunities.civic-opportunities.volunteer-opportunity-search",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "civic-opportunities",
          "name": "Civic Opportunities"
        },
        "shelf": {
          "id": "civic-opportunities",
          "name": "Civic Opportunities"
        },
        "offering": {
          "id": "volunteer-opportunity-search",
          "name": "Volunteer Opportunity Search"
        },
        "pathIds": [
          "public-data",
          "civic-opportunities",
          "civic-opportunities",
          "volunteer-opportunity-search"
        ],
        "pathLabels": [
          "Public Data",
          "Civic Opportunities",
          "Civic Opportunities",
          "Volunteer Opportunity Search"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "volunteering",
        "opportunities",
        "civic",
        "nonprofit",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/volunteer-opportunity-search",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search text."
          },
          "opportunityUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls."
          },
          "lat": {
            "type": "number",
            "description": "Lat numeric value for Volunteer Opportunity Search."
          },
          "lon": {
            "type": "number",
            "description": "Lon numeric value for Volunteer Opportunity Search."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 1,
            "maximum": 250,
            "default": 25,
            "description": "Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250."
          },
          "remote": {
            "type": "boolean",
            "description": "Filter for remote/virtual opportunities."
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Categories item value for Volunteer Opportunity Search."
            },
            "maxItems": 8,
            "description": "Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT."
          },
          "page": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "default": 0,
            "description": "Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "description": "Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "query",
          "opportunityUrl",
          "lat",
          "lon",
          "radiusMiles",
          "remote",
          "categories",
          "page",
          "limit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "query",
            "type": "string",
            "required": false,
            "description": "Search text."
          },
          {
            "name": "opportunityUrl",
            "type": "string",
            "required": false,
            "description": "Optional direct opportunity URL. Prefer query/location filters for whitelabeled calls.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Lat numeric value for Volunteer Opportunity Search."
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Lon numeric value for Volunteer Opportunity Search."
          },
          {
            "name": "radiusMiles",
            "type": "number",
            "required": false,
            "description": "Radius Miles numeric value for Volunteer Opportunity Search. Constraints: default: 25; min: 1; max: 250.",
            "constraints": {
              "default": 25,
              "minimum": 1,
              "maximum": 250
            }
          },
          {
            "name": "remote",
            "type": "boolean",
            "required": false,
            "description": "Filter for remote/virtual opportunities."
          },
          {
            "name": "categories",
            "type": "array",
            "required": false,
            "description": "Cause/category values, such as ANIMALS, EDUCATION, HEALTH_MEDICINE, or ENVIRONMENT.",
            "constraints": {
              "maxItems": 8
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Page numeric value for Volunteer Opportunity Search. Constraints: default: 0; min: 0; max: 100.",
            "constraints": {
              "default": 0,
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Limit numeric value for Volunteer Opportunity Search. Constraints: default: 20; min: 1; max: 100.",
            "constraints": {
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "query": "food bank",
          "lat": 40.7128,
          "lon": -74.006,
          "radiusMiles": 25,
          "categories": [
            "HUNGER_FOOD_SECURITY"
          ],
          "limit": 10
        }
      },
      "exampleRequest": {
        "query": "food bank",
        "lat": 40.7128,
        "lon": -74.006,
        "radiusMiles": 25,
        "categories": [
          "HUNGER_FOOD_SECURITY"
        ],
        "limit": 10
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "volunteer-opportunity-search",
          "name": "Volunteer Opportunity Search",
          "department": "Public Data"
        },
        "total": 128,
        "results": [
          {
            "id": "abc123",
            "title": "Pack meals for neighbors",
            "organization": "Example Food Bank",
            "location": {
              "city": "New York",
              "state": "NY"
            },
            "remote": false
          }
        ]
      },
      "configured": false
    },
    {
      "id": "us-weather-forecast",
      "resource": "https://agentbodega.store/api/public-data/us-weather-forecast",
      "type": "http",
      "method": "POST",
      "serviceName": "US Weather Forecast",
      "description": "Return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.",
      "longDescription": "Purpose: Return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.\nBest use: Use this when an agent needs return a US weather forecast for a point by latitude/longitude, ZIP code, or city/state, including current observation, hourly forecast, multi-day periods, alerts, and grid metadata.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: lat, lon, zip, city, state, location, includeCurrent, includeHourly, includeAlerts, includeOffice, hourlyLimit, dailyLimit, proxiesSx.\n\nAccepted fields:\n- lat (optional, number): Latitude for a US point. Must be paired with lon. Constraints: min: -90; max: 90.\n- lon (optional, number): Longitude for a US point. Must be paired with lat. Constraints: min: -180; max: 180.\n- zip (optional, string): US ZIP code to geocode before forecast lookup.\n- city (optional, string): US city name. Pair with state for best geocoding.\n- state (optional, string): US state name or two-letter abbreviation for city lookup.\n- location (optional, string): Free-form US place query when lat/lon, zip, or city/state are not supplied.\n- includeCurrent (optional, boolean): Fetch the nearest station's latest observation. Constraints: default: true.\n- includeHourly (optional, boolean): Fetch the hourly forecast. Constraints: default: true.\n- includeAlerts (optional, boolean): Fetch active watches, warnings, and advisories for the point. Constraints: default: true.\n- includeOffice (optional, boolean): Fetch forecast-center metadata such as name, phone, and email when available. Constraints: default: false.\n- hourlyLimit (optional, integer): Maximum hourly periods to return. Constraints: default: 24; min: 1; max: 72.\n- dailyLimit (optional, integer): Maximum multi-day forecast periods to return. Constraints: default: 14; min: 1; max: 14.\n- proxiesSx (optional, boolean | object): Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers. Object accepts: enabled, country, session, rotation, pool, reason.\n\nExample request body:\n```json\n{\n  \"city\": \"Boulder\",\n  \"state\": \"CO\",\n  \"hourlyLimit\": 24,\n  \"includeAlerts\": true\n}\n```",
      "category": "public-data",
      "kind": "public-data-tool",
      "departmentId": "public-data",
      "department": "Public Data",
      "aisleId": "weather",
      "aisle": "Weather",
      "shelfId": "weather",
      "shelf": "Weather",
      "offeringId": "us-weather-forecast",
      "offering": "US Weather Forecast",
      "pathIds": [
        "public-data",
        "weather",
        "weather",
        "us-weather-forecast"
      ],
      "pathLabels": [
        "Public Data",
        "Weather",
        "Weather",
        "US Weather Forecast"
      ],
      "taxonomyPath": "public-data.weather.weather.us-weather-forecast",
      "layout": {
        "department": {
          "id": "public-data",
          "name": "Public Data"
        },
        "aisle": {
          "id": "weather",
          "name": "Weather"
        },
        "shelf": {
          "id": "weather",
          "name": "Weather"
        },
        "offering": {
          "id": "us-weather-forecast",
          "name": "US Weather Forecast"
        },
        "pathIds": [
          "public-data",
          "weather",
          "weather",
          "us-weather-forecast"
        ],
        "pathLabels": [
          "Public Data",
          "Weather",
          "Weather",
          "US Weather Forecast"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "weather",
        "forecast",
        "alerts",
        "public-data"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/public-data/us-weather-forecast",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/public-data/us-weather-forecast",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Latitude for a US point. Must be paired with lon."
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude for a US point. Must be paired with lat."
          },
          "zip": {
            "type": "string",
            "description": "US ZIP code to geocode before forecast lookup."
          },
          "city": {
            "type": "string",
            "description": "US city name. Pair with state for best geocoding."
          },
          "state": {
            "type": "string",
            "description": "US state name or two-letter abbreviation for city lookup."
          },
          "location": {
            "type": "string",
            "description": "Free-form US place query when lat/lon, zip, or city/state are not supplied."
          },
          "includeCurrent": {
            "type": "boolean",
            "default": true,
            "description": "Fetch the nearest station's latest observation."
          },
          "includeHourly": {
            "type": "boolean",
            "default": true,
            "description": "Fetch the hourly forecast."
          },
          "includeAlerts": {
            "type": "boolean",
            "default": true,
            "description": "Fetch active watches, warnings, and advisories for the point."
          },
          "includeOffice": {
            "type": "boolean",
            "default": false,
            "description": "Fetch forecast-center metadata such as name, phone, and email when available."
          },
          "hourlyLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 72,
            "default": 24,
            "description": "Maximum hourly periods to return."
          },
          "dailyLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 14,
            "default": 14,
            "description": "Maximum multi-day forecast periods to return."
          },
          "proxiesSx": {
            "type": [
              "boolean",
              "object"
            ],
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "default": true,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled."
              },
              "country": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2,
                "default": "US",
                "description": "Two-letter country code for the Proxies.sx pool, for example US."
              },
              "session": {
                "type": "string",
                "maxLength": 64,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity."
              },
              "rotation": {
                "type": "string",
                "enum": [
                  "sticky",
                  "hard",
                  "auto5",
                  "auto10",
                  "auto20",
                  "auto60",
                  "ondemand"
                ],
                "default": "sticky",
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP."
              },
              "pool": {
                "type": "string",
                "enum": [
                  "mobile",
                  "residential",
                  "any"
                ],
                "default": "mobile",
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose."
              },
              "reason": {
                "type": "string",
                "maxLength": 160,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "lat",
          "lon",
          "zip",
          "city",
          "state",
          "location",
          "includeCurrent",
          "includeHourly",
          "includeAlerts",
          "includeOffice",
          "hourlyLimit",
          "dailyLimit",
          "proxiesSx"
        ],
        "fields": [
          {
            "name": "lat",
            "type": "number",
            "required": false,
            "description": "Latitude for a US point. Must be paired with lon.",
            "constraints": {
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "type": "number",
            "required": false,
            "description": "Longitude for a US point. Must be paired with lat.",
            "constraints": {
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "zip",
            "type": "string",
            "required": false,
            "description": "US ZIP code to geocode before forecast lookup."
          },
          {
            "name": "city",
            "type": "string",
            "required": false,
            "description": "US city name. Pair with state for best geocoding."
          },
          {
            "name": "state",
            "type": "string",
            "required": false,
            "description": "US state name or two-letter abbreviation for city lookup."
          },
          {
            "name": "location",
            "type": "string",
            "required": false,
            "description": "Free-form US place query when lat/lon, zip, or city/state are not supplied."
          },
          {
            "name": "includeCurrent",
            "type": "boolean",
            "required": false,
            "description": "Fetch the nearest station's latest observation.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeHourly",
            "type": "boolean",
            "required": false,
            "description": "Fetch the hourly forecast.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeAlerts",
            "type": "boolean",
            "required": false,
            "description": "Fetch active watches, warnings, and advisories for the point.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeOffice",
            "type": "boolean",
            "required": false,
            "description": "Fetch forecast-center metadata such as name, phone, and email when available.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "hourlyLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum hourly periods to return.",
            "constraints": {
              "default": 24,
              "minimum": 1,
              "maximum": 72
            }
          },
          {
            "name": "dailyLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum multi-day forecast periods to return.",
            "constraints": {
              "default": 14,
              "minimum": 1,
              "maximum": 14
            }
          },
          {
            "name": "proxiesSx",
            "type": "boolean | object",
            "required": false,
            "description": "Optional Proxies.sx egress hint for services that need mobile/residential fetches. Pass true for default US mobile egress, or an object with enabled, country, session, and rotation. Credentials and proxy URLs are never accepted from callers.",
            "fields": [
              {
                "name": "enabled",
                "type": "boolean",
                "required": false,
                "description": "Set false to force direct Worker egress when service-level Proxies.sx default routing is enabled.",
                "constraints": {
                  "default": true
                }
              },
              {
                "name": "country",
                "type": "string",
                "required": false,
                "description": "Two-letter country code for the Proxies.sx pool, for example US.",
                "constraints": {
                  "default": "US",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              {
                "name": "session",
                "type": "string",
                "required": false,
                "description": "Optional sticky-session key. Use stable, non-secret text when you need repeated calls to keep the same mobile identity.",
                "constraints": {
                  "maxLength": 64
                }
              },
              {
                "name": "rotation",
                "type": "string",
                "required": false,
                "description": "Rotation mode requested from the runner. sticky keeps the same session; hard asks for a fresh mobile IP.",
                "constraints": {
                  "enum": [
                    "sticky",
                    "hard",
                    "auto5",
                    "auto10",
                    "auto20",
                    "auto60",
                    "ondemand"
                  ],
                  "default": "sticky"
                }
              },
              {
                "name": "pool",
                "type": "string",
                "required": false,
                "description": "Optional pool preference. mobile maps to the Proxies.sx mbl pool, residential maps to peer, and any lets the gateway choose.",
                "constraints": {
                  "enum": [
                    "mobile",
                    "residential",
                    "any"
                  ],
                  "default": "mobile"
                }
              },
              {
                "name": "reason",
                "type": "string",
                "required": false,
                "description": "Optional caller note for internal observability, such as blocked-direct-worker-egress.",
                "constraints": {
                  "maxLength": 160
                }
              }
            ]
          }
        ],
        "additionalProperties": false,
        "example": {
          "city": "Boulder",
          "state": "CO",
          "hourlyLimit": 24,
          "includeAlerts": true
        }
      },
      "exampleRequest": {
        "city": "Boulder",
        "state": "CO",
        "hourlyLimit": 24,
        "includeAlerts": true
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "success",
          "tool",
          "requested",
          "checkedAt"
        ],
        "properties": {
          "success": {
            "type": "boolean"
          },
          "tool": {
            "type": "object",
            "additionalProperties": true
          },
          "requested": {
            "type": "object",
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "egress": {
            "type": "object",
            "additionalProperties": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "outputExample": {
        "success": true,
        "tool": {
          "id": "us-weather-forecast",
          "name": "US Weather Forecast",
          "department": "Public Data"
        },
        "location": {
          "input": "Boulder, CO",
          "lat": 40.015,
          "lon": -105.2705,
          "relative_location": {
            "city": "Boulder",
            "state": "CO"
          },
          "time_zone": "America/Denver"
        },
        "grid": {
          "wfo": "BOU",
          "gridX": 54,
          "gridY": 74
        },
        "current_observation": {
          "station_id": "KBDU",
          "text_description": "Mostly Cloudy",
          "temperature_f": 71.6
        },
        "forecast_multi_day": [
          {
            "name": "Tonight",
            "temperature": 54,
            "temperature_unit": "F",
            "short_forecast": "Partly Cloudy"
          }
        ],
        "forecast_hourly": [
          {
            "start_time": "2026-07-03T18:00:00-06:00",
            "temperature": 72,
            "temperature_unit": "F",
            "short_forecast": "Sunny"
          }
        ],
        "alerts": []
      },
      "configured": false
    },
    {
      "id": "official-status-check",
      "resource": "https://agentbodega.store/api/status/check",
      "type": "http",
      "method": "POST",
      "serviceName": "Official Service Status Check",
      "description": "Check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.",
      "longDescription": "Purpose: Check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.\nBest use: Use this when an agent needs check one official status page or status API for GitHub, GitLab, deploy platforms, package registries, databases, auth, and AI APIs.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: service.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- service (required, string): Service id from /api/status/catalog, for example github or gitlab.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Official Service Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"service\": \"github\",\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "utility",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "status-checks",
      "aisle": "Status Checks",
      "offeringId": "official-status-check",
      "offering": "Official Service Status Check",
      "pathIds": [
        "official-status",
        "status-checks",
        "official-status-check"
      ],
      "pathLabels": [
        "Status & Infra",
        "Status Checks",
        "Official Service Status Check"
      ],
      "taxonomyPath": "official-status.status-checks.official-status-check",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "status-checks",
          "name": "Status Checks"
        },
        "offering": {
          "id": "official-status-check",
          "name": "Official Service Status Check"
        },
        "pathIds": [
          "official-status",
          "status-checks",
          "official-status-check"
        ],
        "pathLabels": [
          "Status & Infra",
          "Status Checks",
          "Official Service Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "github",
        "gitlab",
        "deploy-readiness",
        "incident-response",
        "agent-tools"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/check",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/check",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "service"
        ],
        "properties": {
          "service": {
            "type": "string",
            "description": "Service id from /api/status/catalog, for example github or gitlab."
          },
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Official Service Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Official Service Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "service"
        ],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "service",
            "type": "string",
            "required": true,
            "description": "Service id from /api/status/catalog, for example github or gitlab."
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Official Service Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "service": "github",
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "service": "github",
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "id": "github",
          "name": "GitHub"
        },
        "ok": true,
        "status": "operational",
        "label": "All Systems Operational",
        "source": {
          "type": "managed-status-source",
          "cached": false,
          "stale": false
        }
      },
      "configured": false
    },
    {
      "id": "cloud-status-check",
      "resource": "https://agentbodega.store/api/cloud/status/check",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Provider Status Check",
      "description": "Check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.",
      "longDescription": "Purpose: Check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.\nBest use: Use this when an agent needs check one public AWS, Google Cloud, Azure, DigitalOcean, or Linode service/location status source and return a terse agent-ready verdict.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: provider.\nOptional fields: service, product, region, location, includeHistory, includeHealthy, incidentLimit.\n\nAccepted fields:\n- provider (required, string): Cloud provider id. Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\".\n- service (optional, string): Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke.\n- product (optional, string): GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine.\n- region (optional, string): Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global.\n- location (optional, string): Provider location alias. Treated the same as region.\n- includeHistory (optional, boolean): Return recent/resolved historical incidents when the provider source exposes them. Constraints: default: false.\n- includeHealthy (optional, boolean): Include healthy/noisy rows. Default responses focus on degraded or relevant incidents. Constraints: default: false.\n- incidentLimit (optional, integer): Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20. Constraints: default: 5; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"provider\": \"aws\",\n  \"service\": \"lambda\",\n  \"region\": \"us-east-1\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "utility",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "provider-status",
      "aisle": "Provider Status",
      "shelfId": "single-unit",
      "shelf": "Single Unit",
      "offeringId": "cloud-status-check",
      "offering": "Cloud Provider Status Check",
      "pathIds": [
        "cloud-status",
        "provider-status",
        "single-unit",
        "cloud-status-check"
      ],
      "pathLabels": [
        "Cloud Status",
        "Provider Status",
        "Single Unit",
        "Cloud Provider Status Check"
      ],
      "taxonomyPath": "cloud-status.provider-status.single-unit.cloud-status-check",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "provider-status",
          "name": "Provider Status"
        },
        "shelf": {
          "id": "single-unit",
          "name": "Single Unit"
        },
        "offering": {
          "id": "cloud-status-check",
          "name": "Cloud Provider Status Check"
        },
        "pathIds": [
          "cloud-status",
          "provider-status",
          "single-unit",
          "cloud-status-check"
        ],
        "pathLabels": [
          "Cloud Status",
          "Provider Status",
          "Single Unit",
          "Cloud Provider Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/check",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/check",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "provider"
        ],
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "aws",
              "gcp",
              "azure",
              "digitalocean",
              "linode"
            ],
            "description": "Cloud provider id."
          },
          "service": {
            "type": "string",
            "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
          },
          "product": {
            "type": "string",
            "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
          },
          "region": {
            "type": "string",
            "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
          },
          "location": {
            "type": "string",
            "description": "Provider location alias. Treated the same as region."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Return recent/resolved historical incidents when the provider source exposes them."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Include healthy/noisy rows. Default responses focus on degraded or relevant incidents."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "provider"
        ],
        "optional": [
          "service",
          "product",
          "region",
          "location",
          "includeHistory",
          "includeHealthy",
          "incidentLimit"
        ],
        "fields": [
          {
            "name": "provider",
            "type": "string",
            "required": true,
            "description": "Cloud provider id.",
            "constraints": {
              "enum": [
                "aws",
                "gcp",
                "azure",
                "digitalocean",
                "linode"
              ]
            }
          },
          {
            "name": "service",
            "type": "string",
            "required": false,
            "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
          },
          {
            "name": "product",
            "type": "string",
            "required": false,
            "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
          },
          {
            "name": "region",
            "type": "string",
            "required": false,
            "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
          },
          {
            "name": "location",
            "type": "string",
            "required": false,
            "description": "Provider location alias. Treated the same as region."
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Return recent/resolved historical incidents when the provider source exposes them.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Include healthy/noisy rows. Default responses focus on degraded or relevant incidents.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Incident Limit numeric value for Cloud Provider Status Check. Constraints: default: 5; min: 1; max: 20.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "provider": "aws",
          "service": "lambda",
          "region": "us-east-1",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "provider": "aws",
        "service": "lambda",
        "region": "us-east-1",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "provider": {
          "id": "aws",
          "name": "AWS"
        },
        "status": "operational",
        "summary": "No broad-impact incident matched the requested unit.",
        "incidents": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-summary",
      "resource": "https://agentbodega.store/api/cloud/status/summary",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Provider Status Summary",
      "description": "Summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.",
      "longDescription": "Purpose: Summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.\nBest use: Use this when an agent needs summarize public broad-impact incidents for AWS, Google Cloud, Azure, DigitalOcean, Linode, or all providers before an agent retries cloud work.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: provider, includeHistory, includeHealthy, incidentLimit.\n\nAccepted fields:\n- provider (optional, string): Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\".\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false. Constraints: default: false.\n- incidentLimit (optional, integer): Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20. Constraints: default: 5; min: 1; max: 20.\n\nExample request body:\n```json\n{\n  \"provider\": \"all\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "http-json",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "incident-summaries",
      "aisle": "Incident Summaries",
      "shelfId": "single-unit",
      "shelf": "Single Unit",
      "offeringId": "cloud-status-summary",
      "offering": "Cloud Provider Status Summary",
      "pathIds": [
        "cloud-status",
        "incident-summaries",
        "single-unit",
        "cloud-status-summary"
      ],
      "pathLabels": [
        "Cloud Status",
        "Incident Summaries",
        "Single Unit",
        "Cloud Provider Status Summary"
      ],
      "taxonomyPath": "cloud-status.incident-summaries.single-unit.cloud-status-summary",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "incident-summaries",
          "name": "Incident Summaries"
        },
        "shelf": {
          "id": "single-unit",
          "name": "Single Unit"
        },
        "offering": {
          "id": "cloud-status-summary",
          "name": "Cloud Provider Status Summary"
        },
        "pathIds": [
          "cloud-status",
          "incident-summaries",
          "single-unit",
          "cloud-status-summary"
        ],
        "pathLabels": [
          "Cloud Status",
          "Incident Summaries",
          "Single Unit",
          "Cloud Provider Status Summary"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "summary",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/summary",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/summary",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "aws",
              "gcp",
              "azure",
              "digitalocean",
              "linode",
              "all"
            ],
            "default": "all",
            "description": "Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\"."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "provider",
          "includeHistory",
          "includeHealthy",
          "incidentLimit"
        ],
        "fields": [
          {
            "name": "provider",
            "type": "string",
            "required": false,
            "description": "Provider filter for Cloud Provider Status Summary. Accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\". Constraints: accepted values: \"aws\", \"gcp\", \"azure\", \"digitalocean\", \"linode\", \"all\"; default: \"all\".",
            "constraints": {
              "enum": [
                "aws",
                "gcp",
                "azure",
                "digitalocean",
                "linode",
                "all"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Provider Status Summary. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Provider Status Summary. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Incident Limit numeric value for Cloud Provider Status Summary. Constraints: default: 5; min: 1; max: 20.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "provider": "all",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "provider": "all",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "provider": "all",
        "summary": {
          "worstStatus": "operational",
          "checkedProviders": 5
        },
        "incidents": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-bundle",
      "resource": "https://agentbodega.store/api/cloud/status/bundle",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Status Small Bundle",
      "description": "Check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.",
      "longDescription": "Purpose: Check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.\nBest use: Use this when an agent needs check up to five cloud service/location units, or a curated cloud-provider bundle, without dumping every healthy cloud service.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: bundle, targets, includeHistory, includeHealthy.\n\nAccepted fields:\n- bundle (optional, string): Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\".\n- targets (optional, array): Optional explicit cloud checks. Bundle price covers up to five normalized units. Constraints: min items: 1; max items: 5. Array items accept: provider, service, product, region, location.\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"bundle\": \"cloud-core\",\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "utility",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "cloud-bundles",
      "aisle": "Cloud Bundles",
      "shelfId": "multi-unit",
      "shelf": "Multi Unit",
      "offeringId": "cloud-status-bundle",
      "offering": "Cloud Status Small Bundle",
      "pathIds": [
        "cloud-status",
        "cloud-bundles",
        "multi-unit",
        "cloud-status-bundle"
      ],
      "pathLabels": [
        "Cloud Status",
        "Cloud Bundles",
        "Multi Unit",
        "Cloud Status Small Bundle"
      ],
      "taxonomyPath": "cloud-status.cloud-bundles.multi-unit.cloud-status-bundle",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "cloud-bundles",
          "name": "Cloud Bundles"
        },
        "shelf": {
          "id": "multi-unit",
          "name": "Multi Unit"
        },
        "offering": {
          "id": "cloud-status-bundle",
          "name": "Cloud Status Small Bundle"
        },
        "pathIds": [
          "cloud-status",
          "cloud-bundles",
          "multi-unit",
          "cloud-status-bundle"
        ],
        "pathLabels": [
          "Cloud Status",
          "Cloud Bundles",
          "Multi Unit",
          "Cloud Status Small Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "bundle",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/bundle",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/bundle",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "string",
            "enum": [
              "cloud-core",
              "aws-webapp",
              "gcp-ai-app",
              "azure-saas",
              "do-core",
              "linode-core"
            ],
            "default": "cloud-core",
            "description": "Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\"."
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "aws",
                    "gcp",
                    "azure",
                    "digitalocean",
                    "linode"
                  ],
                  "description": "Cloud provider id."
                },
                "service": {
                  "type": "string",
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                "product": {
                  "type": "string",
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                "region": {
                  "type": "string",
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                "location": {
                  "type": "string",
                  "description": "Provider location alias. Treated the same as region."
                }
              },
              "additionalProperties": false,
              "description": "Targets item object for configuring Cloud Status Small Bundle."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "Optional explicit cloud checks. Bundle price covers up to five normalized units."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "bundle",
          "targets",
          "includeHistory",
          "includeHealthy"
        ],
        "fields": [
          {
            "name": "bundle",
            "type": "string",
            "required": false,
            "description": "Bundle filter for Cloud Status Small Bundle. Accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\". Constraints: accepted values: \"cloud-core\", \"aws-webapp\", \"gcp-ai-app\", \"azure-saas\", \"do-core\", \"linode-core\"; default: \"cloud-core\".",
            "constraints": {
              "enum": [
                "cloud-core",
                "aws-webapp",
                "gcp-ai-app",
                "azure-saas",
                "do-core",
                "linode-core"
              ],
              "default": "cloud-core"
            }
          },
          {
            "name": "targets",
            "type": "array",
            "required": false,
            "description": "Optional explicit cloud checks. Bundle price covers up to five normalized units.",
            "constraints": {
              "minItems": 1,
              "maxItems": 5
            },
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "fields": [
                {
                  "name": "provider",
                  "type": "string",
                  "required": true,
                  "description": "Cloud provider id.",
                  "constraints": {
                    "enum": [
                      "aws",
                      "gcp",
                      "azure",
                      "digitalocean",
                      "linode"
                    ]
                  }
                },
                {
                  "name": "service",
                  "type": "string",
                  "required": false,
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                {
                  "name": "product",
                  "type": "string",
                  "required": false,
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                {
                  "name": "region",
                  "type": "string",
                  "required": false,
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                {
                  "name": "location",
                  "type": "string",
                  "required": false,
                  "description": "Provider location alias. Treated the same as region."
                }
              ]
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Status Small Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Status Small Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "bundle": "cloud-core",
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "bundle": "cloud-core",
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "cloud-core",
          "units": 4
        },
        "summary": {
          "worstStatus": "operational",
          "degraded": 0
        },
        "results": []
      },
      "configured": false
    },
    {
      "id": "cloud-status-stack",
      "resource": "https://agentbodega.store/api/cloud/status/stack",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloud Stack Status Bundle",
      "description": "Check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.",
      "longDescription": "Purpose: Check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.\nBest use: Use this when an agent needs check up to twelve caller-selected cloud service/location units for a stack-wide public status verdict.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: targets.\nOptional fields: includeHistory, includeHealthy.\n\nAccepted fields:\n- targets (required, array): Caller-selected cloud checks. Stack price covers up to twelve normalized units. Constraints: min items: 3; max items: 12. Array items accept: provider, service, product, region, location.\n- includeHistory (optional, boolean): Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n- includeHealthy (optional, boolean): Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"targets\": [\n    {\n      \"provider\": \"aws\",\n      \"service\": \"lambda\",\n      \"region\": \"us-east-1\"\n    },\n    {\n      \"provider\": \"aws\",\n      \"service\": \"s3\",\n      \"region\": \"us-east-1\"\n    },\n    {\n      \"provider\": \"gcp\",\n      \"product\": \"cloud-run\",\n      \"location\": \"us-central1\"\n    },\n    {\n      \"provider\": \"azure\",\n      \"service\": \"app-service\",\n      \"region\": \"eastus\"\n    }\n  ],\n  \"includeHistory\": false\n}\n```",
      "category": "cloud-status",
      "kind": "http-json",
      "departmentId": "cloud-status",
      "department": "Cloud Status",
      "aisleId": "cloud-bundles",
      "aisle": "Cloud Bundles",
      "shelfId": "multi-unit",
      "shelf": "Multi Unit",
      "offeringId": "cloud-status-stack",
      "offering": "Cloud Stack Status Bundle",
      "pathIds": [
        "cloud-status",
        "cloud-bundles",
        "multi-unit",
        "cloud-status-stack"
      ],
      "pathLabels": [
        "Cloud Status",
        "Cloud Bundles",
        "Multi Unit",
        "Cloud Stack Status Bundle"
      ],
      "taxonomyPath": "cloud-status.cloud-bundles.multi-unit.cloud-status-stack",
      "layout": {
        "department": {
          "id": "cloud-status",
          "name": "Cloud Status"
        },
        "aisle": {
          "id": "cloud-bundles",
          "name": "Cloud Bundles"
        },
        "shelf": {
          "id": "multi-unit",
          "name": "Multi Unit"
        },
        "offering": {
          "id": "cloud-status-stack",
          "name": "Cloud Stack Status Bundle"
        },
        "pathIds": [
          "cloud-status",
          "cloud-bundles",
          "multi-unit",
          "cloud-status-stack"
        ],
        "pathLabels": [
          "Cloud Status",
          "Cloud Bundles",
          "Multi Unit",
          "Cloud Stack Status Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloud",
        "custom-stack",
        "aws",
        "gcp",
        "azure",
        "digitalocean",
        "linode",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/cloud/status/stack",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/cloud/status/stack",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "targets"
        ],
        "properties": {
          "targets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "aws",
                    "gcp",
                    "azure",
                    "digitalocean",
                    "linode"
                  ],
                  "description": "Cloud provider id."
                },
                "service": {
                  "type": "string",
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                "product": {
                  "type": "string",
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                "region": {
                  "type": "string",
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                "location": {
                  "type": "string",
                  "description": "Provider location alias. Treated the same as region."
                }
              },
              "additionalProperties": false,
              "description": "Targets item object for configuring Cloud Stack Status Bundle."
            },
            "minItems": 3,
            "maxItems": 12,
            "description": "Caller-selected cloud checks. Stack price covers up to twelve normalized units."
          },
          "includeHistory": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false."
          },
          "includeHealthy": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "targets"
        ],
        "optional": [
          "includeHistory",
          "includeHealthy"
        ],
        "fields": [
          {
            "name": "targets",
            "type": "array",
            "required": true,
            "description": "Caller-selected cloud checks. Stack price covers up to twelve normalized units.",
            "constraints": {
              "minItems": 3,
              "maxItems": 12
            },
            "items": {
              "type": "object",
              "required": [
                "provider"
              ],
              "fields": [
                {
                  "name": "provider",
                  "type": "string",
                  "required": true,
                  "description": "Cloud provider id.",
                  "constraints": {
                    "enum": [
                      "aws",
                      "gcp",
                      "azure",
                      "digitalocean",
                      "linode"
                    ]
                  }
                },
                {
                  "name": "service",
                  "type": "string",
                  "required": false,
                  "description": "Provider service name or id, for example ec2, lambda, app-service, spaces, droplets, object-storage, or lke."
                },
                {
                  "name": "product",
                  "type": "string",
                  "required": false,
                  "description": "GCP product name, id, or alias, for example cloud-run, vertex-ai, cloud-sql, or compute-engine."
                },
                {
                  "name": "region",
                  "type": "string",
                  "required": false,
                  "description": "Provider region/location such as us-east-1, us-central1, eastus, nyc3, us-east-newark, or global."
                },
                {
                  "name": "location",
                  "type": "string",
                  "required": false,
                  "description": "Provider location alias. Treated the same as region."
                }
              ]
            }
          },
          {
            "name": "includeHistory",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include history behavior for Cloud Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "includeHealthy",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include healthy behavior for Cloud Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "targets": [
            {
              "provider": "aws",
              "service": "lambda",
              "region": "us-east-1"
            },
            {
              "provider": "aws",
              "service": "s3",
              "region": "us-east-1"
            },
            {
              "provider": "gcp",
              "product": "cloud-run",
              "location": "us-central1"
            },
            {
              "provider": "azure",
              "service": "app-service",
              "region": "eastus"
            }
          ],
          "includeHistory": false
        }
      },
      "exampleRequest": {
        "targets": [
          {
            "provider": "aws",
            "service": "lambda",
            "region": "us-east-1"
          },
          {
            "provider": "aws",
            "service": "s3",
            "region": "us-east-1"
          },
          {
            "provider": "gcp",
            "product": "cloud-run",
            "location": "us-central1"
          },
          {
            "provider": "azure",
            "service": "app-service",
            "region": "eastus"
          }
        ],
        "includeHistory": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "custom-stack",
          "units": 5
        },
        "summary": {
          "worstStatus": "operational",
          "degraded": 0
        },
        "results": []
      },
      "configured": false
    },
    {
      "id": "status-bundle-check",
      "resource": "https://agentbodega.store/api/status/bundle",
      "type": "http",
      "method": "POST",
      "serviceName": "Vibe Deploy Readiness Bundle",
      "description": "Check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.",
      "longDescription": "Purpose: Check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.\nBest use: Use this when an agent needs check a bundle of official status sources so an agent can decide whether to deploy, retry, or wait before blaming its own code.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: bundle, services, includeComponents.\n\nAccepted fields:\n- bundle (optional, string): Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\".\n- services (optional, array): Optional explicit service ids from /api/status/catalog. Constraints: min items: 1; max items: 20.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"bundle\": \"vibe-deploy-readiness\",\n  \"includeComponents\": false\n}\n```",
      "category": "agent-utilities",
      "kind": "utility",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "status-bundle-check",
      "offering": "Vibe Deploy Readiness Bundle",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "status-bundle-check"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Vibe Deploy Readiness Bundle"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.status-bundle-check",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "status-bundle-check",
          "name": "Vibe Deploy Readiness Bundle"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "status-bundle-check"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Vibe Deploy Readiness Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "deploy-readiness",
        "github",
        "gitlab",
        "vercel",
        "supabase",
        "openai"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bundle",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bundle",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "string",
            "enum": [
              "vibe-deploy-readiness",
              "ai-app-stack",
              "source-and-ci",
              "deploy-platforms",
              "all"
            ],
            "default": "vibe-deploy-readiness",
            "description": "Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\"."
          },
          "services": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Services item value for Vibe Deploy Readiness Bundle."
            },
            "minItems": 1,
            "maxItems": 20,
            "description": "Optional explicit service ids from /api/status/catalog."
          },
          "includeComponents": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "bundle",
          "services",
          "includeComponents"
        ],
        "fields": [
          {
            "name": "bundle",
            "type": "string",
            "required": false,
            "description": "Bundle filter for Vibe Deploy Readiness Bundle. Accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\". Constraints: accepted values: \"vibe-deploy-readiness\", \"ai-app-stack\", \"source-and-ci\", \"deploy-platforms\", \"all\"; default: \"vibe-deploy-readiness\".",
            "constraints": {
              "enum": [
                "vibe-deploy-readiness",
                "ai-app-stack",
                "source-and-ci",
                "deploy-platforms",
                "all"
              ],
              "default": "vibe-deploy-readiness"
            }
          },
          {
            "name": "services",
            "type": "array",
            "required": false,
            "description": "Optional explicit service ids from /api/status/catalog.",
            "constraints": {
              "minItems": 1,
              "maxItems": 20
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Vibe Deploy Readiness Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "bundle": "vibe-deploy-readiness",
          "includeComponents": false
        }
      },
      "exampleRequest": {
        "bundle": "vibe-deploy-readiness",
        "includeComponents": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "vibe-deploy-readiness"
        },
        "summary": {
          "status": "operational"
        },
        "results": [
          {
            "service": {
              "id": "github"
            },
            "status": "operational"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "status-stack-bundle",
      "resource": "https://agentbodega.store/api/status/stack",
      "type": "http",
      "method": "POST",
      "serviceName": "Custom Stack Status Bundle",
      "description": "Check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.",
      "longDescription": "Purpose: Check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.\nBest use: Use this when an agent needs check a caller-selected stack of official status sources at the stack-bundle price. Repeated stack layers are rejected before payment.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: services.\nOptional fields: includeComponents.\n\nAccepted fields:\n- services (required, array): Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host. Constraints: min items: 3; max items: 20.\n- includeComponents (optional, boolean): Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"services\": [\n    \"github\",\n    \"npm\",\n    \"vercel\",\n    \"supabase\",\n    \"openai\"\n  ],\n  \"includeComponents\": false\n}\n```",
      "category": "agent-utilities",
      "kind": "utility",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "status-stack-bundle",
      "offering": "Custom Stack Status Bundle",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "status-stack-bundle"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Custom Stack Status Bundle"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.status-stack-bundle",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "status-stack-bundle",
          "name": "Custom Stack Status Bundle"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "status-stack-bundle"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Custom Stack Status Bundle"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "custom-stack",
        "deploy-readiness",
        "github",
        "vercel",
        "supabase",
        "openai"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/stack",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/stack",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "services"
        ],
        "properties": {
          "services": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Services item value for Custom Stack Status Bundle."
            },
            "minItems": 3,
            "maxItems": 20,
            "description": "Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host."
          },
          "includeComponents": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "services"
        ],
        "optional": [
          "includeComponents"
        ],
        "fields": [
          {
            "name": "services",
            "type": "array",
            "required": true,
            "description": "Service ids from /api/status/catalog. Stack pricing requires at least three stack roles and no repeated capped layer, for example one data layer and one deploy host.",
            "constraints": {
              "minItems": 3,
              "maxItems": 20
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Custom Stack Status Bundle. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "services": [
            "github",
            "npm",
            "vercel",
            "supabase",
            "openai"
          ],
          "includeComponents": false
        }
      },
      "exampleRequest": {
        "services": [
          "github",
          "npm",
          "vercel",
          "supabase",
          "openai"
        ],
        "includeComponents": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "bundle": {
          "id": "vibe-deploy-readiness"
        },
        "summary": {
          "status": "operational"
        },
        "results": [
          {
            "service": {
              "id": "github"
            },
            "status": "operational"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "official-status-github",
      "resource": "https://agentbodega.store/api/status/github",
      "type": "http",
      "method": "POST",
      "serviceName": "GitHub Status Check",
      "description": "Check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check GitHub's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for GitHub Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "github",
      "shelf": "Github",
      "offeringId": "official-status-github",
      "offering": "GitHub Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "github",
        "official-status-github"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Github",
        "GitHub Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.github.official-status-github",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "github",
          "name": "Github"
        },
        "offering": {
          "id": "official-status-github",
          "name": "GitHub Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "github",
          "official-status-github"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Github",
          "GitHub Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "github",
        "git",
        "ci",
        "packages",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/github",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/github",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for GitHub Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for GitHub Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for GitHub Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "GitHub Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-gitlab",
      "resource": "https://agentbodega.store/api/status/gitlab",
      "type": "http",
      "method": "POST",
      "serviceName": "GitLab Status Check",
      "description": "Check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check GitLab.com's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for GitLab Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "gitlab",
      "shelf": "Gitlab",
      "offeringId": "official-status-gitlab",
      "offering": "GitLab Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "gitlab",
        "official-status-gitlab"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Gitlab",
        "GitLab Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.gitlab.official-status-gitlab",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "gitlab",
          "name": "Gitlab"
        },
        "offering": {
          "id": "official-status-gitlab",
          "name": "GitLab Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "gitlab",
          "official-status-gitlab"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Gitlab",
          "GitLab Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "gitlab",
        "git",
        "ci",
        "packages",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/gitlab",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/gitlab",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for GitLab Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for GitLab Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for GitLab Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "GitLab Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-bitbucket",
      "resource": "https://agentbodega.store/api/status/bitbucket",
      "type": "http",
      "method": "POST",
      "serviceName": "Bitbucket Status Check",
      "description": "Check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Bitbucket's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "bitbucket",
      "shelf": "Bitbucket",
      "offeringId": "official-status-bitbucket",
      "offering": "Bitbucket Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "bitbucket",
        "official-status-bitbucket"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Bitbucket",
        "Bitbucket Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.bitbucket.official-status-bitbucket",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "bitbucket",
          "name": "Bitbucket"
        },
        "offering": {
          "id": "official-status-bitbucket",
          "name": "Bitbucket Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "bitbucket",
          "official-status-bitbucket"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Bitbucket",
          "Bitbucket Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "bitbucket",
        "git",
        "ci",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bitbucket",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bitbucket",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Bitbucket Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Bitbucket Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Bitbucket Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-npm",
      "resource": "https://agentbodega.store/api/status/npm",
      "type": "http",
      "method": "POST",
      "serviceName": "npm Status Check",
      "description": "Check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check npm's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for npm Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "npm",
      "shelf": "Npm",
      "offeringId": "official-status-npm",
      "offering": "npm Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "npm",
        "official-status-npm"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Npm",
        "npm Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.npm.official-status-npm",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "npm",
          "name": "Npm"
        },
        "offering": {
          "id": "official-status-npm",
          "name": "npm Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "npm",
          "official-status-npm"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Npm",
          "npm Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "npm",
        "node",
        "packages",
        "registry",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/npm",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/npm",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for npm Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for npm Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for npm Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "npm Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-vercel",
      "resource": "https://agentbodega.store/api/status/vercel",
      "type": "http",
      "method": "POST",
      "serviceName": "Vercel Status Check",
      "description": "Check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Vercel's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Vercel Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "vercel",
      "shelf": "Vercel",
      "offeringId": "official-status-vercel",
      "offering": "Vercel Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "vercel",
        "official-status-vercel"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Vercel",
        "Vercel Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.vercel.official-status-vercel",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "vercel",
          "name": "Vercel"
        },
        "offering": {
          "id": "official-status-vercel",
          "name": "Vercel Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "vercel",
          "official-status-vercel"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Vercel",
          "Vercel Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "vercel",
        "deploy",
        "hosting",
        "nextjs",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/vercel",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/vercel",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Vercel Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Vercel Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Vercel Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Vercel Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-netlify",
      "resource": "https://agentbodega.store/api/status/netlify",
      "type": "http",
      "method": "POST",
      "serviceName": "Netlify Status Check",
      "description": "Check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Netlify's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Netlify Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "netlify",
      "shelf": "Netlify",
      "offeringId": "official-status-netlify",
      "offering": "Netlify Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "netlify",
        "official-status-netlify"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Netlify",
        "Netlify Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.netlify.official-status-netlify",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "netlify",
          "name": "Netlify"
        },
        "offering": {
          "id": "official-status-netlify",
          "name": "Netlify Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "netlify",
          "official-status-netlify"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Netlify",
          "Netlify Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "netlify",
        "deploy",
        "hosting",
        "functions",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/netlify",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/netlify",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Netlify Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Netlify Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Netlify Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Netlify Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-render",
      "resource": "https://agentbodega.store/api/status/render",
      "type": "http",
      "method": "POST",
      "serviceName": "Render Status Check",
      "description": "Check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Render's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Render Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "render",
      "shelf": "Render",
      "offeringId": "official-status-render",
      "offering": "Render Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "render",
        "official-status-render"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Render",
        "Render Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.render.official-status-render",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "render",
          "name": "Render"
        },
        "offering": {
          "id": "official-status-render",
          "name": "Render Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "render",
          "official-status-render"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Render",
          "Render Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "render",
        "deploy",
        "hosting",
        "postgres",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/render",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/render",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Render Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Render Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Render Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Render Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-fly",
      "resource": "https://agentbodega.store/api/status/fly",
      "type": "http",
      "method": "POST",
      "serviceName": "Fly.io Status Check",
      "description": "Check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Fly.io's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "fly",
      "shelf": "Fly",
      "offeringId": "official-status-fly",
      "offering": "Fly.io Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "fly",
        "official-status-fly"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Fly",
        "Fly.io Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.fly.official-status-fly",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "fly",
          "name": "Fly"
        },
        "offering": {
          "id": "official-status-fly",
          "name": "Fly.io Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "fly",
          "official-status-fly"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Fly",
          "Fly.io Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "fly",
        "flyio",
        "deploy",
        "hosting",
        "edge",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/fly",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/fly",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Fly.io Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Fly.io Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Fly.io Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-railway",
      "resource": "https://agentbodega.store/api/status/railway",
      "type": "http",
      "method": "POST",
      "serviceName": "Railway Status Check",
      "description": "Check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Railway's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Railway Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "railway",
      "shelf": "Railway",
      "offeringId": "official-status-railway",
      "offering": "Railway Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "railway",
        "official-status-railway"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Railway",
        "Railway Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.railway.official-status-railway",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "railway",
          "name": "Railway"
        },
        "offering": {
          "id": "official-status-railway",
          "name": "Railway Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "railway",
          "official-status-railway"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Railway",
          "Railway Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "railway",
        "deploy",
        "hosting",
        "builds",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/railway",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/railway",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Railway Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Railway Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Railway Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Railway Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-coinbase",
      "resource": "https://agentbodega.store/api/status/coinbase",
      "type": "http",
      "method": "POST",
      "serviceName": "Coinbase Status Check",
      "description": "Check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Coinbase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "coinbase",
      "shelf": "Coinbase",
      "offeringId": "official-status-coinbase",
      "offering": "Coinbase Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "coinbase",
        "official-status-coinbase"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Coinbase",
        "Coinbase Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.coinbase.official-status-coinbase",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "coinbase",
          "name": "Coinbase"
        },
        "offering": {
          "id": "official-status-coinbase",
          "name": "Coinbase Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "coinbase",
          "official-status-coinbase"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Coinbase",
          "Coinbase Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "coinbase",
        "crypto",
        "payments",
        "wallet",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/coinbase",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/coinbase",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Coinbase Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Coinbase Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Coinbase Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-cursor",
      "resource": "https://agentbodega.store/api/status/cursor",
      "type": "http",
      "method": "POST",
      "serviceName": "Cursor Status Check",
      "description": "Check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Cursor's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Cursor Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "cursor",
      "shelf": "Cursor",
      "offeringId": "official-status-cursor",
      "offering": "Cursor Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "cursor",
        "official-status-cursor"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Cursor",
        "Cursor Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.cursor.official-status-cursor",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "cursor",
          "name": "Cursor"
        },
        "offering": {
          "id": "official-status-cursor",
          "name": "Cursor Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "cursor",
          "official-status-cursor"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Cursor",
          "Cursor Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cursor",
        "ai",
        "editor",
        "ide",
        "developer-tools",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/cursor",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/cursor",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Cursor Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Cursor Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Cursor Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Cursor Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-bambulab",
      "resource": "https://agentbodega.store/api/status/bambulab",
      "type": "http",
      "method": "POST",
      "serviceName": "Bambu Lab Status Check",
      "description": "Check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Bambu Lab's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "bambulab",
      "shelf": "Bambulab",
      "offeringId": "official-status-bambulab",
      "offering": "Bambu Lab Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "bambulab",
        "official-status-bambulab"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Bambulab",
        "Bambu Lab Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.bambulab.official-status-bambulab",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "bambulab",
          "name": "Bambulab"
        },
        "offering": {
          "id": "official-status-bambulab",
          "name": "Bambu Lab Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "bambulab",
          "official-status-bambulab"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Bambulab",
          "Bambu Lab Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "bambu-lab",
        "3d-printing",
        "hardware",
        "iot",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/bambulab",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/bambulab",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Bambu Lab Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Bambu Lab Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Bambu Lab Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-ring",
      "resource": "https://agentbodega.store/api/status/ring",
      "type": "http",
      "method": "POST",
      "serviceName": "Ring Status Check",
      "description": "Check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Ring's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Ring Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "ring",
      "shelf": "Ring",
      "offeringId": "official-status-ring",
      "offering": "Ring Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "ring",
        "official-status-ring"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Ring",
        "Ring Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.ring.official-status-ring",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "ring",
          "name": "Ring"
        },
        "offering": {
          "id": "official-status-ring",
          "name": "Ring Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "ring",
          "official-status-ring"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Ring",
          "Ring Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "ring",
        "iot",
        "security",
        "camera",
        "smart-home",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/ring",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/ring",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Ring Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Ring Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Ring Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Ring Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-cloudflare",
      "resource": "https://agentbodega.store/api/status/cloudflare",
      "type": "http",
      "method": "POST",
      "serviceName": "Cloudflare Status Check",
      "description": "Check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Cloudflare's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "cloudflare",
      "shelf": "Cloudflare",
      "offeringId": "official-status-cloudflare",
      "offering": "Cloudflare Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "cloudflare",
        "official-status-cloudflare"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Cloudflare",
        "Cloudflare Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.cloudflare.official-status-cloudflare",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "cloudflare",
          "name": "Cloudflare"
        },
        "offering": {
          "id": "official-status-cloudflare",
          "name": "Cloudflare Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "cloudflare",
          "official-status-cloudflare"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Cloudflare",
          "Cloudflare Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "cloudflare",
        "dns",
        "cdn",
        "workers",
        "edge",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/cloudflare",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/cloudflare",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Cloudflare Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Cloudflare Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Cloudflare Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-supabase",
      "resource": "https://agentbodega.store/api/status/supabase",
      "type": "http",
      "method": "POST",
      "serviceName": "Supabase Status Check",
      "description": "Check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Supabase's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Supabase Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "supabase",
      "shelf": "Supabase",
      "offeringId": "official-status-supabase",
      "offering": "Supabase Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "supabase",
        "official-status-supabase"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Supabase",
        "Supabase Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.supabase.official-status-supabase",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "supabase",
          "name": "Supabase"
        },
        "offering": {
          "id": "official-status-supabase",
          "name": "Supabase Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "supabase",
          "official-status-supabase"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Supabase",
          "Supabase Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "supabase",
        "postgres",
        "auth",
        "storage",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/supabase",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/supabase",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Supabase Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Supabase Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Supabase Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Supabase Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-convex",
      "resource": "https://agentbodega.store/api/status/convex",
      "type": "http",
      "method": "POST",
      "serviceName": "Convex Status Check",
      "description": "Check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Convex's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Convex Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "convex",
      "shelf": "Convex",
      "offeringId": "official-status-convex",
      "offering": "Convex Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "convex",
        "official-status-convex"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Convex",
        "Convex Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.convex.official-status-convex",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "convex",
          "name": "Convex"
        },
        "offering": {
          "id": "official-status-convex",
          "name": "Convex Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "convex",
          "official-status-convex"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Convex",
          "Convex Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "convex",
        "backend",
        "database",
        "realtime",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/convex",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/convex",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Convex Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Convex Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Convex Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Convex Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-clerk",
      "resource": "https://agentbodega.store/api/status/clerk",
      "type": "http",
      "method": "POST",
      "serviceName": "Clerk Status Check",
      "description": "Check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Clerk's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Clerk Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "clerk",
      "shelf": "Clerk",
      "offeringId": "official-status-clerk",
      "offering": "Clerk Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "clerk",
        "official-status-clerk"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Clerk",
        "Clerk Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.clerk.official-status-clerk",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "clerk",
          "name": "Clerk"
        },
        "offering": {
          "id": "official-status-clerk",
          "name": "Clerk Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "clerk",
          "official-status-clerk"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Clerk",
          "Clerk Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "clerk",
        "auth",
        "identity",
        "sessions",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/clerk",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/clerk",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Clerk Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Clerk Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Clerk Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Clerk Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-openai",
      "resource": "https://agentbodega.store/api/status/openai",
      "type": "http",
      "method": "POST",
      "serviceName": "OpenAI Status Check",
      "description": "Check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check OpenAI's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "openai",
      "shelf": "Openai",
      "offeringId": "official-status-openai",
      "offering": "OpenAI Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "openai",
        "official-status-openai"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Openai",
        "OpenAI Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.openai.official-status-openai",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "openai",
          "name": "Openai"
        },
        "offering": {
          "id": "official-status-openai",
          "name": "OpenAI Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "openai",
          "official-status-openai"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Openai",
          "OpenAI Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "openai",
        "ai",
        "llm",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/openai",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/openai",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for OpenAI Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for OpenAI Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "OpenAI Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "official-status-anthropic",
      "resource": "https://agentbodega.store/api/status/anthropic",
      "type": "http",
      "method": "POST",
      "serviceName": "Anthropic Claude Status Check",
      "description": "Check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.",
      "longDescription": "Purpose: Check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nBest use: Use this when an agent needs check Anthropic Claude's official status source for current incidents, component health, and scheduled maintenance before an agent retries, deploys, or escalates.\nPrice: $0.005 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: none.\nOptional fields: includeComponents, includeIncidentDetails, incidentLimit, component, components.\n\nAccepted fields:\n- includeComponents (optional, boolean): Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true. Constraints: default: true.\n- includeIncidentDetails (optional, boolean): Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json. Constraints: default: false.\n- incidentLimit (optional, integer): Maximum recent incidents to return when includeIncidentDetails is true. Constraints: default: 5; min: 1; max: 20.\n- component (optional, string): Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government.\n- components (optional, array): Optional component selectors when the caller wants a scoped provider status. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"includeComponents\": true\n}\n```",
      "category": "official-status",
      "kind": "status-alias",
      "departmentId": "official-status",
      "department": "Status & Infra",
      "aisleId": "direct-status-checks",
      "aisle": "Direct Status Checks",
      "shelfId": "anthropic",
      "shelf": "Anthropic",
      "offeringId": "official-status-anthropic",
      "offering": "Anthropic Claude Status Check",
      "pathIds": [
        "official-status",
        "direct-status-checks",
        "anthropic",
        "official-status-anthropic"
      ],
      "pathLabels": [
        "Status & Infra",
        "Direct Status Checks",
        "Anthropic",
        "Anthropic Claude Status Check"
      ],
      "taxonomyPath": "official-status.direct-status-checks.anthropic.official-status-anthropic",
      "layout": {
        "department": {
          "id": "official-status",
          "name": "Status & Infra"
        },
        "aisle": {
          "id": "direct-status-checks",
          "name": "Direct Status Checks"
        },
        "shelf": {
          "id": "anthropic",
          "name": "Anthropic"
        },
        "offering": {
          "id": "official-status-anthropic",
          "name": "Anthropic Claude Status Check"
        },
        "pathIds": [
          "official-status",
          "direct-status-checks",
          "anthropic",
          "official-status-anthropic"
        ],
        "pathLabels": [
          "Status & Infra",
          "Direct Status Checks",
          "Anthropic",
          "Anthropic Claude Status Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "status",
        "anthropic",
        "claude",
        "ai",
        "llm",
        "api",
        "incident-response"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/status/anthropic",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.005"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/status/anthropic",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeComponents": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true."
          },
          "includeIncidentDetails": {
            "type": "boolean",
            "default": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json."
          },
          "incidentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true."
          },
          "component": {
            "type": "string",
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Components item value for Anthropic Claude Status Check."
            },
            "maxItems": 12,
            "description": "Optional component selectors when the caller wants a scoped provider status."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [],
        "optional": [
          "includeComponents",
          "includeIncidentDetails",
          "incidentLimit",
          "component",
          "components"
        ],
        "fields": [
          {
            "name": "includeComponents",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include components behavior for Anthropic Claude Status Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          },
          {
            "name": "includeIncidentDetails",
            "type": "boolean",
            "required": false,
            "description": "Optional deep incident history/timeline fetch. For Status.io providers this parses the public history page; for Statuspage providers it uses /api/v2/incidents.json.",
            "constraints": {
              "default": false
            }
          },
          {
            "name": "incidentLimit",
            "type": "integer",
            "required": false,
            "description": "Maximum recent incidents to return when includeIncidentDetails is true.",
            "constraints": {
              "default": 5,
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "component",
            "type": "string",
            "required": false,
            "description": "Optional component selector, alias, id, or name. For Anthropic examples: api, code, console, claude-ai, cowork, government."
          },
          {
            "name": "components",
            "type": "array",
            "required": false,
            "description": "Optional component selectors when the caller wants a scoped provider status.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "includeComponents": true
        }
      },
      "exampleRequest": {
        "includeComponents": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "service": {
          "name": "Anthropic Claude Status Check"
        },
        "ok": true,
        "status": "operational",
        "recommendation": "No provider incident is visible."
      },
      "configured": false
    },
    {
      "id": "domain-launch-check",
      "resource": "https://agentbodega.store/api/check/domain",
      "type": "http",
      "method": "POST",
      "serviceName": "DNS SSL Email Launch Check",
      "description": "Check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.",
      "longDescription": "Purpose: Check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.\nBest use: Use this when an agent needs check a domain's launch basics: DNS resolution, HTTPS reachability, MX, SPF, DMARC, CAA, and optional DKIM selectors.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: domain.\nOptional fields: dkimSelectors.\n\nAccepted fields:\n- domain (required, string): Domain name to inspect, without a URL scheme. Constraints: min length: 1.\n- dkimSelectors (optional, array): Optional DKIM selectors to check, such as google or selector1. Constraints: max items: 10.\n\nExample request body:\n```json\n{\n  \"domain\": \"example.com\",\n  \"dkimSelectors\": [\n    \"google\",\n    \"selector1\"\n  ]\n}\n```",
      "category": "launch-checks",
      "kind": "utility",
      "departmentId": "launch-checks",
      "department": "Launch Checks",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "domain-launch-check",
      "offering": "DNS SSL Email Launch Check",
      "pathIds": [
        "launch-checks",
        "readiness-audits",
        "utility",
        "domain-launch-check"
      ],
      "pathLabels": [
        "Launch Checks",
        "Readiness Audits",
        "Utility",
        "DNS SSL Email Launch Check"
      ],
      "taxonomyPath": "launch-checks.readiness-audits.utility.domain-launch-check",
      "layout": {
        "department": {
          "id": "launch-checks",
          "name": "Launch Checks"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "domain-launch-check",
          "name": "DNS SSL Email Launch Check"
        },
        "pathIds": [
          "launch-checks",
          "readiness-audits",
          "utility",
          "domain-launch-check"
        ],
        "pathLabels": [
          "Launch Checks",
          "Readiness Audits",
          "Utility",
          "DNS SSL Email Launch Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "dns",
        "ssl",
        "email",
        "deliverability",
        "launch-check"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/domain",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/domain",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "domain"
        ],
        "properties": {
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Domain name to inspect, without a URL scheme."
          },
          "dkimSelectors": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Dkim Selectors item value for DNS SSL Email Launch Check."
            },
            "maxItems": 10,
            "description": "Optional DKIM selectors to check, such as google or selector1."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "domain"
        ],
        "optional": [
          "dkimSelectors"
        ],
        "fields": [
          {
            "name": "domain",
            "type": "string",
            "required": true,
            "description": "Domain name to inspect, without a URL scheme.",
            "constraints": {
              "minLength": 1
            }
          },
          {
            "name": "dkimSelectors",
            "type": "array",
            "required": false,
            "description": "Optional DKIM selectors to check, such as google or selector1.",
            "constraints": {
              "maxItems": 10
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "domain": "example.com",
          "dkimSelectors": [
            "google",
            "selector1"
          ]
        }
      },
      "exampleRequest": {
        "domain": "example.com",
        "dkimSelectors": [
          "google",
          "selector1"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "domain": "example.com",
        "summary": {
          "status": "pass",
          "score": 92
        },
        "checks": [
          {
            "name": "https",
            "status": "pass"
          },
          {
            "name": "spf",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "hosted-artifact",
      "resource": "https://agentbodega.store/api/artifacts",
      "type": "http",
      "method": "POST",
      "serviceName": "Temporary Hosted Artifact",
      "description": "Create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.",
      "longDescription": "Purpose: Create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.\nBest use: Use this when an agent needs create a short-lived signed hosted artifact for agents: text, JSON, SVG badge, or redirect URL. No database required for small artifacts.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: kind, content.\nOptional fields: contentType, ttlSeconds, filename.\n\nAccepted fields:\n- kind (required, string): Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\".\n- content (required, any): Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json.\n- contentType (optional, string): Optional MIME type override.\n- ttlSeconds (optional, integer): Artifact lifetime in seconds. Constraints: default: 86400; min: 60; max: 604800.\n- filename (optional, string): Optional display filename. Constraints: max length: 120.\n\nExample request body:\n```json\n{\n  \"kind\": \"json\",\n  \"content\": {\n    \"ok\": true,\n    \"message\": \"hello agent\"\n  },\n  \"ttlSeconds\": 3600\n}\n```",
      "category": "agent-utilities",
      "kind": "http-json",
      "departmentId": "agent-utilities",
      "department": "Agent Utilities",
      "aisleId": "agent-artifacts",
      "aisle": "Agent Artifacts",
      "offeringId": "hosted-artifact",
      "offering": "Temporary Hosted Artifact",
      "pathIds": [
        "agent-utilities",
        "agent-artifacts",
        "hosted-artifact"
      ],
      "pathLabels": [
        "Agent Utilities",
        "Agent Artifacts",
        "Temporary Hosted Artifact"
      ],
      "taxonomyPath": "agent-utilities.agent-artifacts.hosted-artifact",
      "layout": {
        "department": {
          "id": "agent-utilities",
          "name": "Agent Utilities"
        },
        "aisle": {
          "id": "agent-artifacts",
          "name": "Agent Artifacts"
        },
        "offering": {
          "id": "hosted-artifact",
          "name": "Temporary Hosted Artifact"
        },
        "pathIds": [
          "agent-utilities",
          "agent-artifacts",
          "hosted-artifact"
        ],
        "pathLabels": [
          "Agent Utilities",
          "Agent Artifacts",
          "Temporary Hosted Artifact"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "artifact-hosting",
        "webhook-bin",
        "signed-url",
        "agent-tools"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/artifacts",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/artifacts",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "kind",
          "content"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "text",
              "json",
              "svg",
              "redirect"
            ],
            "description": "Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\"."
          },
          "content": {
            "description": "Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json."
          },
          "contentType": {
            "type": "string",
            "description": "Optional MIME type override."
          },
          "ttlSeconds": {
            "type": "integer",
            "minimum": 60,
            "maximum": 604800,
            "default": 86400,
            "description": "Artifact lifetime in seconds."
          },
          "filename": {
            "type": "string",
            "maxLength": 120,
            "description": "Optional display filename."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "kind",
          "content"
        ],
        "optional": [
          "contentType",
          "ttlSeconds",
          "filename"
        ],
        "fields": [
          {
            "name": "kind",
            "type": "string",
            "required": true,
            "description": "Kind filter for Temporary Hosted Artifact. Accepted values: \"text\", \"json\", \"svg\", \"redirect\". Constraints: accepted values: \"text\", \"json\", \"svg\", \"redirect\".",
            "constraints": {
              "enum": [
                "text",
                "json",
                "svg",
                "redirect"
              ]
            }
          },
          {
            "name": "content",
            "type": "any",
            "required": true,
            "description": "Artifact body. Use a string for text, SVG, and redirects, or any JSON value when kind is json."
          },
          {
            "name": "contentType",
            "type": "string",
            "required": false,
            "description": "Optional MIME type override."
          },
          {
            "name": "ttlSeconds",
            "type": "integer",
            "required": false,
            "description": "Artifact lifetime in seconds.",
            "constraints": {
              "default": 86400,
              "minimum": 60,
              "maximum": 604800
            }
          },
          {
            "name": "filename",
            "type": "string",
            "required": false,
            "description": "Optional display filename.",
            "constraints": {
              "maxLength": 120
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "kind": "json",
          "content": {
            "ok": true,
            "message": "hello agent"
          },
          "ttlSeconds": 3600
        }
      },
      "exampleRequest": {
        "kind": "json",
        "content": {
          "ok": true,
          "message": "hello agent"
        },
        "ttlSeconds": 3600
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "artifactUrl",
          "expiresAt"
        ],
        "properties": {
          "artifactUrl": {
            "type": "string",
            "format": "uri"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "outputExample": {
        "artifactUrl": "signed hosted URL",
        "expiresAt": "2026-07-04T16:00:00.000Z",
        "bytes": 128
      },
      "configured": false
    },
    {
      "id": "agent-launch-audit",
      "resource": "https://agentbodega.store/api/audit/agent-launch",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Launch Audit",
      "description": "Audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.",
      "longDescription": "Purpose: Audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.\nBest use: Use this when an agent needs audit whether a site or API is ready for AI agents: discoverability, markdown access, OpenAPI, MCP, Agent Skills, x402 commerce, and concrete fix instructions.\nPrice: $0.03 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: siteType, includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Launch Audit. Constraints: format: uri. Constraints: format: uri.\n- siteType (optional, string): Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"siteType\": \"all\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-launch-audit",
      "offering": "Agent Launch Audit",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-launch-audit"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Launch Audit"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-launch-audit",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-launch-audit",
          "name": "Agent Launch Audit"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-launch-audit"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Launch Audit"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "launch-audit",
        "mcp",
        "agent-skills",
        "x402",
        "seo"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/audit/agent-launch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.03"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/audit/agent-launch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Launch Audit. Constraints: format: uri."
          },
          "siteType": {
            "type": "string",
            "enum": [
              "all",
              "content",
              "api"
            ],
            "default": "all",
            "description": "Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "siteType",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Launch Audit. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "siteType",
            "type": "string",
            "required": false,
            "description": "Site Type filter for Agent Launch Audit. Accepted values: \"all\", \"content\", \"api\". Constraints: accepted values: \"all\", \"content\", \"api\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "content",
                "api"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Launch Audit. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "siteType": "all",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "siteType": "all",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 86,
          "verdict": "agent-ready with fixes"
        },
        "checks": [
          {
            "name": "OpenAPI",
            "status": "pass"
          },
          {
            "name": "x402 discovery",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-discoverability-check",
      "resource": "https://agentbodega.store/api/check/agent-discoverability",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Discoverability Check",
      "description": "Check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.",
      "longDescription": "Purpose: Check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.\nBest use: Use this when an agent needs check robots.txt, sitemap, Link headers, markdown access, llms.txt, and AI content-signal hints for agent-facing discoverability.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Discoverability Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-discoverability-check",
      "offering": "Agent Discoverability Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-discoverability-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Discoverability Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-discoverability-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-discoverability-check",
          "name": "Agent Discoverability Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-discoverability-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Discoverability Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "robots",
        "sitemap",
        "llms",
        "markdown",
        "link-headers"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-discoverability",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-discoverability",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Discoverability Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Discoverability Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Discoverability Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 78
        },
        "checks": [
          {
            "name": "robots.txt",
            "status": "pass"
          },
          {
            "name": "sitemap",
            "status": "pass"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-protocol-check",
      "resource": "https://agentbodega.store/api/check/agent-protocols",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Protocol Discovery Check",
      "description": "Check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.",
      "longDescription": "Purpose: Check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.\nBest use: Use this when an agent needs check OpenAPI, API catalog, MCP server cards, Agent Skills, auth.md, OAuth discovery, OAuth protected-resource metadata, A2A cards, and WebMCP hints.\nPrice: $0.02 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Protocol Discovery Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-protocol-check",
      "offering": "Agent Protocol Discovery Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-protocol-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Protocol Discovery Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-protocol-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-protocol-check",
          "name": "Agent Protocol Discovery Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-protocol-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Protocol Discovery Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "openapi",
        "mcp",
        "agent-skills",
        "oauth",
        "a2a",
        "webmcp"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-protocols",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.02"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-protocols",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Protocol Discovery Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Protocol Discovery Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Protocol Discovery Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 82
        },
        "checks": [
          {
            "name": "OpenAPI",
            "status": "pass"
          },
          {
            "name": "MCP card",
            "status": "neutral"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-commerce-check",
      "resource": "https://agentbodega.store/api/check/agent-commerce",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Commerce Check",
      "description": "Check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.",
      "longDescription": "Purpose: Check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.\nBest use: Use this when an agent needs check whether a site exposes machine-payable commerce metadata for x402, MPP-style OpenAPI payment hints, UCP, or ACP.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Commerce Check. Constraints: format: uri. Constraints: format: uri.\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true. Constraints: default: true.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"includeEvidence\": true\n}\n```",
      "category": "agent-readiness",
      "kind": "utility",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "utility",
      "shelf": "Utility",
      "offeringId": "agent-commerce-check",
      "offering": "Agent Commerce Check",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "utility",
        "agent-commerce-check"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Utility",
        "Agent Commerce Check"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.utility.agent-commerce-check",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "utility",
          "name": "Utility"
        },
        "offering": {
          "id": "agent-commerce-check",
          "name": "Agent Commerce Check"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "utility",
          "agent-commerce-check"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Utility",
          "Agent Commerce Check"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "x402",
        "mpp",
        "ucp",
        "acp",
        "commerce"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/check/agent-commerce",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/check/agent-commerce",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Commerce Check. Constraints: format: uri."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": true,
            "description": "Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Commerce Check. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Commerce Check. Constraints: default: true.",
            "constraints": {
              "default": true
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "includeEvidence": true
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "includeEvidence": true
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "score": 70
        },
        "checks": [
          {
            "name": "x402",
            "status": "pass"
          },
          {
            "name": "payment hints",
            "status": "neutral"
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-readiness-batch",
      "resource": "https://agentbodega.store/api/audit/agent-batch",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Readiness Batch Audit",
      "description": "Run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.",
      "longDescription": "Purpose: Run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.\nBest use: Use this when an agent needs run agent-readiness checks across up to five URLs in one paid call and return comparable scores, failures, and concrete next steps.\nPrice: $0.05 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: urls.\nOptional fields: scope, includeEvidence.\n\nAccepted fields:\n- urls (required, array): List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5. Constraints: min items: 1; max items: 5.\n- scope (optional, string): Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"urls\": [\n    \"https://example.com\",\n    \"https://example.org\"\n  ],\n  \"scope\": \"all\",\n  \"includeEvidence\": false\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-readiness-batch",
      "offering": "Agent Readiness Batch Audit",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-readiness-batch"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Readiness Batch Audit"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-readiness-batch",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-readiness-batch",
          "name": "Agent Readiness Batch Audit"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-readiness-batch"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Readiness Batch Audit"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "batch-audit",
        "launch-audit",
        "seo",
        "x402"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/audit/agent-batch",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.05"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/audit/agent-batch",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri",
              "description": "Urls item value for Agent Readiness Batch Audit. Constraints: format: uri."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5."
          },
          "scope": {
            "type": "string",
            "enum": [
              "all",
              "discoverability",
              "protocols",
              "commerce"
            ],
            "default": "all",
            "description": "Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "urls"
        ],
        "optional": [
          "scope",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "urls",
            "type": "array",
            "required": true,
            "description": "List of urls values for Agent Readiness Batch Audit. Constraints: min items: 1; max items: 5.",
            "constraints": {
              "minItems": 1,
              "maxItems": 5
            },
            "items": {
              "type": "string"
            }
          },
          {
            "name": "scope",
            "type": "string",
            "required": false,
            "description": "Scope filter for Agent Readiness Batch Audit. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "discoverability",
                "protocols",
                "commerce"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Readiness Batch Audit. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "urls": [
            "https://example.com",
            "https://example.org"
          ],
          "scope": "all",
          "includeEvidence": false
        }
      },
      "exampleRequest": {
        "urls": [
          "https://example.com",
          "https://example.org"
        ],
        "scope": "all",
        "includeEvidence": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "summary": {
          "compared": 3,
          "best": "example.com"
        },
        "results": [
          {
            "site": "example.com",
            "score": 86
          }
        ]
      },
      "configured": false
    },
    {
      "id": "agent-ready-badge",
      "resource": "https://agentbodega.store/api/badge/agent-ready",
      "type": "http",
      "method": "POST",
      "serviceName": "Agent Ready Badge",
      "description": "Generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.",
      "longDescription": "Purpose: Generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.\nBest use: Use this when an agent needs generate an agent-readiness score and SVG badge for a URL using the same checks as the launch audit.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: scope, includeEvidence.\n\nAccepted fields:\n- url (required, string): Url value for Agent Ready Badge. Constraints: format: uri. Constraints: format: uri.\n- scope (optional, string): Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".\n- includeEvidence (optional, boolean): Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false. Constraints: default: false.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"scope\": \"all\",\n  \"includeEvidence\": false\n}\n```",
      "category": "agent-readiness",
      "kind": "http-json",
      "departmentId": "agent-readiness",
      "department": "Agent Readiness",
      "aisleId": "readiness-audits",
      "aisle": "Readiness Audits",
      "shelfId": "http-json",
      "shelf": "Http Json",
      "offeringId": "agent-ready-badge",
      "offering": "Agent Ready Badge",
      "pathIds": [
        "agent-readiness",
        "readiness-audits",
        "http-json",
        "agent-ready-badge"
      ],
      "pathLabels": [
        "Agent Readiness",
        "Readiness Audits",
        "Http Json",
        "Agent Ready Badge"
      ],
      "taxonomyPath": "agent-readiness.readiness-audits.http-json.agent-ready-badge",
      "layout": {
        "department": {
          "id": "agent-readiness",
          "name": "Agent Readiness"
        },
        "aisle": {
          "id": "readiness-audits",
          "name": "Readiness Audits"
        },
        "shelf": {
          "id": "http-json",
          "name": "Http Json"
        },
        "offering": {
          "id": "agent-ready-badge",
          "name": "Agent Ready Badge"
        },
        "pathIds": [
          "agent-readiness",
          "readiness-audits",
          "http-json",
          "agent-ready-badge"
        ],
        "pathLabels": [
          "Agent Readiness",
          "Readiness Audits",
          "Http Json",
          "Agent Ready Badge"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "agent-readiness",
        "badge",
        "svg",
        "launch-audit"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/badge/agent-ready",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/badge/agent-ready",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for Agent Ready Badge. Constraints: format: uri."
          },
          "scope": {
            "type": "string",
            "enum": [
              "all",
              "discoverability",
              "protocols",
              "commerce"
            ],
            "default": "all",
            "description": "Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\"."
          },
          "includeEvidence": {
            "type": "boolean",
            "default": false,
            "description": "Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "scope",
          "includeEvidence"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for Agent Ready Badge. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "scope",
            "type": "string",
            "required": false,
            "description": "Scope filter for Agent Ready Badge. Accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\". Constraints: accepted values: \"all\", \"discoverability\", \"protocols\", \"commerce\"; default: \"all\".",
            "constraints": {
              "enum": [
                "all",
                "discoverability",
                "protocols",
                "commerce"
              ],
              "default": "all"
            }
          },
          {
            "name": "includeEvidence",
            "type": "boolean",
            "required": false,
            "description": "Set true to enable include evidence behavior for Agent Ready Badge. Constraints: default: false.",
            "constraints": {
              "default": false
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "scope": "all",
          "includeEvidence": false
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "scope": "all",
        "includeEvidence": false
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "score": 86,
        "badgeSvg": "<svg>...</svg>",
        "summary": {
          "verdict": "agent-ready"
        }
      },
      "configured": false
    },
    {
      "id": "x402-directory-pack",
      "resource": "https://agentbodega.store/api/package/x402-directory",
      "type": "http",
      "method": "POST",
      "serviceName": "x402 Directory Listing Pack",
      "description": "Build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.",
      "longDescription": "Purpose: Build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.\nBest use: Use this when an agent needs build a compact listing payload for x402 directories: service name, discovery links, payment metadata, endpoint counts, tags, and readiness warnings.\nPrice: $0.01 per successful paid call, settled by x402 before fulfillment.\nFulfillment: Managed AgentBodega HTTP+JSON endpoint. Upstream provider details are intentionally not disclosed unless the response explicitly includes managed source metadata.\n\nInput: send a JSON request body.\nRequired fields: url.\nOptional fields: name, tags.\n\nAccepted fields:\n- url (required, string): Url value for x402 Directory Listing Pack. Constraints: format: uri. Constraints: format: uri.\n- name (optional, string): Name value for x402 Directory Listing Pack. Constraints: max length: 80. Constraints: max length: 80.\n- tags (optional, array): List of tags values for x402 Directory Listing Pack. Constraints: max items: 12. Constraints: max items: 12.\n\nExample request body:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"name\": \"Example x402 API\",\n  \"tags\": [\n    \"x402\",\n    \"agents\"\n  ]\n}\n```",
      "category": "x402-tools",
      "kind": "http-json",
      "departmentId": "x402-tools",
      "department": "x402 Tools",
      "aisleId": "payment-discovery",
      "aisle": "Payment Discovery",
      "shelfId": "directory-packaging",
      "shelf": "Directory Packaging",
      "offeringId": "x402-directory-pack",
      "offering": "x402 Directory Listing Pack",
      "pathIds": [
        "x402-tools",
        "payment-discovery",
        "directory-packaging",
        "x402-directory-pack"
      ],
      "pathLabels": [
        "x402 Tools",
        "Payment Discovery",
        "Directory Packaging",
        "x402 Directory Listing Pack"
      ],
      "taxonomyPath": "x402-tools.payment-discovery.directory-packaging.x402-directory-pack",
      "layout": {
        "department": {
          "id": "x402-tools",
          "name": "x402 Tools"
        },
        "aisle": {
          "id": "payment-discovery",
          "name": "Payment Discovery"
        },
        "shelf": {
          "id": "directory-packaging",
          "name": "Directory Packaging"
        },
        "offering": {
          "id": "x402-directory-pack",
          "name": "x402 Directory Listing Pack"
        },
        "pathIds": [
          "x402-tools",
          "payment-discovery",
          "directory-packaging",
          "x402-directory-pack"
        ],
        "pathLabels": [
          "x402 Tools",
          "Payment Discovery",
          "Directory Packaging",
          "x402 Directory Listing Pack"
        ]
      },
      "tags": [
        "l402",
        "lightning",
        "agent-tools",
        "x402",
        "directory-listing",
        "marketplace",
        "bazaar",
        "discovery"
      ],
      "payment": {
        "protocol": "l402",
        "scheme": "L402",
        "network": "bitcoin-lightning",
        "status": "discovery_only",
        "resource": "https://agentbodega.store/api/package/x402-directory",
        "price": {
          "mode": "fixed",
          "currency": "USD",
          "amount": "0.01"
        },
        "quote": {
          "unit": "sats",
          "amount": null,
          "source": "not_configured"
        },
        "challenge": {
          "method": "POST",
          "url": "https://agentbodega.store/api/package/x402-directory",
          "header": "WWW-Authenticate",
          "headerFormat": "L402 macaroon=\"<base64>\", invoice=\"<bolt11>\"",
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "credentialHeader": "Authorization",
          "credentialFormat": "L402 <macaroon>:<preimage>"
        },
        "gateway": {
          "mode": "trusted_reverse_proxy",
          "enabled": false,
          "issuer": "https://agentbodega-l402-gateway-2tupfjztia-uc.a.run.app/",
          "proofHeader": "x-agentbodega-l402-gateway",
          "requiredSecretEnv": "AGENTBODEGA_L402_GATEWAY_TOKEN",
          "acceptedMetadataHeaders": [
            "x-agentbodega-l402-payment-hash",
            "x-agentbodega-l402-preimage-hash",
            "x-agentbodega-l402-invoice-hash",
            "x-agentbodega-l402-amount-sats",
            "x-agentbodega-l402-amount-msats",
            "x-agentbodega-l402-macaroon-id",
            "x-agentbodega-l402-caveats"
          ],
          "forbiddenForwardHeaders": [
            "authorization"
          ],
          "note": "The L402 issuer/proxy must verify the macaroon and preimage before forwarding. Forward the shared proof header and non-sensitive hashes only; do not forward raw macaroons, invoices, or preimages to the Worker."
        },
        "discovery": "https://agentbodega.store/.well-known/l402-services",
        "settlement": {
          "sourceOfTruth": "lightning_invoice_preimage",
          "verification": "not_enabled_in_worker"
        },
        "note": "L402 is advertised for discovery and client handoff. Live AgentBodega fulfillment is currently verified through x402 until a Lightning invoice issuer is configured."
      },
      "inputSchema": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Url value for x402 Directory Listing Pack. Constraints: format: uri."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Name value for x402 Directory Listing Pack. Constraints: max length: 80."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Tags item value for x402 Directory Listing Pack."
            },
            "maxItems": 12,
            "description": "List of tags values for x402 Directory Listing Pack. Constraints: max items: 12."
          }
        },
        "additionalProperties": false
      },
      "inputContract": {
        "contentType": "application/json",
        "required": [
          "url"
        ],
        "optional": [
          "name",
          "tags"
        ],
        "fields": [
          {
            "name": "url",
            "type": "string",
            "required": true,
            "description": "Url value for x402 Directory Listing Pack. Constraints: format: uri.",
            "constraints": {
              "format": "uri"
            }
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Name value for x402 Directory Listing Pack. Constraints: max length: 80.",
            "constraints": {
              "maxLength": 80
            }
          },
          {
            "name": "tags",
            "type": "array",
            "required": false,
            "description": "List of tags values for x402 Directory Listing Pack. Constraints: max items: 12.",
            "constraints": {
              "maxItems": 12
            },
            "items": {
              "type": "string"
            }
          }
        ],
        "additionalProperties": false,
        "example": {
          "url": "https://example.com",
          "name": "Example x402 API",
          "tags": [
            "x402",
            "agents"
          ]
        }
      },
      "exampleRequest": {
        "url": "https://example.com",
        "name": "Example x402 API",
        "tags": [
          "x402",
          "agents"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": true
      },
      "outputExample": {
        "listing": {
          "payableResourceCount": 12,
          "score": 91
        },
        "files": [
          {
            "name": "openapi.json"
          },
          {
            "name": "x402 discovery"
          }
        ]
      },
      "configured": false
    }
  ],
  "seeAlso": [
    "https://agentbodega.store/.well-known/x402",
    "https://agentbodega.store/api/directory",
    "https://agentbodega.store/api/taxonomy",
    "https://agentbodega.store/api/storefront",
    "https://agentbodega.store/openapi.json",
    "https://agentbodega.store/llms.txt"
  ],
  "note": "This document exposes AgentBodega to L402-aware discovery surfaces. Live paid fulfillment remains x402-backed until a Lightning invoice issuer is configured."
}