Referência da API de Sessões e Resultados

This page is not available in the language you requested. You have been redirected to the English version of the page.
Link to this page copied to clipboard

Recupere listas de sessões e resultados completos de acessibilidade programaticamente usando a API REST

Not for use with personal data

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

important

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.

tip

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. curl then requests every encoding it supports and decompresses the response for you. It only requests Brotli if your curl build supports it: run curl -V and check for brotli in the Features line. Some builds, including the curl that ships with macOS, don't include Brotli and fall back to gzip. A curl installed from a package manager such as Homebrew typically includes it. If your curl doesn't support Brotli, request it with -H "Accept-Encoding: br" (without --compressed) and decompress the saved file with brotli -d.
  • Python requests: Instale o pacote brotli (pip install brotli). Com ele instalado, requests solicita Brotli e descomprime a resposta automaticamente.
  • Outros clientes: Configure Accept-Encoding: br e certifique-se de que seu cliente descomprime respostas Brotli. Se não, salve a resposta e descomprime você mesmo, por exemplo, com brotli -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 1

Formatos 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.

important

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