{"openapi": "3.1.0", "info": {"title": "Materiais em Uberlândia — API", "version": "1.3.0", "description": "Somente leitura. Todos os campos *_centavos são inteiros BRL; null significa desconhecido. price_centavos é o preço por embalagem; unit_price_centavos é por unidade base (ex.: m²). Ofertas não são cotações finais. SINAPI via SINPRES, MG, não desonerado. Sem garantia de cobertura integral do varejo."}, "servers": [{"url": "/"}], "paths": {"/api/health": {"get": {"summary": "Contagens, referência e identificação do serviço", "parameters": [], "responses": {"200": {"description": "JSON com dados públicos observados"}, "400": {"description": "Parâmetro inválido"}}}}, "/api/sources": {"get": {"summary": "Fontes, modo de atualização, falhas e cobertura", "parameters": [], "responses": {"200": {"description": "JSON com dados públicos observados"}, "400": {"description": "Parâmetro inválido"}}}}, "/api/prices": {"get": {"summary": "Pesquisar observações atuais armazenadas", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Busca por relevância: produto pelo nome antes de acessórios/categoria. Palavras inteiras, acentos e plurais normalizados; medidas exatas (50kg, 2,5mm). SKU, EAN e referência completos. Sem resultados exatos, tenta o início da última palavra. meta.sort=relevance e meta.search_mode=exact|prefix.", "schema": {"type": "string"}}, {"name": "kind", "in": "query", "required": false, "description": "Categoria de dado", "schema": {"type": "string", "enum": ["retail", "reference", "composition", "catalog"]}}, {"name": "source", "in": "query", "required": false, "description": "ID da fonte: obramax, leroy, abc, lojaeletrica, madeiranit, sinpres ou ubercom. Consulte /api/sources.", "schema": {"type": "string"}}, {"name": "page", "in": "query", "required": false, "description": "Página", "schema": {"type": "integer", "minimum": 1, "default": 1}}, {"name": "limit", "in": "query", "required": false, "description": "Registros por página", "schema": {"type": "integer", "minimum": 1, "maximum": 250, "default": 50}}], "responses": {"200": {"description": "JSON com dados públicos observados"}, "400": {"description": "Parâmetro inválido"}}}}, "/api/compare": {"get": {"summary": "Subtotais por EAN e embalagem equivalentes em duas ou mais lojas", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Filtro opcional de produto", "schema": {"type": "string"}}, {"name": "quantity", "in": "query", "required": false, "description": "Quantidade inteira de embalagens; descontos por volume não recalculados", "schema": {"type": "integer", "minimum": 1, "maximum": 100000, "default": 1}}], "responses": {"200": {"description": "JSON com dados públicos observados"}, "400": {"description": "Parâmetro inválido"}}}}, "/api/history": {"get": {"summary": "Até 100 observações anteriores da mesma oferta", "parameters": [{"name": "id", "in": "query", "required": true, "description": "offer_id devolvido por /api/prices", "schema": {"type": "string"}}], "responses": {"200": {"description": "JSON com dados públicos observados"}, "400": {"description": "Parâmetro inválido"}}}}}, "components": {"schemas": {"Offer": {"type": "object", "properties": {"offer_id": {"type": "string"}, "source": {"type": "string"}, "sku": {"type": "string"}, "name": {"type": "string"}, "kind": {"enum": ["retail", "reference", "composition", "catalog"]}, "gtin": {"type": "string"}, "price_centavos": {"type": ["integer", "null"], "description": "Por embalagem, ou por unidade SINAPI"}, "unit_price_centavos": {"type": ["integer", "null"]}, "unit": {"type": "string"}, "unit_multiplier": {"type": "number"}, "package_label": {"type": "string", "description": "Unidade/embalagem publicada; ITEM indica conteúdo ainda não confirmado"}, "package_verified": {"type": "boolean"}, "regional_verified": {"type": "boolean", "description": "false: preço online ainda não confirmado para Uberlândia/CEP"}, "freight_centavos": {"type": ["integer", "null"], "description": "null até cotação para CEP e lista reais"}, "pickup_fee_centavos": {"type": ["integer", "null"], "description": "Simulação para um item; não somar por item numa lista"}, "available": {"type": ["boolean", "null"]}, "observed_at": {"type": "string", "format": "date-time"}, "reference_month": {"type": "string"}, "url": {"type": "string", "format": "uri"}, "identity_conflict": {"type": "string"}, "needs_refresh": {"type": "boolean", "description": "Varejo observado há mais de 24 horas"}}}}}}