{
  "openapi": "3.1.0",
  "info": {
    "title": "AUTROTEC Public Content API",
    "version": "1.0.0",
    "summary": "Read-only catalogue of AUTROTEC services, products, brands and technical articles.",
    "description": "Public, read-only JSON API of AUTROTEC Sistemas Eletrônicos (CNPJ 39.181.052/0001-47), a Brazilian supplier of gas detection, tank gauging and marine monitoring equipment, with a CGCRE/Inmetro-accredited calibration laboratory (RBC no. 593).\n\nIt exposes exactly what the website already publishes, so an agent can answer questions about the catalogue, cite the matching page, and hand the user a way to ask for a quote.\n\nNo authentication and no API keys: every endpoint is public. Prices are not available — commercial conditions are given by quote only, through the contact channels in `getCompany`.\n\nRate limit: 120 requests per minute per IP, announced on every response with the IETF `RateLimit-Policy` and `RateLimit` header fields (plus the older `RateLimit-Limit`/`Remaining`/`Reset`). Over the limit you get `429` with `Retry-After` in seconds. Counting is per server instance, so the effective limit is more generous than the announced one; responses are cacheable for 5 minutes.\n\nVersioning: the major version is in the path (`/api/v1`) and the exact version is in the `API-Version` response header. Additive changes (new fields, new endpoints) ship without notice, so ignore fields you do not know. A breaking change means a new path version. When a version is retired, every response of that version carries `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers, and the commitment is at least 12 months between the two dates. This version is current, with no sunset date announced.\n\nHuman documentation: https://autrotec.com/desenvolvedores. The same pages are also available as Markdown (`Accept: text/markdown`) and indexed in https://autrotec.com/llms.txt.",
    "contact": {
      "name": "AUTROTEC comercial",
      "email": "autrotec@autrotec.com.br",
      "url": "https://autrotec.com/contato"
    },
    "license": {
      "name": "Conteúdo público, uso com atribuição",
      "url": "https://autrotec.com/termos-de-uso"
    },
    "termsOfService": "https://autrotec.com/termos-de-uso"
  },
  "servers": [
    {
      "url": "https://autrotec.com",
      "description": "Produção"
    }
  ],
  "security": [],
  "externalDocs": {
    "description": "Documentação para desenvolvedores e agentes",
    "url": "https://autrotec.com/desenvolvedores"
  },
  "tags": [
    {
      "name": "company",
      "description": "Identificação, endereço, contactos e acreditação da empresa."
    },
    {
      "name": "services",
      "description": "Serviços prestados (calibração, locação, manutenção, automação, instrumentação)."
    },
    {
      "name": "products",
      "description": "Categorias de produtos e os modelos de cada uma."
    },
    {
      "name": "brands",
      "description": "Marcas representadas e a relação com cada fabricante."
    },
    {
      "name": "articles",
      "description": "Artigos técnicos do blog."
    },
    {
      "name": "search",
      "description": "Busca sobre todo o catálogo público."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "company"
        ],
        "summary": "Índice da API",
        "description": "Lista os endpoints disponíveis, as contagens de cada coleção e as URLs da especificação e da documentação. Bom ponto de partida para descobrir a API.",
        "responses": {
          "200": {
            "description": "Índice da API.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndexResponse"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/company": {
      "get": {
        "operationId": "getCompany",
        "tags": [
          "company"
        ],
        "summary": "Dados da empresa",
        "description": "Razão social, CNPJ, ano de fundação, endereço no Rio de Janeiro, canais de contacto, horário de atendimento, acreditação do laboratório (RBC nº 593) e marcas representadas. Use para verificar quem é a empresa e como falar com ela.",
        "responses": {
          "200": {
            "description": "Dados da empresa.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyResponse"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/services": {
      "get": {
        "operationId": "listServices",
        "tags": [
          "services"
        ],
        "summary": "Lista os serviços",
        "description": "Todos os serviços com slug, nome e resumo. Use antes de getService para descobrir o slug.",
        "responses": {
          "200": {
            "description": "Lista os serviços",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceListResponse"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/services/{slug}": {
      "get": {
        "operationId": "getService",
        "tags": [
          "services"
        ],
        "summary": "Detalha um serviço",
        "description": "Descrição, selo de acreditação quando aplicável, perguntas frequentes e páginas relacionadas de um serviço.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug do serviço, como em listServices (ex.: `calibracao`).",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalha um serviço",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "404": {
            "description": "Recurso inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/products": {
      "get": {
        "operationId": "listProducts",
        "tags": [
          "products"
        ],
        "summary": "Lista as categorias de produtos",
        "description": "Categorias de produtos com slug, resumo e número de modelos documentados.",
        "responses": {
          "200": {
            "description": "Lista as categorias de produtos",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductListResponse"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/products/{slug}": {
      "get": {
        "operationId": "getProduct",
        "tags": [
          "products"
        ],
        "summary": "Detalha uma categoria de produtos",
        "description": "Visão geral da categoria, modelos com marca e especificações resumidas, serviços associados e perguntas frequentes. Não inclui preços.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug da categoria, como em listProducts (ex.: `trena-uti`).",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalha uma categoria de produtos",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductResponse"
                }
              }
            }
          },
          "404": {
            "description": "Recurso inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/brands": {
      "get": {
        "operationId": "listBrands",
        "tags": [
          "brands"
        ],
        "summary": "Lista as marcas representadas",
        "description": "Marcas com slug, relação comercial (distribuidor, representante) e site do fabricante.",
        "responses": {
          "200": {
            "description": "Lista as marcas representadas",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandListResponse"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/brands/{slug}": {
      "get": {
        "operationId": "getBrand",
        "tags": [
          "brands"
        ],
        "summary": "Detalha uma marca",
        "description": "Relação com o fabricante, produtos em destaque, catálogo por família e aplicações típicas da marca.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug da marca, como em listBrands (ex.: `riken-keiki`).",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalha uma marca",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandResponse"
                }
              }
            }
          },
          "404": {
            "description": "Recurso inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/articles": {
      "get": {
        "operationId": "listArticles",
        "tags": [
          "articles"
        ],
        "summary": "Lista os artigos técnicos",
        "description": "Artigos do blog com título, resumo, data de publicação e tema.",
        "responses": {
          "200": {
            "description": "Lista os artigos técnicos",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArticleListResponse"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/articles/{slug}": {
      "get": {
        "operationId": "getArticle",
        "tags": [
          "articles"
        ],
        "summary": "Lê um artigo técnico",
        "description": "Texto completo do artigo em secções, mais as perguntas frequentes associadas.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug do artigo, como em listArticles (ex.: `o-que-e-trena-uti`).",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lê um artigo técnico",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArticleResponse"
                }
              }
            }
          },
          "404": {
            "description": "Recurso inexistente.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/search": {
      "get": {
        "operationId": "searchCatalog",
        "tags": [
          "search"
        ],
        "summary": "Busca no catálogo",
        "description": "Busca por texto no nome e no resumo de serviços, produtos, marcas e artigos. Use quando souber o que o utilizador procura mas não souber o slug; depois chame o get* correspondente ao tipo devolvido.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Termo de busca, mínimo 2 caracteres (ex.: `calibração`, `trena`, `riken`).",
            "schema": {
              "type": "string",
              "minLength": 2
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Restringe a busca a certos tipos, separados por vírgula. Por omissão procura em todos.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "service",
                  "product",
                  "brand",
                  "article"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Número máximo de resultados.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultados da busca, os mais relevantes primeiro.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Parâmetro inválido.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Método não permitido: a API é somente de leitura.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido; repita depois de `Retry-After` segundos.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Política anunciada, no formato do draft IETF: `\"default\";q=120;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Estado atual da quota: `\"default\";r=<restantes>;t=<segundos até reiniciar>`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Quota da janela (forma antiga).",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Pedidos restantes na janela.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Segundos até a janela reiniciar.",
                "schema": {
                  "type": "integer"
                }
              },
              "API-Version": {
                "description": "Versão da API que respondeu.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Presente só quando esta versão está descontinuada (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Data a partir da qual esta versão deixa de responder (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de repetir.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiIndexResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "description": "Índice da API.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ApiIndex"
          }
        }
      },
      "CompanyResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "description": "Dados da empresa.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Company"
          }
        }
      },
      "ServiceListResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "description": "Lista de serviços.",
        "properties": {
          "data": {
            "type": "array",
            "description": "Itens da coleção.",
            "items": {
              "$ref": "#/components/schemas/ServiceSummary"
            }
          },
          "meta": {
            "type": "object",
            "description": "Metadados da listagem.",
            "required": [
              "count"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "description": "Número de itens devolvidos."
              }
            }
          }
        }
      },
      "ServiceResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "description": "Um serviço.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Service"
          }
        }
      },
      "ProductListResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "description": "Lista de categorias de produtos.",
        "properties": {
          "data": {
            "type": "array",
            "description": "Itens da coleção.",
            "items": {
              "$ref": "#/components/schemas/ProductSummary"
            }
          },
          "meta": {
            "type": "object",
            "description": "Metadados da listagem.",
            "required": [
              "count"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "description": "Número de itens devolvidos."
              }
            }
          }
        }
      },
      "ProductResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "description": "Uma categoria de produtos.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Product"
          }
        }
      },
      "BrandListResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "description": "Lista de marcas.",
        "properties": {
          "data": {
            "type": "array",
            "description": "Itens da coleção.",
            "items": {
              "$ref": "#/components/schemas/BrandSummary"
            }
          },
          "meta": {
            "type": "object",
            "description": "Metadados da listagem.",
            "required": [
              "count"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "description": "Número de itens devolvidos."
              }
            }
          }
        }
      },
      "BrandResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "description": "Uma marca.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Brand"
          }
        }
      },
      "ArticleListResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "description": "Lista de artigos.",
        "properties": {
          "data": {
            "type": "array",
            "description": "Itens da coleção.",
            "items": {
              "$ref": "#/components/schemas/ArticleSummary"
            }
          },
          "meta": {
            "type": "object",
            "description": "Metadados da listagem.",
            "required": [
              "count"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "description": "Número de itens devolvidos."
              }
            }
          }
        }
      },
      "ArticleResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "description": "Um artigo.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Article"
          }
        }
      },
      "SearchResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "description": "Resultados da busca.",
        "properties": {
          "data": {
            "type": "array",
            "description": "Resultados, os mais relevantes primeiro.",
            "items": {
              "$ref": "#/components/schemas/SearchResult"
            }
          },
          "meta": {
            "type": "object",
            "description": "Como a busca foi executada.",
            "required": [
              "query",
              "count",
              "limit",
              "types"
            ],
            "properties": {
              "query": {
                "type": "string",
                "description": "Termo pesquisado."
              },
              "count": {
                "type": "integer",
                "description": "Resultados devolvidos."
              },
              "limit": {
                "type": "integer",
                "description": "Limite aplicado."
              },
              "types": {
                "type": "array",
                "description": "Tipos de recurso incluídos.",
                "items": {
                  "type": "string",
                  "enum": [
                    "service",
                    "product",
                    "brand",
                    "article"
                  ]
                }
              }
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "description": "Formato único de erro da API.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "description": "Descrição do erro.",
            "required": [
              "code",
              "status",
              "message",
              "hint",
              "documentationUrl"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "not_found",
                  "invalid_request",
                  "method_not_allowed",
                  "internal_error"
                ],
                "description": "Código estável do erro, próprio para lógica de programa."
              },
              "status": {
                "type": "integer",
                "description": "Código HTTP repetido no corpo."
              },
              "message": {
                "type": "string",
                "description": "Explicação legível, em português."
              },
              "hint": {
                "type": "string",
                "description": "O que fazer a seguir para corrigir o pedido."
              },
              "documentationUrl": {
                "type": "string",
                "description": "Documentação da API."
              },
              "details": {
                "type": "object",
                "additionalProperties": true,
                "description": "Contexto do erro, como o parâmetro em falta e os valores aceites."
              }
            }
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome da API."
          },
          "description": {
            "type": "string",
            "description": "O que a API serve."
          },
          "version": {
            "type": "string",
            "description": "Versão semântica da API."
          },
          "documentationUrl": {
            "type": "string",
            "description": "Documentação para humanos."
          },
          "openapiUrl": {
            "type": "string",
            "description": "Esta especificação."
          },
          "llmsTxtUrl": {
            "type": "string",
            "description": "Índice llms.txt do site."
          },
          "counts": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Número de itens por coleção."
          },
          "rateLimit": {
            "type": "object",
            "description": "Limite de uso em vigor e cabeçalhos que o anunciam.",
            "additionalProperties": true
          },
          "versioning": {
            "type": "object",
            "description": "Esquema de versões e como a descontinuação é sinalizada.",
            "additionalProperties": true
          },
          "cli": {
            "type": "object",
            "description": "CLI oficial que consome esta API.",
            "additionalProperties": true
          },
          "endpoints": {
            "type": "array",
            "description": "Endpoints disponíveis, com o operationId da especificação.",
            "items": {
              "type": "object",
              "required": [
                "operationId",
                "method",
                "url"
              ],
              "properties": {
                "operationId": {
                  "type": "string",
                  "description": "Identificador da operação, igual ao desta especificação."
                },
                "method": {
                  "type": "string",
                  "description": "Método HTTP."
                },
                "url": {
                  "type": "string",
                  "description": "URL do endpoint, com `{slug}` onde houver parâmetro."
                }
              }
            }
          }
        }
      },
      "Company": {
        "type": "object",
        "required": [
          "name",
          "legalName",
          "taxId",
          "address",
          "contact"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Nome comercial."
          },
          "legalName": {
            "type": "string",
            "description": "Razão social."
          },
          "taxId": {
            "type": "object",
            "description": "Identificação fiscal da empresa.",
            "required": [
              "type",
              "value",
              "country"
            ],
            "properties": {
              "type": {
                "type": "string",
                "description": "Tipo de identificador fiscal (CNPJ)."
              },
              "value": {
                "type": "string",
                "description": "Número do CNPJ."
              },
              "country": {
                "type": "string",
                "description": "País, em ISO 3166-1 alpha-2."
              }
            }
          },
          "foundingYear": {
            "type": "integer",
            "description": "Ano de fundação."
          },
          "slogan": {
            "type": "string",
            "description": "Assinatura da marca."
          },
          "sectors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Setores atendidos."
          },
          "address": {
            "type": "object",
            "description": "Endereço da sede, no Rio de Janeiro.",
            "required": [
              "street",
              "city",
              "state",
              "country"
            ],
            "properties": {
              "street": {
                "type": "string",
                "description": "Logradouro e número."
              },
              "district": {
                "type": "string",
                "description": "Bairro."
              },
              "city": {
                "type": "string",
                "description": "Cidade."
              },
              "state": {
                "type": "string",
                "description": "Unidade federativa."
              },
              "postalCode": {
                "type": "string",
                "description": "CEP."
              },
              "country": {
                "type": "string",
                "description": "País."
              }
            }
          },
          "contact": {
            "type": "object",
            "description": "Canais de atendimento e pedido de cotação.",
            "required": [
              "phone",
              "salesEmail"
            ],
            "properties": {
              "phone": {
                "type": "string",
                "description": "Telefone, em formato internacional."
              },
              "whatsapp": {
                "type": "string",
                "description": "Número de WhatsApp."
              },
              "whatsappUrl": {
                "type": "string",
                "description": "Link direto de conversa."
              },
              "salesEmail": {
                "type": "string",
                "description": "E-mail comercial."
              },
              "generalEmail": {
                "type": "string",
                "description": "E-mail geral."
              },
              "businessHours": {
                "type": "string",
                "description": "Horário de atendimento."
              },
              "timeZone": {
                "type": "string",
                "description": "Fuso horário IANA do atendimento."
              },
              "quoteUrl": {
                "type": "string",
                "description": "Página de pedido de cotação."
              }
            }
          },
          "accreditation": {
            "type": "object",
            "description": "Acreditação do laboratório de calibração.",
            "properties": {
              "body": {
                "type": "string",
                "description": "Organismo acreditador."
              },
              "network": {
                "type": "string",
                "description": "Rede de acreditação (RBC)."
              },
              "laboratory": {
                "type": "string",
                "description": "Número do laboratório."
              },
              "standard": {
                "type": "string",
                "description": "Norma aplicada."
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Escopos acreditados."
              }
            }
          },
          "brands": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Marcas representadas."
          },
          "website": {
            "type": "string",
            "description": "Site oficial."
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Idiomas do atendimento e do site."
          }
        }
      },
      "ServiceSummary": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "summary",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador do serviço na URL."
          },
          "name": {
            "type": "string",
            "description": "Nome do serviço."
          },
          "summary": {
            "type": "string",
            "description": "Resumo de uma linha."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "Service": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "summary",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador do serviço na URL."
          },
          "name": {
            "type": "string",
            "description": "Nome do serviço."
          },
          "headline": {
            "type": "string",
            "description": "Título da página."
          },
          "summary": {
            "type": "string",
            "description": "Resumo para listagens e meta description."
          },
          "subtitle": {
            "type": "string",
            "description": "Frase de apoio ao título."
          },
          "badge": {
            "type": [
              "string",
              "null"
            ],
            "description": "Selo em destaque, como a acreditação."
          },
          "description": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Parágrafos de introdução."
          },
          "faq": {
            "type": "array",
            "description": "Perguntas frequentes publicadas na página.",
            "items": {
              "type": "object",
              "required": [
                "question",
                "answer"
              ],
              "properties": {
                "question": {
                  "type": "string",
                  "description": "Pergunta."
                },
                "answer": {
                  "type": "string",
                  "description": "Resposta."
                }
              }
            }
          },
          "related": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "label",
                "url"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Título da página ligada."
                },
                "url": {
                  "type": "string",
                  "description": "URL absoluta."
                }
              }
            },
            "description": "Páginas relacionadas."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "ProductSummary": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "summary",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador da categoria na URL."
          },
          "name": {
            "type": "string",
            "description": "Nome da categoria."
          },
          "summary": {
            "type": "string",
            "description": "Resumo de uma linha."
          },
          "modelCount": {
            "type": "integer",
            "description": "Modelos documentados na categoria."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "Product": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "summary",
          "models",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador da categoria na URL."
          },
          "name": {
            "type": "string",
            "description": "Nome da categoria."
          },
          "summary": {
            "type": "string",
            "description": "Resumo para listagens e meta description."
          },
          "subtitle": {
            "type": "string",
            "description": "Frase de apoio ao título."
          },
          "overview": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Parágrafos de contexto."
          },
          "models": {
            "type": "array",
            "description": "Modelos documentados. Sem preços: as condições vêm por cotação.",
            "items": {
              "type": "object",
              "required": [
                "name",
                "brand",
                "summary"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Nome do modelo."
                },
                "brand": {
                  "type": "string",
                  "description": "Marca do modelo."
                },
                "summary": {
                  "type": "string",
                  "description": "Para que serve."
                },
                "specs": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Características resumidas."
                },
                "manufacturerUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Página do modelo no site do fabricante."
                },
                "modelPageUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Ficha técnica do modelo neste site, quando existe."
                }
              }
            }
          },
          "services": {
            "type": "array",
            "description": "Serviços associados a esta categoria.",
            "items": {
              "type": "object",
              "required": [
                "title",
                "url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "description": "Serviço."
                },
                "description": {
                  "type": "string",
                  "description": "O que inclui."
                },
                "url": {
                  "type": "string",
                  "description": "Página do serviço."
                }
              }
            }
          },
          "faq": {
            "type": "array",
            "description": "Perguntas frequentes publicadas na página.",
            "items": {
              "type": "object",
              "required": [
                "question",
                "answer"
              ],
              "properties": {
                "question": {
                  "type": "string",
                  "description": "Pergunta."
                },
                "answer": {
                  "type": "string",
                  "description": "Resposta."
                }
              }
            }
          },
          "related": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "label",
                "url"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Título da página ligada."
                },
                "url": {
                  "type": "string",
                  "description": "URL absoluta."
                }
              }
            },
            "description": "Páginas relacionadas."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "BrandSummary": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "summary",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador da marca na URL."
          },
          "name": {
            "type": "string",
            "description": "Nome da marca."
          },
          "relationship": {
            "type": [
              "string",
              "null"
            ],
            "description": "Relação comercial com o fabricante."
          },
          "summary": {
            "type": "string",
            "description": "Resumo de uma linha."
          },
          "manufacturerUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site oficial do fabricante."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "Brand": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador da marca na URL."
          },
          "name": {
            "type": "string",
            "description": "Nome da marca."
          },
          "relationship": {
            "type": [
              "string",
              "null"
            ],
            "description": "Relação comercial com o fabricante."
          },
          "summary": {
            "type": "string",
            "description": "Resumo da proposta da marca."
          },
          "description": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Parágrafos sobre a marca."
          },
          "facts": {
            "type": "array",
            "description": "Números e dados em destaque sobre a marca.",
            "items": {
              "type": "object",
              "required": [
                "value",
                "label"
              ],
              "properties": {
                "value": {
                  "type": "string",
                  "description": "Número ou dado."
                },
                "label": {
                  "type": "string",
                  "description": "O que o dado significa."
                }
              }
            }
          },
          "products": {
            "type": "array",
            "description": "Modelos em destaque da marca.",
            "items": {
              "type": "object",
              "required": [
                "name",
                "description",
                "url"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Modelo."
                },
                "category": {
                  "type": "string",
                  "description": "Tipo de equipamento."
                },
                "description": {
                  "type": "string",
                  "description": "Resumo do modelo."
                },
                "tags": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Etiquetas curtas do modelo."
                },
                "url": {
                  "type": "string",
                  "description": "Página da categoria no site."
                },
                "manufacturerUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Página no site do fabricante."
                }
              }
            }
          },
          "catalog": {
            "type": "array",
            "description": "Portfólio completo, agrupado por família.",
            "items": {
              "type": "object",
              "required": [
                "title",
                "items"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "description": "Família de produtos."
                },
                "description": {
                  "type": "string",
                  "description": "O que a família cobre."
                },
                "items": {
                  "type": "array",
                  "description": "Modelos da família.",
                  "items": {
                    "type": "object",
                    "required": [
                      "name",
                      "detail"
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Modelo."
                      },
                      "detail": {
                        "type": "string",
                        "description": "Característica principal."
                      }
                    }
                  }
                }
              }
            }
          },
          "applications": {
            "type": "array",
            "description": "Aplicações típicas dos equipamentos da marca.",
            "items": {
              "type": "object",
              "required": [
                "title",
                "description"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "description": "Aplicação."
                },
                "description": {
                  "type": "string",
                  "description": "Onde se usa."
                }
              }
            }
          },
          "models": {
            "type": "array",
            "description": "Modelos com ficha técnica própria em /marcas/{slug}/{modelo}, com especificações da documentação oficial.",
            "items": {
              "type": "object",
              "required": [
                "slug",
                "name",
                "summary",
                "discontinued",
                "url"
              ],
              "properties": {
                "slug": {
                  "type": "string",
                  "description": "Identificador do modelo na URL."
                },
                "name": {
                  "type": "string",
                  "description": "Nome do modelo."
                },
                "summary": {
                  "type": "string",
                  "description": "Resumo da ficha."
                },
                "discontinued": {
                  "type": "boolean",
                  "description": "Verdadeiro se o fabricante já não produz o modelo."
                },
                "url": {
                  "type": "string",
                  "description": "URL da página HTML correspondente."
                },
                "markdownUrl": {
                  "type": "string",
                  "description": "URL da mesma página em Markdown (`text/markdown`)."
                }
              }
            }
          },
          "manufacturerUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site oficial do fabricante."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "ArticleSummary": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "summary",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador do artigo na URL."
          },
          "title": {
            "type": "string",
            "description": "Título do artigo."
          },
          "summary": {
            "type": "string",
            "description": "Resumo do artigo."
          },
          "datePublished": {
            "type": "string",
            "format": "date",
            "description": "Data de publicação (ISO 8601)."
          },
          "topic": {
            "type": "string",
            "description": "Tema."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "Article": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "sections",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador do artigo na URL."
          },
          "title": {
            "type": "string",
            "description": "Título do artigo."
          },
          "summary": {
            "type": "string",
            "description": "Resumo do artigo."
          },
          "datePublished": {
            "type": "string",
            "format": "date",
            "description": "Data de publicação (ISO 8601)."
          },
          "topic": {
            "type": "string",
            "description": "Tema."
          },
          "lead": {
            "type": "string",
            "description": "Parágrafo de abertura."
          },
          "sections": {
            "type": "array",
            "description": "Corpo do artigo, secção a secção.",
            "items": {
              "type": "object",
              "required": [
                "heading",
                "text"
              ],
              "properties": {
                "heading": {
                  "type": "string",
                  "description": "Título da secção."
                },
                "text": {
                  "type": "string",
                  "description": "Texto da secção."
                }
              }
            }
          },
          "faq": {
            "type": "array",
            "description": "Perguntas frequentes publicadas na página.",
            "items": {
              "type": "object",
              "required": [
                "question",
                "answer"
              ],
              "properties": {
                "question": {
                  "type": "string",
                  "description": "Pergunta."
                },
                "answer": {
                  "type": "string",
                  "description": "Resposta."
                }
              }
            }
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "required": [
          "type",
          "slug",
          "name",
          "url"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "service",
              "product",
              "brand",
              "article"
            ],
            "description": "Tipo de recurso encontrado."
          },
          "slug": {
            "type": "string",
            "description": "Slug a usar no get* correspondente."
          },
          "name": {
            "type": "string",
            "description": "Nome ou título."
          },
          "summary": {
            "type": "string",
            "description": "Resumo."
          },
          "url": {
            "type": "string",
            "description": "URL da página HTML correspondente."
          },
          "markdownUrl": {
            "type": "string",
            "description": "URL da mesma página em Markdown (`text/markdown`)."
          }
        }
      }
    }
  }
}
