API REST
aqua e Caixa de entrada
A IA do tracker, os créditos, as revisões e a Caixa de entrada.
GET /aqua(tracker:read): se a aqua (assistente de IA) está ligada na empresa,{"available": true, "reason": null, "can_review": true}(reason:disabledouno_key;can_review: a pessoa edita issues em algum projeto e vê a tela aqua,GET /aqua/recommendations).POST /aqua(tracker:read): a conversa de ajuda do app,{"messages": [{"role": "user", "content": "Como crio uma issue?"}], "path": "/issues", "app": "ios"}(até 20 mensagens, começando e terminando comusere alternando;app:iosoumac, opcional). Devolve{"answer": "..."}; 422 quando a IA recusa ou está desligada, sem chave ou no limite.GET /aqua/credits(tracker:read): os créditos de IA da empresa. Sem chave própria, a aqua usa a chave do tracker e gasta créditos de um pacote por ciclo de 30 dias, que renova sozinho; com a chave própria da empresa, não gasta. Devolveavailable,reason,key_source(server: créditos;organization: chave própria;nullsem IA),credits(nullcom a chave própria):state(ok,lowcom 20% ou menos,emptyquando acabou e a aqua pausa até renovar,expired),remaining,used,total(per_cyclemaisgranted, os créditos lançados pela equipe da plataforma no ciclo),cycle_days,cycle_start,cycle_end,auto_renewerenews_at; eusage(só admin e dono,nullpara os demais):since(o início do ciclo; com a chave própria, 30 dias atrás) eby_action, das ações mais usadas para as menos (action,label,calls,failures,credits). Sempre em créditos, nunca em dinheiro. Quando uma chamada de IA volta 422 por falta de créditos, a mensagem diz quando renova. No MCP:get_ai_credits. A chave própria da empresa (só da Claude) se põe, troca e tira só na tela, em Empresa → Integrações → Assistente de IA (admin e dono): nem a API nem o MCP leem ou gravam a chave.- Caixa de entrada (a da tela /inbox):
GET /inbox(tracker:read,?view=unreadsó as não lidas ou?view=hiddenas ocultadas; sem ele, as não ocultadas;?before=<id>pagina,?limit=até 100) trazunreadeitems, os comentários que chegaram para a pessoa do token, os mais recentes primeiro:kind(mention: alguém escreveu @o nome dela;reply: resposta numa conversa em que ela escreveu),own_thread(a conversa começou com um comentário dela),id(do comentário),text,author,excerpt,issue(id,code,title,project),url,at,readehidden. Escrever na tarefa depois do comentário, abrir a tarefa ou ler a notificação dele também contam como lida. As menções e as respostas nas threads das Conversas vêm à parte, emchat_items(comchat_unread):id(da notificação),kind(mentionoureply, resposta numa thread em que ela está),own_thread(a thread começou com uma mensagem dela),thread(veio de uma thread),text,author,excerpt(o trecho da mensagem),project,url(direto à mensagem),at,readehidden; abrir a thread ou ler o canal conta como lida.POST /inbox(tracker:read) muda o estado (dos ids deitemse dechat_items):{"action": "read", "ids": [...]}ou{"action": "read", "all": true},{"action": "hide", "ids": [...]}ou{"action": "hide", "older_than_days": 30}(ocultar conta como lida) e{"action": "unhide", "ids": [...]}; devolveupdated,unreadechat_unread. Resumo da aqua do dia e do mês (o do topo da caixa):GET /aqua/summary(tracker:read,?period=day, o padrão, oumonth, no fuso de Brasília) devolveavailable,reason,periodesummary(nullantes de pedir):headline,highlights(o que aconteceu nas tarefas da pessoa e nas que ela acompanha),attention(o que pede a atenção dela),issues(as citadas, comcode,ideurl),generated_ateoutdated(chegou novidade depois).POST /aqua/summary(tracker:read) com{"period": "month"}pede um novo (gasta créditos de IA; período sem nada não gasta); 422 com a IA desligada, sem chave ou sem créditos. No MCP:list_inbox,update_inboxeget_aqua_summary. - aqua nas issues (a mesma da tela):
GET /issues/{ref}/aqua(tracker:read) trazavailable,can_review(se a pessoa pode pedir a revisão),summary(comoaqua_summarydeGET /issues/{ref}),review(summary,reviewed_at,outdated), asrecommendationsabertas (id,kind:comment,status,field,custom_field,label,duplicateoumove;title,before,after,reasonecomment, o texto do pedido de informações) esnooze_options.POST /issues/{ref}/aqua/summary(tracker:read) resume a conversa (a partir desummary_min_commentscomentários) e devolve{"summary": ...}.POST /issues/{ref}/aqua/review(tracker:write, quem edita a issue) revisa e devolve o mesmo que oGET.POST /aqua/recommendations/{id}/apply(tracker:write) aplica a sugestão ({"comment": "..."}opcional troca o texto do pedido de informações);POST /aqua/recommendations/{id}/dismiss(tracker:write) com{"for": "7"}(1,7,30dias ouforever) ignora. A tela aqua inteira:GET /aqua/recommendations(tracker:read,?project=MOBopcional) trazavailable,reason,can_review,daily_review(enabled,hour,limit,last_on,last_count,last_error),sentry_waiting(erros do Sentry esperando decisão, emGET /sentry/errors?waiting=true),totaleissues, as issues com sugestões abertas (das paradas há mais tempo para as recentes), cada uma comid,code,title,project,status(name,color,category),summary,reviewed_at,outdatederecommendations(como acima), esnooze_options. "Revisar issues abertas" roda no servidor:POST /aqua/review-runs(tracker:write,{"project": "MOB"}opcional) começa a revisão de todas as issues abertas que a aqua ainda não viu ou que mudaram desde a revisão (até 500, uma de cada vez; uma revisão por vez na empresa, e pedir de novo devolve a que já roda) e devolve{"run": ...}(nullsem nada pendente);GET /aqua/review-runs(tracker:read) traz a que roda ou a última,GET /aqua/review-runs/{id}o andamento (status:running,done,stoppedoufailed;total,reviewed,failed,suggestions,error,created_at,finished_ateissues, cada uma comid,code,title,state—waiting,running,doneoufailed—,suggestionseerror) ePOST /aqua/review-runs/{id}/stop(tracker:write) para.GET /aqua/review-queue(tracker:read,?project=e?limit=até 25) continua devolvendo a fila (id,code,title) para revisar uma a uma comPOST /issues/{ref}/aqua/reviewe{"batch": true}(o modelo da revisão em lote). No MCP:list_aqua_recommendations,start_aqua_review,get_aqua_review,stop_aqua_review,list_issues_to_review,review_issue_with_aqua,apply_aqua_recommendationedismiss_aqua_recommendation.POST /aqua/draft(tracker:read) com{"text": "relato livre", "project": "MOB"}(projectopcional) devolve os campos dePOST /issuespreenchidos emissing(o que o relato não diz), sem criar nada.POST /aqua/improve(tracker:read) com{"project": "MOB", "type": "bug", "title": "...", "description": "..."}(e os outros textos do formulário) devolve título e textos reescritos enotes, sem gravar. 422 quando a IA está desligada, sem chave ou no limite.