Referencia de API de Proyectos
Cree, recupere, actualice, elimine y gestione la membresía de sus proyectos del Axe Developer Hub programáticamente utilizando la API REST
La API de Proyectos le permite gestionar proyectos y la membresía de Axe Developer Hub programáticamente, utilizando la misma clave API de Axe Account que ya usa para el resto de las API REST de Axe Developer Hub. No hay credenciales separadas para la gestión de proyectos. Para una introducción paso a paso, consulte Comience con la Automatización de Gestión de Proyectos.
Si solo necesita descubrir el ID de un proyecto a partir de su nombre para poder llamar a la API de Sesiones y Resultados, consulte Listar Proyectos a continuación. Si ya conoce su ID de proyecto, puede encontrarlo en Axe Developer Hub y llamar directamente a la API de Sesiones y Resultados.
Autenticación
Todas las solicitudes requieren una clave API. Proporciónela utilizando el encabezado X-API-Key:
X-API-Key: <DEQUE_API_KEY>Encuentre su clave API en el Portal de Cuentas Axe. Elija una clave API de Axe Developer Hub para proyectos web o CI/CD. Elija una clave API de Axe DevTools Mobile para proyectos móviles.
Trate su clave API como un secreto: almacénela en una variable de entorno o en el almacén de secretos de su plataforma CI/CD en lugar de codificarla en sus solicitudes.
Control de Acceso y Permisos
- Crear un proyecto requiere una suscripción activa (licencia) para el tipo de ese proyecto. Quien crea un proyecto se convierte automáticamente en su administrador de proyecto.
- Roles de proyecto son administrador y miembro. Un administrador de proyectos puede actualizar o eliminar el proyecto y gestionar su membresía. Un miembro del proyecto puede acceder al proyecto pero no gestionarlo ni a su membresía.
- Admins de Organización pueden ver y gestionar cada proyecto de los tipos con licencia de su organización, independientemente de su propia membresía de proyecto. No necesitan una licencia personal para ver, actualizar, eliminar o gestionar los miembros de un proyecto existente. Crear un proyecto es la única excepción: siempre requiere una licencia activa, ya sea que el solicitante sea un administrador de organización o no.
- Agregar un miembro a un proyecto no requiere que ese miembro tenga una licencia. La API los registra como miembros del proyecto de inmediato, pero no pueden acceder al proyecto hasta que tengan una licencia. El usuario objetivo ya debe pertenecer a la organización. No puede agregar a alguien que no sea ya miembro de la organización.
- Eliminar un proyecto es definitivo. No hay una opción de restauración automática para un proyecto eliminado.
- En todos los casos, la respuesta está limitada al producto de la clave API. Una clave API de Axe Developer Hub devuelve y gestiona solo proyectos de Axe Developer Hub (web). Una clave API de Axe DevTools Mobile devuelve y gestiona solo proyectos de Axe DevTools Mobile.
Una suscripción inactiva devuelve 401 Unauthorized.
Valores de Configuración del Tipo de Proyecto
Cada proyecto tiene un selected_project_type, y cada tipo acepta solo un conjunto específico y fijo de valores test_language / test_platform:
selected_project_type |
Familia de productos | Válido test_language |
Válido test_platform |
|---|---|---|---|
axe-devtools-watcher |
Web | javascript, typescript |
Cypress, Cypress Component, WebDriverJS, Playwright, Playwright Test, Puppeteer, WebdriverIO, WebdriverIO Testrunner |
axe-devtools-watcher |
Web | java |
Selenium WebDriver, Playwright |
axe-devtools-html |
Web | null (requerido) |
null (requerido) |
axe-devtools-mobile |
Móvil | null (requerido) |
Appium, Espresso, UI Automator, XCUITest |
El selected_project_type de un proyecto se fija cuando se crea el proyecto. Para utilizar un tipo diferente, cree un nuevo proyecto.
Listar Proyectos
Devuelve la lista de proyectos a los que la clave API autenticada puede acceder.
Solicitud
- Punto final:
GET https://axe.deque.com/api-pub/v1/results/projects - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
Parámetros de consulta
Todos los parámetros de consulta son opcionales.
| Parámetro | Descripción |
|---|---|
project_types |
Lista separada por comas de tipos de proyectos a devolver, por ejemplo axe-devtools-watcher,axe-devtools-html. También acepta los alias web y mobile, que cada uno se expande a los tipos concretos para ese producto: web devuelve proyectos axe-devtools-watcher y axe-devtools-html, y mobile devuelve proyectos axe-devtools-mobile (proyectos de Axe DevTools Mobile SDK y Appium). Si omite este parámetro, la respuesta devuelve todos los tipos de proyectos a los que su clave API puede acceder. |
member_only |
true o false. Predeterminado: false. Si eres administrador de la organización, true devuelve solo los proyectos de los que eres miembro en lugar de todos los proyectos de tu organización. Para otros usuarios, el parámetro no tiene efecto, porque la respuesta ya contiene solo los proyectos de los que son miembros. |
page_size |
Número de proyectos a devolver por página. Predeterminado: 30. Máximo: 100. Los valores por encima del máximo se ajustan a 100. Vea Paginación por cursor. |
after |
Valor del cursor de la respuesta anterior, usado para recuperar la siguiente página. Vea Paginación por cursor. |
Cuerpo de la respuesta
Una respuesta exitosa devuelve un array JSON de objetos de proyecto. Cada objeto de proyecto incluye los siguientes campos:
| Campo | Tipo | Descripción |
|---|---|---|
project_id |
Cadena | Identificador único para el proyecto. Cuando llame a esta API o al Punto final de sesiones, use este valor como {project_id}. |
name |
Cadena | El nombre de visualización del proyecto. |
selected_project_type |
Cadena | El tipo de proyecto, por ejemplo axe-devtools-watcher o axe-devtools-html. Vea Valores de Configuración del Tipo de Proyecto. |
test_language |
Cadena | El idioma de prueba del proyecto. Para tipos de proyectos que no usan un idioma de prueba, esto es null. Vea Valores de Configuración del Tipo de Proyecto. |
test_platform |
Cadena | La plataforma de prueba del proyecto. Para tipos de proyectos que no usan una plataforma de prueba, esto es null. Vea Valores de Configuración del Tipo de Proyecto. Lea test_language y test_platform antes de actualizar un proyecto: la actualización valida el par después de fusionar sus cambios con estos valores almacenados. |
role |
Cadena | Su rol en el proyecto: admin, o contributor para un miembro del proyecto. Si es un administrador de la organización que no es miembro del proyecto, esto es null. |
user_id |
Cadena | Su ID de usuario, cuando role está configurado. Si role es null, esto es null. |
enterprise_id |
Cadena | ID de la organización que posee el proyecto. Si el proyecto no pertenece a una organización, esto es null. |
is_enterprise_project |
Booleano | Si el proyecto pertenece a una organización, es decir, si enterprise_id está configurado. |
created_at |
Cadena | Marca de tiempo UTC ISO 8601 para el tiempo de creación del proyecto. |
updated_at |
Cadena | Marca de tiempo UTC ISO 8601 para la última actualización del proyecto. Si el proyecto nunca ha sido actualizado, esto es null. |
run_by |
Cadena | Nombre del usuario cuya clave API ejecutó la sesión más reciente del proyecto. Si el proyecto no tiene sesiones, o no se puede resolver el usuario (por ejemplo, se eliminó la clave API), esto es null. |
last_session_created_at |
Cadena | Marca de tiempo UTC ISO 8601 de la sesión más reciente del proyecto. Si el proyecto no tiene sesiones, esto es null. |
has_git_information |
Booleano | Si el proyecto tiene metadatos Git adjuntos. |
git_url |
Cadena | URL del repositorio Git asociado con el proyecto. Si el proyecto no tiene información de Git, esto es null. |
latest_session |
Objeto | Detalles de la sesión más reciente del proyecto, incluyendo su ID (id), tiempo de creación (created_at), y rama de Git (git_branch). Si el proyecto no tiene sesiones, esto es null. Este campo contiene solo una sesión. Para listar cada sesión, use el Punto final de sesiones en su lugar. |
Las respuestas pueden incluir campos adicionales que no están listados aquí, y se pueden agregar nuevos campos con el tiempo. Ignore cualquier campo que no reconozca, y no dependa de campos no documentados.
Cuerpo de respuesta de ejemplo
[
{
"project_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "webapp-ci",
"selected_project_type": "axe-devtools-watcher",
"test_language": "typescript",
"test_platform": "Playwright",
"role": "admin",
"user_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"enterprise_id": "3f2b8e1a-6c4d-4f7e-9a0b-1d2c3e4f5a6b",
"is_enterprise_project": true,
"created_at": "2026-06-01T14:23:00.000Z",
"updated_at": "2026-06-10T16:45:00.000Z",
"run_by": "Jane Developer",
"last_session_created_at": "2026-06-14T09:12:00.000Z",
"has_git_information": true,
"git_url": "https://github.com/example/webapp",
"latest_session": {
"id": "0d4a85a2-9e6f-44ef-b814-fee8412abeb0",
"created_at": "2026-06-14T09:12:00.000Z",
"git_branch": "main"
}
},
{
"project_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef",
"name": "design-system",
"selected_project_type": "axe-devtools-html",
"test_language": null,
"test_platform": null,
"role": "admin",
"user_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"enterprise_id": "3f2b8e1a-6c4d-4f7e-9a0b-1d2c3e4f5a6b",
"is_enterprise_project": true,
"created_at": "2026-05-20T08:00:00.000Z",
"updated_at": null,
"run_by": null,
"last_session_created_at": null,
"has_git_information": false,
"git_url": null,
"latest_session": null
},
{
"project_id": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f",
"name": "ios-app-ci",
"selected_project_type": "axe-devtools-mobile",
"test_language": null,
"test_platform": "XCUITest",
"role": "admin",
"user_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"enterprise_id": "3f2b8e1a-6c4d-4f7e-9a0b-1d2c3e4f5a6b",
"is_enterprise_project": true,
"created_at": "2026-06-03T10:15:00.000Z",
"updated_at": null,
"run_by": "Jane Developer",
"last_session_created_at": "2026-06-15T11:05:00.000Z",
"has_git_information": false,
"git_url": null,
"latest_session": {
"id": "5b6c7d8e-9f0a-4b1c-8d2e-3f4a5b6c7d8e",
"created_at": "2026-06-15T11:05:00.000Z",
"git_branch": null
}
}
]Para mantener el ejemplo corto, cada objeto de latest_session muestra solo tres de sus campos. La API devuelve más.
Paginación por cursor
La paginación es opcional. No envíe page_size ni after, y la respuesta devolverá su lista completa de proyectos en una sola respuesta, sin un encabezado de cursor.
Para paginar a través de los resultados, la API de Proyectos usa la misma paginación basada en cursores que la Punto final de sesiones. Cuando hay más resultados más allá de la página actual, la respuesta devuelve un valor de cursor opaco en el encabezado x-pagination-cursor. Pase este valor como el parámetro de consulta after en su próxima solicitud para recuperar la siguiente página.
Cuando la respuesta no tiene el encabezado x-pagination-cursor, está en la última página.
Buscar un ID de proyecto por nombre
Este ejemplo utiliza curl y jq para encontrar el ID de un proyecto a partir de su nombre:
curl -s \
-H "Accept: application/json" \
-H "X-API-Key: $API_KEY" \
"https://axe.deque.com/api-pub/v1/results/projects" \
| jq -r '.[] | select(.name == "webapp-ci") | .project_id'Pase el ID devuelto al Punto final de sesiones para listar las sesiones de ese proyecto.
Listar respuestas de error de proyectos
| Estado | Causa |
|---|---|
400 Bad Request |
El valor project_types contiene un tipo de proyecto no válido, el cursor after está mal formado, page_size/after se repitió en la cadena de consulta, o member_only no es true o false. |
401 Unauthorized |
La clave API es inválida o falta, o la suscripción asociada está inactiva. |
Recuperar un proyecto
Devuelve un solo proyecto por su ID, con el mismo formato que Listar Proyectos.
Solicitud
- Punto final:
GET https://axe.deque.com/api-pub/v1/results/projects/{project_id} - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
Recuperar respuestas de error de proyecto
| Estado | Causa |
|---|---|
400 Bad Request |
project_id no es un UUID válido. |
401 Unauthorized |
La clave API es inválida o falta, o la suscripción asociada está inactiva. |
403 Forbidden |
El proyecto existe pero está fuera de la organización o tipo de producto de su clave API, o no es miembro de él. |
404 Not Found |
No existe ningún proyecto con ese ID, o el proyecto fue eliminado. |
Crear un proyecto
Crear un proyecto requiere el conjunto completo de configuraciones., name, selected_project_type, test_language y test_platform son todos obligatorios. Un campo omitido se rechaza con un error 400.
Solicitud
- Punto final:
POST https://axe.deque.com/api-pub/v1/results/projects - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>Content-Type: application/jsonAccept: application/json
Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name |
Cadena | Sí | El nombre visible del proyecto. De 1 a 512 caracteres. |
selected_project_type |
Cadena | Sí | El tipo del proyecto. Ver Valores de Configuración del Tipo de Proyecto. |
test_language |
Cadena o null |
Sí | Debe ser un valor válido para selected_project_type. Ver Valores de Configuración del Tipo de Proyecto. |
test_platform |
Cadena o null |
Sí | Debe ser un valor válido para selected_project_type y test_language. Ver Valores de Configuración del Tipo de Proyecto. |
Ejemplo de Cuerpo de Solicitud
{
"name": "webapp-ci",
"selected_project_type": "axe-devtools-watcher",
"test_language": "typescript",
"test_platform": "Playwright"
}Cuerpo de la respuesta
Devuelve el proyecto creado, con la misma estructura que Listar Proyectos. Quien crea un proyecto se convierte automáticamente en su administrador de proyecto, por lo que no se necesita una llamada de membresía por separado. Una creación exitosa devuelve 201 Created.
Crear un Proyecto Respuestas de Error
| Estado | Causa |
|---|---|
400 Bad Request |
El cuerpo de la solicitud carece de un campo requerido, o selected_project_type no es un tipo de proyecto válido. También puede significar que test_language/test_platform no son una combinación válida para selected_project_type, o que name está vacío o excede los 512 caracteres. |
401 Unauthorized |
La clave API es inválida o falta, o la suscripción asociada está inactiva. |
403 Forbidden |
El producto de su clave de API no coincide con selected_project_type, o su suscripción no cubre este tipo de proyecto. |
Actualizar un Proyecto
Un PATCH solo cambia los campos que envía. Aunque name, selected_project_type, test_language y test_platform son cada uno opcionales, la solicitud necesita al menos uno. Un campo omitido mantiene su valor almacenado. Después de la actualización, test_language y test_platform deben seguir siendo un par válido para el selected_project_type del proyecto, así que si solo envía uno de ellos, verifique primero el valor actual del otro.
Solicitud
- Punto final:
PATCH https://axe.deque.com/api-pub/v1/results/projects/{project_id} - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>Content-Type: application/jsonAccept: application/json
Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name |
Cadena | No | El nombre visible del proyecto. De 1 a 512 caracteres. |
selected_project_type |
Cadena | No | El tipo del proyecto no puede cambiar después de la creación. Enviar el valor actual es aceptado, y cualquier otro valor devuelve un error 400. |
test_language |
Cadena o null |
No | Debe ser un valor válido para el selected_project_type del proyecto. Ver Valores de Configuración del Tipo de Proyecto. |
test_platform |
Cadena o null |
No | Debe ser un valor válido para el selected_project_type y test_language del proyecto. Ver Valores de Configuración del Tipo de Proyecto. |
Ejemplo de Cuerpo de Solicitud
{
"name": "webapp-ci-renamed"
}Cuerpo de la respuesta
Devuelve el proyecto actualizado, con la misma estructura que Listar Proyectos. Una actualización exitosa devuelve 200 OK.
Actualizar un Proyecto Respuestas de Error
| Estado | Causa |
|---|---|
400 Bad Request |
El cuerpo de la solicitud no tiene ninguno de los campos actualizables, o selected_project_type difiere del tipo actual del proyecto. También puede significar que test_language/test_platform no son válidos para el tipo de proyecto o que name está vacío o excede los 512 caracteres. |
401 Unauthorized |
La clave API es inválida o falta, o la suscripción asociada está inactiva. |
403 Forbidden |
El producto de su clave de API no coincide con el selected_project_type del proyecto, o su suscripción no cubre este tipo de proyecto. También cubre el caso en que usted no es administrador del proyecto. |
404 Not Found |
No existe ningún proyecto con ese ID, o el proyecto fue eliminado. |
Eliminar un Proyecto
Eliminar un proyecto es definitivo. No hay restauración autoservicio.
Solicitud
- Punto final:
DELETE https://axe.deque.com/api-pub/v1/results/projects/{project_id} - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
Cuerpo de la respuesta
{ "deleted": true }Eliminar un Proyecto Respuestas de Error
| Estado | Causa |
|---|---|
400 Bad Request |
project_id no es un UUID válido. |
401 Unauthorized |
La clave API es inválida o falta, o la suscripción asociada está inactiva. |
403 Forbidden |
No eres administrador del proyecto ni administrador de la organización que posee el proyecto, o el tipo de proyecto está fuera de tu acceso. |
404 Not Found |
No existe ningún proyecto con ese ID, o el proyecto ya fue eliminado. |
Membresía del Proyecto
La membresía de un proyecto es un sub-recurso del proyecto. Un administrador de proyecto puede gestionar el proyecto y su membresía. Un miembro del proyecto (el rol de member en las operaciones de membresía a continuación) puede acceder al proyecto pero no gestionarlo. Las operaciones de membresía identifican a los usuarios por su dirección de correo electrónico. Agregar un miembro no requiere que posea una licencia. La API los registra inmediatamente, pero no pueden acceder al proyecto hasta que posean una licencia. El usuario objetivo debe pertenecer ya a su organización. No puedes agregar a alguien que no sea ya miembro de la organización.
Use las operaciones en lote a continuación siempre que sea posible. Las tres operaciones de escritura aceptan múltiples usuarios en una sola llamada. Esto reduce el número de solicitudes que necesita realizar. Si gestiona la membresía para una organización grande, aplique backoff y reintento cuando reciba una respuesta de 429. Consulte 429 Too Many Requests para el patrón general.
Listado de Miembros del Proyecto
- Punto final:
GET https://axe.deque.com/api-pub/v1/results/projects/{project_id}/memberships - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>,Accept: application/json
Cuerpo de la respuesta
{
"members": [
{
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"role": "admin",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"active_license": true,
"created_at": "2026-06-01T14:23:00.000Z"
}
]
}| Campo | Tipo | Descripción |
|---|---|---|
user_id |
Cadena | ID de usuario único del miembro. |
role |
Cadena | admin o member. |
email, first_name, last_name |
Cadena o null |
La dirección de correo electrónico del miembro es el valor que usan las operaciones de agregar, cambiar rol y eliminar para identificarlos. Si el registro de la cuenta de Axe del miembro ya no existe, estos son null. La respuesta aún lista al miembro en lugar de eliminar la fila, por lo que una fila de membresía de administrador existente siempre muestra un administrador en el proyecto. |
active_license |
Booleano | Si el miembro actualmente posee una licencia activa para el tipo de producto de este proyecto. |
created_at |
Cadena | Marca de tiempo UTC ISO 8601 para el momento de creación de la membresía. |
Agregar Miembros al Proyecto
- Punto final:
POST https://axe.deque.com/api-pub/v1/results/projects/{project_id}/memberships - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>,Content-Type: application/json,Accept: application/json
Cuerpo de la Solicitud
{
"user_email_role_pairs": [
{ "user_email": "sam@example.com", "role": "member" },
{ "user_email": "alex@example.com", "role": "admin" }
]
}user_email es la dirección de correo electrónico de la cuenta de Axe del usuario. La coincidencia ignora mayúsculas y minúsculas y espacios circundantes. role acepta admin o member (contributor también se acepta como sinónimo de member). Cada usuario puede aparecer solo una vez en una solicitud. Agregar un usuario que ya pertenece al proyecto no tiene efecto en esa entrada: no cambia su rol existente. Esta es una operación por lotes. Una entrada no válida rechaza toda la solicitud, y la API no escribe nada. El mensaje de error lista cada entrada que falló, para que pueda corregir un lote en un solo intento.
Una solicitud exitosa devuelve 201 Created con { "created": true }, haya o no agregado la solicitud nuevas membresías.
Cambiar Roles de Miembros
- Punto final:
PATCH https://axe.deque.com/api-pub/v1/results/projects/{project_id}/memberships - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>,Content-Type: application/json,Accept: application/json - Cuerpo de la solicitud: misma forma de
user_email_role_pairsque Agregar Miembros al Proyecto
Cada user_email debe pertenecer a un miembro actual del proyecto. Un proyecto siempre debe conservar al menos un admin. La API rechaza una solicitud que deja al proyecto sin administrador. Un único miembro restante que sea el único administrador no puede cambiar su propio rol. Esto es una operación por lotes. Una entrada inválida rechaza toda la solicitud y la API no escribe nada.
Una solicitud exitosa devuelve 200 OK con { "ok": true }.
Eliminar Miembros del Proyecto
- Punto final:
DELETE https://axe.deque.com/api-pub/v1/results/projects/{project_id}/memberships?user_emails={comma-separated,url-encoded,emails} - Encabezados (requeridos):
X-API-Key: <DEQUE_API_KEY>,Accept: application/json
Pase las direcciones de correo electrónico de los usuarios a eliminar como una lista separada por comas en un único parámetro de consulta user_emails, y codifique el valor en URL. Por ejemplo, un literal + en una dirección que no está codificada llega como un espacio y se rechaza por estar malformada. No hay cuerpo de solicitud. Eliminar a un usuario que no es miembro tiene éxito y no elimina nada, por lo que una solicitud repetida no es un error. Un proyecto siempre debe conservar al menos un admin. La API rechaza una solicitud que elimina al último administrador del proyecto. Un único miembro restante que sea el único administrador no puede eliminarse a sí mismo.
Una solicitud exitosa devuelve 200 OK con las direcciones que eliminó y las que no coincidieron con ningún miembro, para que pueda distinguir un error tipográfico de una eliminación completada:
{
"deleted": true,
"removed": ["sam@example.com"],
"unmatched": ["alx@example.com"]
}Respuestas de Error de Membresía del Proyecto
| Estado | Causa |
|---|---|
400 Bad Request |
project_id no es un UUID válido, user_email_role_pairs falta o está malformado, un user_email no es una dirección de correo electrónico válida, o el mismo usuario aparece más de una vez. También cubre un role que no es admin o member, o un valor user_emails que falta, se repite como parámetros separados o está malformado en la solicitud de eliminación. En la solicitud de adición, cubre una dirección de correo electrónico que no pertenece a su organización. En la solicitud de cambio de rol, cubre una dirección de correo electrónico que no pertenece a un miembro del proyecto. En cualquier solicitud de escritura, cubre una dirección de correo electrónico que coincide con más de un usuario; la API la rechaza en lugar de arriesgarse a realizar un cambio a la persona equivocada. |
401 Unauthorized |
La clave API es inválida o falta, o la suscripción asociada está inactiva. |
403 Forbidden |
No eres un administrador del proyecto o un administrador de la organización. También cubre un cambio que deja al proyecto sin administrador, o un único miembro restante intentando cambiar o eliminar su propia membresía. |
404 Not Found |
No existe ningún proyecto con ese ID, o el proyecto fue eliminado. |
