TogaAI API

Documentação

Uma API REST para integrar o assistente jurídico do TogaAI. Base URL https://togai.pt/api/v1.

Autenticação

Todas as chamadas precisam de uma chave de API no cabeçalho Authorization. Cria a tua no portal — a chave é mostrada uma única vez.

Authorization: Bearer sk_toga_live_...

Trata a chave como uma palavra-passe: nunca a exponhas no frontend/browser.

POST /api/v1/chat

O endpoint principal. O developer escolhe o modo, o esforço e se envia documentos.

CampoTipoDescrição
message*stringA pergunta ou instrução jurídica.
mode"fast" | "deep"Rápido (default) ou aprofundado (pesquisa exaustiva).
effort"low" | "medium" | "high"Profundidade de raciocínio/pesquisa (low mais rápido, high mais capaz).
documents{ name, content }[]Até 10 documentos em texto para dar como contexto.
anonymizebooleanAnonimização de dados pessoais antes de sair para o modelo — ativo por default. Desliga com false se o pedido não tiver dados pessoais.
streambooleantrue (default) devolve SSE; false devolve um JSON único.
request_idstringIdentificador para rastreio/idempotência.

Exemplo (cURL)

bash
curl https://togai.pt/api/v1/chat \
  -H "Authorization: Bearer sk_toga_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Resume as cláusulas de rescisão deste contrato",
    "mode": "fast",
    "effort": "medium",
    "stream": false
  }'

Exemplo (JavaScript)

js
const res = await fetch("https://togai.pt/api/v1/chat", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.TOGA_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    message: "Qual o prazo de oposição à renovação de um arrendamento?",
    mode: "deep",
    documents: [{ name: "contrato.txt", content: "..." }],
    stream: false,
  }),
});
const data = await res.json();
console.log(data.answer, data.usage, data.cost_micro);

Resposta (stream: false)

json
{
  "answer": "Nos termos do artigo 1097.º do Código Civil...",
  "sources": [{ "id": "https://www.dgsi.pt/...", "citation_number": 1, "content": "..." }],
  "usage": { "input_tokens": 4210, "output_tokens": 980 },
  "cost_micro": 8540,
  "mode": "deep"
}

Streaming (stream: true, default)

Devolve text/event-stream. Cada evento é data: {...}: {status}, {sources}, {chunk, done:false} repetido, e por fim {done:true, usage}.

Privacidade — o modelo nunca vê dados pessoais

Por default (anonymize: true), antes de o teu pedido chegar ao modelo os dados pessoais são pseudonimizados na Europa (nomes → "Pessoa A", moradas → "Morada 1", NIF, contactos, IBAN, matrículas…). O modelo — e a pesquisa web — recebem apenas o texto anonimizado e nunca veem os dados reais. Os valores reais são reinseridos do lado do TogaAI, em tempo real, à medida que a resposta é gerada (inclusive em streaming).

  • Todo o processamento corre em servidores na UE (Frankfurt); nenhum dado pessoal toca em infraestrutura fora da UE.
  • A anonimização e o mapeamento correm num modelo europeu; o modelo de geração recebe só pseudónimos.
  • Se a anonimização não puder correr, o pedido é bloqueado — nunca enviamos dados pessoais em claro.
  • Desliga com anonymize: false quando o pedido não tem dados pessoais (mais rápido e económico).

GET /api/v1/usage

Consulta o saldo e o consumo dos últimos 30 dias.

bash
curl https://togai.pt/api/v1/usage -H "Authorization: Bearer sk_toga_live_..."
json
{
  "balance": { "eur": 24.61, "currency": "EUR", "billing_mode": "prepaid" },
  "usage_30d": { "requests": 128, "spend_eur": 5.39, "input_tokens": 512000, "output_tokens": 96400 }
}

Preços & créditos

€14 por 1 milhão de tokens

input + output combinados · ≈ €0,014 / 1.000 tokens · o mesmo preço em fast/deep e em qualquer modelo. Ligeiramente mais barato que o plano Plus (€15 / 1M).

A faturação é por tokens (input + output) do pedido, debitada da tua carteira de API — separada da subscrição da app. Cada resposta inclui cost_micro (micro-EUR, 1e-6 €), por isso sabes o custo exato de cada chamada.

  • Pré-pago: carregas saldo e cada chamada desconta; a 0, as chamadas devolvem 402.
  • Pay-as-you-go: consumo faturado ao fim do mês (em breve).

Gere o saldo no portal.

Erros

400Pedido inválido (ex.: falta `message`).
401Chave em falta, malformada ou revogada.
402Saldo insuficiente — carrega créditos.
429Demasiados pedidos (rate limit).
500Erro do servidor.