A API v1 é a interface que o app Android usa para falar com a console: login, conta, análises, relatórios e envio de traces. Ela foi feita para o app e segue as mesmas regras da console no navegador. Esta página resume o contrato; para mandar um trace por script, siga Enviar traces pela API.
Endereço e formato
- Base:
https://app.waitscope.com/api/v1, só por HTTPS. O endereço anterior,https://waitscope.io/api/v1, ainda responde, para o app configurado com ele. - JSON em UTF-8 nos dois sentidos, menos os downloads e os pedaços de arquivo do envio. Campo desconhecido no corpo é recusado com 400.
- Os caminhos seguem os da console, em português:
/analises,/envios,/conta. - Instantes em RFC 3339 com fuso, como
2026-10-17T13:50:48-03:00. Tempos do trace em microssegundos inteiros, nos campos terminados em_us, e tamanhos em bytes. Quem formata números e datas para exibir é o cliente. - Sem CORS: a API não atende página de outro site aberta no navegador.
Autenticação
O login tem as duas etapas da console: a senha e depois o código do app autenticador. No fim, a API devolve um token de 43 caracteres, que vai em toda chamada no cabeçalho Authorization: Bearer <token>.
curl -s https://app.waitscope.com/api/v1/sessao \
-H 'Content-Type: application/json' \
-d '{"username": "zz-exemplo", "password": "...", "method": "app", "device_name": "zz-script"}'
A resposta traz "etapa": "codigo" e um desafio, que vale 10 minutos. Mande o desafio com o código de 6 dígitos do app, ou com um código de recuperação:
curl -s https://app.waitscope.com/api/v1/sessao/codigo \
-H 'Content-Type: application/json' \
-d '{"desafio": "...", "codigo": "123456"}'
A resposta traz o token, a validade em expira_em e os dados da conta, os mesmos de GET /eu.
- O token vale até 90 dias e cai com 30 dias sem uso.
DELETE /sessaoencerra o token na hora. - Ele conta no limite de sessões simultâneas da conta, junto com as do navegador, e aparece em Minha conta como “App Android · aparelho”, com o
device_namedo login. - O cookie da console não vale na API, e o token não vale na console.
methodéapp, o padrão, ouemail, este só quando a conta tem e-mail confirmado e o servidor envia e-mail. A recusa traz os meios aceitos emmetodos_disponiveis.- A conta ainda sem verificação em duas etapas recebe
"etapa": "cadastro"e um token que só abre o cadastro, por 30 minutos. - Até você aceitar na console a versão em vigor dos Termos de Serviço e da Política de Privacidade, toda rota responde 403
termos_pendentes, menosGET /eueDELETE /sessao.
Idioma
As mensagens, o diagnóstico, os cartões do relatório e o catálogo de erros Oracle vêm traduzidos pelo servidor. Com token, no idioma da conta, que PUT /conta/idioma muda. Sem token, pelo cabeçalho Accept-Language: pt, en ou es, e qualquer outro vira pt.
Erros
O erro vem com o status HTTP e um corpo assim:
{"erro": {"codigo": "nao_encontrado", "mensagem": "O endereço pedido não existe."}}
O codigo é estável e serve para o programa decidir o que fazer; a mensagem já vem traduzida, para mostrar a quem usa. Alguns erros trazem campos ao lado de erro: bloqueado_ate, com o cabeçalho Retry-After, tentativas_restantes e metodos_disponiveis.
| HTTP | codigo | Quando |
|---|---|---|
| 400 | requisicao_invalida | JSON inválido, campo desconhecido ou valor fora da faixa |
| 401 | sessao_invalida | Sem token, ou token vencido, encerrado ou de outro tipo |
| 401 | credenciais_invalidas | Usuário ou senha errados; a resposta é a mesma para usuário que não existe |
| 401 | codigo_incorreto | Código da segunda etapa errado; traz tentativas_restantes |
| 403 | cadastro_pendente | Token de cadastro tentando outra rota |
| 403 | troca_de_senha | Senha vencida ou provisória: só valem /eu, /conta/senha e DELETE /sessao |
| 403 | acesso_vencido | O prazo de acesso da conta terminou |
| 403 | admin_cadastro_local | Administrador sem segunda etapa entrando pela internet |
| 403 | admin_so_local | Administrador pela internet, quando o servidor só aceita o administrador na própria máquina |
| 403 | termos_pendentes | Falta aceitar na console a versão em vigor dos termos |
| 404 | nao_encontrado | Recurso que não existe ou que é de outra conta |
| 409 | conflito | O estado não permite, como o relatório de análise que não terminou ou o envio já concluído |
| 410 | desafio_expirado | Desafio da segunda etapa vencido, já usado ou trocado por outro login |
| 413 | grande_demais | Passou do limite de envio |
| 429 | muitas_tentativas | Bloqueio de login ou de código; traz bloqueado_ate |
| 429 | limite | Fila cheia, análises guardadas no limite ou outro envio em andamento |
| 503 | indisponivel | Serviço indisponível por um instante, como o banco fora do ar ou a falha ao gravar o arquivo |
| 503 | sem_espaco | O envio deixaria o servidor sem a reserva de espaço em disco |
As rotas da conta e do cadastro usam também senha_atual_incorreta (401), senha_invalida, metodo_indisponivel, email_indisponivel, email_invalido e codigo_expirado (400).
Rotas
Todas as rotas pedem o token, menos GET /versao e as do login. A rota com o id de um recurso de outra conta responde 404 nao_encontrado, sem confirmar que ele existe: nem o administrador vê as análises de outra conta.
Versão
| Método e caminho | O que faz |
|---|---|
GET /versao | Sem token. A versão do servidor e da API e, quando há app publicado, a do app: versao, codigo, minima, sha256, bytes, o endereço do download e o da página do app. Quando o codigo instalado é menor que minima, o app pede a atualização. |
GET /app/apk | Baixa o APK publicado. |
curl -s https://app.waitscope.com/api/v1/versao
Com o app publicado, a resposta traz a versão dele; sem APK publicado, app vem nulo:
{"api":1,"app":{"bytes":...,"codigo":7,"download":"/api/v1/app/apk","minima":...,"pagina":"/app","sha256":"...","versao":"1.2.1"},"servidor":"1.6.0"}
Sessão
| Método e caminho | O que faz |
|---|---|
POST /sessao | Primeira etapa do login: username, password, method e device_name, opcional, com até 80 caracteres. |
POST /sessao/codigo | Segunda etapa: desafio e codigo. Devolve o token. |
POST /sessao/codigo/reenviar | Reenvia o código por e-mail, no máximo 3 envios, com 60 s entre eles. |
DELETE /sessao | Encerra o token usado na chamada. |
GET /eu | Os dados da conta: usuário, idioma, prazos, segunda etapa, limites (limits) e termos pendentes (terms_pending). |
GET e POST /duas-etapas/app | Com o token de cadastro: a chave e o QR code do app autenticador e, depois, a confirmação com o código, que devolve os 10 códigos de recuperação. |
POST /duas-etapas/email e /duas-etapas/email/confirmar | Cadastro do código por e-mail, quando o servidor envia e-mail. |
Conta
| Método e caminho | O que faz |
|---|---|
PUT /conta/idioma | Muda o idioma da conta: pt, en ou es. |
GET e PUT /conta/privacidade | A máscara de literais: ocultar_textos e ocultar_numeros, ligadas por padrão. A regra de cada uma está em Literais escondidos no SQL. |
POST /conta/senha | Troca a senha (senha_atual, nova, repetir) e encerra as outras sessões. |
GET /conta/aparelhos | As sessões abertas, da console e do app. |
DELETE /conta/aparelhos/{id} | Encerra uma sessão. |
POST /conta/aparelhos/encerrar-outros | Encerra todas as outras sessões. |
POST /conta/recuperacao | Gera códigos de recuperação novos. |
POST /conta/app e /conta/app/confirmar | Troca o app autenticador; o atual vale até a confirmação. |
POST /conta/email e /conta/email/confirmar | Configura ou troca o e-mail da segunda etapa. |
As ações sensíveis (senha, app, e-mail e códigos de recuperação) pedem a senha_atual, com o mesmo bloqueio da console para quem erra.
Análises
| Método e caminho | O que faz |
|---|---|
GET /analises?limite=50&antes=<cursor> | Lista as análises, da mais nova para a mais antiga, de 1 a 200 por página (padrão 50). O campo proximo leva à página seguinte, em antes. |
GET /analises/{id} | Uma análise. |
DELETE /analises/{id} | Exclui a análise. |
POST /analises/excluir | Exclui várias, com {"ids": [...]}, até 200. |
GET /analises/mudancas?desde=<instante> | As análises que terminaram depois do instante, até 500 por consulta. O campo agora é o desde da consulta seguinte. |
Cada análise traz id, name, status (queued, running, done ou error), progress, size_bytes, as datas, o response_time_us, o tipo do trace e a mensagem de erro já traduzida. Não há download do trace nem reprocessamento: o trace não fica no servidor.
curl -s "https://app.waitscope.com/api/v1/analises?limite=20" -H "Authorization: Bearer $TOKEN"
Relatório
| Método e caminho | O que faz |
|---|---|
GET /analises/{id}/relatorio | O relatório em JSON, com as seções da página da console, os textos traduzidos e os números crus. |
GET /analises/{id}/relatorio.html | O HTML exportado, igual ao Baixar HTML. |
GET /analises/{id}/comandos/{rank} | O detalhe de um comando, com o plano. |
GET /analises/{id}/objetos/{obj} | A página de objeto: consultas prontas para rodar no banco. |
GET /analises/{id}/plsql?dono=&nome=&tipo=&linha= | Consultas prontas para o PL/SQL da pilha de um deadlock. |
relatorio e relatorio.html aceitam ?top=N, de 1 a 300, ou ?todos=1, como Comandos por lista; sem eles, 10. Enquanto a análise não termina, ou se ela terminou com erro, as rotas do relatório respondem 409 conflito. O SQL sai com a máscara de literais da conta. Com uma das opções da máscara ligada, o sql_id das variantes (top_variants) vem vazio e o sql_ids dos textos compartilháveis vem []: o sql_id é calculado a partir do texto com os valores.
Envio
O envio é retomável: o arquivo vai em pedaços de até 8 MiB, um por vez, e depois de uma queda de rede continua de onde parou.
| Método e caminho | O que faz |
|---|---|
POST /envios | Abre o envio, com juntar e a lista de arquivos (nome e tamanho). Devolve o id, a lista que vale e o pedaco_max; arquivos .trm e vazios ficam de fora. |
PUT /envios/{id}/arquivos/{n} | Manda um pedaço do arquivo n, com Content-Range: bytes ini-fim/total; ini é o que já foi recebido. |
GET /envios/{id} | Quanto já chegou de cada arquivo, para retomar. |
POST /envios/{id}/concluir | Fecha o envio e cria as análises. Repetir devolve o mesmo resultado, sem criar análise de novo. |
DELETE /envios/{id} | Cancela o envio e apaga o que chegou. |
curl -s https://app.waitscope.com/api/v1/envios \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"juntar": false, "arquivos": [{"nome": "exemplo-10046.trc", "tamanho": 1845}]}'
curl -s -X PUT "https://app.waitscope.com/api/v1/envios/$ENVIO/arquivos/0" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Range: bytes 0-1844/1845" \
--data-binary @exemplo-10046.trc
O exemplo manda o trace sintético, de 1.845 bytes, num pedaço só; $ENVIO é o id devolvido pelo POST /envios. Com "juntar": true, os arquivos viram uma coleta, analisada como um trace só. O envio pertence ao token que o abriu e some com 24 horas sem pedaço novo ou quando a sessão do token termina.
Limites
- Limite de pedidos por endereço IP e bloqueio progressivo do login depois de 5 erros de senha ou de código. Quem passa do limite recebe 429.
- Os limites da conta (tamanho por envio, análises na fila e análises guardadas) vêm em
GET /eu, no campolimits. Passou do tamanho: 413grande_demais. Fila ou análises guardadas no limite: 429limite. - Um envio em andamento por usuário, em pedaços de até 8 MiB. O envio parado some em 24 horas.
- Até 200 análises por página na lista, até 200 ids na exclusão em lote e até 500 itens por consulta de mudanças.
- Token por até 90 dias, ou 30 dias sem uso; token de cadastro por 30 minutos; desafio da segunda etapa por 10 minutos.
Para onde ir depois
- Enviar traces pela API: o passo a passo do envio por script.
- Enviar traces pelo app Android: o app que usa esta API.
- Limites e envio repetido: os limites de tamanho e o que acontece com o arquivo enviado de novo.
- Retenção, exclusão e privacidade dos dados: o que fica guardado e quem vê.