---
title: "Get project analytics"
method: GET
path: "/v1/projects/{project_id}/analytics"
tags: ["analytics"]
---

# Get project analytics

`GET /v1/projects/{project_id}/analytics`

**Plan:** `All plans`

Returns analytics for a published project: the historical time series and breakdowns for a date range by default, or the real-time visitor trend with series=trend.

## Path parameters

- `project_id` string, required — Project ID

## Query parameters

- `series` 'historical' | 'trend' — historical returns the time series and breakdowns for the requested date range; trend returns the real-time visitor trend for the last 30 minutes.
- `start_date` string — Start date in RFC 3339 format (e.g. 2026-04-01T00:00:00Z). Required when series=historical.
- `end_date` string — End date in RFC 3339 format (e.g. 2026-04-08T00:00:00Z). Required when series=historical.
- `startDate` string — Deprecated alias for start_date.
- `endDate` string — Deprecated alias for end_date.
- `granularity` string — Time bucket size for series=historical: hourly or daily (default: daily).

## Response `200`

OK

- PublicV1ProjectAnalyticsBody
  - `lists` ListsGroup
    - `country` ListData, required
      - `data` ListDataPoint[], nullable, required
        - `label` string, required
        - `value` integer, required
      - `label` string, required
    - `device` ListData, required
      - `data` ListDataPoint[], nullable, required
        - `label` string, required
        - `value` integer, required
      - `label` string, required
    - `page` ListData, required
      - `data` ListDataPoint[], nullable, required
        - `label` string, required
        - `value` integer, required
      - `label` string, required
    - `source` ListData, required
      - `data` ListDataPoint[], nullable, required
        - `label` string, required
        - `value` integer, required
      - `label` string, required
  - `timeSeries` TimeSeriesGroup
    - `bounceRate` TimeSeriesData, required
      - `data` TimeSeriesDataPoint[], nullable, required — Per-bucket values ordered by date, one entry per bucket in the range (bucket size set by the granularity parameter).
        - `date` string, required — Bucket start as "YYYY-MM-DD HH:MM:SS" in UTC.
        - `value` number, double, required — Metric value for this bucket. Unit matches the parent metric — see its description.
      - `label` string, required — Metric identifier, e.g. "sessionDuration".
      - `total` number, double, required — Period-level aggregate for this metric over the requested range. How it is computed (sum, ratio, or average) and its unit depend on the metric — see the metric field's description.
    - `pageviews` TimeSeriesData, required
      - `data` TimeSeriesDataPoint[], nullable, required — Per-bucket values ordered by date, one entry per bucket in the range (bucket size set by the granularity parameter).
        - `date` string, required — Bucket start as "YYYY-MM-DD HH:MM:SS" in UTC.
        - `value` number, double, required — Metric value for this bucket. Unit matches the parent metric — see its description.
      - `label` string, required — Metric identifier, e.g. "sessionDuration".
      - `total` number, double, required — Period-level aggregate for this metric over the requested range. How it is computed (sum, ratio, or average) and its unit depend on the metric — see the metric field's description.
    - `pageviewsPerVisit` TimeSeriesData, required
      - `data` TimeSeriesDataPoint[], nullable, required — Per-bucket values ordered by date, one entry per bucket in the range (bucket size set by the granularity parameter).
        - `date` string, required — Bucket start as "YYYY-MM-DD HH:MM:SS" in UTC.
        - `value` number, double, required — Metric value for this bucket. Unit matches the parent metric — see its description.
      - `label` string, required — Metric identifier, e.g. "sessionDuration".
      - `total` number, double, required — Period-level aggregate for this metric over the requested range. How it is computed (sum, ratio, or average) and its unit depend on the metric — see the metric field's description.
    - `sessionDuration` TimeSeriesData, required
      - `data` TimeSeriesDataPoint[], nullable, required — Per-bucket values ordered by date, one entry per bucket in the range (bucket size set by the granularity parameter).
        - `date` string, required — Bucket start as "YYYY-MM-DD HH:MM:SS" in UTC.
        - `value` number, double, required — Metric value for this bucket. Unit matches the parent metric — see its description.
      - `label` string, required — Metric identifier, e.g. "sessionDuration".
      - `total` number, double, required — Period-level aggregate for this metric over the requested range. How it is computed (sum, ratio, or average) and its unit depend on the metric — see the metric field's description.
    - `visitors` TimeSeriesData, required
      - `data` TimeSeriesDataPoint[], nullable, required — Per-bucket values ordered by date, one entry per bucket in the range (bucket size set by the granularity parameter).
        - `date` string, required — Bucket start as "YYYY-MM-DD HH:MM:SS" in UTC.
        - `value` number, double, required — Metric value for this bucket. Unit matches the parent metric — see its description.
      - `label` string, required — Metric identifier, e.g. "sessionDuration".
      - `total` number, double, required — Period-level aggregate for this metric over the requested range. How it is computed (sum, ratio, or average) and its unit depend on the metric — see the metric field's description.
  - `trend` ProjectTrendResponse
    - `currentVisitors` integer, required
    - `data` TrendDataPoint[], nullable, required
      - `time` string, required
      - `visits` integer, required

## Other responses

- `401` — Missing or invalid API key.
- `403` — The key or caller lacks the required scope or permission.
- `406` — The Accept header excludes every media type this endpoint produces.
- `429` — Too many requests. Retry after the interval in Retry-After when present.
- `default` — Error. The response body uses the standard error envelope; status matches the HTTP status code and type is a machine-readable error code.

---

[API](https://skmtc.net/lovable/apis/lovable-api.md) · [All operations](https://skmtc.net/lovable/apis/lovable-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/lovable/lovable-api/revisions/aa8d44585147/schema)
