{
  "openapi": "3.1.0",
  "info": {
    "title": "Tapetes Publicitarios MORSAR",
    "version": "1.0.0",
    "description": "Información pública del sitio y el cobro del pedido. Calcular precio por MCP, crear la solicitud y consultar el estatus no se cobran. GET /api/x402/cotizacion cobra 0.01 USDC por x402. El anticipo o el total del pedido se pagan con tarjeta en Stripe, en la página del pedido."
  },
  "servers": [{ "url": "https://tapetesmorsar.com" }],
  "x-service-info": {
    "categories": ["commerce"],
    "docs": {
      "homepage": "https://tapetesmorsar.com/",
      "apiReference": "https://tapetesmorsar.com/openapi.json",
      "llms": "https://tapetesmorsar.com/llms.txt"
    }
  },
  "paths": {
    "/llms.txt": {
      "get": {
        "operationId": "leerResumen",
        "summary": "Resumen del sitio para agentes",
        "responses": {
          "200": {
            "description": "Texto plano",
            "content": { "text/plain": { "schema": { "type": "string" } } }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "mcp",
        "summary": "MCP: calcular precio, crear solicitud, abrir pago Stripe y consultar el pedido con su token",
        "responses": {
          "200": { "description": "Respuesta JSON-RPC" },
          "202": { "description": "Notificación aceptada" }
        }
      }
    },
    "/pedido": {
      "get": {
        "operationId": "pagarPedido",
        "summary": "Pagar el anticipo o el total de un pedido con Stripe",
        "description": "Cargo único con tarjeta. El anticipo es el 50% del total cotizado, IVA incluido, con un mínimo de 100 MXN. El total liquida el pedido. El monto exacto lo confirma el pedido con el token de crear_solicitud; la tarjeta se escribe en esta página, no en el chat. No hay cobro por llamada ni sesión de pago.",
        "parameters": [
          {
            "name": "t",
            "in": "query",
            "required": true,
            "description": "Token hexadecimal de 64 caracteres del link personal del pedido.",
            "schema": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
          },
          {
            "name": "pagar",
            "in": "query",
            "required": false,
            "description": "anticipo cobra el 50%; total cobra el saldo completo.",
            "schema": { "type": "string", "enum": ["anticipo", "total"], "default": "anticipo" }
          }
        ],
        "x-payment-info": {
          "intent": "charge",
          "method": "stripe",
          "amount": null,
          "currency": "mxn",
          "description": "Precio dinámico en centavos MXN: 50% del total cotizado con IVA, mínimo 10000. El pedido confirma el entero antes de cobrar."
        },
        "responses": {
          "200": {
            "description": "Página donde el cliente paga con Stripe"
          },
          "402": {
            "description": "Payment Required"
          }
        }
      }
    },
    "/api/geo": {
      "get": {
        "operationId": "geoEstado",
        "summary": "Estado de México inferido por IP, para preseleccionar el cotizador",
        "responses": {
          "200": {
            "description": "Código ISO 3166-2 de la entidad, o null",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": { "estado": { "type": ["string", "null"] } },
                  "required": ["estado"]
                }
              }
            }
          }
        }
      }
    },
    "/api/x402/cotizacion": {
      "get": {
        "operationId": "cotizacionX402",
        "summary": "Estimado de precio. Sin pago responde 402 con los requisitos x402.",
        "parameters": [
          { "name": "material", "in": "query", "required": true, "schema": { "type": "string", "enum": ["ryzo", "alfombra"] } },
          { "name": "con_logo", "in": "query", "required": true, "schema": { "type": "boolean" } },
          { "name": "largo_cm", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "ancho_cm", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "cantidad", "in": "query", "required": true, "schema": { "type": "integer" } }
        ],
        "x-payment-info": {
          "protocols": ["x402"],
          "price": { "mode": "fixed", "currency": "USD", "amount": "0.01" },
          "description": "USDC vía x402. Facilitador y wallet en /.well-known/x402."
        },
        "responses": {
          "200": { "description": "Estimado pagado" },
          "402": { "description": "Payment Required. Cuerpo y encabezado PAYMENT-REQUIRED con accepts." }
        }
      }
    },
    "/.well-known/x402": {
      "get": {
        "operationId": "descubrimientoX402",
        "summary": "Recursos x402, facilitador y dirección de cobro",
        "responses": {
          "200": { "description": "Documento de descubrimiento" }
        }
      }
    },
    "/api/salud": {
      "get": {
        "operationId": "salud",
        "summary": "Estado del sitio",
        "responses": {
          "200": {
            "description": "El sitio responde",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": { "status": { "type": "string", "const": "ok" } },
                  "required": ["status"]
                }
              }
            }
          }
        }
      }
    }
  }
}
