Operaciones
Rutas, permisos, idempotencia y finalidad de las 23 operaciones de la API HTTP, con ejemplos de solicitud.
Llama a cada operación con POST /api/v1/<operation> y un cuerpo que sea un objeto JSON. El nombre de operación de las tablas es el sufijo exacto después de /api/v1/. En MCP, la misma operación es la herramienta autonomy_<operation> con los puntos sustituidos por guiones bajos.
En las tablas, Obligatoria significa que la solicitud debe incluir un idempotencyKey (consulta Mutaciones idempotentes).
Proyectos
| Operación | Permiso | Idempotencia | Para qué sirve |
|---|---|---|---|
project.list | autonomy:read | Ninguna | Lista por nombre los proyectos a los que tienes acceso. Empieza por aquí para obtener el projectId que usan las demás operaciones. |
project.get | autonomy:read | Ninguna | Obtiene un proyecto por projectId, con su conocimiento del producto. |
Casos de prueba
| Operación | Permiso | Idempotencia | Para qué sirve |
|---|---|---|---|
test_case.list | autonomy:read | Ninguna | Lista los casos de prueba, del más reciente al más antiguo. Filtra por projectId, platform o una búsqueda por nombre (query). Consúltala antes de crear un caso para reutilizar la cobertura existente. |
test_case.get | autonomy:read | Ninguna | Obtiene un caso de prueba por testCaseId, con sus pasos y sus adjuntos. Nunca devuelve los valores secretos. |
test_case.create | autonomy:test_cases:write | Obligatoria | Crea un caso de prueba en un proyecto a partir de pasos escritos como resultados esperados. Recibe projectId, name, platforms, steps y, de forma opcional, description y tags. |
test_case.update_steps | autonomy:test_cases:write | Obligatoria | Sustituye la lista completa de pasos de un caso de prueba. Siempre necesita confirm: true. |
test_case.archive | autonomy:test_cases:write | Obligatoria | Archiva un caso de prueba: desaparece de las listas y no se puede ejecutar. Se conservan sus ejecuciones y sus resultados. Archivarlo otra vez no cambia nada. |
Planes de pruebas
| Operación | Permiso | Idempotencia | Para qué sirve |
|---|---|---|---|
test_plan.list | autonomy:read | Ninguna | Lista los planes de pruebas. Filtra por projectId o una búsqueda por nombre (query). |
test_plan.get | autonomy:read | Ninguna | Obtiene un plan de pruebas con sus casos de prueba en orden. |
test_plan.create | autonomy:test_plans:write | Obligatoria | Crea un plan de pruebas en un proyecto, opcionalmente con sus primeros casos de prueba (testCaseIds, todos de ese proyecto). |
test_plan.set_members | autonomy:test_plans:write | Obligatoria | Sustituye los casos de prueba de un plan de pruebas, en orden. Solo necesita confirm: true cuando se quitarían casos. |
Ejecuciones
| Operación | Permiso | Idempotencia | Para qué sirve |
|---|---|---|---|
run.trigger | autonomy:runs:write | Obligatoria | Pone ejecuciones en cola. Indica exactamente uno de testCaseId o testPlanId (un plan pone en cola una ejecución por caso de prueba). Apunta a un entorno guardado del mismo proyecto con environmentSlug, o pasa targets para un despliegue o una compilación nuevos. Responde al momento. |
run.list | autonomy:read | Ninguna | Lista las ejecuciones recientes, de la más nueva a la más antigua. Filtra por projectId, testCaseId, status, environmentSlug o branch. Consúltala antes de lanzar trabajo duplicado. |
run.get | autonomy:read | Ninguna | Obtiene el resultado de una ejecución, el resultado de cada paso y lo que creó la ejecución. Admite espera larga con cursor y waitMs. |
run.step_actions | autonomy:read | Ninguna | Lista las Step Actions de la ejecución: todo lo que hizo el agente para alcanzar cada resultado esperado, incluido el Final check. Los valores que guardaste como secretos se enmascaran. Filtra con stepIndex. |
run.evidence | autonomy:read | Ninguna | Obtiene la evidencia de cada paso que se ejecutó: el resultado esperado, el resultado, la explicación, el Final check y enlaces a medios de corta duración. Filtra con step. |
Consulta Ejecuciones y evidencia para saber cómo seguir una ejecución y leer estos resultados.
Entornos
| Operación | Permiso | Idempotencia | Para qué sirve |
|---|---|---|---|
environment.list | autonomy:read | Ninguna | Lista los entornos con sus objetivos de plataforma. Filtra por projectId. Se muestran los nombres de los valores, nunca los valores. |
environment.get | autonomy:read | Ninguna | Obtiene un entorno por environmentSlug. |
environment.upsert | autonomy:environments:write | Obligatoria | Crea un entorno (para crearlo hace falta projectId) o actualiza uno por slug. Actualizar un entorno existente necesita confirm: true. Los runtimeValues se combinan por nombre y se usan como {{env.NAME}} en cualquier paso. Los valores secretos son de solo escritura. |
Un objetivo web o de API necesita una url, y un objetivo Android, un artifactUrl para su compilación (los objetivos iOS no se pueden guardar hasta que las pruebas en iOS estén disponibles). packageName, bundleId y versionLabel son opcionales: si no los indicas, se leen de la compilación, y un valor que envíes tiene prioridad. Puedes guardar mientras la compilación todavía se está leyendo; si no se puede leer su ID de app, las ejecuciones en ese objetivo no pueden empezar.
Incidencias
| Operación | Permiso | Idempotencia | Para qué sirve |
|---|---|---|---|
issue.list | autonomy:read | Ninguna | Lista las incidencias, de la más reciente a la más antigua. Filtra por projectId, environmentSlug, status, kind o runId para ver las incidencias que encontró o mostró una ejecución. |
issue.create | autonomy:issues:write | Obligatoria | Registra una incidencia en el entorno donde se detectó. kind es bug o risk. Recibe title, un body en texto plano, expected y actual opcionales, y runIds para citar ejecuciones. |
issue.comment | autonomy:issues:write | Obligatoria | Añade un comentario en texto plano a una incidencia. |
issue.set_status | autonomy:issues:write | Obligatoria | Cambia una incidencia a open, resolved o ignored. Resuélvela cuando una ejecución del mismo caso de prueba muestre la corrección. |
Una incidencia nunca cambia el resultado de una ejecución ni de un paso. Las incidencias registradas antes de v0.5 pueden tener el tipo note; las nuevas son bug o risk. Consulta Incidencias.
Pasos como resultados esperados
Un caso de prueba es una lista de pasos. Cada paso es un resultado esperado en palabras sencillas, con adjuntos opcionales:
1{2 "id": "sign-up",3 "text": "A new account exists for a fresh email address",4 "attachments": [5 {6 "id": "inbox",7 "kind": "inbox",8 "exact": false9 }10 ]11}id: estable dentro del caso de prueba. Letras, dígitos,_y-, hasta 64 caracteres.text: el resultado esperado, hasta 2000 caracteres. Puede usar{{env.NAME}}.attachments: hasta 12. Cada uno tiene su propioid, unkindyexact.
kind | Campos | Qué le da al agente |
|---|---|---|
account | role | Un inicio de sesión guardado del entorno de la ejecución, por rol, como "Grower". |
inbox | label?, address? | Una bandeja de entrada nueva para la ejecución, o una address existente. |
phone | label?, number? | Un número de teléfono que recibe SMS, o un number existente. |
file | label?, file | Un archivo que subir. Copia el objeto file de un caso de prueba que ya use ese archivo. |
screenshot | label? | Una captura del resultado esperado, que se conserva como evidencia. |
data | label, value?, intent?, secret? | Un valor que usar (value), o un intent para que el agente elija uno, como «Una contraseña segura». |
Los adjuntos son datos de prueba salvo que exact sea true. Si el producto rechaza un valor de prueba solo porque ya está en uso, el agente usa otro valor nuevo del mismo tipo y lo indica. Un valor Exact se usa tal como está escrito, y si el producto lo rechaza, el paso se evalúa según ese rechazo. Un adjunto data, inbox o phone marcado como Exact necesita su valor, su dirección o su número.
address, number y value pueden ser {{env.NAME}}, que se rellena desde el entorno de la ejecución. Un adjunto data con secret: true es de solo escritura: su valor se guarda oculto y nunca se devuelve. Si test_case.update_steps vuelve a enviar un adjunto secreto sin su valor, se conserva el valor guardado.
La API acepta hasta 50 pasos por caso de prueba. El editor del panel muestra hasta 12, así que mantén cortos los casos que también editas en el panel. Consulta Creación de casos de prueba para escribir buenos resultados esperados.
Crear un caso de prueba
Este caso de prueba se registra con una bandeja de entrada nueva y una contraseña generada, elige un país que debe ser exactamente «Kenya», confirma la cuenta desde el correo de bienvenida y conserva una captura del perfil.
curl --request POST "https://api.autonomyqa.com/api/v1/test_case.create" \
--header "Authorization: Bearer $AUTONOMY_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"idempotencyKey": "ci-create-grower-sign-up-v1",
"projectId": "jd7exampleprojectid",
"name": "Grower sign-up",
"description": "A new grower can sign up, confirm their email and see their profile.",
"platforms": ["web"],
"tags": ["sign-up", "smoke"],
"steps": [
{
"id": "sign-up",
"text": "A new grower account exists for a fresh email address, with Kenya as the country",
"attachments": [
{ "id": "inbox", "kind": "inbox", "label": "Sign-up inbox", "exact": false },
{
"id": "password",
"kind": "data",
"label": "Password",
"intent": "A strong password the sign-up form accepts",
"exact": false
},
{ "id": "country", "kind": "data", "label": "Country", "value": "Kenya", "exact": true }
]
},
{
"id": "confirm-email",
"text": "The account is confirmed with the link in the welcome email",
"attachments": []
},
{
"id": "profile",
"text": "The profile page shows Kenya as the country",
"attachments": [
{ "id": "profile-shot", "kind": "screenshot", "label": "Profile", "exact": false }
]
}
]
}'Guarda la clave aut_ en AUTONOMY_API_KEY. La respuesta es el nuevo caso de prueba, con su id.
Iniciar una ejecución
Indica exactamente uno de testCaseId o testPlanId, y environmentSlug o targets, pero no ambos. Este ejemplo apunta a una previsualización web nueva:
curl --request POST "https://api.autonomyqa.com/api/v1/run.trigger" \
--header "Authorization: Bearer $AUTONOMY_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"idempotencyKey": "ci-run-pr-128-grower-sign-up-9f3a2c1",
"testCaseId": "jh7exampletestcaseid",
"platforms": ["web"],
"targets": {
"web": { "baseUrl": "https://preview-128.example.com" }
},
"branch": "feature/sign-up-copy",
"pr": "128",
"deployment": { "commitSha": "9f3a2c1d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b" }
}'| Objetivo | Campos |
|---|---|
web | baseUrl |
api | baseUrl, runtimeValues opcional ([{ "name", "value", "isSecret" }]) |
android | packageName, más artifactUrl o un storageId escaneado |
ios | Próximamente: las ejecuciones en iOS todavía no pueden empezar. bundleId, más artifactUrl o un storageId escaneado |
platforms limita la ejecución a algunas de las plataformas del caso de prueba. branch, pr y deployment vinculan las ejecuciones a una rama, una pull request o un commit. En el plan Team y superiores, scope: "changed" con changedFiles centra la ejecución en los archivos modificados.
La respuesta contiene runIds, el environment usado y, para un plan de pruebas, planGroupRunId. Sigue cada ejecución con run.get.
run.trigger rechaza un caso de prueba importado que no se ha confirmado, un caso de prueba que todavía solo tiene pasos anteriores a v0.5 ("Rewrite them as outcome steps with test_case.update_steps, then run it.") y un plan de pruebas sin casos de prueba.
Mutaciones idempotentes
Cada mutación marcada como Obligatoria necesita una cadena idempotencyKey en su cuerpo JSON. Es un campo del cuerpo, no una cabecera. Sin ella, la API devuelve 400 INVALID_ARGUMENT con el mensaje "idempotencyKey is required for this operation."
- Si reintentas con la misma clave y los mismos argumentos, recibes el resultado guardado en lugar de repetir el trabajo.
- Si reutilizas una clave con argumentos distintos, recibes
409 CONFLICT: "idempotencyKey was already used with different arguments." - Los resultados se conservan 24 horas. Las claves son independientes para cada llamante.
Usa una clave por cada cambio que quieras hacer y reutilízala solo para reintentar ese cambio. Las operaciones de lectura no llevan clave.
Confirmación antes de sustituir
Las creaciones y run.trigger nunca necesitan confirmación. Tres operaciones necesitan confirm: true cuando sustituirían algo:
| Operación | Cuándo | details.wouldChange |
|---|---|---|
test_case.update_steps | Siempre: se sustituye toda la lista de pasos. | stepCountBefore, stepCountAfter |
test_plan.set_members | Solo cuando se quitarían casos de prueba. | removed, added (cada uno [{ testCaseId, name }]) |
environment.upsert | Cuando el slug existe y se envían campos u objetivos. | fields, platforms |
Sin confirmación no se escribe nada. La API devuelve 400 INVALID_ARGUMENT con details.confirmRequired: true y la vista previa details.wouldChange. Lee la vista previa y vuelve a enviar la misma solicitud con confirm: true. No añadas confirm: true de forma automática. Consulta Errores para ver la respuesta completa.
Paginación por cursor
Todas las operaciones *.list, y también run.step_actions, aceptan un limit opcional y un cursor opaco:
1{2 "projectId": "jd7exampleprojectid",3 "limit": 20,4 "cursor": "<nextCursor from the previous response>"5}limit vale 20 por defecto y debe ser un entero entre 1 y 100. Cada respuesta es { items, nextCursor }. Pasa nextCursor sin modificar para obtener la página siguiente; null significa que no hay más páginas. Mantén los mismos filtros en todas las páginas. Un null en el nivel superior, como "cursor": null, cuenta como no enviado.
run.list e issue.list aplican algunos filtros dentro de cada página, así que una página puede venir corta o vacía aunque queden más resultados. Sigue paginando mientras nextCursor tenga valor.
¿No lo encontraste?