{
  "openapi": "3.1.0",
  "info": {
    "title": "LupaPlaza API",
    "description": "Catálogo chico de APIs LatAm pagables por uso vía x402. Discovery público = solo 402 live en mainnet. Testnet (p. ej. AR Agent en Base Sepolia) es para humanos y uso local, no inventario de liquidación.",
    "version": "2.0.0",
    "contact": {
      "name": "Marcelo Switach",
      "url": "https://github.com/mswitach/marketplace-402"
    }
  },
  "servers": [
    {
      "url": "https://lupaplaza.com",
      "description": "Estático (Vercel / GitHub Pages) — solo GET de discovery"
    },
    {
      "url": "http://localhost:3402",
      "description": "Express local — submit, probe, MCP POST, /api/search"
    }
  ],
  "paths": {
    "/.well-known/x402.json": {
      "get": {
        "summary": "Well-known x402 del marketplace",
        "description": "Metadatos de LupaPlaza: marketplace de APIs pagables en mainnet. Testnet no se anuncia como inventario settleable. En el host estático mcp.live_proxy es local-only.",
        "responses": {
          "200": {
            "description": "Metadatos del marketplace"
          }
        }
      }
    },
    "/discovery/resources": {
      "get": {
        "summary": "Listado de recursos (Bazaar-compatible)",
        "description": "Catálogo estático **solo mainnet** generado en `npm run build`. Testnet/dead/incomplete no entran. También existe /discovery/resources.json.",
        "responses": {
          "200": {
            "description": "Catálogo de APIs"
          }
        }
      }
    },
    "/discovery/resources.json": {
      "get": {
        "summary": "Mismo catálogo, con extensión .json",
        "responses": {
          "200": {
            "description": "Catálogo de APIs"
          }
        }
      }
    },
    "/api/apis.json": {
      "get": {
        "summary": "Dump honesto del catálogo",
        "description": "Dump completo con callable honesto (mainnet|testnet|dead|incomplete). /discovery/resources es un subset mainnet-only. En el host estático no hay /api/search.",
        "responses": {
          "200": {
            "description": "Dataset completo"
          }
        }
      }
    },
    "/mcp/manifest.json": {
      "get": {
        "summary": "Manifest MCP (estático)",
        "description": "Lista buscar_servicios, obtener_servicio y llamar_servicio. El call-through en vivo no está desplegado: el agente paga el seller.",
        "responses": {
          "200": {
            "description": "Manifest de herramientas"
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "summary": "Guía para agentes/LLMs",
        "responses": {
          "200": {
            "description": "Texto plano"
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "summary": "Esta especificación OpenAPI 3.1",
        "responses": {
          "200": {
            "description": "OpenAPI document"
          }
        }
      }
    },
    "/api/search": {
      "get": {
        "summary": "Búsqueda con facetas (solo Express local)",
        "description": "No existe en Vercel/Pages. En el host estático filtrá /api/apis.json o /discovery/resources.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "callable",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "mainnet",
                "testnet",
                "dead",
                "incomplete"
              ]
            }
          },
          {
            "name": "taxonomy",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultados con facetas"
          }
        }
      }
    },
    "/api/submit": {
      "post": {
        "summary": "Envío de seller (solo Express local)",
        "description": "No hay serverless de submit. Decisión 28 Ago: Express no se publica.",
        "responses": {
          "200": {
            "description": "Recibido (MVP: no escribe data/apis.json)"
          }
        }
      }
    },
    "/api/probe": {
      "post": {
        "summary": "Probe on-demand (solo Express local)",
        "responses": {
          "200": {
            "description": "Estado actual o instrucciones"
          }
        }
      }
    },
    "/mcp": {
      "get": {
        "summary": "Manifest MCP vivo (solo Express local)",
        "responses": {
          "200": {
            "description": "Herramientas MCP"
          }
        }
      }
    },
    "/mcp/buscar_servicios": {
      "post": {
        "summary": "buscar_servicios (solo Express local)",
        "responses": {
          "200": {
            "description": "Resultados"
          }
        }
      }
    },
    "/mcp/obtener_servicio": {
      "post": {
        "summary": "obtener_servicio (solo Express local)",
        "responses": {
          "200": {
            "description": "Detalle"
          }
        }
      }
    },
    "/mcp/llamar_servicio": {
      "post": {
        "summary": "llamar_servicio (solo Express local; no hay pay-through público)",
        "description": "En este MVP devuelve instrucciones. El agente paga el endpoint del seller.",
        "responses": {
          "200": {
            "description": "Instrucciones de pago directo"
          }
        }
      }
    }
  }
}
