API CrUX History

A API CrUX History oferece acesso de baixa latência a seis meses de dados históricos da experiência do usuário real em granularidade da página e da origem.

Caso de uso comum

A API CrUX History permite consultar métricas históricas de experiência do usuário para um URI específico, como "Confira as tendências históricas de UX para a origem do https://example.com".

A API History segue a mesma estrutura da API CrUX diária, mas os valores são fornecidos em uma matriz e as chaves são rotuladas com nomes no plural (por exemplo, histogramTimeseries em vez de histogram ou p75s em vez de p75).

Chave da API CrUX

Assim como a API diária, para usar a API CrUX History, você precisa de uma chave de API do Google Cloud. A mesma chave pode ser usada para a API diária e de histórico.

Você pode criar uma na página Credenciais e provisioná-la para uso do Chrome UX Report API.

Depois que você estiver com uma chave de API, seu aplicativo poderá anexar o parâmetro de consulta key=[YOUR_API_KEY] a todos os URLs de solicitação. Consulte Exemplos de consultas.

A chave de API é segura para ser incorporada a URLs sem precisar de codificação.

Modelo de dados

Esta seção detalha a estrutura de dados em solicitações e respostas.

Gravar

Uma informação discreta sobre uma página ou um site. Um registro pode ter dados específicos para um identificador e para uma combinação específica de dimensões. Um registro pode conter dados de uma ou mais métricas.

Identificadores

Os identificadores especificam quais registros precisam ser pesquisados. No CrUX, esses identificadores são páginas da Web e sites.

Origem

Quando o identificador é uma origem, todos os dados presentes para todas as páginas nessa origem são agregados. Por exemplo, digamos que a origem http://www.example.com tenha páginas conforme disposto por este sitemap:

http://www.example.com/
http://www.example.com/foo.html
http://www.example.com/bar.html

Isso significa que, ao consultar o Chrome UX Report com a origem definida como http://www.example.com, os dados de http://www.example.com/, http://www.example.com/foo.html e http://www.example.com/bar.html seriam retornados, agregados, porque essas são todas as páginas sob essa origem.

URLs

Quando o identificador é um URL, apenas os dados desse URL específico são retornados. Analisando novamente o sitemap de origem http://www.example.com:

http://www.example.com/
http://www.example.com/foo.html
http://www.example.com/bar.html

Se o identificador estiver definido como um URL com o valor de http://www.example.com/foo.html, somente os dados dessa página serão retornados.

Dimensões

As dimensões identificam um grupo específico de dados ao qual um registro está sendo agregado. Por exemplo, o formato PHONE indica que o registro contém informações sobre carregamentos que ocorreram em um dispositivo móvel.

A API CrUX History só está disponível de forma agregada por dimensão de formato. Essa é uma classe geral de dispositivo dividida em PHONE, TABLET e DESKTOP.

Métrica

Informamos métricas em séries temporais de agregações estatísticas, que são histogramas, percentis e frações.

Histogramas

Quando as métricas são expressas em uma matriz de histograma, cada entrada de série temporal representa a porcentagem de carregamentos de página em que a métrica se enquadrava em um intervalo, proporcionalmente a todos. Os pontos de dados são apresentados na ordem das datas do período de coleta também retornadas pela API, sendo que o primeiro ponto é o período mais antigo e o último, o mais recente.

Um histograma simples de três bin para uma métrica de exemplo fica assim:

{
  "histogramTimeseries": [
    {
      "start": 0,
      "end": 2500,
      "densities": [0.9190, 0.9203, 0.9194, 0.9195, 0.9183, 0.9187]
    },
    {
      "start": 2500,
      "end": 4000,
      "densities": [0.0521, 0.0513, 0.0518, 0.0518, 0.0526, 0.0527]
    },
    {
      "start": 4000,
      "densities": [0.0288, 0.0282, 0.0286, 0.0285, 0.0290, 0.0285]
    }
  ],
}

