{"openapi":"3.0.3","info":{"title":"ERP TPH — API Pública v1","version":"1.0.0","description":"API para integrações externas (ex: CRM TPH Consultoria). Autenticação via API key (Bearer token). Cada tenant gerencia suas próprias chaves em /configuracoes/api."},"servers":[{"url":"/api/v1"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_...","description":"Gere uma chave em /configuracoes/api. Nunca compartilhe uma chave em texto claro."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"FORBIDDEN"},"message":{"type":"string"},"details":{"type":"object"}}}}},"ProductImage":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","description":"URL assinada, expira em 1 hora"},"is_primary":{"type":"boolean"},"sort_order":{"type":"integer"}}},"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"sku":{"type":"string","nullable":true},"name":{"type":"string"},"price":{"type":"number"},"images":{"type":"array","items":{"$ref":"#/components/schemas/ProductImage"}}}},"Customer":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"customer_type":{"type":"string","enum":["pf","pj"]},"name":{"type":"string"},"document":{"type":"string","nullable":true},"email":{"type":"string","nullable":true}}}}},"paths":{"/products":{"get":{"summary":"Listar produtos","description":"Requer o escopo `products.view` na API key.","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20,"maximum":100}},{"name":"search","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista paginada de produtos","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"total":{"type":"integer"}}}}}},"401":{"description":"API key ausente, inválida, revogada ou expirada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"API key sem o escopo products.view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requisições excedido (60/min por chave)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/customers":{"get":{"summary":"Listar clientes","description":"Requer o escopo `customers.view` na API key.","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20,"maximum":100}},{"name":"search","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista paginada de clientes","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Customer"}},"total":{"type":"integer"}}}}}},"401":{"description":"API key ausente, inválida, revogada ou expirada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"API key sem o escopo customers.view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requisições excedido (60/min por chave)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}