> For the complete documentation index, see [llms.txt](https://docs.elevateab.com/elevate-helpcenter/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.elevateab.com/elevate-helpcenter/developer-reference/external-api/api-reference/timeseries.md).

# Timeseries

The Elevate A/B Testing External API /timeseries endpoint returns each variation's metrics in time buckets, cumulative or per interval.

```http
GET /experiments/{testId}/timeseries
```

Returns each variation's metrics split into time buckets, plus the visitors across all variations. Use it to draw a chart of how an experiment moved, or to check when a result started to hold. For the current numbers rather than their history, use [`/summary`](/elevate-helpcenter/developer-reference/external-api/api-reference/summary.md) or [`/results`](/elevate-helpcenter/developer-reference/external-api/api-reference/results.md).

## Parameters

| Parameter                              | Description                                                                                                                                           |
| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `testId`                               | Path parameter. The experiment's ID, from [`/experiments`](/elevate-helpcenter/developer-reference/external-api/api-reference/experiments.md).        |
| `mode`                                 | `cumulative` (default) for running totals up to each bucket, or `interval` for each bucket on its own.                                                |
| `startDate`, `endDate`, `timeZoneName` | The [date window](/elevate-helpcenter/developer-reference/external-api/dates-and-time-zones.md). The time zone also decides where each bucket starts. |
| Filters                                | Any [filter](/elevate-helpcenter/developer-reference/external-api/filters.md), applied before the buckets are built.                                  |

## Response

| Field                      | Type             | What it holds                                                                                          |
| -------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------ |
| `mode`                     | `string`         | `cumulative` or `interval`, as asked for                                                               |
| `interval`                 | `string`         | The bucket size as an ISO 8601 duration, `P1D` today                                                   |
| `timeZoneName`             | `string`         | The time zone the buckets are aligned to                                                               |
| `period.dateRanges[]`      | `object`         | The running periods the buckets cover                                                                  |
| `totalVisitors[]`          | `object`         | `start` (`string`) and `visitors` (`number \| null`), one per bucket                                   |
| `variations[].variationId` | `integer`        | The variation                                                                                          |
| `variations[].name`        | `string \| null` | Its name                                                                                               |
| `variations[].isControl`   | `boolean`        | Whether it is the control                                                                              |
| `variations[].points[]`    | `object`         | `start` (`string`) plus the metrics below, each `number \| null`, in the same order as `totalVisitors` |

Each point's metrics: `visitors`, `conversions`, `conversionRate`, `revenue`, `shippingRevenue`, `revenuePerVisitor`, `averageOrderValue`, `addToCarts`, `checkoutsStarted`, `checkoutsCompleted`, `completionRate`, `subscriptionOrdersPerVisitor`, `collectionPageViewRate`, `productPageViewRate`, `collectionToProductRate`, `productToCartRate`, `cartToCheckoutRate`, `exitBeforeProductRate`.

```bash
curl "https://elevateab.app/api/external/v1/experiments/TEST_ID/timeseries?mode=interval&timeZoneName=America/New_York" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```json
{
  "success": true,
  "data": {
    "testId": "3f2a9c1e-5b7d-4e8a-9f10-2c4d6e8a0b12",
    "mode": "interval",
    "interval": "P1D",
    "timeZoneName": "America/New_York",
    "period": {
      "dateRanges": [
        { "startDate": "2026-09-12 09:52:05", "endDate": "2026-09-18 11:58:35" }
      ]
    },
    "appliedFilters": {},
    "totalVisitors": [
      { "start": "2026-09-12T00:00:00-04:00", "visitors": 23 },
      { "start": "2026-09-13T00:00:00-04:00", "visitors": 13 }
    ],
    "variations": [
      {
        "variationId": 53397,
        "name": "Control",
        "isControl": true,
        "points": [
          {
            "start": "2026-09-12T00:00:00-04:00",
            "visitors": 10,
            "conversions": 2,
            "conversionRate": 20,
            "revenue": 107.1
          },
          {
            "start": "2026-09-13T00:00:00-04:00",
            "visitors": 7,
            "conversions": 1,
            "conversionRate": 14.29,
            "revenue": 139.4
          }
        ]
      }
    ]
  }
}
```

## Worth knowing

* **Read `interval` rather than assuming a day.** Longer experiments may get larger buckets later, and the shape will not change.
* **The last bucket is usually partial**, ending at the end of the period or at the current moment for a running experiment. In `interval` mode its counts look lower for that reason; its rates are unaffected.
* **A visitor counts in every bucket they were active in**, so in `interval` mode the buckets add up to more than the experiment's unique visitors. `cumulative` mode counts each visitor once.
* **Paused periods are not buckets.** They are missing from the series, which is what `period.dateRanges` describes.
* **Personalizations** return only the personalized variation.