Esses dados indicam que 91,90% dos carregamentos de página tiveram o valor da métrica de exemplo entre 0 ms e 2.500 ms no primeiro período de coleta no histórico, seguido por 92,03%, 91,94%... As unidades da métrica não estão contidas neste histograma. Neste caso, vamos considerar milissegundos.

Além disso, 5,21% dos carregamentos de página tiveram o valor da métrica de exemplo entre 2.500 ms e 4.000 ms no primeiro período de coleta no histórico, e 2,88% dos carregamentos de página tiveram um valor maior que 4.000 ms no primeiro período de coleta no histórico.

Percentis

As métricas também podem conter séries temporais de percentis que podem ser úteis para análises adicionais.

Os pontos de dados são apresentados na ordem das datas do período de coleta também retornadas pela API, sendo que o primeiro ponto é o período mais antigo e o último, o mais recente.

{
  "percentilesTimeseries": {
    "p75s": [1362, 1352, 1344, 1356, 1366, 1377]
  },
}

Esses percentis podem mostrar valores específicos de métricas no determinado percentil dessa métrica. Elas são baseadas no conjunto completo de dados disponíveis, e não nos dados finais agrupados por classes. Portanto, elas não correspondem necessariamente a um percentil interpolado baseado no histograma de agrupamento final.

Frações

As métricas podem ser expressas como séries temporais de frações rotuladas. Cada rótulo descreve um carregamento de página de uma maneira específica. Os pontos de dados são apresentados na ordem das datas do período de coleta também retornadas pela API, sendo que o primeiro ponto é o período mais antigo e o último, o mais recente.

Exemplo:

{    
  "fractionTimeseries": {
    "desktop": {"fractions": [0.3195, 0.2115, 0.1421]},
    "phone": {"fractions": [0.6295, 0.7544, 0.8288]},
    "tablet": {"fractions": [0.051, 0.0341, 0.029]}
  }
}

Neste exemplo, o ponto de dados mais recente indica que 14,21% dos carregamentos de página vieram de computadores e 82,88%, de smartphones.

Tipos de valores de métricas

Como a API CrUX History usa os mesmos tipos de valores de métricas, você pode consultar a documentação diária sobre os tipos de valores de métricas da API CrUX para saber mais.

Qualificação da métrica

Com base nos critérios de qualificação, uma origem ou um URL só pode se qualificar para alguns períodos de coleta cobertos pela API CrUX History. Nesses casos, a API CrUX History vai retornar "NaN" para as densidades de histogramTimeseries e null para o percentilesTimeseries para os períodos de coleta que não têm dados qualificados. O motivo da diferença é que as densidades do histograma são sempre números, enquanto os percentis podem ser números ou strings (o CLS usa strings, mesmo que se pareçam com números).

Por exemplo, se o segundo período não tiver dados qualificados, ele será exibido como:

{
  "histogramTimeseries": [
    {
      "start": 0,
      "end": 2500,
      "densities": [0.9190, "NaN", 0.9194, 0.9195, 0.9183, 0.9187]
    },
    {
      "start": 2500,
      "end": 4000,
      "densities": [0.0521, "NaN", 0.0518, 0.0518, 0.0526, 0.0527]
    },
    {
      "start": 4000,
      "densities": [0.0288, "NaN", 0.0286, 0.0285, 0.0290, 0.0285]
    }
  ],
  "percentilesTimeseries": {
    "p75s": [1362, null, 1344, 1356, 1366, 1377]
  },
}

Para URLs ou origens que estão dentro e fora da qualificação ao longo do tempo, pode haver muitas entradas faltando.

Períodos de coleta

A API CrUX History contém um objeto collectionPeriods com uma matriz de campos firstDate e endDate que representam as datas de início e término de cada janela de agregação. Exemplo:

    "collectionPeriods": [{
        "firstDate": { "year": 2022, "month": 7, "day": 10 },
        "lastDate": { "year": 2022, "month": 8, "day": 6 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 17 },
        "lastDate": { "year": 2022, "month": 8, "day": 13 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 24 },
        "lastDate": { "year": 2022, "month": 8, "day": 20 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 31 },
        "lastDate": { "year": 2022, "month": 8, "day": 27 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 7 },
        "lastDate": { "year": 2022, "month": 9, "day": 3 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 14 },
        "lastDate": { "year": 2022, "month": 9, "day": 10 }
      }
    ]

