{
    "openapi": "3.1.0",
    "info": {
        "title": "InBlan — API de catálogo y solicitud de presupuesto",
        "version": "1.1.38",
        "description": "API activa.\nversion=1.1.38 updated=2026-11-10T19:26:20+01:00\nGET /productos, GET /productos/{slug}, POST /presupuestos.\nRate limit POST /presupuestos: ~10 req / 10 min por IP (+ antispam).\nMarkdown: {url}/index.md · Índice: https://staging.inblan.com/llms.txt · OpenAPI JSON: https://staging.inblan.com/openapi.json\nMCP: no desplegado; usar esta OpenAPI (Custom GPT Action / curl / código).",
        "contact": {
            "name": "InBlan",
            "email": "info@inblan.com",
            "url": "https://staging.inblan.com/contacto/"
        },
        "x-updated": "2026-11-10T19:26:20+01:00",
        "x-theme": "1.1.38",
        "x-rateLimit": {
            "presupuestos": {
                "limit": 10,
                "window": "10m",
                "scope": "ip",
                "note": "Respuesta 429 si se supera. Idempotency-Key evita duplicados en reintentos."
            }
        }
    },
    "servers": [
        {
            "url": "https://staging.inblan.com/wp-json/inblan/v1",
            "description": "Origen actual del sitio"
        }
    ],
    "paths": {
        "/productos": {
            "get": {
                "operationId": "listProducts",
                "summary": "Lista de productos con especificaciones",
                "parameters": [
                    {
                        "name": "lang",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "es",
                                "en",
                                "fr",
                                "pt"
                            ],
                            "default": "es"
                        }
                    },
                    {
                        "name": "categoria",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Lista de productos",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Producto"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/productos/{slug}": {
            "get": {
                "operationId": "getProduct",
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Producto",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Producto"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "No existe",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/presupuestos": {
            "post": {
                "operationId": "createQuoteRequest",
                "summary": "Enviar solicitud de presupuesto (requiere consentimiento del usuario)",
                "description": "No genera precio ni pedido. Responde 202 si se acepta.\nCabecera obligatoria Idempotency-Key (UUID).\nRate limit: ~10 / 10 min por IP.",
                "parameters": [
                    {
                        "name": "Idempotency-Key",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "UUID único por intento de envío. Reintentos con la misma clave no duplican."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SolicitudPresupuesto"
                            },
                            "example": {
                                "nombre": "Prueba QA",
                                "email": "prueba.qa@example.com",
                                "telefono": "600000000",
                                "empresa": "QA Agent",
                                "pais": "ES",
                                "mensaje": "Solicitud de prueba desde OpenAPI (no es un pedido).",
                                "privacidad_aceptada": true,
                                "idioma": "es",
                                "productos": [
                                    {
                                        "slug": "algodonera-de-azucar",
                                        "modelo": "AM15",
                                        "cantidad": 1
                                    }
                                ],
                                "agente": "openapi-example"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Solicitud recibida. InBlan contactará después.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PresupuestoAceptado"
                                },
                                "example": {
                                    "id": "Q-K2KTRHKH",
                                    "estado": "recibida",
                                    "mensaje": "Solicitud recibida. InBlan contactará por email o teléfono. Esta respuesta no es un presupuesto ni un pedido."
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Datos inválidos (email, campos requeridos, Idempotency-Key ausente).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                },
                                "example": {
                                    "code": "invalid",
                                    "message": "email inválido",
                                    "data": {
                                        "status": 400
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Falta aceptación de privacidad (privacidad_aceptada debe ser true).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                },
                                "example": {
                                    "code": "privacy",
                                    "message": "Debe aceptarse la política de privacidad",
                                    "data": {
                                        "status": 422
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit o antispam.",
                        "headers": {
                            "Retry-After": {
                                "description": "Segundos hasta poder reintentar",
                                "schema": {
                                    "type": "integer"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                },
                                "example": {
                                    "error": "rate_limit"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Producto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "nombre": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "categoria": {
                        "type": "string"
                    },
                    "descripcion": {
                        "type": "string"
                    },
                    "ficha_pdf": {
                        "type": "string"
                    },
                    "variantes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "SolicitudPresupuesto": {
                "type": "object",
                "required": [
                    "nombre",
                    "email",
                    "mensaje",
                    "privacidad_aceptada"
                ],
                "properties": {
                    "nombre": {
                        "type": "string",
                        "maxLength": 120
                    },
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "telefono": {
                        "type": "string"
                    },
                    "empresa": {
                        "type": "string"
                    },
                    "pais": {
                        "type": "string"
                    },
                    "mensaje": {
                        "type": "string",
                        "maxLength": 4000
                    },
                    "productos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "slug"
                            ],
                            "properties": {
                                "slug": {
                                    "type": "string"
                                },
                                "modelo": {
                                    "type": "string"
                                },
                                "cantidad": {
                                    "type": "integer",
                                    "minimum": 1
                                }
                            }
                        }
                    },
                    "idioma": {
                        "type": "string",
                        "enum": [
                            "es",
                            "en",
                            "fr",
                            "pt"
                        ]
                    },
                    "privacidad_aceptada": {
                        "type": "boolean",
                        "const": true,
                        "description": "Usuario aceptó https://staging.inblan.com/politica-de-privacidad/"
                    },
                    "agente": {
                        "type": "string"
                    }
                }
            },
            "PresupuestoAceptado": {
                "type": "object",
                "required": [
                    "id",
                    "estado",
                    "mensaje"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "pattern": "^Q-[A-Z0-9]{8}$",
                        "description": "Identificador de acuse de recibo (no es número de pedido ni de presupuesto). Formato Q- + 8 caracteres alfanuméricos. Hoy no hay endpoint GET de consulta por id; sirve para referencia en correo/seguimiento humano.",
                        "example": "Q-K2KTRHKH"
                    },
                    "estado": {
                        "type": "string",
                        "const": "recibida",
                        "description": "Estado actual: siempre \"recibida\" en 202. No implica precio ni plazo."
                    },
                    "mensaje": {
                        "type": "string",
                        "description": "Texto humano; no promete presupuesto ni pedido."
                    }
                }
            },
            "Error": {
                "type": "object",
                "required": [
                    "code",
                    "message"
                ],
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "Código de error estable"
                    },
                    "message": {
                        "type": "string"
                    },
                    "data": {
                        "type": "object",
                        "additionalProperties": true
                    }
                }
            }
        }
    }
}