Visão geral da API

Uma única superfície de integração: GraphQL — endpoint, autenticação, quotas diárias e o que uma chave de API alcança realmente

4 min de leitura
Imprimir esta secção

O FreeMaint expõe uma única superfície de API para integrações entre sistemas: GraphQL, em /api/v1/graphql. As rotas REST que vê no navegador são a API da própria aplicação, autenticada por sessão de utilizador — uma chave de API não lhes chega. Planeie a integração sobre GraphQL.

API REST

As rotas REST em /api/v1/{resource} são as que as aplicações web e móvel do FreeMaint chamam, autenticadas por sessão de utilizador (JWT). Uma chave de API (fmk_...) NÃO as autentica — é aceite apenas em /api/v1/graphql e no endpoint de ingestão de energia. Para uma integração, leia a secção GraphQL abaixo.

Exemplo (sessão de utilizador, NÃO uma chave de API — uma chave fmk_ não autentica esta rota): curl -H 'Authorization: Bearer <session-token>' 'https://freemaint.com/api/v1/work-orders?status=OPEN&assigneeId=42&page=1&pageSize=20'

API GraphQL

O endpoint GraphQL é POST /api/v1/graphql. Cobre um subconjunto deliberado do produto — ordens de trabalho, ativos, paragens de máquina, peças e os seus movimentos de stock, contadores, encomendas de compra, localizações, fornecedores, clientes e plantas — e não a aplicação inteira. Use GraphQL quando de outro modo teria de chamar vários endpoints para compor um só ecrã: por exemplo, um cartão que mostra uma ordem de trabalho com o detalhe do seu ativo, as peças consumidas e o custo total de mão de obra. O guia de integração com ERP enumera o que o esquema não alcança.

Consulta de exemplo: query { workOrders(status: "OPEN", limit: 10) { id reference title status priority assetId dueDate } }

Autenticação

Ambas as API aceitam um token JWT no cabeçalho Authorization, emitido por POST /api/v1/auth/login e válido por 2 horas (renova-se com o token de atualização). Para integrações servidor a servidor use antes uma chave de API: um administrador cria-a em Definições da Empresa > API (/company-settings/api), e uma pessoa cuja função o permita cria as suas em Perfil > Segurança > Chaves API (/profile/api-keys); envie Authorization: Bearer fmk_... . Uma chave atua como o seu proprietário: tem as permissões dele e só vê o que ele vê. IMPORTANTE: uma chave de API autentica o endpoint GraphQL (POST /api/v1/graphql), o endpoint de ingestão de energia e /public-api/{whoami,ping} — NÃO autentica as rotas REST de recursos, que exigem um JWT de utilizador.

Cabeçalho

Authorization: Bearer <token>

Validade do token

Token de acesso: 2 horas. Refresh token: 30 dias.

Disponibilidade por nível

Business

Chaves de API, leituras e escritas GraphQL, 5.000 chamadas por dia

Enterprise

Tudo do Business, 100.000 chamadas por dia, mais a ingestão de energia

Limites de pedidos

A quota é um contador DIÁRIO por empresa, partilhado entre o GraphQL e o endpoint de ingestão de energia, e reinicia às 00:00 UTC. O Business permite 5.000 chamadas por dia; o Enterprise, 100.000. Cada resposta traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Não há janela por minuto nem cabeçalho Retry-After. Nas superfícies REST a recusa é um HTTP 403; no GraphQL o estado HTTP mantém-se 200 — o GraphQL responde sempre 200 — e a recusa está em errors[0].extensions.code = FORBIDDEN. Não teste o estado HTTP 403 no GraphQL: leia o array errors.

Formato de erro

Cada erro traz um estado HTTP, um código legível por máquina e uma mensagem legível por pessoas. Os 4xx são erros do cliente (validação, permissões, não encontrado); os 5xx são erros do servidor e devem ser repetidos com espera exponencial. No GraphQL o código está em extensions.code e os valores que pode filtrar são: BAD_REQUEST, UNAUTHENTICATED, FORBIDDEN, NOT_FOUND, CONFLICT, BAD_USER_INPUT e TOO_MANY_REQUESTS. Quando a validação falha, a mensagem indica exatamente os campos em falta — por exemplo «quantity must be a number conforming to the specified constraints» — pelo que nunca terá de adivinhar qual deles o seu sistema enviou mal. Uma procura que simplesmente não corresponde a nada não é um erro: part(barcode:) devolve null.

SDK e ferramentas oficiais

Não existe hoje um SDK cliente oficial. O endpoint GraphQL tem introspeção ativada, pelo que qualquer cliente GraphQL (Apollo, graphql-codegen, Insomnia, Postman) pode descobrir o esquema apontando para POST /api/v1/graphql com a sua chave de API. De momento não publicamos um documento OpenAPI estático nem um ficheiro SDL num URL fixo.

Dica

Os URL incluem /v1 — quando introduzirmos alterações não retrocompatíveis (raro), lançamos /v2 em paralelo e mantemos /v1 suportado durante pelo menos 12 meses antes da descontinuação.

As chaves de API não estão disponíveis no Core nem no Starter.

Esta página foi útil?