Guia para desenvolvedores
Desenvolva com o Trama
A API do Trama é a API JSON em que o app web roda: workspaces, quadros, tarefas, comentários e integrações. Este guia mostra como se autenticar, as partes de que a maioria das integrações precisa e como GitHub, GitLab e GRUPIM se conectam. Todas as operações estão na especificação OpenAPI.
Início rápido
O jeito mais rápido de começar é com um token pessoal. Ele age como você, em tudo o que você acessa no app, então não o deixe em código que você compartilha.
Crie um token pessoal
Em ConfiguraçõesAPI e MCP, escolha Criar token e copie o token. Ele aparece uma única vez.Separe a chave e o segredo
O token é a sua chave de API e o seu segredo unidos por um ponto. Envie a parte antes do primeiro ponto comoX-Api-Keye o resto comoX-Api-Secret.Chame a API
A URL base éhttps://api.ontrama.com.
# Seu token pessoal é KEY.SECRET: separe-o no primeiro ponto
TOKEN="YOUR_PERSONAL_TOKEN"
export TRAMA_KEY="${TOKEN%%.*}"
export TRAMA_SECRET="${TOKEN#*.}"
# Quem sou eu?
curl https://api.ontrama.com/me \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET"
# Os quadros que eu vejo
curl https://api.ontrama.com/boards \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET"Autenticação
Todos os endpoints, exceto o login, o health check e o servidor OAuth, exigem uma de três credenciais. Todas agem como o mesmo usuário e alcançam os mesmos quadros; o que muda é quanto tempo duram e o que podem fazer.
| Credencial | Envie como | Validade | Pode fazer |
|---|---|---|---|
| Token pessoal | X-Api-Key + X-Api-Secret | Até você substituí-lo | Tudo o que você pode fazer no app |
| Access token OAuth | Authorization: Bearer lxt_at_… | 7 dias, depois é renovado | Só as operações que os scopes dele permitem |
| JWT do login por e-mail | Authorization: Bearer <jwt> | 24 horas | Tudo o que você pode fazer no app |
Token pessoal
Scripts e integrações do lado do servidor devem usar um token pessoal. Crie ou substitua o seu em ConfiguraçõesAPI e MCP. O mesmo token também funciona como Bearer token no servidor MCP, que faz a separação para você; a API REST só aceita os dois headers.
Quando X-Api-Key está presente, ela é a única credencial que a API considera: um par errado responde 401 mesmo que um header Authorization válido também seja enviado.
Login por e-mail (JWT)
O app web faz login com um código enviado por e-mail. Cada etapa é um POST /login: primeiro com o endereço, depois com o endereço e o código.
# 1. Peça um código (aqui, uma resposta 400 quer dizer que o e-mail foi enviado)
curl -X POST https://api.ontrama.com/login \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com"}'
# 2. Troque o código de 6 dígitos por um JWT (201: {"user": {…}, "token": "…"})
curl -X POST https://api.ontrama.com/login \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "otp": "123456"}'
# 3. Use o JWT
curl https://api.ontrama.com/me -H "Authorization: Bearer YOUR_JWT"- Os códigos têm 6 dígitos, valem por 10 minutos e só funcionam uma vez. Só o código mais recente vale; cinco tentativas erradas o bloqueiam.
- O login é limitado a 30 requisições por IP e 10 por endereço a cada 15 minutos; acima disso, a resposta é
429comRetry-After. POST /logoutencerra todos os JWTs emitidos para a conta até então, em todos os dispositivos. Os tokens pessoais continuam funcionando.
OAuth 2.1
O Trama é um servidor de autorização OAuth 2.1, feito para clientes MCP: registro dinâmico de clientes (RFC 7591), metadados do servidor (RFC 8414), metadados do recurso protegido (RFC 9728) e o fluxo authorization code com PKCE (S256). Os clientes são públicos (token_endpoint_auth_method: none). Access tokens (lxt_at_…) duram 7 dias; refresh tokens (lxt_rt_…) são rotacionados a cada uso. Um cliente MCP faz tudo isso sozinho; o guia de MCP mostra o fluxo passo a passo.
| Endpoint | URL |
|---|---|
| Metadados do servidor | GEThttps://api.ontrama.com/.well-known/oauth-authorization-server |
| Registrar um cliente | POSThttps://api.ontrama.com/oauth2/register |
| Consentimento (no navegador) | https://ontrama.com/oauth2/authorize |
| Token | POSThttps://api.ontrama.com/oauth2/token |
| Revogar | POSThttps://api.ontrama.com/oauth2/revoke |
São cinco scopes. Um cliente que não pede nenhum recebe todos, os dois de invoices só se você administra um workspace, e você os vê na página de consentimento.
| Scope | Permite |
|---|---|
boards.read | Ver quadros, tarefas, marcos, etiquetas e documentos que você já acessa, e buscar neles. |
boards.write | Criar e alterar tarefas (detalhes, responsáveis, etiquetas, marcos, subtarefas, relações, checklists, links de PR, cronômetro, lançamentos de tempo) e documentos, no que você pode editar. |
comments.write | Comentar e responder em tarefas e documentos; resolver conversas em documentos. |
invoices.read | Ler invoices, clientes e o tempo registrado de um workspace (admins). |
invoices.write | Criar e editar invoices, marcar como enviadas, registrar pagamentos (admins). |
| Operação | Scope |
|---|---|
| GET/boards | boards.read |
| GET/boards/{id} | boards.read |
| GET/boards/{id}/search | boards.read |
| GET/search | boards.read |
| GET/boards/{board_id}/tasks/{id} | boards.read |
| POST/boards/{board_id}/tasks | boards.write |
| PUT/boards/{board_id}/tasks/{id} | boards.write |
| PUT…/tasks/{id}/move, /task_users, /taggings | boards.write |
| PUT…/tasks/{id}/stopwatch | boards.write |
| POST · DELETE…/tasks/{task_id}/relations | boards.write |
| POST…/tasks/{task_id}/sub_issues, /pull_requests | boards.write |
| GET · POST · PUT…/tasks/{task_id}/task_checklists, /task_check_items | boards.read · boards.write |
| GET · POST · PUT/boards/{board_id}/milestones | boards.read · boards.write |
| GET · POST/boards/{board_id}/tags | boards.read · boards.write |
| POST · PUT…/tasks/{task_id}/comments | comments.write |
| GET/me, /me/tasks, /workspaces | boards.read |
| GET/workspaces/{id}/workspace_documents, …/{id}, …/mentionables | boards.read |
| POST · PATCH/workspaces/{id}/workspace_documents, …/archive, /restore, /upload_presign | boards.write |
| GET…/workspace_documents/{id}/comments | boards.read |
| POST · PUT · DELETE…/workspace_documents/{id}/comments, /resolve, /unresolve | comments.write |
| GET/tasks/{id}, /workspace_documents/{id} | boards.read |
| GET…/tasks/{task_id}/time_entries | boards.read |
| POST · PUT · DELETE…/tasks/{task_id}/time_entries | boards.write |
| GET/workspaces/{id}/invoices, …/{id}, /invoice_clients, /time_entries | invoices.read |
| POST · PUT/workspaces/{id}/invoices | invoices.write |
Excluir marcos, etiquetas, checklists e links de PR, excluir comentários de tarefas, publicar documentos e excluir ou importar invoices continuam sendo feitos por pessoas, no app.
Você vê e revoga os apps que conectou em ConfiguraçõesApps conectados.
Convenções
- URL base
https://api.ontrama.com. Requisições e respostas são JSON; os caminhos funcionam com ou sem o sufixo.json. - Tarefas têm um
idnumérico e uma chave comoACME-42. Rotas que recebem{id}aceitam qualquer um dos dois; rotas aninhadas ({task_id}) recebem o id numérico. - Erros:
401credenciais ausentes ou inválidas,403o seu papel não permite,404não encontrado ou não visível para você,422validação ({"field": ["message"]}ou{"error": "…"}),429limite de requisições atingido, comRetry-After. - Limites de requisições: login (acima), registro de clientes OAuth 20 por IP por hora, presigns de upload 60 por usuário por hora, convites 30 por usuário por hora.
- A especificação em /openapi.yaml é o contrato. A referência da API mostra essa especificação com um console para testar requisições.
Endpoints
Os principais recursos, num relance. As rotas de um quadro começam em /boards/{board_id}.
| Área | Rotas |
|---|---|
| Conta | GET · PUT/meGET/me/tasksGET/me/api_credentialsGET/me/oauth_clients /me/tasks lista as tarefas abertas atribuídas a você, em todos os quadros. |
| Busca | GET/search Passe q, e board_id para buscar em um só quadro. Cobre quadros, tarefas e comentários que você vê; no máximo 50 resultados. |
| Notificações | GET/notificationsGET/notifications/unread_countPUT/notifications/mark_all_readGET · PUT/notification_preferences |
| Workspaces | GET · POST/workspacesGET · PUT/workspaces/{id}…/workspace_users…/workspace_documents…/workspace_activities…/integrations…/invoices |
| Quadros | GET · POST/boardsGET · PUT · DELETE/boards/{id}PUT/boards/{id}/archivePOST/boards/{id}/share GET /boards/{id} é o kanban inteiro: colunas, cartões e modelos. Com ?compact=1 vêm sem descrições, atividade e itens de checklist (os cartões trazem contagens). |
| Partes do quadro | …/board_columns…/tags…/milestones…/board_users |
| Tarefas | POST/boards/{board_id}/tasksGET · PUT · DELETE…/tasks/{id}PUT…/movePUT…/task_usersPUT…/taggingsPUT…/stopwatch |
| Dentro de uma tarefa | …/comments…/task_checklists…/task_check_items…/relations…/sub_issues…/pull_requests…/attachments |
# Crie uma tarefa no fim de uma coluna
curl https://api.ontrama.com/boards/41/tasks \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET" \
-H "Content-Type: application/json" \
-d '{"task": {"board_column_id": 310, "name": "Write the release notes",
"priority": "priority_high"}}'
# Abra uma tarefa pela chave
curl https://api.ontrama.com/boards/41/tasks/ACME-42 \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET"
# Mova-a para outra coluna, logo depois do cartão 7090
curl -X PUT https://api.ontrama.com/boards/41/tasks/ACME-42/move \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET" \
-H "Content-Type: application/json" \
-d '{"to_board_id": 41, "to_column_id": 312, "insert_after_task_id": 7090}'
# Comente (o corpo é HTML)
curl https://api.ontrama.com/boards/41/tasks/7104/comments \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET" \
-H "Content-Type: application/json" \
-d '{"body": "<p>Shipped in 2.4</p>"}'Conceitos
Chaves de tarefa
Toda tarefa recebe uma chave formada pelo prefixo do workspace e um número sequencial, como ACME-42. A chave não muda quando o cartão passa por outras colunas e quadros do workspace; mover a tarefa para outro workspace dá a ela uma chave nova. Citar uma chave em uma descrição ou em um comentário relaciona as duas tarefas, quando você pode editar o outro quadro.
- Ordem. Os cartões de uma coluna são ordenados por um
sort_keyfracionário. Cartões novos e movidos vão para o fim, a não ser que você passeinsert_after_task_id. - Prioridade.
priority_none,priority_low,priority_medium,priority_highoupriority_urgent. Qualquer outro valor é um422. - Datas e marcos.
start_atedue_at(o início não pode ser depois do prazo), e ummilestone_idopcional de/boards/{board_id}/milestones, do mesmo quadro. Eles alimentam a visão de planejamento do quadro.
Subtarefas e relações
Uma tarefa pode ter uma tarefa-mãe (parent_id): do mesmo workspace, até 8 níveis de profundidade, sem ciclos e sem modelos. Crie subtarefas com POST …/tasks/{task_id}/sub_issues, enviando name, uma lista de names ou existing_task_id para adotar uma tarefa que já existe. Reordene-as com PUT …/tasks/{id}/reorder_sub_issues.
As relações são related, blocks, blocked_by e duplicate, criadas com POST …/tasks/{task_id}/relations. Quando uma tarefa que bloqueia outras é concluída, os links blocks dela viram related. A outra tarefa precisa estar em um quadro que você pode editar.
# Divida uma tarefa em subtarefas
curl https://api.ontrama.com/boards/41/tasks/7104/sub_issues \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET" \
-H "Content-Type: application/json" \
-d '{"names": ["Draft the copy", "Review with legal"]}'
# Marque-a como bloqueada por outra tarefa (id ou chave)
curl https://api.ontrama.com/boards/41/tasks/7104/relations \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET" \
-H "Content-Type: application/json" \
-d '{"related_task_id": "ACME-7", "relation_type": "blocked_by"}'Modelos
Uma tarefa com is_template: true fica fora das colunas e aparece em templates no payload do quadro; ela não tem chave. Crie uma tarefa a partir dela com template_id em POST /boards/{board_id}/tasks: nome, descrição, prioridade, etiquetas e checklists são copiados (com os itens desmarcados). Responsáveis, datas, comentários e anexos não são.
Quem vê o quê
- Você vê um quadro se é membro dele, admin do workspace dele, membro do workspace quando o quadro é visível para o workspace, ou se simplesmente está logado quando o quadro é público (por link). Tudo o que está dentro de um quadro que você vê pode ser lido.
- Editar exige o papel de membro, admin ou dono no quadro, ou ser admin do workspace. Gerenciar o quadro (membros, compartilhamento, visibilidade, arquivar, excluir) exige admin ou dono.
- Um quadro que você não vê responde
404, não403, para não revelar que ele existe. - As invoices de um workspace (
…/invoices) são só para os admins dele; qualquer outra pessoa recebe404. Elas aceitam o seu token pessoal, um JWT ou um token OAuth cominvoices.read/invoices.write.
Tempo real
Quadros e notificações se atualizam ao vivo via ActionCable em wss://api.ontrama.com/cable. O socket se autentica só com um JWT, em ?token= ou em um header Bearer; tokens pessoais e tokens OAuth não são aceitos ali.
BoardChannelcom umboard_idenvia o quadro inteiro depois de uma mudança, ou uma mensagem curtatask_reorderedquando só a posição de um cartão mudou. Comcompact: truevem o quadro compacto (como?compact=1). Assinar um quadro que você não vê é recusado.NotificationChannelenvia mensagensnew_notificationpara o usuário logado.
import { createConsumer } from "@rails/actioncable";
const cable = createConsumer(`wss://api.ontrama.com/cable?token=${jwt}`);
cable.subscriptions.create(
{ channel: "BoardChannel", board_id: 41 },
{
received(data) {
const message = JSON.parse(data);
// O quadro inteiro (no mesmo formato de GET /boards/41) ou
// { type: "task_reordered", task_id, board_column_id, sort_key }
},
},
);GitHub e GitLab
Vincule pull requests e merge requests a tarefas e deixe que eles movam os cartões conforme avançam. Uma tarefa mostra cada PR vinculado com o status, o estado da revisão e o resultado do CI.
Cole um link (funciona em qualquer lugar)
Cole a URL de um pull request do github.com ou de um merge request do gitlab.com em qualquer tarefa. Não há nada para configurar; o badge se atualiza quando o workspace estiver conectado. Pela API, éPOST …/tasks/{task_id}/pull_requests.Conecte o workspace
Um admin do workspace abre Configurações do workspaceIntegrações e conecta o GitHub (instala o GitHub App do Trama nos repositórios que você escolher) ou o GitLab (autorize e depois ative os projetos que quer acompanhar; ativar um projeto adiciona o webhook de merge requests dele). Os repositórios do GitHub começam ativados, e os projetos do GitLab, desativados.Cite as chaves
Quando um pull request em um repositório conectado cita uma chave comoACME-42no título, na descrição ou no nome do branch, o Trama o vincula a essa tarefa. Um PR pode ser vinculado a várias tarefas.Escolha as colunas de revisão e de concluídas
No quadro, abra o menu de uma coluna e escolha Usar esta coluna como…Em revisão, e faça o mesmo para Concluído.
| Quando o pull request… | O cartão… |
|---|---|
| É aberto ou reaberto (rascunhos também) | Vai para a coluna Em revisão |
| É mergeado | Vai para a coluna Concluído, o que também desbloqueia as tarefas que ele bloqueava |
| É fechado sem merge | Fica onde está |
| Recebe uma revisão ou um resultado de CI | Continua na coluna; o badge mostra aprovado / alterações solicitadas e o último check |
Os cartões só se movem quando o status muda, não a cada push, e só quando o quadro tem essa coluna definida. As movimentações são feitas em nome do admin que conectou a integração, que precisa ter permissão de edição no quadro.
curl https://api.ontrama.com/boards/41/tasks/7104/pull_requests \
-H "X-Api-Key: $TRAMA_KEY" -H "X-Api-Secret: $TRAMA_SECRET" \
-H "Content-Type: application/json" \
-d '{"url": "https://github.com/acme/website/pull/99"}'Próximos passos
Usa um agente de IA? O servidor MCP oferece ao Claude, ao Cursor e a outros clientes a mesma API em forma de ferramentas, com login por OAuth. Sentiu falta de algum endpoint neste guia? A especificação tem todos.