Skip to content

Metrics by dimension and date range for a property.

Returns a customized report of your Google Analytics event data. Reports contain statistics derived from data collected by the Google Analytics tracking code. The data returned from the API is as a table with columns for the requested dimensions and metrics. Metrics are individual measurements of user activity on your property, such as active users or event count. Dimensions break down metrics across some common criteria, such as country or event name.

Job analytics.reports.run

Your AI asks

checks the price first
telipot run google-analytics.reports.run \
  --input-json '{"propertyId":"123456789","dateRanges":[{"startDate":"2026-09-01","endDate":"2026-09-30"}],"metrics":[{"name":"activeUsers"}]}' \
  --quote

Price

Free
Priced· before it runs

google-analytics.reports.run

FreeCompany account

Whose account it uses

1The person asking
skipped
2Your company’s Google Analytics 4 account
Selected identity for this example
3Our account
not used

What it sends

{
  "propertyId": "123456789",
  "dateRanges": [{"startDate":"2026-09-01","endDate":"2026-09-30"}],
  "metrics": [{"name":"activeUsers"}]
}

Your Google Analytics 4 login is added for you. Your AI never sees it.

What it costs

Free

no charge from the provider

Preview the price first. --quote runs nothing.

For developers · run it

Shell · runs the task on the named account

telipot run google-analytics.reports.run \
  --input-json '{"propertyId":"123456789","dateRanges":[{"startDate":"2026-09-01","endDate":"2026-09-30"}],"metrics":[{"name":"activeUsers"}]}'

propertyId

string · required · path

The numeric id of a GA4 property, as google-analytics.accounts.summaries returns it after properties/

dateRanges

array · required · body

Up to 4 ranges, each a startDate and an endDate, either YYYY-MM-DD or NdaysAgo, yesterday or today. With several, each row carries the index of its range.

dimensions

array · body

Up to 9 dimensions, each an object with the name of one the property offers, such as country or eventName; google-analytics.properties.metadata lists them

metrics

array · required · body

Up to 10 metrics, each an object with the name of one the property offers, such as activeUsers or eventCount; google-analytics.properties.metadata lists them

dimensionFilter

object · body

A filter expression over dimensions, applied before the metrics are aggregated

metricFilter

object · body

A filter expression over metrics, applied after the rows are aggregated, as a SQL HAVING clause is

orderBys

array · body

How the rows are ordered, each an order by a dimension or a metric

limit

integer · 1 to 250000 · default 10000 · body

Rows to return; a report can return fewer

offset

integer · at least 0 · default 0 · body

Zero-based index of the first row, for paging

metricAggregations

array · body

TOTAL, MINIMUM or MAXIMUM, each adding a row of that aggregate of every metric

currencyCode

string · body

An ISO 4217 code for currency metrics; the property's own currency when absent

keepEmptyRows

boolean · default false · body

Whether to return rows whose metrics are all 0

returnPropertyQuota

boolean · default false · body

Whether to add the property's quota state to the answer

dimensionHeaders

object[]

metricHeaders

object[]

rows

object[]

Absent when no row matches. Each row holds the values of the dimension and metric headers, in their order.

totals

object[]

Present when metricAggregations asked for TOTAL

maximums

object[]

Present when metricAggregations asked for MAXIMUM

minimums

object[]

Present when metricAggregations asked for MINIMUM

rowCount

integer

Rows in the result before limit and offset

metadata

object

propertyQuota

object

Present when returnPropertyQuota is true; each quota holds consumed and remaining

kind

string

Full output schema · JSONNested fields and constraints

Output JSON Schema

{
  "type": "object",
  "properties": {
    "dimensionHeaders": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          }
        }
      }
    },
    "metricHeaders": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "The kind of value such as TYPE_INTEGER or TYPE_CURRENCY"
          }
        }
      }
    },
    "rows": {
      "type": "array",
      "description": "Absent when no row matches. Each row holds the values of the dimension and metric headers, in their order.",
      "items": {
        "type": "object",
        "properties": {
          "dimensionValues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "value": {
                  "type": "string"
                }
              }
            }
          },
          "metricValues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "value": {
                  "type": "string",
                  "description": "A number as a string"
                }
              }
            }
          }
        }
      }
    },
    "totals": {
      "type": "array",
      "description": "Present when metricAggregations asked for TOTAL",
      "items": {
        "type": "object"
      }
    },
    "maximums": {
      "type": "array",
      "description": "Present when metricAggregations asked for MAXIMUM",
      "items": {
        "type": "object"
      }
    },
    "minimums": {
      "type": "array",
      "description": "Present when metricAggregations asked for MINIMUM",
      "items": {
        "type": "object"
      }
    },
    "rowCount": {
      "type": "integer",
      "description": "Rows in the result before limit and offset"
    },
    "metadata": {
      "type": "object",
      "properties": {
        "currencyCode": {
          "type": "string"
        },
        "timeZone": {
          "type": "string",
          "description": "The property's time zone"
        },
        "dataLossFromOtherRow": {
          "type": "boolean",
          "description": "True when some dimension combinations are rolled into an (other) row"
        },
        "subjectToThresholding": {
          "type": "boolean",
          "description": "True when the report leaves out data below a privacy threshold"
        },
        "emptyReason": {
          "type": "string"
        }
      }
    },
    "propertyQuota": {
      "type": "object",
      "description": "Present when returnPropertyQuota is true; each quota holds consumed and remaining"
    },
    "kind": {
      "type": "string"
    }
  }
}

A real answer

examples/google-analytics.reports.run.json

{
  "dimensionHeaders": [
    {
      "name": "country"
    }
  ],
  "metricHeaders": [
    {
      "name": "activeUsers",
      "type": "TYPE_INTEGER"
    }
  ],
  "rows": [
    {
      "dimensionValues": [
        {
          "value": "United States"
        }
      ],
      "metricValues": [
        {
          "value": "1842"
        }
      ]
    },
    {
      "dimensionValues": [
        {
          "value": "Germany"
        }
      ],
      "metricValues": [
        {
          "value": "311"
        }
      ]
    }
  ],
  "rowCount": 37,
  "metadata": {
    "currencyCode": "USD",
    "timeZone": "America/Los_Angeles"
  },
  "kind": "analyticsData#runReport"
}