Esses períodos de coleta estão em ordem crescente e representam o período de cada um dos pontos de dados nas outras seções da resposta.

A API History é atualizada toda segunda-feira e contém dados até o sábado anterior (de acordo com o atraso padrão de dois dias). Ele contém os dados das 25 semanas anteriores, um período de coleta por semana.

Como cada período de coleta contém os dados agregados anteriores dos 28 dias anteriores e os períodos de coleta são semanais, isso significa que os períodos de coleta vão se sobrepor. Eles são semelhantes a uma média móvel de dados, com três semanas de dados sendo incluídas em cada período subsequente, e uma semana sendo diferente.

Exemplos de consultas

As consultas são enviadas como objetos JSON usando uma solicitação POST para https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord?key=[YOUR_API_KEY]" com dados de consulta como um objeto JSON no corpo do POST.

Observe o uso de queryHistoryRecord substituindo o queryRecord da API CrUX diária.

Um exemplo de corpo é:

{
  "origin": "https://example.com",
  "formFactor": "PHONE",
  "metrics": [
    "largest_contentful_paint",
    "experimental_time_to_first_byte"
  ]
}

Por exemplo, isso pode ser chamado em curl com a seguinte linha de comando (substituindo API_KEY pela sua chave):

curl -s --request POST 'https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord?key=API_KEY' \
    --header 'Accept: application/json' \
    --header 'Content-Type: application/json' \
    --data '{"formFactor":"PHONE","origin":"https://www.example.com","metrics":["largest_contentful_paint", "experimental_time_to_first_byte"]}'

Os dados no nível da página estão disponíveis pela API transmitindo uma propriedade url na consulta, em vez de origin:

{
  "url": "https://example.com/page",
  "formFactor": "PHONE",
  "metrics": [
    "largest_contentful_paint",
    "experimental_time_to_first_byte"
  ]
}

Se a propriedade metrics não for definida, todas as métricas disponíveis serão retornadas:

  • cumulative_layout_shift
  • first_contentful_paint
  • first_input_delay
  • interaction_to_next_paint
  • largest_contentful_paint
  • experimental_time_to_first_byte
  • navigation_types
  • form_factors (informado apenas se nenhum formFactor for especificado na solicitação)

Se nenhum valor de formFactor for informado, os valores vão ser agregados em todos os formatos.

Consulte o guia Como usar a API CrUX History para ver mais exemplos de consultas.

Pipeline de dados

O conjunto de dados CrUX é processado por um pipeline para consolidar, agregar e filtrar os dados antes de serem disponibilizados pela API.

A média contínua

Os dados do Chrome UX Report são uma média contínua de 28 dias das métricas agregadas. Isso significa que os dados apresentados no Chrome UX Report a qualquer momento são, na verdade, dados dos últimos 28 dias agregados.

A API History contém vários períodos de coleta, cada um abrangendo esses 28 dias. Como cada período de coleta contém os dados agregados anteriores dos 28 dias anteriores e os períodos de coleta são semanais, isso significa que os períodos de coleta vão se sobrepor. Eles são semelhantes a uma média móvel de dados, com três semanas de dados sendo incluídas em cada período subsequente, e uma semana sendo diferente.

Atualizações semanais

A API History é atualizada toda segunda-feira por volta das 4h UTC e contém dados até o sábado anterior (de acordo com o atraso padrão de dois dias). Ele contém os dados das últimas 25 semanas (aproximadamente 6 meses), um período de coleta por semana.

Não há contrato de nível de serviço para horários de atualização. Ele é executado com base no melhor esforço todos os dias.

Esquema

Há um único endpoint para a API CrUX History, que aceita solicitações HTTP POST. A API retorna um record que contém um ou mais metrics correspondentes aos dados de performance da origem ou página solicitada.

Solicitação HTTP

POST https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord

