{
  "openapi": "3.1.1",
  "info": {
    "title": "Loja ASSIST Catalog API",
    "version": "1.1.0",
    "description": "API oficial de consulta do catálogo da ASSIST Tecnologia. Consulta anônima com GET/HEAD; não cria pedidos, não reserva produtos e não envia mensagens. Preço, disponibilidade e compatibilidade exigem confirmação comercial. Paginação máxima de 100 itens e offset 10000; parâmetros desconhecidos ou repetidos são rejeitados. O serviço não fornece acesso à administração ou dados pessoais. Rate limit: 300 requisições por minuto UTC por IP. HTTP 429 inclui Retry-After. Política de versioning, deprecation e Sunset: https://loja.assist.com.br/api-policy. A v1 está ativa, sem data de encerramento.",
    "contact": {
      "name": "ASSIST Tecnologia",
      "email": "contato@assist.com.br",
      "url": "https://loja.assist.com.br/contato"
    }
  },
  "servers": [
    {
      "url": "https://loja.assist.com.br",
      "description": "Loja ASSIST em produção"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Catálogo",
      "description": "Operações públicas e somente de leitura."
    }
  ],
  "externalDocs": {
    "description": "Documentação ASSIST para desenvolvedores e agentes",
    "url": "https://loja.assist.com.br/developers"
  },
  "paths": {
    "/api": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "Descobrir a API ASSIST",
        "description": "Retorna links para o contrato e as coleções públicas. Não exige autenticação.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headGetApiIndex",
        "summary": "Verificar cabeçalhos: Descobrir a API ASSIST",
        "description": "Mesmos status e cabeçalhos de GET, sem corpo. Retorna links para o contrato e as coleções públicas. Não exige autenticação.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          }
        }
      }
    },
    "/api/v1": {
      "get": {
        "operationId": "getCatalog",
        "summary": "Consultar o índice da API v1",
        "description": "Retorna links da API de consulta. Não realiza ações comerciais.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headGetCatalog",
        "summary": "Verificar cabeçalhos: Consultar o índice da API v1",
        "description": "Mesmos status e cabeçalhos de GET, sem corpo. Retorna links da API de consulta. Não realiza ações comerciais.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          }
        }
      }
    },
    "/api/v1/products": {
      "get": {
        "operationId": "listProducts",
        "summary": "Buscar produtos ASSIST",
        "description": "Lista produtos publicados; busca por nome ou SKU e filtros de marca/categoria. Paginação estável por nome e slug. O catálogo não garante estoque e preços devem ser confirmados.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Quantidade de itens por página; padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Posição inicial em ordem de nome e slug; padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          },
          {
            "name": "q",
            "in": "query",
            "description": "Trecho literal do nome ou SKU; caracteres %, _ e barra invertida são tratados como texto.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            }
          },
          {
            "name": "brand",
            "in": "query",
            "description": "Slug de uma marca ativa, retornado por listBrands.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,199}$",
              "maxLength": 200
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Slug de uma categoria ativa, retornado por listCategories.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,199}$",
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductPage"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headListProducts",
        "summary": "Verificar cabeçalhos: Buscar produtos ASSIST",
        "description": "Mesmos status e cabeçalhos de GET, sem corpo. Lista produtos publicados; busca por nome ou SKU e filtros de marca/categoria. Paginação estável por nome e slug. O catálogo não garante estoque e preços devem ser confirmados.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Quantidade de itens por página; padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Posição inicial em ordem de nome e slug; padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          },
          {
            "name": "q",
            "in": "query",
            "description": "Trecho literal do nome ou SKU; caracteres %, _ e barra invertida são tratados como texto.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            }
          },
          {
            "name": "brand",
            "in": "query",
            "description": "Slug de uma marca ativa, retornado por listBrands.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,199}$",
              "maxLength": 200
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Slug de uma categoria ativa, retornado por listCategories.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,199}$",
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          }
        }
      }
    },
    "/api/v1/products/{slug}": {
      "get": {
        "operationId": "getProduct",
        "summary": "Consultar especificações de um produto",
        "description": "Retorna descrição, SKU, imagens próprias e especificações do produto publicado. Use um slug retornado por listProducts. Produtos fora do catálogo público retornam 404.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug do produto retornado pela listagem.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,199}$",
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headGetProduct",
        "summary": "Verificar cabeçalhos: Consultar especificações de um produto",
        "description": "Mesmos status e cabeçalhos de GET, sem corpo. Retorna descrição, SKU, imagens próprias e especificações do produto publicado. Use um slug retornado por listProducts. Produtos fora do catálogo público retornam 404.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug do produto retornado pela listagem.",
            "schema": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,199}$",
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          }
        }
      }
    },
    "/api/v1/brands": {
      "get": {
        "operationId": "listBrands",
        "summary": "Listar marcas ASSIST",
        "description": "Lista marcas ativas para descoberta de slugs e filtragem de produtos.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Quantidade de itens por página; padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Posição inicial em ordem de nome e slug; padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CollectionPage"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headListBrands",
        "summary": "Verificar cabeçalhos: Listar marcas ASSIST",
        "description": "Mesmos status e cabeçalhos de GET, sem corpo. Lista marcas ativas para descoberta de slugs e filtragem de produtos.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Quantidade de itens por página; padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Posição inicial em ordem de nome e slug; padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          }
        }
      }
    },
    "/api/v1/categories": {
      "get": {
        "operationId": "listCategories",
        "summary": "Listar categorias ASSIST",
        "description": "Lista categorias ativas para descoberta de slugs e filtragem de produtos.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Quantidade de itens por página; padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Posição inicial em ordem de nome e slug; padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CollectionPage"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headListCategories",
        "summary": "Verificar cabeçalhos: Listar categorias ASSIST",
        "description": "Mesmos status e cabeçalhos de GET, sem corpo. Lista categorias ativas para descoberta de slugs e filtragem de produtos.",
        "tags": [
          "Catálogo"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Quantidade de itens por página; padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Posição inicial em ordem de nome e slug; padrão 0.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Consulta concluída.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido, desconhecido ou repetido.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "404": {
            "description": "Endpoint ou produto inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "405": {
            "description": "Método não permitido; use GET ou HEAD.",
            "headers": {
              "Allow": {
                "description": "Métodos permitidos.",
                "schema": {
                  "type": "string",
                  "example": "GET, HEAD"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "503": {
            "description": "Catálogo temporariamente indisponível; tente novamente após Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Segundos antes de tentar novamente.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "429": {
            "description": "Quota por IP esgotada. Aguarde Retry-After antes de repetir.",
            "headers": {
              "Retry-After": {
                "description": "Segundos até o próximo minuto UTC.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Product": {
        "type": "object",
        "description": "Produto do catálogo público. Consulte a equipe antes de decidir compra, compatibilidade ou disponibilidade.",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome publicado do produto."
          },
          "slug": {
            "type": "string",
            "description": "Identificador utilizado na consulta por produto."
          },
          "sku": {
            "type": "string",
            "description": "Código do modelo informado no catálogo."
          },
          "url": {
            "type": "string",
            "description": "Página canônica do produto.",
            "format": "uri"
          },
          "description": {
            "type": "string",
            "description": "Descrição pública em texto, sem marcação HTML."
          },
          "price": {
            "type": [
              "number",
              "null"
            ],
            "exclusiveMinimum": 0,
            "description": "Preço informativo em BRL; null significa sob consulta, nunca gratuito."
          },
          "currency": {
            "type": "string",
            "description": "Moeda do preço informativo.",
            "const": "BRL"
          },
          "availability": {
            "type": "string",
            "description": "Disponibilidade sujeita a confirmação comercial.",
            "const": "confirm_with_sales"
          },
          "brand": {
            "description": "Marca pública associada, quando disponível.",
            "anyOf": [
              {
                "type": "object",
                "description": "Marca do equipamento.",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Nome publicado da marca."
                  },
                  "slug": {
                    "type": "string",
                    "description": "Identificador da marca no catálogo."
                  }
                },
                "required": [
                  "name",
                  "slug"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "images": {
            "type": "array",
            "description": "Imagens públicas em domínios da ASSIST.",
            "maxItems": 8,
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "attributes": {
            "type": "array",
            "description": "Especificações publicadas como pares de texto.",
            "maxItems": 40,
            "items": {
              "type": "object",
              "description": "Especificação técnica.",
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Nome da especificação."
                },
                "value": {
                  "type": "string",
                  "description": "Valor informado."
                }
              },
              "required": [
                "name",
                "value"
              ]
            }
          }
        },
        "required": [
          "name",
          "slug",
          "sku",
          "url",
          "description",
          "price",
          "currency",
          "availability",
          "brand",
          "images",
          "attributes"
        ]
      },
      "Collection": {
        "type": "object",
        "description": "Categoria ou marca ativa no catálogo.",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome da categoria ou marca."
          },
          "slug": {
            "type": "string",
            "description": "Identificador público."
          },
          "description": {
            "type": "string",
            "description": "Descrição pública em texto."
          },
          "url": {
            "type": "string",
            "description": "Página canônica da coleção.",
            "format": "uri"
          }
        },
        "required": [
          "name",
          "slug",
          "description",
          "url"
        ]
      },
      "ProductPage": {
        "type": "object",
        "description": "Página de resultados em ordem estável por nome e slug.",
        "additionalProperties": false,
        "properties": {
          "items": {
            "type": "array",
            "description": "Resultados da página atual.",
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          },
          "limit": {
            "type": "integer",
            "description": "Tamanho solicitado da página.",
            "minimum": 1,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "description": "Quantidade de resultados ignorados.",
            "minimum": 0,
            "maximum": 10000
          },
          "hasMore": {
            "type": "boolean",
            "description": "Há resultados depois desta página."
          },
          "nextOffset": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 10000,
            "description": "Próximo offset, ou null ao terminar ou atingir o limite de paginação."
          }
        },
        "required": [
          "items",
          "limit",
          "offset",
          "hasMore",
          "nextOffset"
        ]
      },
      "CollectionPage": {
        "type": "object",
        "description": "Página de resultados em ordem estável por nome e slug.",
        "additionalProperties": false,
        "properties": {
          "items": {
            "type": "array",
            "description": "Resultados da página atual.",
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/Collection"
            }
          },
          "limit": {
            "type": "integer",
            "description": "Tamanho solicitado da página.",
            "minimum": 1,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "description": "Quantidade de resultados ignorados.",
            "minimum": 0,
            "maximum": 10000
          },
          "hasMore": {
            "type": "boolean",
            "description": "Há resultados depois desta página."
          },
          "nextOffset": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 10000,
            "description": "Próximo offset, ou null ao terminar ou atingir o limite de paginação."
          }
        },
        "required": [
          "items",
          "limit",
          "offset",
          "hasMore",
          "nextOffset"
        ]
      },
      "Problem": {
        "type": "object",
        "description": "Erro estruturado application/problem+json conforme RFC 9457. Não inclui detalhes internos do banco.",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "description": "Tipo de problema conforme RFC 9457.",
            "const": "about:blank",
            "format": "uri"
          },
          "title": {
            "type": "string",
            "description": "Título padrão do status HTTP."
          },
          "status": {
            "type": "integer",
            "description": "Status HTTP da resposta.",
            "enum": [
              400,
              404,
              405,
              503,
              429
            ]
          },
          "detail": {
            "type": "string",
            "description": "Descrição segura do problema."
          },
          "instance": {
            "type": "string",
            "description": "Caminho da requisição, sem parâmetros.",
            "format": "uri-reference"
          },
          "code": {
            "type": "string",
            "description": "Código estável para tratamento automatizado.",
            "enum": [
              "invalid_parameter",
              "endpoint_not_found",
              "product_not_found",
              "method_not_allowed",
              "catalog_unavailable",
              "rate_limit_exceeded"
            ]
          },
          "hint": {
            "type": "string",
            "description": "Orientação para corrigir a requisição ou retomar a consulta."
          }
        },
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "code",
          "hint"
        ]
      },
      "ApiIndex": {
        "type": "object",
        "description": "Índice da API pública de consulta da Loja ASSIST.",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome da API."
          },
          "version": {
            "type": "string",
            "description": "Versão do contrato."
          },
          "description": {
            "type": "string",
            "description": "Finalidade e limites da API."
          },
          "openapi": {
            "type": "string",
            "description": "Contrato OpenAPI.",
            "format": "uri"
          },
          "documentation": {
            "type": "string",
            "description": "Documentação para desenvolvedores.",
            "format": "uri"
          },
          "products": {
            "type": "string",
            "description": "Listagem de produtos.",
            "format": "uri"
          },
          "brands": {
            "type": "string",
            "description": "Listagem de marcas.",
            "format": "uri"
          },
          "categories": {
            "type": "string",
            "description": "Listagem de categorias.",
            "format": "uri"
          }
        },
        "required": [
          "name",
          "version",
          "description",
          "openapi",
          "documentation",
          "products",
          "brands",
          "categories"
        ]
      }
    },
    "headers": {
      "RateLimit-Policy": {
        "description": "Política conforme draft-ietf-httpapi-ratelimit-headers-11: quota 300 por 60 segundos.",
        "schema": {
          "type": "string"
        },
        "example": "\"catalog\";q=300;w=60"
      },
      "RateLimit": {
        "description": "Saldo r após a requisição e segundos t até reiniciar a janela.",
        "schema": {
          "type": "string"
        },
        "example": "\"catalog\";r=299;t=45"
      },
      "RateLimit-Limit": {
        "description": "Quota total (compatibilidade).",
        "schema": {
          "type": "integer",
          "minimum": 300,
          "maximum": 300
        }
      },
      "RateLimit-Remaining": {
        "description": "Saldo restante (compatibilidade).",
        "schema": {
          "type": "integer",
          "minimum": 0,
          "maximum": 300
        }
      },
      "RateLimit-Reset": {
        "description": "Segundos até o próximo minuto UTC (compatibilidade).",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 60
        }
      }
    }
  }
}
