La API v1 es la interfaz que usa la app de Android para comunicarse con la consola: inicio de sesión, cuenta, análisis, informes y envío de traces. Se hizo para la app y sigue las mismas reglas que la consola en el navegador. Esta página resume el contrato; para enviar un trace por script, siga Enviar traces por la API.
Dirección y formato
- Base:
https://app.waitscope.com/api/v1, solo por HTTPS. La dirección anterior,https://waitscope.io/api/v1, todavía responde, para la app configurada con ella. - JSON en UTF-8 en los dos sentidos, salvo las descargas y los fragmentos de archivo del envío. Un campo desconocido en el cuerpo se rechaza con 400.
- Las rutas siguen las de la consola, en portugués:
/analises,/envios,/conta. - Instantes en RFC 3339 con zona horaria, como
2026-10-17T13:50:48-03:00. Tiempos del trace en microsegundos enteros, en los campos que terminan en_us, y tamaños en bytes. Formatear números y fechas para mostrarlos le corresponde al cliente. - Sin CORS: la API no atiende una página de otro sitio abierta en el navegador.
Autenticación
El inicio de sesión tiene los dos pasos de la consola: la contraseña y después el código de la app de autenticación. Al final, la API devuelve un token de 43 caracteres, que va en toda llamada en el encabezado 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"}'
La respuesta trae "etapa": "codigo" y un desafio, que vale 10 minutos. Envíe el desafío con el código de 6 dígitos de la app, o con un código de recuperación:
curl -s https://app.waitscope.com/api/v1/sessao/codigo \
-H 'Content-Type: application/json' \
-d '{"desafio": "...", "codigo": "123456"}'
La respuesta trae el token, la validez en expira_em y los datos de la cuenta, los mismos de GET /eu.
- El token vale hasta 90 días y caduca con 30 días sin uso.
DELETE /sessaotermina el token en el acto. - Cuenta en el límite de sesiones simultáneas de la cuenta, junto con las del navegador, y aparece en Mi cuenta como “App Android · dispositivo”, con el
device_namedel inicio de sesión. - La cookie de la consola no vale en la API, y el token no vale en la consola.
methodesapp, el valor predeterminado, oemail, este solo cuando la cuenta tiene el correo electrónico confirmado y el servidor envía correo. El rechazo trae los medios aceptados enmetodos_disponiveis.- La cuenta todavía sin verificación en dos pasos recibe
"etapa": "cadastro"y un token que solo abre el registro, durante 30 minutos. - Hasta que usted acepte en la consola la versión vigente de los Términos de Servicio y de la Política de Privacidad, toda ruta responde 403
termos_pendentes, salvoGET /euyDELETE /sessao.
Idioma
Los mensajes, el diagnóstico, las tarjetas del informe y el catálogo de errores de Oracle vienen traducidos por el servidor. Con token, en el idioma de la cuenta, que PUT /conta/idioma cambia. Sin token, por el encabezado Accept-Language: pt, en o es, y cualquier otro pasa a pt.
Errores
El error viene con el estado HTTP y un cuerpo así:
{"erro": {"codigo": "nao_encontrado", "mensagem": "La dirección solicitada no existe."}}
El codigo es estable y sirve para que el programa decida qué hacer; el campo mensagem ya viene traducido, para mostrarlo al usuario. Algunos errores traen campos al lado de erro: bloqueado_ate, con el encabezado Retry-After, tentativas_restantes y metodos_disponiveis.
| HTTP | codigo | Cuándo |
|---|---|---|
| 400 | requisicao_invalida | JSON no válido, campo desconocido o valor fuera de rango |
| 401 | sessao_invalida | Sin token, o con un token caducado, terminado o de otro tipo |
| 401 | credenciais_invalidas | Usuario o contraseña incorrectos; la respuesta es la misma para un usuario que no existe |
| 401 | codigo_incorreto | Código del segundo paso incorrecto; trae tentativas_restantes |
| 403 | cadastro_pendente | Token de registro que intenta otra ruta |
| 403 | troca_de_senha | Contraseña caducada o provisional: solo valen /eu, /conta/senha y DELETE /sessao |
| 403 | acesso_vencido | Terminó el plazo de acceso de la cuenta |
| 403 | admin_cadastro_local | Administrador sin segundo paso que entra por internet |
| 403 | admin_so_local | Administrador por internet, cuando el servidor solo acepta al administrador en la propia máquina |
| 403 | termos_pendentes | Falta aceptar en la consola la versión vigente de los términos |
| 404 | nao_encontrado | Recurso que no existe o que es de otra cuenta |
| 409 | conflito | El estado no lo permite, como el informe de un análisis que no terminó o el envío ya completado |
| 410 | desafio_expirado | Desafío del segundo paso caducado, ya usado o reemplazado por otro inicio de sesión |
| 413 | grande_demais | Superó el límite de envío |
| 429 | muitas_tentativas | Bloqueo de inicio de sesión o de código; trae bloqueado_ate |
| 429 | limite | Cola llena, análisis guardados en el límite u otro envío en curso |
| 503 | indisponivel | Servicio no disponible por un instante, como la base de datos caída o el fallo al grabar el archivo |
| 503 | sem_espaco | El envío dejaría al servidor sin la reserva de espacio en disco |
Las rutas de la cuenta y del registro usan también senha_atual_incorreta (401), senha_invalida, metodo_indisponivel, email_indisponivel, email_invalido y codigo_expirado (400).
Rutas
Todas las rutas piden el token, salvo GET /versao y las del inicio de sesión. La ruta con el id de un recurso de otra cuenta responde 404 nao_encontrado, sin confirmar que existe: ni el administrador ve los análisis de otra cuenta.
Versión
| Método y ruta | Qué hace |
|---|---|
GET /versao | Sin token. La versión del servidor y de la API y, cuando hay una app publicada, la de la app: versao, codigo, minima, sha256, bytes, la dirección de la descarga y la de la página de la app. Cuando el codigo instalado es menor que minima, la app pide la actualización. |
GET /app/apk | Descarga el APK publicado. |
curl -s https://app.waitscope.com/api/v1/versao
Con la app publicada, la respuesta trae su versión; sin APK publicado, app viene nulo:
{"api":1,"app":{"bytes":...,"codigo":7,"download":"/api/v1/app/apk","minima":...,"pagina":"/app","sha256":"...","versao":"1.2.1"},"servidor":"1.6.0"}
Sesión
| Método y ruta | Qué hace |
|---|---|
POST /sessao | Primer paso del inicio de sesión: username, password, method y device_name, opcional, de hasta 80 caracteres. |
POST /sessao/codigo | Segundo paso: desafio y codigo. Devuelve el token. |
POST /sessao/codigo/reenviar | Reenvía el código por correo electrónico, como máximo 3 envíos, con 60 s entre ellos. |
DELETE /sessao | Termina el token usado en la llamada. |
GET /eu | Los datos de la cuenta: usuario, idioma, plazos, segundo paso, límites (limits) y términos pendientes (terms_pending). |
GET y POST /duas-etapas/app | Con el token de registro: la clave y el código QR de la app de autenticación y, después, la confirmación con el código, que devuelve los 10 códigos de recuperación. |
POST /duas-etapas/email y /duas-etapas/email/confirmar | Registro del código por correo electrónico, cuando el servidor envía correo. |
Cuenta
| Método y ruta | Qué hace |
|---|---|
PUT /conta/idioma | Cambia el idioma de la cuenta: pt, en o es. |
GET y PUT /conta/privacidade | La máscara de literales: ocultar_textos y ocultar_numeros, activadas de forma predeterminada. La regla de cada una está en Literales ocultos en el SQL. |
POST /conta/senha | Cambia la contraseña (senha_atual, nova, repetir) y termina las otras sesiones. |
GET /conta/aparelhos | Las sesiones abiertas, de la consola y de la app. |
DELETE /conta/aparelhos/{id} | Termina una sesión. |
POST /conta/aparelhos/encerrar-outros | Termina todas las otras sesiones. |
POST /conta/recuperacao | Genera códigos de recuperación nuevos. |
POST /conta/app y /conta/app/confirmar | Cambia la app de autenticación; la actual vale hasta la confirmación. |
POST /conta/email y /conta/email/confirmar | Configura o cambia el correo electrónico del segundo paso. |
Las acciones sensibles (contraseña, app, correo electrónico y códigos de recuperación) piden la senha_atual, con el mismo bloqueo de la consola para quien se equivoca.
Análisis
| Método y ruta | Qué hace |
|---|---|
GET /analises?limite=50&antes=<cursor> | Lista los análisis, del más nuevo al más antiguo, de 1 a 200 por página (valor predeterminado 50). El campo proximo lleva a la página siguiente, en antes. |
GET /analises/{id} | Un análisis. |
DELETE /analises/{id} | Elimina el análisis. |
POST /analises/excluir | Elimina varios, con {"ids": [...]}, hasta 200. |
GET /analises/mudancas?desde=<instante> | Los análisis que terminaron después del instante, hasta 500 por consulta. El campo agora es el desde de la consulta siguiente. |
Cada análisis trae id, name, status (queued, running, done o error), progress, size_bytes, las fechas, el response_time_us, el tipo de trace y el mensaje de error ya traducido. No hay descarga del trace ni reprocesamiento: el trace no se queda en el servidor.
curl -s "https://app.waitscope.com/api/v1/analises?limite=20" -H "Authorization: Bearer $TOKEN"
Informe
| Método y ruta | Qué hace |
|---|---|
GET /analises/{id}/relatorio | El informe en JSON, con las secciones de la página de la consola, los textos traducidos y los números en bruto. |
GET /analises/{id}/relatorio.html | El HTML exportado, igual al de Descargar HTML. |
GET /analises/{id}/comandos/{rank} | El detalle de una sentencia, con el plan. |
GET /analises/{id}/objetos/{obj} | La página del objeto: consultas listas para ejecutar en la base de datos. |
GET /analises/{id}/plsql?dono=&nome=&tipo=&linha= | Consultas listas para el PL/SQL de la pila de un deadlock. |
relatorio y relatorio.html aceptan ?top=N, de 1 a 300, o ?todos=1, como Sentencias por lista; sin ellos, 10. Mientras el análisis no termina, o si terminó con error, las rutas del informe responden 409 conflito. El SQL sale con la máscara de literales de la cuenta. Con una de las opciones de la máscara activada, el sql_id de las variantes (top_variants) viene vacío y el sql_ids de los textos compartibles viene []: el sql_id se calcula a partir del texto con los valores.
Envío
El envío se puede reanudar: el archivo va en fragmentos de hasta 8 MiB, uno por vez, y después de una caída de la red sigue desde donde se detuvo.
| Método y ruta | Qué hace |
|---|---|
POST /envios | Abre el envío, con juntar y la lista de arquivos (nome y tamanho). Devuelve el id, la lista que vale y el pedaco_max; los archivos .trm y vacíos quedan fuera. |
PUT /envios/{id}/arquivos/{n} | Envía un fragmento del archivo n, con Content-Range: bytes ini-fim/total; ini es lo que ya se recibió. |
GET /envios/{id} | Cuánto llegó de cada archivo, para retomar. |
POST /envios/{id}/concluir | Cierra el envío y crea los análisis. Repetirlo devuelve el mismo resultado, sin crear el análisis de nuevo. |
DELETE /envios/{id} | Cancela el envío y borra lo que llegó. |
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
El ejemplo envía el trace sintético, de 1.845 bytes, en un solo fragmento; $ENVIO es el id devuelto por el POST /envios. Con "juntar": true, los archivos pasan a ser una colección, analizada como un solo trace. El envío pertenece al token que lo abrió y desaparece tras 24 horas sin un fragmento nuevo o cuando termina la sesión del token.
Límites
- Límite de solicitudes por dirección IP y bloqueo progresivo del inicio de sesión después de 5 errores de contraseña o de código. Quien supera el límite recibe 429.
- Los límites de la cuenta (tamaño por envío, análisis en cola y análisis guardados) vienen en
GET /eu, en el campolimits. Si supera el tamaño: 413grande_demais. Cola o análisis guardados en el límite: 429limite. - Un envío en curso por usuario, en fragmentos de hasta 8 MiB. El envío detenido desaparece en 24 horas.
- Hasta 200 análisis por página en la lista, hasta 200 ids en la eliminación en lote y hasta 500 elementos por consulta de cambios.
- Token por hasta 90 días, o 30 días sin uso; token de registro por 30 minutos; desafío del segundo paso por 10 minutos.
Adónde ir después
- Enviar traces por la API: el paso a paso del envío por script.
- Enviar traces con la app de Android: la app que usa esta API.
- Límites y envío repetido: los límites de tamaño y qué pasa con el archivo enviado de nuevo.
- Retención, eliminación y privacidad de los datos: qué se guarda y quién lo ve.