O URL usa a sintaxe de transcodificação gRPC.

Corpo da solicitação

A API CrUX History usa os mesmos corpos de solicitação que a API CrUX diária, exceto por não oferecer suporte ao campo de solicitação effectiveConnectionType.

Por exemplo, para solicitar os valores de Maior exibição de conteúdo do computador para a página inicial web.dev:

{
  "origin": "https://web.dev/",
  "formFactor": "DESKTOP",
  "metrics": [
    "largest_contentful_paint"
  ]
}

Corpo da resposta

As solicitações bem-sucedidas retornam respostas com um objeto record e urlNormalizationDetails na estrutura a seguir:

{
  "record": {
    "key": {
      object (Key)
    },
    "metrics": [
      string: {
        object (Metric)
      }
    ]
  },
  "urlNormalizationDetails": {
    object (UrlNormalization)
  }
}

Por exemplo, a resposta ao corpo da solicitação na solicitação anterior poderia ser:

{
  "record": {
    "key": {
      "origin": "https://web.dev"
    },
    "metrics": {
      "largest_contentful_paint": {
        "histogramTimeseries": [{
            "start": 0, "end": 2500, "densities": [
              0.9190, 0.9203, 0.9194, 0.9195, 0.9183, 0.9187, ...
            ]
          }, {
            "start": 2500, "end": 4000, "densities": [
              0.0521, 0.0513, 0.0518, 0.0518, 0.0526, 0.0527, ...
            ]
          },  {
            "start": 4000, "densities": [
              0.0288, 0.0282, 0.0286, 0.0285, 0.0290, 0.0285, ...
            ]
          }
        ],
        "percentilesTimeseries": {
          "p75s": [
            1362, 1352, 1344, 1356, 1366, 1377, ...
          ]
        }
      }
    },
    "collectionPeriods": [{
        "firstDate": { "year": 2022, "month": 7, "day": 10 },
        "lastDate": { "year": 2022, "month": 8, "day": 6 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 17 },
        "lastDate": { "year": 2022, "month": 8, "day": 13 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 24 },
        "lastDate": { "year": 2022, "month": 8, "day": 20 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 31 },
        "lastDate": { "year": 2022, "month": 8, "day": 27 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 7 },
        "lastDate": { "year": 2022, "month": 9, "day": 3 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 14 },
        "lastDate": { "year": 2022, "month": 9, "day": 10 }
      }, {
        ...
      }
    ]
  }
}

Chave

Key define todas as dimensões que identificam esse registro como único.

{
  "formFactor": enum (FormFactor),

  // Union field url_pattern can be only one of the following:
  "origin": string,
  "url": string
  // End of list of possible types for union field url_pattern.
}
Campos
formFactor

enum (FormFactor)

O formato é a classe do dispositivo que todos os usuários usaram para acessar o site para esse registro.

Se o formato não for especificado, os dados agregados de todos os formatos serão retornados.

Campo de união url_pattern. O padrão de URL é o URL ao qual o registro se aplica. url_pattern pode ser apenas de um dos tipos a seguir:
origin

string

"Origin" especifica a origem desse registro.

Observação: ao especificar uma origem, os dados dos carregamentos nela em todas as páginas são agregados aos dados de experiência do usuário no nível da origem.

url

string

url especifica um URL específico para o qual este registro é direcionado.

Observação: quando você especifica um url, apenas os dados desse URL são agregados.

Métricas

Uma metric é um conjunto de dados de experiência do usuário para uma única métrica de desempenho na Web, como a primeira exibição de conteúdo. Ele contém um histograma de resumo do uso real do Chrome como uma série de bins.

{
  "histogramTimeseries": [
    {
      object (Bin)
    }
  ],
  "percentilesTimeseries": {
    object (Percentiles)
  }
}

ou

"fractionTimeseries": {
  object (Fractions)
}
Campos
histogramTimeseries[]

object (Bin)

O histograma de série temporal de experiências do usuário para uma métrica. O histograma de série temporal terá pelo menos um agrupamento e as densidades de todos os agrupamentos serão somados em torno de um.

