Referência da API de Sessões e Resultados
Recupere listas de sessões e resultados completos de acessibilidade programaticamente usando a API REST
A API de Sessões e Resultados oferece acesso programático às suas sessões do Axe Developer Hub e seus resultados de acessibilidade. Utilize o endpoint Sessões para descobrir sessões de um projeto e, em seguida, use o endpoint Resultados para obter os resultados detalhados de qualquer sessão específica.
Ambos os endpoints requerem um ID de projeto. Encontre-o em Axe Developer Hub ou procure pelo nome do projeto com a API de Projetos.
Autenticação
Todas as solicitações requerem uma chave de API. Forneça-a usando o cabeçalho X-API-Key:
X-API-Key: <DEQUE_API_KEY>Encontre sua chave de API no Portal de Contas Axe. Escolha uma chave de API do Axe Developer Hub para projetos web ou CI/CD, ou uma chave de API do Axe DevTools Mobile para projetos móveis.
Trate sua chave de API como um segredo: armazene-a em uma variável de ambiente ou no armazenamento secreto da sua plataforma CI/CD em vez de codificá-la diretamente em suas solicitações.
Controle de Acesso
As seguintes regras de acesso se aplicam a ambos os endpoints:
- Membros do projeto pode acessar sessões e resultados de qualquer projeto ao qual pertençam.
- Admins da Organização com uma assinatura ativa do Axe Developer Hub ou do Axe DevTools Mobile pode acessar sessões e resultados de qualquer projeto em sua organização, independentemente da associação ao projeto. O acesso está limitado ao produto da chave de API: uma chave de API do Axe Developer Hub retorna apenas dados do Axe Developer Hub, e uma chave de API do Axe DevTools Mobile retorna apenas dados do Axe DevTools Mobile. Um Admin da Organização não pode usar uma chave de API do Axe DevTools Mobile para recuperar dados do Axe Developer Hub, nem uma chave de API do Axe Developer Hub para recuperar dados do Axe DevTools Mobile.
- Usuários não membros, nem administradores recebem uma resposta de acesso negado.
- Uma assinatura inativa retorna
401 Unauthorized.
Endpoint de Sessões
Retorna uma lista paginada e filtrável de sessões para um projeto dado.
Solicitação
- Endpoint:
GET https://axe.deque.com/api-pub/v1/results/projects/{project_id}/sessions - Cabeçalhos (obrigatórios):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
Substitua {project_id} pelo ID do projeto cujas sessões você deseja recuperar. Encontre seu ID de projeto em Axe Developer Hub.
Parâmetros de Consulta
Todos os parâmetros de consulta são opcionais.
| Parâmetro | Descrição |
|---|---|
page_size |
Número de sessões para retornar por página. Padrão: 30. Máximo: 100. Valores acima do máximo são ajustados para 100. |
after |
Valor do cursor da resposta anterior, usado para recuperar a próxima página. Veja Paginação por Cursor. |
created_after |
Retorna apenas sessões criadas após este timestamp (ISO 8601 UTC, meia-aberta; exclui o limite exato). Exemplo: 2025-01-01T00:00:00Z |
created_before |
Retorna apenas sessões criadas antes deste timestamp (ISO 8601 UTC, meia-aberta; exclui o limite exato). Exemplo: 2026-01-01T00:00:00Z |
is_canonical_source |
Quando true, retorna apenas sessões marcadas como uma fonte canônica. Deve ser true ou false. |
git_branch |
Retorna apenas sessões associadas ao nome da ramificação Git fornecido. Sessões sem Git não vão corresponder. |
commit_sha |
Retorna apenas sessões associadas ao SHA de commit Git fornecido. Sessões sem Git não vão corresponder. |
git_url |
Retorna apenas sessões associadas ao URL do repositório Git fornecido. Sessões sem Git não vão corresponder. |
created_by_user_email |
Retorna apenas sessões criadas pelo usuário com este endereço de e-mail. Veja Limitação de Filtro de Email. |
Corpo da Resposta
Uma resposta bem-sucedida retorna um objeto JSON com um array sessions. Cada objeto de sessão contém os seguintes campos:
| Campo | Tipo | Descrição |
|---|---|---|
session_id |
String | Identificador único para a sessão. |
name |
String | Nome legível por humanos para a sessão, se algum foi definido. Omitido quando não definido; não é fornecido um retorno sintético. |
created_at |
String | Timestamp ISO 8601 UTC de quando a sessão foi criada. |
is_canonical_source |
Booleano | Se esta sessão está marcada como uma fonte canônica. |
git_branch |
String | Branch do Git associado à sessão. null para sessões sem git. |
git_url |
String | URL do repositório Git associado à sessão. null para sessões sem git. |
commit_sha |
String | SHA do commit do Git associado à sessão. null para sessões sem git. |
created_by_user_name |
String | Nome de exibição do usuário que criou a sessão. Omitido se a chave de API do usuário foi excluída. |
created_by_user_email |
String ou nulo | Endereço de e-mail do usuário que criou a sessão. null para sessões criadas antes que os e-mails dos criadores fossem armazenados. |
created_by_user_api_key_name |
String | Nome da chave de API usada para criar a sessão. Retorna "Unknown Member" se a chave de API foi excluída. |
Exemplo de Corpo de Resposta
{
"sessions": [
{
"session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Main CI run for PR 451",
"created_at": "2026-06-01T14:23:00.000Z",
"is_canonical_source": true,
"git_branch": "feature/new-nav",
"git_url": "https://github.com/example/webapp",
"commit_sha": "9eabf5b536662000f79978c4d1b6e4eff5c8d785",
"created_by_user_name": "Jane Smith",
"created_by_user_email": "jane.smith@example.com",
"created_by_user_api_key_name": "CI Pipeline Key"
},
{
"session_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef",
"created_at": "2026-05-30T09:00:00.000Z",
"is_canonical_source": false,
"git_branch": null,
"git_url": null,
"commit_sha": null,
"created_by_user_email": null,
"created_by_user_api_key_name": "Unknown Member"
}
]
}Paginação por Cursor
O endpoint de Sessões usa paginação baseada em cursor. Quando há mais resultados além da página atual, um valor de cursor opaco é retornado no cabeçalho de resposta x-pagination-cursor. Passe este valor como o parâmetro de consulta after em sua próxima solicitação para recuperar a próxima página.
Quando o cabeçalho x-pagination-cursor está ausente da resposta, você atingiu a última página.
Limitação de Filtro de Email
O filtro created_by_user_email só corresponde a sessões criadas após uma data específica quando a persistência no lado do servidor dos e-mails do criador foi introduzida. Sessões criadas antes dessa data não têm um e-mail do criador armazenado e não aparecerão em resultados filtrados por e-mail. À medida que mais novas sessões se acumulam, o filtro torna-se progressivamente mais completo.
Respostas de Erro do Endpoint de Sessões
| Status | Causa |
|---|---|
400 Bad Request |
Um valor de parâmetro de consulta é inválido (por exemplo, um timestamp ISO 8601 malformado ou um page_size acima do máximo). |
401 Unauthorized |
A chave de API é inválida, está faltando ou a assinatura associada está inativa. |
403 Forbidden |
A chave de API não tem acesso ao projeto especificado. |
404 Not Found |
O ID do projeto especificado não existe. |
Endpoint de Resultados
Retorna os resultados de acessibilidade para uma sessão específica. Os resultados são retornados assincronamente: se os resultados ainda não estiverem prontos, o endpoint retorna 204 No Content e você faz polling até que estejam.
Os resultados são comprimidos usando Brotli por padrão. Envie Accept-Encoding: br com cada solicitação para downloads mais rápidos e confiáveis, especialmente com format=full e sessões grandes. Veja Compressão de Resposta.
Desduplicação
Para projetos web, ambos os formatos de resposta retornam resultados desduplicados. Quando o mesmo problema é encontrado em mais de um estado de página na sessão, ele é relatado uma vez, no primeiro estado de página onde foi encontrado. Dois resultados contam como o mesmo problema quando têm a mesma regra e URL de página e o mesmo elemento, correspondendo por seletor CSS, XPath ou ancestralidade. Veja Duplicado para as regras completas de correspondência.
format=summary: a contagem das questões por impacto e por regra considera cada problema único uma vez.format=full: cada problema único aparece uma vez na lista de problemas, e as contagens resumidas do cabeçalho são contagens únicas.
A desduplicação ocorre apenas dentro de uma única sessão: os resultados não são comparados com outras sessões, e a resposta não indica quantos duplicados foram removidos ou se um problema é novo. Resultados móveis não são desduplicados.
Solicitação
- Endpoint:
GET https://axe.deque.com/api-pub/v1/results/sessions/{session_id}/results - Cabeçalhos (obrigatórios):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
- Cabeçalhos (recomendado):
Accept-Encoding: br: solicita a resposta comprimida com Brotli, que é baixada mais rapidamente. Veja Compressão de Resposta.
Substitua {session_id} com o valor session_id retornado pelo endpoint de Sessões. Deve ser um UUID válido.
Parâmetros de Consulta
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
format |
Não | Formato de resposta. summary (padrão) retorna o mesmo formato JSON que o endpoint de relatório para download legado. full retorna o completo JSON Universal (Formato Comum de Exportação). |
Compressão de Resposta
O endpoint de Resultados comprime sua resposta com base no cabeçalho Accept-Encoding do seu pedido. Ele usa Brotli (br) se você aceitar, caso contrário, gzip, ou então sem compressão. O cabeçalho Content-Encoding da resposta informa qual codificação foi utilizada.
Use Brotli sempre que possível. Os resultados são armazenados comprimidos com Brotli, então uma resposta Brotli é enviada como está. Uma resposta gzip ou não comprimida precisa ser descomprimida e re-codificada no servidor primeiro, o que é muito mais lento: grandes downloads de format=full, ou vários downloads ao mesmo tempo, podem falhar antes de serem concluídos.
Se não puder usar Brotli (por exemplo, se um proxy ou VPN na rede remove br de Accept-Encoding), respostas gzip e não comprimidas ainda funcionam. Espere downloads mais lentos e faça downloads de grandes resultados uma sessão de cada vez.
A maioria dos clientes HTTP não solicita Brotli por padrão:
curl: Add--compressed.curlthen requests every encoding it supports and decompresses the response for you. It only requests Brotli if yourcurlbuild supports it: runcurl -Vand check forbrotliin theFeaturesline. Some builds, including thecurlthat ships with macOS, don't include Brotli and fall back to gzip. Acurlinstalled from a package manager such as Homebrew typically includes it. If yourcurldoesn't support Brotli, request it with-H "Accept-Encoding: br"(without--compressed) and decompress the saved file withbrotli -d.- Python
requests: Instale o pacotebrotli(pip install brotli). Com ele instalado,requestssolicita Brotli e descomprime a resposta automaticamente. - Outros clientes: Configure
Accept-Encoding: bre certifique-se de que seu cliente descomprime respostas Brotli. Se não, salve a resposta e descomprime você mesmo, por exemplo, combrotli -d.
Estado da Sessão e o Padrão de Polling
Quando os resultados de uma sessão ainda não foram processados, o endpoint de Resultados aciona o processamento automaticamente e responde com 204 No Content (sem corpo de resposta). Seu cliente deve fazer polling no mesmo endpoint até receber uma resposta 200 OK.
| Estado | Resposta HTTP | O que fazer |
|---|---|---|
done |
200 OK com o payload dos resultados |
Resultados estão prontos. Consuma o corpo da resposta. |
processing |
204 No Content |
Os resultados ainda estão sendo gerados. Aguarde brevemente e tente novamente. |
error |
422 Unprocessable Entity com um corpo de erro (veja abaixo) |
O processamento falhou para esta sessão. Reenviar a solicitação inicia o processamento novamente, para que você possa tentar novamente e continuar a pesquisa. |
Corpo de resposta para error
{
"state": "ERROR",
"message": "We were unable to process your session. Please try again, if the issue persists contact helpdesk."
}Lidando com 429 Too Many Requests
Durante períodos de alta carga, o endpoint de Resultados pode responder com 429 Too Many Requests em vez de acionar o processamento imediatamente. Isso não significa que sua solicitação foi perdida: o trabalho subjacente permanece na fila, e tentar novamente não cria processamento duplicado para a mesma sessão.
Uma resposta 429 inclui um cabeçalho Retry-After, em segundos. Espere pelo menos esse tempo antes de tentar novamente — o exemplo abaixo lida com isso junto ao caso normal de polling 204.
Corpo da resposta
{
"error": "Too many requests. Retry after the Retry-After interval."
}Exemplo: Polling para Resultados
#!/bin/bash
SESSION_ID="a1b2c3d4-e5f6-7890-abcd-ef1234567890"
URL="https://axe.deque.com/api-pub/v1/results/sessions/$SESSION_ID/results"
MAX_ATTEMPTS=20
DELAY=5
TEMP_FILE=$(mktemp)
for ((i=1; i<=MAX_ATTEMPTS; i++)); do
echo "Attempt $i..."
HEADERS_FILE=$(mktemp)
# --compressed requests Brotli (if your curl supports it) and decompresses the response
STATUS=$(curl -s -w '%{http_code}' -L --compressed \
-H "Accept: application/json" \
-H "X-API-Key: $API_KEY" \
-D "$HEADERS_FILE" \
-o "$TEMP_FILE" \
"$URL?format=full")
case $STATUS in
200)
echo "Results ready!"
cat "$TEMP_FILE"
rm "$TEMP_FILE" "$HEADERS_FILE"
exit 0
;;
204)
echo "Still processing, waiting ${DELAY}s..."
sleep $DELAY
;;
429)
RETRY_AFTER=$(grep -i '^retry-after:' "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}')
RETRY_AFTER=${RETRY_AFTER:-$DELAY}
echo "Too many requests, waiting ${RETRY_AFTER}s per Retry-After..."
sleep "$RETRY_AFTER"
;;
*)
echo "Error: HTTP $STATUS"
cat "$TEMP_FILE"
rm "$TEMP_FILE" "$HEADERS_FILE"
exit 1
;;
esac
rm -f "$HEADERS_FILE"
done
echo "Timeout after $MAX_ATTEMPTS attempts"
rm "$TEMP_FILE"
exit 1Formatos de Resposta
format=summary(padrão)
Retorna o mesmo formato JSON que o endpoint de relatório para download legado. Use este formato se você tiver ferramentas existentes construídas contra o endpoint de relatório para download e quiser uma substituição direta.
format=full
Retorna os resultados completos a nível de problema em JSON Universal (Formato Comum de Exportação). Este formato inclui todos os problemas de acessibilidade encontrados durante a sessão, incluindo detalhes a nível de página e regra.
Os resultados completos podem ser muito grandes, então solicite-os comprimidos com Brotli (Accept-Encoding: br, ou --compressed com um curl habilitado para Brotli). A Content-Encoding da resposta é negociada a partir do seu cabeçalho Accept-Encoding; veja Compressão de Resposta.
As sessões criadas antes de 15 de julho de 2026 retornam 404 Not Found para format=full, porque a captura do Universal JSON (Formato Comum de Exportação) não estava habilitada até essa data. Essas sessões não têm dados no formato universal para retornar. Use format=summary para recuperar resultados de sessões criadas antes dessa data.
Respostas de Erro do Endpoint de Resultados
| Status | Causa |
|---|---|
400 Bad Request |
O valor do parâmetro format não é summary ou full, ou o session_id não é um UUID válido. |
401 Unauthorized |
A chave de API é inválida, está faltando ou a assinatura associada está inativa. |
403 Forbidden |
A chave de API não tem acesso ao projeto que possui esta sessão. |
404 Not Found |
O ID de sessão especificado não existe. |
422 Unprocessable Entity |
O processamento falhou para esta sessão. Veja Estado da Sessão e o Padrão de Polling. |
429 Too Many Requests |
O sistema está sob grande carga. Veja Tratamento de 429 Demasiadas Solicitações. |
Fluxos de Trabalho Comuns
Recuperar Todas as Sessões de um Projeto e Baixar Resultados Completos
Este exemplo usa curl e jq para percorrer todas as sessões de um projeto e baixar os resultados JSON Universais completos para cada uma. Para projetos web, cada arquivo contém os problemas desduplicados da sessão; veja Desduplicação.
#!/bin/bash
# Set these environment variables before running:
# API_KEY: your Axe Developer Hub API key
# PROJECT_ID: your project ID
BASE_URL="https://axe.deque.com/api-pub/v1/results"
CURSOR=""
while true; do
QUERY="page_size=100"
if [ -n "$CURSOR" ]; then
QUERY="$QUERY&after=$CURSOR"
fi
RESPONSE=$(curl -s -D - -H "Accept: application/json" -H "X-API-Key: $API_KEY" \
"$BASE_URL/projects/$PROJECT_ID/sessions?$QUERY")
NEXT_CURSOR=$(echo "$RESPONSE" | grep -i "x-pagination-cursor:" | tr -d '\r' | awk '{print $2}')
BODY=$(echo "$RESPONSE" | sed -n '/^\r\{0,1\}$/,$p' | tail -n +2)
SESSION_IDS=$(echo "$BODY" | jq -r '.sessions[].session_id')
for SESSION_ID in $SESSION_IDS; do
echo "Fetching results for session $SESSION_ID..."
while true; do
# --compressed requests Brotli (if your curl supports it) and decompresses the response
STATUS=$(curl -s -w '%{http_code}' -L --compressed \
-H "Accept: application/json" \
-H "X-API-Key: $API_KEY" \
-o "${SESSION_ID}.json" \
"$BASE_URL/sessions/$SESSION_ID/results?format=full")
if [ "$STATUS" = "200" ]; then
echo "Saved ${SESSION_ID}.json"
break
elif [ "$STATUS" = "204" ]; then
echo " Still processing, waiting..."
sleep 5
else
echo " Error: HTTP $STATUS"
break
fi
done
done
if [ -z "$NEXT_CURSOR" ]; then
break
fi
CURSOR="$NEXT_CURSOR"
done