---
title: Compute retention timeseries
description: Datadog, the leading service for cloud-scale monitoring.
breadcrumbs: Docs > API Reference > Product Analytics
---

> For the complete documentation index, see [llms.txt](https://docs.datadoghq.com/llms.txt).

# Compute retention timeseries{% #compute-retention-timeseries %}
Copy pageCopied
{% tab title="v2" %}
**Note**: This endpoint is in preview and is subject to change. If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
| Datadog site      | API endpoint                                                                     |
| ----------------- | -------------------------------------------------------------------------------- |
| ap1.datadoghq.com | POST https://api.ap1.datadoghq.com/api/v2/product-analytics/retention/timeseries |
| ap2.datadoghq.com | POST https://api.ap2.datadoghq.com/api/v2/product-analytics/retention/timeseries |
| app.datadoghq.eu  | POST https://api.datadoghq.eu/api/v2/product-analytics/retention/timeseries      |
| app.ddog-gov.com  | POST https://api.ddog-gov.com/api/v2/product-analytics/retention/timeseries      |
| us2.ddog-gov.com  | POST https://api.us2.ddog-gov.com/api/v2/product-analytics/retention/timeseries  |
| uk1.datadoghq.com | POST https://api.uk1.datadoghq.com/api/v2/product-analytics/retention/timeseries |
| app.datadoghq.com | POST https://api.datadoghq.com/api/v2/product-analytics/retention/timeseries     |
| us3.datadoghq.com | POST https://api.us3.datadoghq.com/api/v2/product-analytics/retention/timeseries |
| us5.datadoghq.com | POST https://api.us5.datadoghq.com/api/v2/product-analytics/retention/timeseries |

### Overview

Compute retention as a series of values over time, using the same query definition as the retention grid. This endpoint requires the `rum_apps_read` permission.

### Request

#### Body Data (required)

The retention timeseries query.

{% tab title="Model" %}

| Parent field                               | Field                                      | Type          | Description                                                                                                                                                                                                                                       |
| ------------------------------------------ | ------------------------------------------ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|                                            | data [*required*]                     | object        | The single JSON:API resource carrying a retention scalar or timeseries query. Its attributes hold the time window to query and the retention query definition to evaluate.                                                                        |
| data                                       | attributes [*required*]               | object        | Attributes of a retention scalar or retention timeseries request.                                                                                                                                                                                 |
| attributes                                 | exclude_anonymous_traffic                  | boolean       | Whether to exclude sessions that are not tied to an identified user.                                                                                                                                                                              |
| attributes                                 | from [*required*]                     | int64         | Start of the query window, in epoch milliseconds.                                                                                                                                                                                                 |
| attributes                                 | query [*required*]                    | object        | Query definition for a retention scalar or retention timeseries request.                                                                                                                                                                          |
| query                                      | computation_scope                          |  <oneOf> | Restricts a retention query to part of the grid, so that results can be examined in detail. Omit it to compute the whole grid.                                                                                                                    |
| computation_scope                          | <type=cohort>                              | object        | Narrows a retention query to a single cohort row.                                                                                                                                                                                                 |
| <type=cohort>                              | target [*required*]                   |  <oneOf> | Selects a cohort, either by index or by the aggregation that rolls all cohorts together.                                                                                                                                                          |
| target                                     | <type=index>                               | object        | Selects a cohort or return period by its zero-based position in the grid.                                                                                                                                                                         |
| <type=index>                               | type [*required*]                     | enum          | The discriminator identifying a target selected by index. Allowed enum values: `index`                                                                                                                                                            |
| <type=index>                               | value [*required*]                    | int64         | Zero-based index of the targeted cohort or return period.                                                                                                                                                                                         |
| target                                     | <type=aggregation>                         | object        | Selects the rolled-up row that aggregates every cohort, rather than a single cohort.                                                                                                                                                              |
| <type=aggregation>                         | type [*required*]                     | enum          | The discriminator identifying a target selected by aggregation. Allowed enum values: `aggregation`                                                                                                                                                |
| <type=aggregation>                         | value [*required*]                    | string        | The aggregation that produced the rolled-up row.                                                                                                                                                                                                  |
| <type=cohort>                              | type [*required*]                     | enum          | The discriminator identifying a scope narrowed to one cohort. Allowed enum values: `cohort`                                                                                                                                                       |
| computation_scope                          | <type=return_period>                       | object        | Narrows a retention query to a single return-period column.                                                                                                                                                                                       |
| <type=return_period>                       | target [*required*]                   | object        | Selects a cohort or return period by its zero-based position in the grid.                                                                                                                                                                         |
| target                                     | type [*required*]                     | enum          | The discriminator identifying a target selected by index. Allowed enum values: `index`                                                                                                                                                            |
| target                                     | value [*required*]                    | int64         | Zero-based index of the targeted cohort or return period.                                                                                                                                                                                         |
| <type=return_period>                       | type [*required*]                     | enum          | The discriminator identifying a scope narrowed to one return period. Allowed enum values: `return_period`                                                                                                                                         |
| computation_scope                          | <type=cell>                                | object        | Narrows a retention query to a single cell, at the intersection of one cohort and one return period.                                                                                                                                              |
| <type=cell>                                | cohort_target [*required*]            |  <oneOf> | Selects a cohort, either by index or by the aggregation that rolls all cohorts together.                                                                                                                                                          |
| cohort_target                              | <type=index>                               | object        | Selects a cohort or return period by its zero-based position in the grid.                                                                                                                                                                         |
| <type=index>                               | type [*required*]                     | enum          | The discriminator identifying a target selected by index. Allowed enum values: `index`                                                                                                                                                            |
| <type=index>                               | value [*required*]                    | int64         | Zero-based index of the targeted cohort or return period.                                                                                                                                                                                         |
| cohort_target                              | <type=aggregation>                         | object        | Selects the rolled-up row that aggregates every cohort, rather than a single cohort.                                                                                                                                                              |
| <type=aggregation>                         | type [*required*]                     | enum          | The discriminator identifying a target selected by aggregation. Allowed enum values: `aggregation`                                                                                                                                                |
| <type=aggregation>                         | value [*required*]                    | string        | The aggregation that produced the rolled-up row.                                                                                                                                                                                                  |
| <type=cell>                                | return_period_target [*required*]     | object        | Selects a cohort or return period by its zero-based position in the grid.                                                                                                                                                                         |
| return_period_target                       | type [*required*]                     | enum          | The discriminator identifying a target selected by index. Allowed enum values: `index`                                                                                                                                                            |
| return_period_target                       | value [*required*]                    | int64         | Zero-based index of the targeted cohort or return period.                                                                                                                                                                                         |
| <type=cell>                                | type [*required*]                     | enum          | The discriminator identifying a scope narrowed to one grid cell. Allowed enum values: `cell`                                                                                                                                                      |
| query                                      | compute [*required*]                  | object        | The metric and aggregation applied to a retention query.                                                                                                                                                                                          |
| compute                                    | aggregation [*required*]              | string        | The aggregation function applied to the metric, such as `count` or `avg`.                                                                                                                                                                         |
| compute                                    | metric [*required*]                   | enum          | The retention metric to compute, either an absolute count or a rate. Allowed enum values: `__dd.retention,__dd.retention_rate`                                                                                                                    |
| query                                      | group_by                                   | [object]      | Splits the results by the values of one or more facets.                                                                                                                                                                                           |
| group_by                                   | facet [*required*]                    | string        | The attribute path to group by.                                                                                                                                                                                                                   |
| group_by                                   | limit                                      | int64         | Maximum number of groups to return. Omit it to let the service choose.                                                                                                                                                                            |
| group_by                                   | should_exclude_missing                     | boolean       | Whether to drop entities that have no value for the facet.                                                                                                                                                                                        |
| group_by                                   | sort                                       | object        | Sort configuration for group-by results.                                                                                                                                                                                                          |
| sort                                       | aggregation                                | string        | The aggregation function to sort by.                                                                                                                                                                                                              |
| sort                                       | metric                                     | string        | The metric to sort by.                                                                                                                                                                                                                            |
| sort                                       | order                                      | enum          | Direction of sort. Allowed enum values: `asc,desc`                                                                                                                                                                                                |
| group_by                                   | source                                     | string        | Audience source backing the group-by, when grouping by an audience rather than a facet.                                                                                                                                                           |
| group_by                                   | target [*required*]                   | enum          | Which axis of the retention grid a group-by applies to. Allowed enum values: `cohort,return_period`                                                                                                                                               |
| query                                      | search [*required*]                   | object        | Defines the cohort and return criteria that make up a retention query.                                                                                                                                                                            |
| search                                     | cohort_criteria [*required*]          | object        | Defines the event that places an entity into a cohort, and how cohorts are bucketed over time.                                                                                                                                                    |
| cohort_criteria                            | base_query [*required*]               |  <oneOf> | A query definition discriminated by the `data_source` field. Use `product_analytics` for standard event queries, or `product_analytics_occurrence` for occurrence-filtered queries.                                                               |
| base_query                                 | <data_source=product_analytics>            | object        | A standard Product Analytics event query.                                                                                                                                                                                                         |
| <data_source=product_analytics>            | data_source [*required*]              | enum          | The data source identifier. Allowed enum values: `product_analytics`                                                                                                                                                                              |
| <data_source=product_analytics>            | search [*required*]                   | object        | Search parameters for an event query.                                                                                                                                                                                                             |
| search                                     | query                                      | string        | The search query using Datadog search syntax.                                                                                                                                                                                                     |
| base_query                                 | <data_source=product_analytics_occurrence> | object        | A Product Analytics occurrence-filtered query.                                                                                                                                                                                                    |
| <data_source=product_analytics_occurrence> | data_source [*required*]              | enum          | The data source identifier for occurrence queries. Allowed enum values: `product_analytics_occurrence`                                                                                                                                            |
| <data_source=product_analytics_occurrence> | search [*required*]                   | object        | Search parameters for an occurrence query.                                                                                                                                                                                                        |
| search                                     | occurrences                                | object        | Filter for occurrence-based queries.                                                                                                                                                                                                              |
| occurrences                                | meta                                       | object        | Additional metadata.                                                                                                                                                                                                                              |
| additionalProperties                       | <any-key>                                  | string        |
| occurrences                                | operator [*required*]                 | string        | Comparison operator (=, >=, <=, >, <).                                                                                                                                                                                                            |
| occurrences                                | value [*required*]                    | string        | The occurrence count threshold as a string.                                                                                                                                                                                                       |
| search                                     | query                                      | string        | The search query using Datadog search syntax.                                                                                                                                                                                                     |
| cohort_criteria                            | time_interval [*required*]            |  <oneOf> | A retention interval, either aligned to calendar boundaries or of a fixed length. Cohort criteria use calendar intervals; return criteria use fixed intervals.                                                                                    |
| time_interval                              | <type=calendar>                            | object        | A retention interval aligned to calendar boundaries.                                                                                                                                                                                              |
| <type=calendar>                            | type [*required*]                     | enum          | The discriminator identifying a calendar-aligned retention interval. Allowed enum values: `calendar`                                                                                                                                              |
| <type=calendar>                            | value [*required*]                    | object        | A calendar-aligned bucket definition, such as "every 1 week starting on Monday".                                                                                                                                                                  |
| value                                      | alignment                                  | string        | Where each bucket starts within the calendar unit. Use an hour for `day` (for example `1am` or `14`), a day name for `week` (for example `monday`), or an ordinal for `month` (for example `1st`).                                                |
| value                                      | quantity                                   | int64         | Number of calendar units per bucket.                                                                                                                                                                                                              |
| value                                      | timezone                                   | string        | Timezone used to align the buckets.                                                                                                                                                                                                               |
| value                                      | type [*required*]                     | enum          | Calendar unit used to bucket cohorts. Allowed enum values: `minute,hour,day,week,month,quarter,year`                                                                                                                                              |
| time_interval                              | <type=fixed>                               | object        | A retention interval of fixed length, such as "7 days".                                                                                                                                                                                           |
| <type=fixed>                               | type [*required*]                     | enum          | The discriminator identifying a fixed-length retention interval. Allowed enum values: `fixed`                                                                                                                                                     |
| <type=fixed>                               | unit [*required*]                     | enum          | Time unit for a fixed-length retention interval. Allowed enum values: `day,week,month`                                                                                                                                                            |
| <type=fixed>                               | value [*required*]                    | double        | Length of the interval, expressed in `unit`.                                                                                                                                                                                                      |
| search                                     | filters                                    | object        | Filters narrowing the events considered by a retention query.                                                                                                                                                                                     |
| filters                                    | audience_filters                           | object        | Audience filter definitions for targeting specific user segments.                                                                                                                                                                                 |
| audience_filters                           | accounts                                   | [object]      | Account audience queries.                                                                                                                                                                                                                         |
| accounts                                   | name [*required*]                     | string        | Name of this query, referenced in the formula.                                                                                                                                                                                                    |
| accounts                                   | query                                      | string        | Search query for filtering accounts.                                                                                                                                                                                                              |
| audience_filters                           | formula                                    | string        | Boolean formula combining audience queries by name.                                                                                                                                                                                               |
| audience_filters                           | segments                                   | [object]      | Segment audience queries.                                                                                                                                                                                                                         |
| segments                                   | name [*required*]                     | string        | Name of this query, referenced in the formula.                                                                                                                                                                                                    |
| segments                                   | segment_id [*required*]               | uuid          | UUID of the segment to filter by.                                                                                                                                                                                                                 |
| audience_filters                           | users                                      | [object]      | User audience queries.                                                                                                                                                                                                                            |
| users                                      | name [*required*]                     | string        | Name of this query, referenced in the formula.                                                                                                                                                                                                    |
| users                                      | query                                      | string        | Search query for filtering users.                                                                                                                                                                                                                 |
| filters                                    | string_filter                              | string        | Free-text search query applied to the events.                                                                                                                                                                                                     |
| search                                     | retention_entity [*required*]         | enum          | The entity whose retention is measured. Allowed enum values: `@usr.id,@account.id`                                                                                                                                                                |
| search                                     | return_condition [*required*]         | enum          | When an entity counts as having returned. Use `conversion_on` to count only entities that returned during the period itself, or `conversion_on_or_after` to also count later returns. Allowed enum values: `conversion_on,conversion_on_or_after` |
| search                                     | return_criteria                            | object        | Defines the event that counts as a return, and the window in which it must occur.                                                                                                                                                                 |
| return_criteria                            | base_query [*required*]               |  <oneOf> | A query definition discriminated by the `data_source` field. Use `product_analytics` for standard event queries, or `product_analytics_occurrence` for occurrence-filtered queries.                                                               |
| base_query                                 | <data_source=product_analytics>            | object        | A standard Product Analytics event query.                                                                                                                                                                                                         |
| <data_source=product_analytics>            | data_source [*required*]              | enum          | The data source identifier. Allowed enum values: `product_analytics`                                                                                                                                                                              |
| <data_source=product_analytics>            | search [*required*]                   | object        | Search parameters for an event query.                                                                                                                                                                                                             |
| search                                     | query                                      | string        | The search query using Datadog search syntax.                                                                                                                                                                                                     |
| base_query                                 | <data_source=product_analytics_occurrence> | object        | A Product Analytics occurrence-filtered query.                                                                                                                                                                                                    |
| <data_source=product_analytics_occurrence> | data_source [*required*]              | enum          | The data source identifier for occurrence queries. Allowed enum values: `product_analytics_occurrence`                                                                                                                                            |
| <data_source=product_analytics_occurrence> | search [*required*]                   | object        | Search parameters for an occurrence query.                                                                                                                                                                                                        |
| search                                     | occurrences                                | object        | Filter for occurrence-based queries.                                                                                                                                                                                                              |
| occurrences                                | meta                                       | object        | Additional metadata.                                                                                                                                                                                                                              |
| additionalProperties                       | <any-key>                                  | string        |
| occurrences                                | operator [*required*]                 | string        | Comparison operator (=, >=, <=, >, <).                                                                                                                                                                                                            |
| occurrences                                | value [*required*]                    | string        | The occurrence count threshold as a string.                                                                                                                                                                                                       |
| search                                     | query                                      | string        | The search query using Datadog search syntax.                                                                                                                                                                                                     |
| return_criteria                            | time_interval                              |  <oneOf> | A retention interval, either aligned to calendar boundaries or of a fixed length. Cohort criteria use calendar intervals; return criteria use fixed intervals.                                                                                    |
| time_interval                              | <type=calendar>                            | object        | A retention interval aligned to calendar boundaries.                                                                                                                                                                                              |
| <type=calendar>                            | type [*required*]                     | enum          | The discriminator identifying a calendar-aligned retention interval. Allowed enum values: `calendar`                                                                                                                                              |
| <type=calendar>                            | value [*required*]                    | object        | A calendar-aligned bucket definition, such as "every 1 week starting on Monday".                                                                                                                                                                  |
| value                                      | alignment                                  | string        | Where each bucket starts within the calendar unit. Use an hour for `day` (for example `1am` or `14`), a day name for `week` (for example `monday`), or an ordinal for `month` (for example `1st`).                                                |
| value                                      | quantity                                   | int64         | Number of calendar units per bucket.                                                                                                                                                                                                              |
| value                                      | timezone                                   | string        | Timezone used to align the buckets.                                                                                                                                                                                                               |
| value                                      | type [*required*]                     | enum          | Calendar unit used to bucket cohorts. Allowed enum values: `minute,hour,day,week,month,quarter,year`                                                                                                                                              |
| time_interval                              | <type=fixed>                               | object        | A retention interval of fixed length, such as "7 days".                                                                                                                                                                                           |
| <type=fixed>                               | type [*required*]                     | enum          | The discriminator identifying a fixed-length retention interval. Allowed enum values: `fixed`                                                                                                                                                     |
| <type=fixed>                               | unit [*required*]                     | enum          | Time unit for a fixed-length retention interval. Allowed enum values: `day,week,month`                                                                                                                                                            |
| <type=fixed>                               | value [*required*]                    | double        | Length of the interval, expressed in `unit`.                                                                                                                                                                                                      |
| attributes                                 | to [*required*]                       | int64         | End of the query window, in epoch milliseconds.                                                                                                                                                                                                   |
| data                                       | type [*required*]                     | enum          | The resource type identifier for a retention scalar or retention timeseries request. Allowed enum values: `formula_retention_request`                                                                                                             |

{% /tab %}

{% tab title="Example" %}

```json
{
  "data": {
    "attributes": {
      "exclude_anonymous_traffic": false,
      "from": 1756425600000,
      "query": {
        "computation_scope": {
          "target": {
            "type": "index",
            "value": 0
          },
          "type": "cohort"
        },
        "compute": {
          "aggregation": "count",
          "metric": "__dd.retention_rate"
        },
        "group_by": [
          {
            "facet": "@geo.country",
            "limit": 10,
            "should_exclude_missing": false,
            "sort": {
              "aggregation": "count",
              "metric": "string",
              "order": "string"
            },
            "source": "string",
            "target": "cohort"
          }
        ],
        "search": {
          "cohort_criteria": {
            "base_query": {
              "data_source": "product_analytics",
              "search": {
                "query": "@type:view"
              }
            },
            "time_interval": {
              "type": "calendar",
              "value": {
                "alignment": "monday",
                "quantity": 1,
                "timezone": "UTC",
                "type": "week"
              }
            }
          },
          "filters": {
            "audience_filters": {
              "accounts": [
                {
                  "name": "",
                  "query": "string"
                }
              ],
              "formula": "u",
              "segments": [
                {
                  "name": "",
                  "segment_id": "00000000-0000-0000-0000-000000000000"
                }
              ],
              "users": [
                {
                  "name": "u",
                  "query": "*"
                }
              ]
            },
            "string_filter": "string"
          },
          "retention_entity": "@usr.id",
          "return_condition": "conversion_on_or_after",
          "return_criteria": {
            "base_query": {
              "data_source": "product_analytics",
              "search": {
                "query": "@type:view"
              }
            },
            "time_interval": {
              "type": "calendar",
              "value": {
                "alignment": "monday",
                "quantity": 1,
                "timezone": "UTC",
                "type": "week"
              }
            }
          }
        }
      },
      "to": 1756857600000
    },
    "type": "formula_retention_request"
  }
}
```

{% /tab %}

### Response

{% tab title="200" %}
OK
{% tab title="Model" %}
Response for a timeseries analytics query.

| Parent field | Field        | Type      | Description                                                                                                  |
| ------------ | ------------ | --------- | ------------------------------------------------------------------------------------------------------------ |
|              | data         | object    | Data object for a timeseries analytics response.                                                             |
| data         | attributes   | object    | Attributes of a timeseries analytics response, containing series data, timestamps, and interval definitions. |
| attributes   | intervals    | [object]  | Interval definitions describing the time buckets used in the response.                                       |
| intervals    | milliseconds | int64     | The duration of each time bucket in milliseconds.                                                            |
| intervals    | start_time   | int64     | The start of this interval as an epoch timestamp in milliseconds.                                            |
| intervals    | times        | [integer] | Epoch timestamps (in milliseconds) for each bucket in this interval.                                         |
| intervals    | type         | string    | The interval type (e.g., fixed or auto-computed bucket size).                                                |
| attributes   | series       | [object]  | The list of series, each corresponding to a query or group-by combination.                                   |
| series       | group_tags   | [string]  | The group-by tag values that identify this series.                                                           |
| series       | query_index  | int64     | The index of the query that produced this series.                                                            |
| series       | unit         | [object]  | Unit definitions for the series values.                                                                      |
| unit         | family       | string    | The unit family (e.g., time, bytes).                                                                         |
| unit         | id           | int64     | Numeric identifier for the unit.                                                                             |
| unit         | name         | string    | The full name of the unit (e.g., nanosecond).                                                                |
| unit         | plural       | string    | Plural form of the unit name (e.g., nanoseconds).                                                            |
| unit         | scale_factor | double    | Conversion factor relative to the base unit of the family.                                                   |
| unit         | short_name   | string    | Abbreviated unit name (e.g., ns).                                                                            |
| attributes   | times        | [integer] | Timestamps for each data point (epoch milliseconds).                                                         |
| attributes   | values       | [array]   | Values for each series at each time point.                                                                   |
| data         | id           | string    | Unique identifier for this response data object.                                                             |
| data         | type         | enum      | The resource type identifier for a timeseries analytics response. Allowed enum values: `timeseries_response` |
|              | meta         | object    | Metadata for a Product Analytics query response.                                                             |
| meta         | request_id   | string    | Unique identifier of the query.                                                                              |
| meta         | status       | enum      | The execution status of a Product Analytics query. Allowed enum values: `done,running,timeout`               |

{% /tab %}

{% tab title="Example" %}

```json
{
  "data": {
    "attributes": {
      "intervals": [
        {
          "milliseconds": "integer",
          "start_time": "integer",
          "times": [],
          "type": "string"
        }
      ],
      "series": [
        {
          "group_tags": [],
          "query_index": "integer",
          "unit": [
            {
              "family": "time",
              "id": "integer",
              "name": "nanosecond",
              "plural": "string",
              "scale_factor": "number",
              "short_name": "string"
            }
          ]
        }
      ],
      "times": [],
      "values": []
    },
    "id": "string",
    "type": "string"
  },
  "meta": {
    "request_id": "string",
    "status": "string"
  }
}
```

{% /tab %}

{% /tab %}

{% tab title="400" %}
Bad Request
{% tab title="Model" %}
API error response.

| Field                    | Type     | Description       |
| ------------------------ | -------- | ----------------- |
| errors [*required*] | [string] | A list of errors. |

{% /tab %}

{% tab title="Example" %}

```json
{
  "errors": [
    "Bad Request"
  ]
}
```

{% /tab %}

{% /tab %}

{% tab title="403" %}
Not Authorized
{% tab title="Model" %}
API error response.

| Field                    | Type     | Description       |
| ------------------------ | -------- | ----------------- |
| errors [*required*] | [string] | A list of errors. |

{% /tab %}

{% tab title="Example" %}

```json
{
  "errors": [
    "Bad Request"
  ]
}
```

{% /tab %}

{% /tab %}

{% tab title="429" %}
Too many requests
{% tab title="Model" %}
API error response.

| Field                    | Type     | Description       |
| ------------------------ | -------- | ----------------- |
| errors [*required*] | [string] | A list of errors. |

{% /tab %}

{% tab title="Example" %}

```json
{
  "errors": [
    "Bad Request"
  ]
}
```

{% /tab %}

{% /tab %}

### Code Example

##### 
                  \## default
# 
 \# Curl command curl -X POST "https://api.datadoghq.com/api/v2/product-analytics/retention/timeseries" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: ${DD_API_KEY}" \
-H "DD-APPLICATION-KEY: ${DD_APP_KEY}" \
-d @- << EOF
{
  "data": {
    "attributes": {
      "from": 1756425600000,
      "query": {
        "compute": {
          "aggregation": "count",
          "metric": "__dd.retention_rate"
        },
        "search": {
          "cohort_criteria": {
            "base_query": {
              "data_source": "product_analytics",
              "search": {
                "query": "@type:view @view.name:Signup"
              }
            },
            "time_interval": {
              "type": "calendar",
              "value": {
                "alignment": "monday",
                "quantity": 1,
                "timezone": "UTC",
                "type": "week"
              }
            }
          },
          "retention_entity": "@usr.id",
          "return_condition": "conversion_on_or_after",
          "return_criteria": {
            "base_query": {
              "data_source": "product_analytics",
              "search": {
                "query": "@type:view"
              }
            }
          }
        }
      },
      "to": 1756857600000
    },
    "type": "formula_retention_request"
  }
}
EOF 
                
##### 

```python
"""
Compute retention timeseries returns "OK" response
"""

from datadog_api_client import ApiClient, Configuration
from datadog_api_client.v2.api.product_analytics_api import ProductAnalyticsApi
from datadog_api_client.v2.model.product_analytics_audience_account_subquery import (
    ProductAnalyticsAudienceAccountSubquery,
)
from datadog_api_client.v2.model.product_analytics_audience_filters import ProductAnalyticsAudienceFilters
from datadog_api_client.v2.model.product_analytics_audience_segment_subquery import (
    ProductAnalyticsAudienceSegmentSubquery,
)
from datadog_api_client.v2.model.product_analytics_audience_user_subquery import ProductAnalyticsAudienceUserSubquery
from datadog_api_client.v2.model.product_analytics_calendar_interval import ProductAnalyticsCalendarInterval
from datadog_api_client.v2.model.product_analytics_calendar_interval_type import ProductAnalyticsCalendarIntervalType
from datadog_api_client.v2.model.product_analytics_event_query import ProductAnalyticsEventQuery
from datadog_api_client.v2.model.product_analytics_event_query_data_source import ProductAnalyticsEventQueryDataSource
from datadog_api_client.v2.model.product_analytics_event_search import ProductAnalyticsEventSearch
from datadog_api_client.v2.model.product_analytics_formula_retention_query import ProductAnalyticsFormulaRetentionQuery
from datadog_api_client.v2.model.product_analytics_formula_retention_request import (
    ProductAnalyticsFormulaRetentionRequest,
)
from datadog_api_client.v2.model.product_analytics_formula_retention_request_attributes import (
    ProductAnalyticsFormulaRetentionRequestAttributes,
)
from datadog_api_client.v2.model.product_analytics_formula_retention_request_data import (
    ProductAnalyticsFormulaRetentionRequestData,
)
from datadog_api_client.v2.model.product_analytics_formula_retention_request_type import (
    ProductAnalyticsFormulaRetentionRequestType,
)
from datadog_api_client.v2.model.product_analytics_group_by_sort import ProductAnalyticsGroupBySort
from datadog_api_client.v2.model.product_analytics_retention_calendar_time_interval import (
    ProductAnalyticsRetentionCalendarTimeInterval,
)
from datadog_api_client.v2.model.product_analytics_retention_calendar_time_interval_type import (
    ProductAnalyticsRetentionCalendarTimeIntervalType,
)
from datadog_api_client.v2.model.product_analytics_retention_cohort_criteria import (
    ProductAnalyticsRetentionCohortCriteria,
)
from datadog_api_client.v2.model.product_analytics_retention_cohort_scope import ProductAnalyticsRetentionCohortScope
from datadog_api_client.v2.model.product_analytics_retention_cohort_scope_type import (
    ProductAnalyticsRetentionCohortScopeType,
)
from datadog_api_client.v2.model.product_analytics_retention_compute import ProductAnalyticsRetentionCompute
from datadog_api_client.v2.model.product_analytics_retention_compute_metric import (
    ProductAnalyticsRetentionComputeMetric,
)
from datadog_api_client.v2.model.product_analytics_retention_entity import ProductAnalyticsRetentionEntity
from datadog_api_client.v2.model.product_analytics_retention_filters import ProductAnalyticsRetentionFilters
from datadog_api_client.v2.model.product_analytics_retention_group_by import ProductAnalyticsRetentionGroupBy
from datadog_api_client.v2.model.product_analytics_retention_group_by_target import (
    ProductAnalyticsRetentionGroupByTarget,
)
from datadog_api_client.v2.model.product_analytics_retention_index_target import ProductAnalyticsRetentionIndexTarget
from datadog_api_client.v2.model.product_analytics_retention_index_target_type import (
    ProductAnalyticsRetentionIndexTargetType,
)
from datadog_api_client.v2.model.product_analytics_retention_return_condition import (
    ProductAnalyticsRetentionReturnCondition,
)
from datadog_api_client.v2.model.product_analytics_retention_return_criteria import (
    ProductAnalyticsRetentionReturnCriteria,
)
from datadog_api_client.v2.model.product_analytics_retention_search import ProductAnalyticsRetentionSearch
from datadog_api_client.v2.model.query_sort_order import QuerySortOrder
from uuid import UUID

body = ProductAnalyticsFormulaRetentionRequest(
    data=ProductAnalyticsFormulaRetentionRequestData(
        attributes=ProductAnalyticsFormulaRetentionRequestAttributes(
            exclude_anonymous_traffic=False,
            _from=1756425600000,
            query=ProductAnalyticsFormulaRetentionQuery(
                computation_scope=ProductAnalyticsRetentionCohortScope(
                    target=ProductAnalyticsRetentionIndexTarget(
                        type=ProductAnalyticsRetentionIndexTargetType.INDEX,
                        value=0,
                    ),
                    type=ProductAnalyticsRetentionCohortScopeType.COHORT,
                ),
                compute=ProductAnalyticsRetentionCompute(
                    aggregation="count",
                    metric=ProductAnalyticsRetentionComputeMetric.RETENTION_RATE,
                ),
                group_by=[
                    ProductAnalyticsRetentionGroupBy(
                        facet="@geo.country",
                        limit=10,
                        should_exclude_missing=False,
                        sort=ProductAnalyticsGroupBySort(
                            aggregation="count",
                            order=QuerySortOrder.DESC,
                        ),
                        target=ProductAnalyticsRetentionGroupByTarget.COHORT,
                    ),
                ],
                search=ProductAnalyticsRetentionSearch(
                    cohort_criteria=ProductAnalyticsRetentionCohortCriteria(
                        base_query=ProductAnalyticsEventQuery(
                            data_source=ProductAnalyticsEventQueryDataSource.PRODUCT_ANALYTICS,
                            search=ProductAnalyticsEventSearch(
                                query="@type:view",
                            ),
                        ),
                        time_interval=ProductAnalyticsRetentionCalendarTimeInterval(
                            type=ProductAnalyticsRetentionCalendarTimeIntervalType.CALENDAR,
                            value=ProductAnalyticsCalendarInterval(
                                alignment="monday",
                                quantity=1,
                                timezone="UTC",
                                type=ProductAnalyticsCalendarIntervalType.WEEK,
                            ),
                        ),
                    ),
                    filters=ProductAnalyticsRetentionFilters(
                        audience_filters=ProductAnalyticsAudienceFilters(
                            accounts=[
                                ProductAnalyticsAudienceAccountSubquery(
                                    name="",
                                ),
                            ],
                            formula="u",
                            segments=[
                                ProductAnalyticsAudienceSegmentSubquery(
                                    name="",
                                    segment_id=UUID("00000000-0000-0000-0000-000000000000"),
                                ),
                            ],
                            users=[
                                ProductAnalyticsAudienceUserSubquery(
                                    name="u",
                                    query="*",
                                ),
                            ],
                        ),
                    ),
                    retention_entity=ProductAnalyticsRetentionEntity.USER_ID,
                    return_condition=ProductAnalyticsRetentionReturnCondition.CONVERSION_ON_OR_AFTER,
                    return_criteria=ProductAnalyticsRetentionReturnCriteria(
                        base_query=ProductAnalyticsEventQuery(
                            data_source=ProductAnalyticsEventQueryDataSource.PRODUCT_ANALYTICS,
                            search=ProductAnalyticsEventSearch(
                                query="@type:view",
                            ),
                        ),
                        time_interval=ProductAnalyticsRetentionCalendarTimeInterval(
                            type=ProductAnalyticsRetentionCalendarTimeIntervalType.CALENDAR,
                            value=ProductAnalyticsCalendarInterval(
                                alignment="monday",
                                quantity=1,
                                timezone="UTC",
                                type=ProductAnalyticsCalendarIntervalType.WEEK,
                            ),
                        ),
                    ),
                ),
            ),
            to=1756857600000,
        ),
        type=ProductAnalyticsFormulaRetentionRequestType.FORMULA_RETENTION_REQUEST,
    ),
)

configuration = Configuration()
configuration.unstable_operations["query_product_analytics_retention_timeseries"] = True
with ApiClient(configuration) as api_client:
    api_instance = ProductAnalyticsApi(api_client)
    response = api_instance.query_product_analytics_retention_timeseries(body=body)

    print(response)
```

#### Instructions

First [install the library and its dependencies](https://docs.datadoghq.com/api/latest.md?code-lang=python) and then save the example to `example.py` and run following commands:
    DD_SITE="datadoghq.com" DD_API_KEY="<API-KEY>" DD_APP_KEY="<APP-KEY>" python3 "example.py"
##### 

```ruby
# Compute retention timeseries returns "OK" response

require "datadog_api_client"
DatadogAPIClient.configure do |config|
  config.unstable_operations["v2.query_product_analytics_retention_timeseries".to_sym] = true
end
api_instance = DatadogAPIClient::V2::ProductAnalyticsAPI.new

body = DatadogAPIClient::V2::ProductAnalyticsFormulaRetentionRequest.new({
  data: DatadogAPIClient::V2::ProductAnalyticsFormulaRetentionRequestData.new({
    attributes: DatadogAPIClient::V2::ProductAnalyticsFormulaRetentionRequestAttributes.new({
      exclude_anonymous_traffic: false,
      from: 1756425600000,
      query: DatadogAPIClient::V2::ProductAnalyticsFormulaRetentionQuery.new({
        computation_scope: DatadogAPIClient::V2::ProductAnalyticsRetentionCohortScope.new({
          target: DatadogAPIClient::V2::ProductAnalyticsRetentionIndexTarget.new({
            type: DatadogAPIClient::V2::ProductAnalyticsRetentionIndexTargetType::INDEX,
            value: 0,
          }),
          type: DatadogAPIClient::V2::ProductAnalyticsRetentionCohortScopeType::COHORT,
        }),
        compute: DatadogAPIClient::V2::ProductAnalyticsRetentionCompute.new({
          aggregation: "count",
          metric: DatadogAPIClient::V2::ProductAnalyticsRetentionComputeMetric::RETENTION_RATE,
        }),
        group_by: [
          DatadogAPIClient::V2::ProductAnalyticsRetentionGroupBy.new({
            facet: "@geo.country",
            limit: 10,
            should_exclude_missing: false,
            sort: DatadogAPIClient::V2::ProductAnalyticsGroupBySort.new({
              aggregation: "count",
              order: DatadogAPIClient::V2::QuerySortOrder::DESC,
            }),
            target: DatadogAPIClient::V2::ProductAnalyticsRetentionGroupByTarget::COHORT,
          }),
        ],
        search: DatadogAPIClient::V2::ProductAnalyticsRetentionSearch.new({
          cohort_criteria: DatadogAPIClient::V2::ProductAnalyticsRetentionCohortCriteria.new({
            base_query: DatadogAPIClient::V2::ProductAnalyticsEventQuery.new({
              data_source: DatadogAPIClient::V2::ProductAnalyticsEventQueryDataSource::PRODUCT_ANALYTICS,
              search: DatadogAPIClient::V2::ProductAnalyticsEventSearch.new({
                query: "@type:view",
              }),
            }),
            time_interval: DatadogAPIClient::V2::ProductAnalyticsRetentionCalendarTimeInterval.new({
              type: DatadogAPIClient::V2::ProductAnalyticsRetentionCalendarTimeIntervalType::CALENDAR,
              value: DatadogAPIClient::V2::ProductAnalyticsCalendarInterval.new({
                alignment: "monday",
                quantity: 1,
                timezone: "UTC",
                type: DatadogAPIClient::V2::ProductAnalyticsCalendarIntervalType::WEEK,
              }),
            }),
          }),
          filters: DatadogAPIClient::V2::ProductAnalyticsRetentionFilters.new({
            audience_filters: DatadogAPIClient::V2::ProductAnalyticsAudienceFilters.new({
              accounts: [
                DatadogAPIClient::V2::ProductAnalyticsAudienceAccountSubquery.new({
                  name: "",
                }),
              ],
              formula: "u",
              segments: [
                DatadogAPIClient::V2::ProductAnalyticsAudienceSegmentSubquery.new({
                  name: "",
                  segment_id: "00000000-0000-0000-0000-000000000000",
                }),
              ],
              users: [
                DatadogAPIClient::V2::ProductAnalyticsAudienceUserSubquery.new({
                  name: "u",
                  query: "*",
                }),
              ],
            }),
          }),
          retention_entity: DatadogAPIClient::V2::ProductAnalyticsRetentionEntity::USER_ID,
          return_condition: DatadogAPIClient::V2::ProductAnalyticsRetentionReturnCondition::CONVERSION_ON_OR_AFTER,
          return_criteria: DatadogAPIClient::V2::ProductAnalyticsRetentionReturnCriteria.new({
            base_query: DatadogAPIClient::V2::ProductAnalyticsEventQuery.new({
              data_source: DatadogAPIClient::V2::ProductAnalyticsEventQueryDataSource::PRODUCT_ANALYTICS,
              search: DatadogAPIClient::V2::ProductAnalyticsEventSearch.new({
                query: "@type:view",
              }),
            }),
            time_interval: DatadogAPIClient::V2::ProductAnalyticsRetentionCalendarTimeInterval.new({
              type: DatadogAPIClient::V2::ProductAnalyticsRetentionCalendarTimeIntervalType::CALENDAR,
              value: DatadogAPIClient::V2::ProductAnalyticsCalendarInterval.new({
                alignment: "monday",
                quantity: 1,
                timezone: "UTC",
                type: DatadogAPIClient::V2::ProductAnalyticsCalendarIntervalType::WEEK,
              }),
            }),
          }),
        }),
      }),
      to: 1756857600000,
    }),
    type: DatadogAPIClient::V2::ProductAnalyticsFormulaRetentionRequestType::FORMULA_RETENTION_REQUEST,
  }),
})
p api_instance.query_product_analytics_retention_timeseries(body)
```

#### Instructions

First [install the library and its dependencies](https://docs.datadoghq.com/api/latest.md?code-lang=ruby) and then save the example to `example.rb` and run following commands:
    DD_SITE="datadoghq.com" DD_API_KEY="<API-KEY>" DD_APP_KEY="<APP-KEY>" rb "example.rb"
##### 

```go
// Compute retention timeseries returns "OK" response

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"os"

	"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
	"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
	"github.com/google/uuid"
)

func main() {
	body := datadogV2.ProductAnalyticsFormulaRetentionRequest{
		Data: datadogV2.ProductAnalyticsFormulaRetentionRequestData{
			Attributes: datadogV2.ProductAnalyticsFormulaRetentionRequestAttributes{
				ExcludeAnonymousTraffic: datadog.PtrBool(false),
				From:                    1756425600000,
				Query: datadogV2.ProductAnalyticsFormulaRetentionQuery{
					ComputationScope: &datadogV2.ProductAnalyticsRetentionScope{
						ProductAnalyticsRetentionCohortScope: &datadogV2.ProductAnalyticsRetentionCohortScope{
							Target: datadogV2.ProductAnalyticsRetentionCohortTarget{
								ProductAnalyticsRetentionIndexTarget: &datadogV2.ProductAnalyticsRetentionIndexTarget{
									Type:  datadogV2.PRODUCTANALYTICSRETENTIONINDEXTARGETTYPE_INDEX,
									Value: 0,
								}},
							Type: datadogV2.PRODUCTANALYTICSRETENTIONCOHORTSCOPETYPE_COHORT,
						}},
					Compute: datadogV2.ProductAnalyticsRetentionCompute{
						Aggregation: "count",
						Metric:      datadogV2.PRODUCTANALYTICSRETENTIONCOMPUTEMETRIC_RETENTION_RATE,
					},
					GroupBy: []datadogV2.ProductAnalyticsRetentionGroupBy{
						{
							Facet:                "@geo.country",
							Limit:                datadog.PtrInt64(10),
							ShouldExcludeMissing: datadog.PtrBool(false),
							Sort: &datadogV2.ProductAnalyticsGroupBySort{
								Aggregation: datadog.PtrString("count"),
								Order:       datadogV2.QUERYSORTORDER_DESC.Ptr(),
							},
							Target: datadogV2.PRODUCTANALYTICSRETENTIONGROUPBYTARGET_COHORT,
						},
					},
					Search: datadogV2.ProductAnalyticsRetentionSearch{
						CohortCriteria: datadogV2.ProductAnalyticsRetentionCohortCriteria{
							BaseQuery: datadogV2.ProductAnalyticsBaseQuery{
								ProductAnalyticsEventQuery: &datadogV2.ProductAnalyticsEventQuery{
									DataSource: datadogV2.PRODUCTANALYTICSEVENTQUERYDATASOURCE_PRODUCT_ANALYTICS,
									Search: datadogV2.ProductAnalyticsEventSearch{
										Query: datadog.PtrString("@type:view"),
									},
								}},
							TimeInterval: datadogV2.ProductAnalyticsRetentionTimeInterval{
								ProductAnalyticsRetentionCalendarTimeInterval: &datadogV2.ProductAnalyticsRetentionCalendarTimeInterval{
									Type: datadogV2.PRODUCTANALYTICSRETENTIONCALENDARTIMEINTERVALTYPE_CALENDAR,
									Value: datadogV2.ProductAnalyticsCalendarInterval{
										Alignment: datadog.PtrString("monday"),
										Quantity:  datadog.PtrInt64(1),
										Timezone:  datadog.PtrString("UTC"),
										Type:      datadogV2.PRODUCTANALYTICSCALENDARINTERVALTYPE_WEEK,
									},
								}},
						},
						Filters: &datadogV2.ProductAnalyticsRetentionFilters{
							AudienceFilters: &datadogV2.ProductAnalyticsAudienceFilters{
								Accounts: []datadogV2.ProductAnalyticsAudienceAccountSubquery{
									{
										Name: "",
									},
								},
								Formula: datadog.PtrString("u"),
								Segments: []datadogV2.ProductAnalyticsAudienceSegmentSubquery{
									{
										Name:      "",
										SegmentId: uuid.MustParse("00000000-0000-0000-0000-000000000000"),
									},
								},
								Users: []datadogV2.ProductAnalyticsAudienceUserSubquery{
									{
										Name:  "u",
										Query: datadog.PtrString("*"),
									},
								},
							},
						},
						RetentionEntity: datadogV2.PRODUCTANALYTICSRETENTIONENTITY_USER_ID,
						ReturnCondition: datadogV2.PRODUCTANALYTICSRETENTIONRETURNCONDITION_CONVERSION_ON_OR_AFTER,
						ReturnCriteria: &datadogV2.ProductAnalyticsRetentionReturnCriteria{
							BaseQuery: datadogV2.ProductAnalyticsBaseQuery{
								ProductAnalyticsEventQuery: &datadogV2.ProductAnalyticsEventQuery{
									DataSource: datadogV2.PRODUCTANALYTICSEVENTQUERYDATASOURCE_PRODUCT_ANALYTICS,
									Search: datadogV2.ProductAnalyticsEventSearch{
										Query: datadog.PtrString("@type:view"),
									},
								}},
							TimeInterval: &datadogV2.ProductAnalyticsRetentionTimeInterval{
								ProductAnalyticsRetentionCalendarTimeInterval: &datadogV2.ProductAnalyticsRetentionCalendarTimeInterval{
									Type: datadogV2.PRODUCTANALYTICSRETENTIONCALENDARTIMEINTERVALTYPE_CALENDAR,
									Value: datadogV2.ProductAnalyticsCalendarInterval{
										Alignment: datadog.PtrString("monday"),
										Quantity:  datadog.PtrInt64(1),
										Timezone:  datadog.PtrString("UTC"),
										Type:      datadogV2.PRODUCTANALYTICSCALENDARINTERVALTYPE_WEEK,
									},
								}},
						},
					},
				},
				To: 1756857600000,
			},
			Type: datadogV2.PRODUCTANALYTICSFORMULARETENTIONREQUESTTYPE_FORMULA_RETENTION_REQUEST,
		},
	}
	ctx := datadog.NewDefaultContext(context.Background())
	configuration := datadog.NewConfiguration()
	configuration.SetUnstableOperationEnabled("v2.QueryProductAnalyticsRetentionTimeseries", true)
	apiClient := datadog.NewAPIClient(configuration)
	api := datadogV2.NewProductAnalyticsApi(apiClient)
	resp, r, err := api.QueryProductAnalyticsRetentionTimeseries(ctx, body)

	if err != nil {
		fmt.Fprintf(os.Stderr, "Error when calling `ProductAnalyticsApi.QueryProductAnalyticsRetentionTimeseries`: %v\n", err)
		fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
	}

	responseContent, _ := json.MarshalIndent(resp, "", "  ")
	fmt.Fprintf(os.Stdout, "Response from `ProductAnalyticsApi.QueryProductAnalyticsRetentionTimeseries`:\n%s\n", responseContent)
}
```

#### Instructions

First [install the library and its dependencies](https://docs.datadoghq.com/api/latest.md?code-lang=go) and then save the example to `main.go` and run following commands:
    DD_SITE="datadoghq.com" DD_API_KEY="<API-KEY>" DD_APP_KEY="<APP-KEY>" go run "main.go"
##### 

```java
// Compute retention timeseries returns "OK" response

import com.datadog.api.client.ApiClient;
import com.datadog.api.client.ApiException;
import com.datadog.api.client.v2.api.ProductAnalyticsApi;
import com.datadog.api.client.v2.model.ProductAnalyticsAudienceAccountSubquery;
import com.datadog.api.client.v2.model.ProductAnalyticsAudienceFilters;
import com.datadog.api.client.v2.model.ProductAnalyticsAudienceSegmentSubquery;
import com.datadog.api.client.v2.model.ProductAnalyticsAudienceUserSubquery;
import com.datadog.api.client.v2.model.ProductAnalyticsBaseQuery;
import com.datadog.api.client.v2.model.ProductAnalyticsCalendarInterval;
import com.datadog.api.client.v2.model.ProductAnalyticsCalendarIntervalType;
import com.datadog.api.client.v2.model.ProductAnalyticsEventQuery;
import com.datadog.api.client.v2.model.ProductAnalyticsEventQueryDataSource;
import com.datadog.api.client.v2.model.ProductAnalyticsEventSearch;
import com.datadog.api.client.v2.model.ProductAnalyticsFormulaRetentionQuery;
import com.datadog.api.client.v2.model.ProductAnalyticsFormulaRetentionRequest;
import com.datadog.api.client.v2.model.ProductAnalyticsFormulaRetentionRequestAttributes;
import com.datadog.api.client.v2.model.ProductAnalyticsFormulaRetentionRequestData;
import com.datadog.api.client.v2.model.ProductAnalyticsFormulaRetentionRequestType;
import com.datadog.api.client.v2.model.ProductAnalyticsGroupBySort;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCalendarTimeInterval;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCalendarTimeIntervalType;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCohortCriteria;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCohortScope;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCohortScopeType;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCohortTarget;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionCompute;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionComputeMetric;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionEntity;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionFilters;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionGroupBy;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionGroupByTarget;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionIndexTarget;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionIndexTargetType;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionReturnCondition;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionReturnCriteria;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionScope;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionSearch;
import com.datadog.api.client.v2.model.ProductAnalyticsRetentionTimeInterval;
import com.datadog.api.client.v2.model.ProductAnalyticsTimeseriesResponse;
import com.datadog.api.client.v2.model.QuerySortOrder;
import java.util.Collections;
import java.util.UUID;

public class Example {
  public static void main(String[] args) {
    ApiClient defaultClient = ApiClient.getDefaultApiClient();
    defaultClient.setUnstableOperationEnabled("v2.queryProductAnalyticsRetentionTimeseries", true);
    ProductAnalyticsApi apiInstance = new ProductAnalyticsApi(defaultClient);

    ProductAnalyticsFormulaRetentionRequest body =
        new ProductAnalyticsFormulaRetentionRequest()
            .data(
                new ProductAnalyticsFormulaRetentionRequestData()
                    .attributes(
                        new ProductAnalyticsFormulaRetentionRequestAttributes()
                            .excludeAnonymousTraffic(false)
                            .from(1756425600000L)
                            .query(
                                new ProductAnalyticsFormulaRetentionQuery()
                                    .computationScope(
                                        new ProductAnalyticsRetentionScope(
                                            new ProductAnalyticsRetentionCohortScope()
                                                .target(
                                                    new ProductAnalyticsRetentionCohortTarget(
                                                        new ProductAnalyticsRetentionIndexTarget()
                                                            .type(
                                                                ProductAnalyticsRetentionIndexTargetType
                                                                    .INDEX)
                                                            .value(0L)))
                                                .type(
                                                    ProductAnalyticsRetentionCohortScopeType
                                                        .COHORT)))
                                    .compute(
                                        new ProductAnalyticsRetentionCompute()
                                            .aggregation("count")
                                            .metric(
                                                ProductAnalyticsRetentionComputeMetric
                                                    .RETENTION_RATE))
                                    .groupBy(
                                        Collections.singletonList(
                                            new ProductAnalyticsRetentionGroupBy()
                                                .facet("@geo.country")
                                                .limit(10L)
                                                .shouldExcludeMissing(false)
                                                .sort(
                                                    new ProductAnalyticsGroupBySort()
                                                        .aggregation("count")
                                                        .order(QuerySortOrder.DESC))
                                                .target(
                                                    ProductAnalyticsRetentionGroupByTarget.COHORT)))
                                    .search(
                                        new ProductAnalyticsRetentionSearch()
                                            .cohortCriteria(
                                                new ProductAnalyticsRetentionCohortCriteria()
                                                    .baseQuery(
                                                        new ProductAnalyticsBaseQuery(
                                                            new ProductAnalyticsEventQuery()
                                                                .dataSource(
                                                                    ProductAnalyticsEventQueryDataSource
                                                                        .PRODUCT_ANALYTICS)
                                                                .search(
                                                                    new ProductAnalyticsEventSearch()
                                                                        .query("@type:view"))))
                                                    .timeInterval(
                                                        new ProductAnalyticsRetentionTimeInterval(
                                                            new ProductAnalyticsRetentionCalendarTimeInterval()
                                                                .type(
                                                                    ProductAnalyticsRetentionCalendarTimeIntervalType
                                                                        .CALENDAR)
                                                                .value(
                                                                    new ProductAnalyticsCalendarInterval()
                                                                        .alignment("monday")
                                                                        .quantity(1L)
                                                                        .timezone("UTC")
                                                                        .type(
                                                                            ProductAnalyticsCalendarIntervalType
                                                                                .WEEK)))))
                                            .filters(
                                                new ProductAnalyticsRetentionFilters()
                                                    .audienceFilters(
                                                        new ProductAnalyticsAudienceFilters()
                                                            .accounts(
                                                                Collections.singletonList(
                                                                    new ProductAnalyticsAudienceAccountSubquery()
                                                                        .name("")))
                                                            .formula("u")
                                                            .segments(
                                                                Collections.singletonList(
                                                                    new ProductAnalyticsAudienceSegmentSubquery()
                                                                        .name("")
                                                                        .segmentId(
                                                                            UUID.fromString(
                                                                                "00000000-0000-0000-0000-000000000000"))))
                                                            .users(
                                                                Collections.singletonList(
                                                                    new ProductAnalyticsAudienceUserSubquery()
                                                                        .name("u")
                                                                        .query("*")))))
                                            .retentionEntity(
                                                ProductAnalyticsRetentionEntity.USER_ID)
                                            .returnCondition(
                                                ProductAnalyticsRetentionReturnCondition
                                                    .CONVERSION_ON_OR_AFTER)
                                            .returnCriteria(
                                                new ProductAnalyticsRetentionReturnCriteria()
                                                    .baseQuery(
                                                        new ProductAnalyticsBaseQuery(
                                                            new ProductAnalyticsEventQuery()
                                                                .dataSource(
                                                                    ProductAnalyticsEventQueryDataSource
                                                                        .PRODUCT_ANALYTICS)
                                                                .search(
                                                                    new ProductAnalyticsEventSearch()
                                                                        .query("@type:view"))))
                                                    .timeInterval(
                                                        new ProductAnalyticsRetentionTimeInterval(
                                                            new ProductAnalyticsRetentionCalendarTimeInterval()
                                                                .type(
                                                                    ProductAnalyticsRetentionCalendarTimeIntervalType
                                                                        .CALENDAR)
                                                                .value(
                                                                    new ProductAnalyticsCalendarInterval()
                                                                        .alignment("monday")
                                                                        .quantity(1L)
                                                                        .timezone("UTC")
                                                                        .type(
                                                                            ProductAnalyticsCalendarIntervalType
                                                                                .WEEK)))))))
                            .to(1756857600000L))
                    .type(ProductAnalyticsFormulaRetentionRequestType.FORMULA_RETENTION_REQUEST));

    try {
      ProductAnalyticsTimeseriesResponse result =
          apiInstance.queryProductAnalyticsRetentionTimeseries(body);
      System.out.println(result);
    } catch (ApiException e) {
      System.err.println(
          "Exception when calling ProductAnalyticsApi#queryProductAnalyticsRetentionTimeseries");
      System.err.println("Status code: " + e.getCode());
      System.err.println("Reason: " + e.getResponseBody());
      System.err.println("Response headers: " + e.getResponseHeaders());
      e.printStackTrace();
    }
  }
}
```

#### Instructions

First [install the library and its dependencies](https://docs.datadoghq.com/api/latest.md?code-lang=java) and then save the example to `Example.java` and run following commands:
    DD_SITE="datadoghq.com" DD_API_KEY="<API-KEY>" DD_APP_KEY="<APP-KEY>" java "Example.java"
##### 

```rust
// Compute retention timeseries returns "OK" response
use datadog_api_client::datadog;
use datadog_api_client::datadogV2::api_product_analytics::ProductAnalyticsAPI;
use datadog_api_client::datadogV2::model::ProductAnalyticsAudienceAccountSubquery;
use datadog_api_client::datadogV2::model::ProductAnalyticsAudienceFilters;
use datadog_api_client::datadogV2::model::ProductAnalyticsAudienceSegmentSubquery;
use datadog_api_client::datadogV2::model::ProductAnalyticsAudienceUserSubquery;
use datadog_api_client::datadogV2::model::ProductAnalyticsBaseQuery;
use datadog_api_client::datadogV2::model::ProductAnalyticsCalendarInterval;
use datadog_api_client::datadogV2::model::ProductAnalyticsCalendarIntervalType;
use datadog_api_client::datadogV2::model::ProductAnalyticsEventQuery;
use datadog_api_client::datadogV2::model::ProductAnalyticsEventQueryDataSource;
use datadog_api_client::datadogV2::model::ProductAnalyticsEventSearch;
use datadog_api_client::datadogV2::model::ProductAnalyticsFormulaRetentionQuery;
use datadog_api_client::datadogV2::model::ProductAnalyticsFormulaRetentionRequest;
use datadog_api_client::datadogV2::model::ProductAnalyticsFormulaRetentionRequestAttributes;
use datadog_api_client::datadogV2::model::ProductAnalyticsFormulaRetentionRequestData;
use datadog_api_client::datadogV2::model::ProductAnalyticsFormulaRetentionRequestType;
use datadog_api_client::datadogV2::model::ProductAnalyticsGroupBySort;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCalendarTimeInterval;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCalendarTimeIntervalType;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCohortCriteria;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCohortScope;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCohortScopeType;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCohortTarget;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionCompute;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionComputeMetric;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionEntity;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionFilters;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionGroupBy;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionGroupByTarget;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionIndexTarget;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionIndexTargetType;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionReturnCondition;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionReturnCriteria;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionScope;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionSearch;
use datadog_api_client::datadogV2::model::ProductAnalyticsRetentionTimeInterval;
use datadog_api_client::datadogV2::model::QuerySortOrder;
use uuid::Uuid;

#[tokio::main]
async fn main() {
    let body =
        ProductAnalyticsFormulaRetentionRequest::new(
            ProductAnalyticsFormulaRetentionRequestData::new(
                ProductAnalyticsFormulaRetentionRequestAttributes::new(
                    1756425600000,
                    ProductAnalyticsFormulaRetentionQuery::new(
                        ProductAnalyticsRetentionCompute::new(
                            "count".to_string(),
                            ProductAnalyticsRetentionComputeMetric::RETENTION_RATE,
                        ),
                        ProductAnalyticsRetentionSearch::new(
                            ProductAnalyticsRetentionCohortCriteria::new(
                                ProductAnalyticsBaseQuery::ProductAnalyticsEventQuery(
                                    Box::new(
                                        ProductAnalyticsEventQuery::new(
                                            ProductAnalyticsEventQueryDataSource::PRODUCT_ANALYTICS,
                                            ProductAnalyticsEventSearch::new().query("@type:view".to_string()),
                                        ),
                                    ),
                                ),
                                ProductAnalyticsRetentionTimeInterval::ProductAnalyticsRetentionCalendarTimeInterval(
                                    Box::new(
                                        ProductAnalyticsRetentionCalendarTimeInterval::new(
                                            ProductAnalyticsRetentionCalendarTimeIntervalType::CALENDAR,
                                            ProductAnalyticsCalendarInterval::new(
                                                ProductAnalyticsCalendarIntervalType::WEEK,
                                            )
                                                .alignment("monday".to_string())
                                                .quantity(1)
                                                .timezone("UTC".to_string()),
                                        ),
                                    ),
                                ),
                            ),
                            ProductAnalyticsRetentionEntity::USER_ID,
                            ProductAnalyticsRetentionReturnCondition::CONVERSION_ON_OR_AFTER,
                        )
                            .filters(
                                ProductAnalyticsRetentionFilters
                                ::new().audience_filters(
                                    ProductAnalyticsAudienceFilters::new()
                                        .accounts(vec![ProductAnalyticsAudienceAccountSubquery::new("".to_string())])
                                        .formula("u".to_string())
                                        .segments(
                                            vec![
                                                ProductAnalyticsAudienceSegmentSubquery::new(
                                                    "".to_string(),
                                                    Uuid::parse_str(
                                                        "00000000-0000-0000-0000-000000000000",
                                                    ).expect("invalid UUID"),
                                                )
                                            ],
                                        )
                                        .users(
                                            vec![
                                                ProductAnalyticsAudienceUserSubquery::new(
                                                    "u".to_string(),
                                                ).query("*".to_string())
                                            ],
                                        ),
                                ),
                            )
                            .return_criteria(
                                ProductAnalyticsRetentionReturnCriteria::new(
                                    ProductAnalyticsBaseQuery::ProductAnalyticsEventQuery(
                                        Box::new(
                                            ProductAnalyticsEventQuery::new(
                                                ProductAnalyticsEventQueryDataSource::PRODUCT_ANALYTICS,
                                                ProductAnalyticsEventSearch::new().query("@type:view".to_string()),
                                            ),
                                        ),
                                    ),
                                ).time_interval(
                                    ProductAnalyticsRetentionTimeInterval
                                    ::ProductAnalyticsRetentionCalendarTimeInterval(
                                        Box::new(
                                            ProductAnalyticsRetentionCalendarTimeInterval::new(
                                                ProductAnalyticsRetentionCalendarTimeIntervalType::CALENDAR,
                                                ProductAnalyticsCalendarInterval::new(
                                                    ProductAnalyticsCalendarIntervalType::WEEK,
                                                )
                                                    .alignment("monday".to_string())
                                                    .quantity(1)
                                                    .timezone("UTC".to_string()),
                                            ),
                                        ),
                                    ),
                                ),
                            ),
                    )
                        .computation_scope(
                            ProductAnalyticsRetentionScope::ProductAnalyticsRetentionCohortScope(
                                Box::new(
                                    ProductAnalyticsRetentionCohortScope::new(
                                        ProductAnalyticsRetentionCohortTarget::ProductAnalyticsRetentionIndexTarget(
                                            Box::new(
                                                ProductAnalyticsRetentionIndexTarget::new(
                                                    ProductAnalyticsRetentionIndexTargetType::INDEX,
                                                    0,
                                                ),
                                            ),
                                        ),
                                        ProductAnalyticsRetentionCohortScopeType::COHORT,
                                    ),
                                ),
                            ),
                        )
                        .group_by(
                            vec![
                                ProductAnalyticsRetentionGroupBy::new(
                                    "@geo.country".to_string(),
                                    ProductAnalyticsRetentionGroupByTarget::COHORT,
                                )
                                    .limit(10)
                                    .should_exclude_missing(false)
                                    .sort(
                                        ProductAnalyticsGroupBySort::new()
                                            .aggregation("count".to_string())
                                            .order(QuerySortOrder::DESC),
                                    )
                            ],
                        ),
                    1756857600000,
                ).exclude_anonymous_traffic(false),
                ProductAnalyticsFormulaRetentionRequestType::FORMULA_RETENTION_REQUEST,
            ),
        );
    let mut configuration = datadog::Configuration::new();
    configuration
        .set_unstable_operation_enabled("v2.QueryProductAnalyticsRetentionTimeseries", true);
    let api = ProductAnalyticsAPI::with_config(configuration);
    let resp = api.query_product_analytics_retention_timeseries(body).await;
    if let Ok(value) = resp {
        println!("{:#?}", value);
    } else {
        println!("{:#?}", resp.unwrap_err());
    }
}
```

#### Instructions

First [install the library and its dependencies](https://docs.datadoghq.com/api/latest.md?code-lang=rust) and then save the example to `src/main.rs` and run following commands:
    DD_SITE="datadoghq.com" DD_API_KEY="<API-KEY>" DD_APP_KEY="<APP-KEY>" cargo run
##### 

```typescript
/**
 * Compute retention timeseries returns "OK" response
 */

import { client, v2 } from "@datadog/datadog-api-client";

const configuration = client.createConfiguration();
configuration.unstableOperations[
  "v2.queryProductAnalyticsRetentionTimeseries"
] = true;
const apiInstance = new v2.ProductAnalyticsApi(configuration);

const params: v2.ProductAnalyticsApiQueryProductAnalyticsRetentionTimeseriesRequest =
  {
    body: {
      data: {
        attributes: {
          excludeAnonymousTraffic: false,
          from: 1756425600000,
          query: {
            computationScope: {
              target: {
                type: "index",
                value: 0,
              },
              type: "cohort",
            },
            compute: {
              aggregation: "count",
              metric: "__dd.retention_rate",
            },
            groupBy: [
              {
                facet: "@geo.country",
                limit: 10,
                shouldExcludeMissing: false,
                sort: {
                  aggregation: "count",
                  order: "desc",
                },
                target: "cohort",
              },
            ],
            search: {
              cohortCriteria: {
                baseQuery: {
                  dataSource: "product_analytics",
                  search: {
                    query: "@type:view",
                  },
                },
                timeInterval: {
                  type: "calendar",
                  value: {
                    alignment: "monday",
                    quantity: 1,
                    timezone: "UTC",
                    type: "week",
                  },
                },
              },
              filters: {
                audienceFilters: {
                  accounts: [
                    {
                      name: "",
                    },
                  ],
                  formula: "u",
                  segments: [
                    {
                      name: "",
                      segmentId: "00000000-0000-0000-0000-000000000000",
                    },
                  ],
                  users: [
                    {
                      name: "u",
                      query: "*",
                    },
                  ],
                },
              },
              retentionEntity: "@usr.id",
              returnCondition: "conversion_on_or_after",
              returnCriteria: {
                baseQuery: {
                  dataSource: "product_analytics",
                  search: {
                    query: "@type:view",
                  },
                },
                timeInterval: {
                  type: "calendar",
                  value: {
                    alignment: "monday",
                    quantity: 1,
                    timezone: "UTC",
                    type: "week",
                  },
                },
              },
            },
          },
          to: 1756857600000,
        },
        type: "formula_retention_request",
      },
    },
  };

apiInstance
  .queryProductAnalyticsRetentionTimeseries(params)
  .then((data: v2.ProductAnalyticsTimeseriesResponse) => {
    console.log(
      "API called successfully. Returned data: " + JSON.stringify(data)
    );
  })
  .catch((error: any) => console.error(error));
```

#### Instructions

First [install the library and its dependencies](https://docs.datadoghq.com/api/latest.md?code-lang=typescript) and then save the example to `example.ts` and run following commands:
    DD_SITE="datadoghq.com" DD_API_KEY="<API-KEY>" DD_APP_KEY="<APP-KEY>" tsc "example.ts"
{% /tab %}