Os valores ausentes para esse período de coleta específico serão marcados como "NaN".

percentilesTimeseries

object (Percentiles)

Percentis úteis comuns da métrica. O tipo de valor para os percentis será o mesmo que os tipos de valor fornecidos para os agrupamentos de histograma.

Os valores ausentes para esse período de coleta específico serão marcados como null.

fractionTimeseries

object (Fractions)

Este objeto contém séries temporais de frações rotuladas, que somam aproximadamente uma por entrada.

As frações são arredondadas para quatro casas decimais.

As entradas que faltam são expressas como `"NaN"` em todas as frações.

Agrupamento

Um bin é uma parte discreta dos dados que abrange do início ao fim ou se nenhum fim é fornecido do início ao infinito positivo.

Os valores inicial e final de um agrupamento são fornecidos no tipo de valor da métrica que ele representa. Por exemplo, a primeira exibição de conteúdo é medida em milissegundos e exposta como ints. Portanto, os agrupamentos de métricas vão usar int32s para os tipos de início e fim. No entanto, a mudança de layout cumulativa é medida em decimais sem unidade e exposta como um decimal codificado como uma string. Portanto, os agrupamentos de métricas usarão strings para o tipo de valor.

{
  "start": value,
  "end": value,
  "densities": [number, number, number...etc.]
}
Campos
start

(integer | string)

O início é o início do agrupamento de dados.

end

(integer | string)

O fim é o fim do agrupamento de dados. Se end não for preenchido, o agrupamento não terá fim e será válido do início a +inf.

densities

array[number]

Uma série temporal da proporção de usuários que tiveram o valor desse agrupamento para a métrica especificada.

As densidades são arredondadas para quatro casas decimais.

Percentis

Percentiles contém valores sintéticos de uma métrica em um determinado percentil estatístico. Eles são usados para estimar o valor de uma métrica conforme observado por uma porcentagem de usuários do número total.

{
  "P75": value
}
Campos
p75s

array[(integer | string)]

As séries temporais dos valores que 75% da página carregaram a métrica especificada como igual ou menor que esse valor.

Frações

Fractions contém séries temporais de frações rotuladas que somam aproximadamente 1 por entrada. Cada rótulo descreve um carregamento de página de alguma forma. Por isso, as métricas representadas dessa maneira podem ser consideradas como produção de valores distintos em vez de valores numéricos, e as frações expressam com que frequência um determinado valor distinto foi medido.

{
  "label_1": { "fractions": array[fraction]},
  "label_1": { "fractions": array[fraction]},
  ...
  "label_n": { "fractions": array[fraction]}
}

Assim como os valores de densidade nas caixas do histograma, cada fraction é um número 0.0 <= value <= 1.0, e a soma deles é aproximadamente 1,0. Quando a métrica não estiver disponível para um determinado período de coleta, a entrada correspondente será "NaN" em todas as matrizes de frações.

Campos
p75s

array[(integer | string)]

As séries temporais dos valores que 75% da página carregaram a métrica especificada como igual ou inferior a esse valor.

UrlNormalization

Objeto que representa as ações de normalização realizadas para normalizar um URL e aumentar a chance de uma pesquisa bem-sucedida. Essas são mudanças automatizadas simples que são realizadas ao pesquisar o url_pattern fornecido. Ações complexas, como seguir redirecionamentos, não são processadas.

{
  "originalUrl": string,
  "normalizedUrl": string
}
Campos
originalUrl

string

O URL original solicitado antes de qualquer ação de normalização.

normalizedUrl

string

O URL após qualquer ação de normalização. Esse é um URL válido de experiência do usuário que poderia ser razoavelmente pesquisado.

Limitações de taxa

A API CrUX History tem o mesmo limite da API CrUX de 150 consultas por minuto em cada projeto do Google Cloud para qualquer uma das APIs, que é oferecida sem custo financeiro. Esse limite e seu uso atual podem ser consultados no Console do Google Cloud. Essa cota generosa é suficiente para a grande maioria dos casos de uso, e não é possível pagar por uma cota maior.