{"openapi":"3.1.0","info":{"title":"Valore — Loja de API v1","version":"1.0.0","description":"API de integração ERP ↔ Valore. Autenticação via Bearer token (API key) ou header X-Api-Key."},"servers":[{"url":"/api/v1","description":"API v1"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Authorization: Bearer valore_..."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key"}}},"paths":{"/api/v1/health":{"get":{"operationId":"health","summary":"Health check","description":"Valida a API key, a feature api_integrations do tenant e retorna metadados da chave.","tags":["Geral"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}},"/api/v1/items":{"get":{"operationId":"items-list","summary":"Listar itens","description":"Catálogo de materiais do tenant com paginação e filtros.\n\n**Escopo:** `items:read`\n\n**Feature tenant:** `items`","tags":["Itens"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}},"/api/v1/items/batch":{"post":{"operationId":"items-batch-post","summary":"Criar itens (lote)","description":"Criação em lote. Rejeita codes duplicados com 409.\n\n**Escopo:** `items:write`\n\n**Feature tenant:** `items`","tags":["Itens"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}},"/api/v1/requisitions":{"post":{"operationId":"requisitions-post","summary":"Criar requisição","description":"Cria requisição com itens. external_code é obrigatório (chave do ERP). Valore gera code interno REQ-XXXX.\n\n**Escopo:** `requisitions:write`\n\n**Feature tenant:** `requisitions`","tags":["Requisições"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}},"/api/v1/requisitions/{id}":{"delete":{"operationId":"requisitions-delete","summary":"Cancelar requisição","description":"Soft cancel → status cancelled. Aceita UUID, code ou external_code.\n\n**Escopo:** `requisitions:write`\n\n**Feature tenant:** `requisitions`","tags":["Requisições"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}},"/api/v1/quotations/{id}/proposals":{"get":{"operationId":"quotations-proposals","summary":"Propostas por rodada","description":"Retorna quotation + rounds[] com proposals[] e items[] respondidos por fornecedor.\n\n**Escopo:** `quotations:read`\n\n**Feature tenant:** `quotations`","tags":["Cotações"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}},"/api/v1/purchase-orders/{id}/pdf":{"get":{"operationId":"purchase-orders-pdf","summary":"PDF do pedido","description":"Retorna application/pdf (stream).\n\n**Escopo:** `orders:read`\n\n**Feature tenant:** `orders`","tags":["Pedidos"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Sucesso"},"400":{"description":"VALIDATION_ERROR"},"401":{"description":"UNAUTHORIZED"},"403":{"description":"FORBIDDEN"},"404":{"description":"NOT_FOUND"},"409":{"description":"CONFLICT"}}}}}}