Conectar um sistema
- Entre como administrador em Usuários e API.
- Cadastre o usuário responsável, se necessário. Na lista, clique em Vincular token.
- Informe o nome da conexão, a permissão e a validade. Gere e copie o token, exibido apenas nessa criação.
- No servidor da integração, guarde o token como segredo e envie
Authorization: Bearer SEU_TOKEN.
URL base: https://calculadora-tubos.krato.ai/api/v1
Leitura permite consultar dados e calcular prévias sem salvar. Leitura e gravação permite também cadastrar e atualizar papéis, perfis, preços e produções. Os dados são compartilhados pela empresa.
O token vence após o prazo escolhido (1 a 365 dias). Revogação, desativação do usuário, redefinição de senha ou mudança de permissão invalidam o acesso. A troca de token é feita gerando outro e revogando o anterior.
curl "https://calculadora-tubos.krato.ai/api/v1/compositions?page=1" \
-H "Authorization: Bearer $TUBE_API_TOKEN"Exemplo de terminal Linux/macOS. Configure TUBE_API_TOKEN no ambiente da integração. Não coloque o token no código público, na URL ou no JavaScript de uma página.
Operações disponíveis
| Método | Endpoint após /api/v1 | Operação |
|---|---|---|
| GET / POST | /papers | Listar / cadastrar papéis |
| GET / PATCH | /papers/{id} | Consultar / alterar um papel |
| GET / POST | /papers/{id}/prices | Consultar histórico / cadastrar preço por kg |
| GET / POST | /compositions | Listar / cadastrar perfis |
| GET / PATCH | /compositions/{id} | Consultar revisão atual / arquivar ou reativar perfil |
| GET / POST | /compositions/{id}/revisions | Listar / salvar revisões |
| GET | /compositions/{id}/revisions/{revisionId} | Consultar revisão histórica |
| POST | /compositions/{id}/duplicate | Duplicar perfil com novo código e nome |
| POST | /calculations/preview | Calcular peso, papel e custo sem gravar |
| GET / POST | /revisions/{revisionId}/calculations | Listar / calcular e salvar produções |
| GET | /calculations/{id} | Consultar resultado salvo |
O contrato OpenAPI 3.1 contém os corpos de requisição, respostas e as 30 operações, incluindo saúde, sessão e administração. Pode ser importado no Postman ou Insomnia.
Calcular um perfil salvo — exemplo Node.js
O exemplo consulta o perfil e usa seus materiais históricos para calcular um lote de 100 tubos com 1.000 mm. Configure as variáveis de ambiente TUBE_API_TOKEN e TUBE_PROFILE_ID.
const base = 'https://calculadora-tubos.krato.ai/api/v1';
const token = process.env.TUBE_API_TOKEN;
const profileId = process.env.TUBE_PROFILE_ID;
if (!token || !profileId) throw new Error('Configure token e ID do perfil.');
async function api(path, body) {
const response = await fetch(base + path, {
method: body ? 'POST' : 'GET',
headers: {
Authorization: `Bearer ${token}`,
...(body ? {'Content-Type': 'application/json'} : {})
},
body: body ? JSON.stringify(body) : undefined
});
const data = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${data.message}`);
return data;
}
const profile = await api(`/compositions/${profileId}`);
const production = {lengthMm: 1000, quantity: 100};
const result = await api('/calculations/preview', {
diMm: profile.diMm,
targetWallMm: profile.targetWallMm,
sourceRevisionId: profile.id,
items: profile.items.map(item => ({
paperId: item.paperId,
sourceItemId: item.id,
count: item.count,
widthMm: item.widthMm,
wastePct: item.wastePct
})),
production
});
console.log({
pesoPorTuboKg: result.perTube.weightKg,
papelDoLoteComPerdaKg: result.batch.weightWithWasteKg,
custoPorTubo: result.perTube.cost,
custoDoLote: result.batch.cost
});
// Para gravar, use um token com permissão de gravação:
// const saved = await api(`/revisions/${profile.id}/calculations`, production);
// console.log(saved.id, saved.results.batch.cost);profile.id é o ID da revisão retornada; profile.compositionId é o ID do perfil. Ambos são diferentes. Para localizar um perfil, consulte GET /compositions?q=LEVE.
Cadastrar papel e montar o perfil
Envie este JSON em POST /papers:
{
"code": "MEU-PAPEL-350",
"name": "Papel 350",
"grammage": 350,
"tp": 0.53,
"widthMm": 100,
"wastePct": 5,
"pricePerKg": 4
}Use id, version e priceId da resposta ao cadastrar POST /compositions:
{
"code": "MEU-TUBO-2POL",
"name": "Tubo 2 polegadas",
"diMm": 50.8,
"targetWallMm": 4,
"items": [{
"paperId": "ID_DO_PAPEL",
"expectedPaperVersion": 1,
"expectedPriceId": "PRICE_ID_DA_RESPOSTA",
"count": 8,
"widthMm": 100,
"wastePct": 5
}]
}Inclua mais itens para combinar papéis e gramaturas. A espessura efetiva é a soma das camadas: no exemplo, 8 × 0,53 = 4,24 mm. O alvo de 4 mm não altera automaticamente as camadas.
Para alterar preço, envie {"expectedVersion": VERSAO_ATUAL, "pricePerKg": 4} em POST /papers/{id}/prices. Perfis já salvos preservam seus preços: atualize explicitamente os materiais em uma nova revisão para usar os preços atuais.
Regras para integrar corretamente
- JSON usa números com ponto decimal. Dimensões em mm, gramatura em g/m², peso em kg e preços em R$/kg. Comprimento e quantidade pertencem à produção.
- Custos finais são strings como
"2.03".nullsignifica preço pendente;"0.00"é custo zero.knownCostinforma o subtotal conhecido emissingPricesidentifica os papéis sem preço. - O lote é arredondado após a soma: não multiplique o custo unitário já arredondado. Use
batch.cost. - Listagens usam
pagea partir de 1 e 25 itens por página. Papéis, perfis, usuários e tokens retornamtotal; históricos retornam itens, página e limite. Em históricos, continue até receber menos de 25 itens. - Papéis e perfis aceitam busca
q. Papéis:status=active|inactive|all; perfis:status=active|archived|all. O padrão é ativo. - Atualizações de papel exigem
expectedVersion; novas revisões de perfil exigemexpectedRevision. Itens com papel atual exigemexpectedPaperVersioneexpectedPriceId. Um conflito 409 exige releitura e conferência. - O servidor consulta os dados cadastrados e calcula os totais. Gramatura, espessura, preço ou resultado enviados dentro de um item não substituem o catálogo ou o histórico.
- Limites: JSON de 2 MB, 5.000 camadas, 1.000.000 de tubos por lote, dimensões positivas até 1 bilhão de mm com até 6 casas; perda com até 4 casas.
- Erros retornam
{"code":"...","message":"...","fields":{}}(fields opcional). Códigos principais: 401 credencial inválida, 403 escopo/permissão, 404 registro ausente, 409 conflito, 422 validação. - Integrações são servidor a servidor. Bearer válido dispensa cookie e Origin. O login de navegador continua exigindo Origin nas mutações; não há CORS público para tokens.
- Não há webhooks, OAuth, envio de e-mail, exclusão de histórico ou chaves de idempotência. Evite repetir automaticamente POST de gravação quando a resposta se perder; consulte o histórico antes de reenviar.
Administração de acessos
GET/POST /users, PATCH /users/{id}, POST /users/{id}/password, GET/POST /tokens e DELETE /tokens/{id} exigem sessão de administrador. Tokens não acessam esses endpoints.
Usuários não são excluídos, para preservar a autoria dos cadastros. O sistema impede a desativação ou rebaixamento do último administrador ativo.