Como categorizar despesas sem planilha manual
Classifica despesas pela descrição que aparece no extrato ou no comprovante: envia o texto do lançamento — “PIX QRS PADARIA PAO DOUR”, “PAG*FARMACIADROGAV” — e recebe a categoria correspondente, no seu plano de categorias. Serve para quem organiza finanças pessoais, MEI, escritórios contábeis e apps financeiros.
Rode online
Rode nos nossos servidores com a sua conta. As ferramentas grátis rodam no seu navegador; esta aqui é descontada do seu saldo do KIT pelo preço acima.
O extrato brasileiro é um enigma de abreviações
Quem já tentou organizar um extrato conhece o problema: os lançamentos vêm truncados, com prefixos de adquirente e nomes de fantasia cortados — “PAG*JOSE99”, “PIX TRANSF 8821”, “DL*GOOGLPLAY”. Categorizar isso exige decifrar cada linha, e é por essa etapa que a maioria das planilhas de controle financeiro morre em fevereiro. A API foi feita para esse texto sujo: interpreta a descrição como um humano experiente faria e devolve a categoria.
Seu plano de categorias, não o nosso
Na chamada você informa as categorias que usa — as da sua planilha, as do plano de contas do escritório ou as do seu app. “Alimentação, transporte, moradia” para pessoa física; “insumos, marketing, impostos, pró-labore” para uma MEI; um plano de contas contábil completo para escritórios. O retorno respeita a sua lista e pode incluir o grau de confiança de cada classificação, para você revisar só as duvidosas.
Preço que cabe em produto
US$ 0,0135 por lançamento categorizado, mais US$ 0,003 por chamada. Um extrato pessoal de 150 lançamentos mensais custa cerca de US$ 2 por mês; para uso dentro de um app financeiro, o custo por usuário fica previsível e o preço publicado permite calcular margem sem surpresa. Sem mínimo, sem franquia: mês sem uso é mês sem custo. E se o volume escalar, o preço unitário continua o mesmo.
Do CSV do banco à planilha organizada
O fluxo simples: exporte o extrato em CSV ou OFX pelo app do banco, envie as descrições em sequência e grave a categoria de volta em uma coluna nova. Quem prefere não programar resolve com uma automação de planilha chamando a API linha a linha. Para escritórios, o mesmo fluxo roda por cliente, com o plano de contas de cada um — a categorização deixa de consumir o início do mês.
Casos de uso
MEI fechando o mês
Márcia Regina Oliveira é MEI e mistura (como quase todo MEI) conta pessoal e do negócio. O extrato do mês passa pela API com as categorias “negócio” e “pessoal” mais subcategorias — e ela finalmente enxerga quanto do faturamento vai embora em insumo e taxa de maquininha.
Escritório contábil com 80 clientes
Um escritório de Recife recebe extratos de dezenas de PJs todo início de mês. Um script categoriza os lançamentos conforme o plano de contas de cada cliente e o contador revisa apenas os marcados como baixa confiança — a triagem braçal virou revisão.
App de finanças pessoais
Uma fintech em estágio inicial precisa categorizar transações dos usuários sem montar um time de dados. Integra a API no backend: cada transação importada chega categorizada na tela do usuário, e o custo por unidade é conhecido desde o primeiro dia.
Prestação de contas de viagem corporativa
O financeiro da Distribuidora Horizonte Verde S.A. recebe relatórios de despesa dos vendedores externos: notas de posto, restaurante, pedágio, hotel. As descrições passam pela categorização automática e os relatórios chegam padronizados na aprovação, com as exceções destacadas.
Perguntas frequentes
Funciona com aquelas descrições cortadas tipo “PAG*” e “PIX QRS”?
É o caso de uso central: prefixos de adquirente (PAG*, MP*, PG*), lançamentos Pix truncados e nomes de fantasia abreviados são interpretados pelo contexto. Quando a descrição é ambígua de verdade, a classificação vem com confiança baixa em vez de um chute disfarçado.
Preciso enviar valores e datas ou só a descrição?
A descrição basta, mas valor e data melhoram o resultado quando você os incluir — R$ 4.500 com a mesma descrição de um débito de R$ 45 pode indicar naturezas diferentes. Envie o que tiver; o mínimo necessário já funciona.
Meus dados bancários ficam seguros?
Envie apenas as colunas necessárias — descrição, valor, data — e nunca número de conta ou senha, que a categorização não usa. O que você envia serve para classificar aqueles lançamentos e não é retido para outros fins, em conformidade com a LGPD.
Quanto custa para um volume de app, tipo 1 milhão de transações?
O preço é linear e publicado: US$ 0,0135 por item mais US$ 0,003 por chamada — agrupar muitos itens por chamada dilui o custo fixo. Um milhão de transações fica em torno de US$ 13.500; para volumes assim, escreva para a gente antes e conversamos sobre a integração.
Ele aprende com as minhas correções?
Não existe modelo seu sendo treinado: o comportamento vem das categorias e exemplos que você manda na chamada. A forma de “ensinar” é incluir na instrução os casos que você já corrigiu — funciona como memória sua, sob seu controle, e o resultado é reproduzível.
Isso substitui o contador?
Não — organiza o material que chega até ele. A classificação contábil formal, os enquadramentos e as decisões fiscais continuam sendo trabalho profissional; a API elimina a parte mecânica de decifrar extrato, que consome tempo de todo mundo e não exige CRC.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/text/expense-categorize \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"items":["valor-1","valor-2"]}'const res = await fetch("https://api.kit.forhosting.com/text/expense-categorize", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"items": [
"valor-1",
"valor-2"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/expense-categorize",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"items": [
"valor-1",
"valor-2"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/expense-categorize", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"items":["valor-1","valor-2"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"items":["valor-1","valor-2"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/expense-categorize", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"items": [
"valor-1",
"valor-2"
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.expense_categorize",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_tokens | 20000 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
422 | task_failed | A tarefa falhou do nosso lado. Você não paga nada por ela. |