Axuz Developers

Primeira chamada à API

Do zero à primeira chamada autenticada à API da Axuz com um token pessoal axp_, usando curl, Node ou Python.

Este guia leva você de uma conta Axuz até a primeira resposta 200 da API usando um token pessoal (axp_...). Leva uns cinco minutos e não exige instalar nada além de curl, Node 20+ ou Python 3.

Os exemplos usam o ambiente de staging, https://api.axuz.net. Em produção o host é https://api.axuz.club; o resto do contrato é o mesmo.

1. Crie o token

  1. Entre no workspace e abra Configurações pessoais → Tokens de API (caminho /me/settings/api-tokens).
  2. Dê um nome que diga onde o token vai morar (por exemplo script-de-backup), escolha os escopos e a validade.
  3. Copie o valor axp_... na hora: o servidor guarda só o hash e nunca mais mostra o segredo.

Os escopos reconhecidos são me:read (leituras em /me/*), me:write (criar, alterar e apagar em notas, tarefas, arquivos e eventos pessoais) e me:profile. Para este guia basta me:read. O teto de requisições por minuto vai de 1 a 1000 (padrão 60) e a validade, de 1 dia a 5 anos (ou sem expiração).

Guarde o token numa variável de ambiente, nunca no código nem em repositório:

export AXUZ_TOKEN='cole-aqui-o-token-axp_'
export AXUZ_API='https://api.axuz.net'

2. Faça a primeira chamada: quem sou eu e quais equipes tenho

O serviço principal não tem um GET /me para tokens. O equivalente é GET/me/summary, que devolve as equipes ativas da sua conta junto com contadores de tarefas e do financeiro de cada uma. É a forma de descobrir os team.id que você vai usar depois.

curl

curl -sS "$AXUZ_API/me/summary" \
  -H "Authorization: Bearer $AXUZ_TOKEN" \
  -H "Accept: application/json" \
  -i

Node

// node 20+, ESM (arquivo .mjs)
const res = await fetch(`${process.env.AXUZ_API}/me/summary`, {
  headers: { Authorization: `Bearer ${process.env.AXUZ_TOKEN}` },
});
if (!res.ok) {
  throw new Error(`HTTP ${res.status}: ${JSON.stringify(await res.json().catch(() => null))}`);
}
const summary = await res.json();
for (const entry of summary.teams ?? []) {
  console.log(entry.team.id, entry.team.name, `tarefas abertas: ${entry.tasks.open}`);
}

Python

import json
import os
import urllib.error
import urllib.request

req = urllib.request.Request(
    os.environ["AXUZ_API"] + "/me/summary",
    headers={"Authorization": "Bearer " + os.environ["AXUZ_TOKEN"]},
)
try:
    with urllib.request.urlopen(req, timeout=15) as res:
        summary = json.load(res)
except urllib.error.HTTPError as e:
    raise SystemExit(f"HTTP {e.code}: {e.read().decode()}")

for entry in summary.get("teams") or []:
    print(entry["team"]["id"], entry["team"]["name"], "tarefas abertas:", entry["tasks"]["open"])

O que esperar

Uma resposta 200 com Content-Type: application/json. O formato (valores ilustrativos):

{
  "generated_at": "2026-10-22T12:00:00Z",
  "teams": [
    {
      "team": { "id": "2f1c9a52-6a1e-4a3b-9d55-0c7e1d2b7a10", "name": "Acme", "slug": "acme" },
      "tasks": { "open": 3, "overdue": 1, "due_week": 2, "assigned": 3 },
      "financer": { "month_spent_cents": 0, "to_pay_cents": 0, "overdue_cents": 0, "overdue_count": 0 }
    }
  ],
  "unavailable": [
    { "bucket": "calendar", "owner_service": "axuz_calendar_api", "reason": "eventos vivem no DB local do axuz_calendar_api; ..." }
  ]
}

Três coisas para notar. Valores de dinheiro são inteiros em centavos, nunca decimais. O campo unavailable declara o que o endpoint não consegue agregar (hoje, o calendário) em vez de devolver zero. E, com Redis ativo no servidor, a resposta traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset; veja Limites de taxa. A resposta também traz X-Trace-Id, útil ao abrir um chamado.

3. Uma segunda chamada: suas notas

GET/me/notes lista as notas pessoais (também com me:read):

curl -sS "$AXUZ_API/me/notes?limit=5" -H "Authorization: Bearer $AXUZ_TOKEN"

A resposta é {"items": [...]}. Para ler além da primeira página veja Paginação.

Erros comuns neste ponto

SintomaCausa provável
401 com {"error":"unauthorized"}Token ausente, com erro de digitação, expirado ou revogado. O cabeçalho precisa ser exatamente Authorization: Bearer axp_...; o token não vai na URL.
403 com scope required: me:readO token foi criado sem o escopo da operação (me:read para GET, me:write para o resto). Crie outro: escopo não se altera depois.
401 em /teams ou /teams/{id}/...Essas rotas não aceitam axp_, só sessão. Use /me/summary para listar equipes.
429 com rate_limitedPassou do teto por minuto do token. Espere o Retry-After.

A lista completa de status e o formato do corpo estão em Erros.

Próximos passos

Segurança: trate o token como senha. Se ele vazar, revogue em Tokens de API (ou com DELETE/me/api-tokens/{tokenID} usando uma sessão): a revogação vale já na requisição seguinte (o servidor invalida o cache de 30 segundos do token).

Atualizado em