[Tenjin API Reference](https://api-docs.tenjin.com/llms.txt) › [Reporting Metrics API](https://api-docs.tenjin.com/reporting-metrics-api.md) › Pull an SKAdNetwork report from Apple postbacks

- Reporting Metrics API OpenAPI spec: https://api-docs.tenjin.com/openapi/reporting-metrics-api.json

# Pull an SKAdNetwork report from Apple postbacks

- **Method:** `GET`
- **Path:** `/v2/reports/skan_apple`
- **Operation ID:** `get_reports_skan_apple`
- **Tags:** Reporting Metrics

Columns of a row by group_by, besides `date` (absent with `granularity=totals-daily`) and the requested metrics. A group_by of several values always includes `app`, and has the columns of each value.

| group_by           | Columns                                                                               |
| ------------------ | ------------------------------------------------------------------------------------- |
| `app`              | `app_id`, `app_name`, `platform`, `bundle_id`, `store_id`                             |
| `channel`          | `ad_network_id`, `ad_network_name`, `ad_network_short_id`                             |
| `campaign`         | `campaign_id`, `campaign_name`, the `app` columns, `ad_network_id`, `ad_network_name` |
| `conversion_value` | `conversion_value`                                                                    |
| `fidelity_type`    | `fidelity_type`                                                                       |
| `sk_ad_network`    | `sk_ad_network_id`                                                                    |
| `sk_campaign`      | `sk_campaign_id`                                                                      |
| `sk_source_app`    | `sk_source_app_id`                                                                    |

## Effective servers

- `https://api.tenjin.com`

## Authentication

- **Bearer**: HTTP bearer (`JWT`)

  Generate an access token on the [Access Tokens](https://dashboard.tenjin.com/dashboard/access_tokens) page of the Tenjin dashboard and send it as `Authorization: Bearer <access token>`. [API access tokens](https://tenjin.com/docs/api-access-tokens/) explains them.

## Query parameters

- **`start_date`**: `string`, format: `date`

  First day to include, YYYY-MM-DD. Defaults to 30 days before today
- **`end_date`**: `string`, format: `date`

  Last day to include, YYYY-MM-DD. Defaults to today
- **`app_ids`**: `array of string`, explode: `false`

  Ids of the apps to report on, comma-separated; all accessible apps when blank
- **`channel_ids`**: `array of integer`, explode: `false`

  Ids of the channels to report on, comma-separated; all channels when blank
- **`granularity`**: `string`, possible values: `"daily", "totals-daily"`, default: `"daily"`

  Period of each row. With `totals-daily`, one row covers the whole date range
- **`group_by`**: `array`, default: `["app"]`, explode: `false`

  Dimensions to group the rows by, comma-separated: one dimension, or several that include `app`; `sk_campaign` only together with `sk_ad_network`

  **Array of:**

  `string`, possible values: `"app", "channel", "conversion_value", "fidelity_type", "sk_ad_network", "sk_campaign", "sk_source_app", "campaign"`
- **`metrics`**: `array`, default: `["conversion_value_count","conversion_value_avg"]`, explode: `false`

  Metrics to report, comma-separated; see the [Metric Definitions](https://api-docs.tenjin.com/metric_definitions#sk_ad_network)

  **Array of:**

  `string`, possible values: `"conversion_value_count", "conversion_value_total", "conversion_value_avg", "redownload_count", "redownload_cv_total", "redownload_cv_avg", "first_download_count", "first_download_cv_total", "first_download_cv_avg", "assists", "redownload_assists", "first_download_assists"`
- **`metric_filters`**: `array of string`, explode: `false`

  Keep only rows where every filter holds. A filter is metric:op:value; op is gt, gte, lt, lte or eq
- **`omit_blank_rows`**: `boolean`

  Drop rows where every requested metric is zero or null
- **`page`**: `integer`, default: `1`

  Page of results to fetch.
- **`per_page`**: `integer`, default: `100`, minimum: `0`, maximum: `1000`

  Number of results to return per page.

## Responses

### 200 The report

**Headers:**

- **`Link`**

  URLs of the first, previous, next and last pages (RFC 8288); sent only when the list has more than one page

  `string`
- **`Total`**

  Number of items on all pages

  `integer`
- **`Per-Page`**

  Number of items per page

  `integer`

**Content type:** `application/json`

schema: `SkanReportDocument`

- **`data` (required)**: `array`

  **Items:**

  schema: `SkanReportResource`
  - **`attributes` (required)**: `object`

    The dimension columns of the group_by, and the requested metrics; see the [Metric Definitions](https://api-docs.tenjin.com/metric_definitions#sk_ad_network)
    - **`ad_network_id`**: `integer | null`

      Id of the channel. Group by channel or campaign
    - **`ad_network_name`**: `string | null`

      Name of the channel. Group by channel or campaign
    - **`ad_network_short_id`**: `string | null`

      URL-safe id of the channel. Group by channel
    - **`app_id`**: `string | null`, format: `uuid`

      Id of the app. Group by app or campaign; every group_by of several values includes app
    - **`app_name`**: `string | null`

      Name of the app. Group by app or campaign
    - **`assists`**: `integer | null`

      Assists. When requested
    - **`bundle_id`**: `string | null`

      Bundle id of the app in its store. Group by app or campaign
    - **`campaign_id`**: `string`, format: `uuid`

      Id of the campaign. Group by campaign
    - **`campaign_name`**: `string | null`

      Name of the campaign. Group by campaign
    - **`conversion_value`**: `integer | null`

      SKAdNetwork conversion value, from 0 to 63. Group by conversion_value
    - **`conversion_value_avg`**: `number | null`, format: `double`

      Conversion Value Average. When requested
    - **`conversion_value_count`**: `integer | null`

      Conversions. When requested
    - **`conversion_value_total`**: `integer | null`

      Conversion Value Total. When requested
    - **`date`**: `string`, format: `date`

      First day of the period; absent with granularity=totals-daily
    - **`fidelity_type`**: `integer | null`

      1 for StoreKit-rendered ads, 0 for view-through ads. Group by fidelity_type
    - **`first_download_assists`**: `integer | null`

      First Download Assists. When requested
    - **`first_download_count`**: `integer | null`

      First Downloads. When requested
    - **`first_download_cv_avg`**: `number | null`, format: `double`

      First Download Conversion Value Average. When requested
    - **`first_download_cv_total`**: `integer | null`

      First Download Conversion Value Total. When requested
    - **`platform`**: `string | null`, possible values: `"amazon", "android", "android_other", "ios", "windows", "unspecified", null`

      Platform of the app. Group by app or campaign
    - **`redownload_assists`**: `integer | null`

      Redownload Assists. When requested
    - **`redownload_count`**: `integer | null`

      Redownloads. When requested
    - **`redownload_cv_avg`**: `number | null`, format: `double`

      Redownload Conversion Value Average. When requested
    - **`redownload_cv_total`**: `integer | null`

      Redownload Conversion Value Total. When requested
    - **`sk_ad_network_id`**: `string | null`

      SKAdNetwork id of the ad network. Group by sk_ad_network
    - **`sk_campaign_id`**: `integer | null`

      SKAdNetwork campaign id, from 0 to 99. Group by sk_campaign
    - **`sk_source_app_id`**: `integer | null`

      Store id of the app that showed the ad. Group by sk_source_app
    - **`store_id`**: `string | null`

      Id of the app in its store. Group by app or campaign
  - **`id` (required)**: `string`
  - **`type` (required)**: `string`, possible values: `"sk_ad_network_report"`
- **`links` (required)**: `object`, schema: `Links`
  - **`self` (required)**: `string`, format: `uri`

    URL of this request
  - **`first`**: `string`, format: `uri`

    URL of the first page of a list
  - **`last`**: `string`, format: `uri`

    URL of the last page of a list
  - **`next`**: `string`, format: `uri`

    URL of the next page of a list
  - **`prev`**: `string`, format: `uri`

    URL of the previous page of a list
- **`meta` (required)**: `object`, schema: `SkanReportMeta`
  - **`ad_network_ids` (required)**: `array of integer`

    The channel_ids param
  - **`app_ids` (required)**: `array of string`

    The app_ids param
  - **`count` (required)**: `integer`

    Number of rows on all pages
  - **`end_date` (required)**: `string`, format: `date`

    The end_date param, or its default
  - **`granularity` (required)**: `string`, possible values: `"daily", "totals-daily"`

    The granularity param, or its default
  - **`group_by` (required)**

    Internal dimension names: a string for one dimension, an array for several

    **One of:**
    - `string`, possible values: `"app_id", "ad_network_id", "conversion_value", "fidelity_type", "sk_ad_network_id", "sk_campaign_id", "sk_source_app_id", "campaign_id"`
    - `array`

      **Array of:**

      `string`, possible values: `"app_id", "ad_network_id", "conversion_value", "fidelity_type", "sk_ad_network_id", "sk_campaign_id", "sk_source_app_id", "campaign_id"`
  - **`metrics` (required)**: `array of string`

    The requested metrics
  - **`organization_id` (required)**: `string`, format: `uuid`

    Id of your organization
  - **`per_page` (required)**: `integer`

    Number of rows per page
  - **`start_date` (required)**: `string`, format: `date`

    The start_date param, or its default

**Example: Group by app**

```json
{
  "data": [
    {
      "id": "2026-08-29.d5e94942-6dc2-4e03-8a94-4d6a13ada0f1",
      "type": "sk_ad_network_report",
      "attributes": {
        "date": "2026-08-29",
        "app_id": "d5e94942-6dc2-4e03-8a94-4d6a13ada0f1",
        "conversion_value_count": 8,
        "conversion_value_avg": 13.75,
        "app_name": "Alpha",
        "bundle_id": "com.example.alpha",
        "store_id": "2000000001",
        "platform": "ios"
      }
    },
    {
      "id": "2026-08-29.1edc1a8e-8466-4e16-9927-5ee89d12f71d",
      "type": "sk_ad_network_report",
      "attributes": {
        "date": "2026-08-29",
        "app_id": "1edc1a8e-8466-4e16-9927-5ee89d12f71d",
        "conversion_value_count": 2,
        "conversion_value_avg": null,
        "app_name": "Bravo",
        "bundle_id": "com.example.bravo",
        "store_id": "com.example.bravo",
        "platform": "android"
      }
    }
  ],
  "links": {
    "self": "https://api.tenjin.com/v2/reports/skan_apple?start_date=2026-08-29&end_date=2026-08-31&group_by=app&granularity=daily"
  },
  "meta": {
    "count": 6,
    "per_page": 100,
    "start_date": "2026-08-29",
    "end_date": "2026-08-31",
    "granularity": "daily",
    "metrics": [
      "conversion_value_count",
      "conversion_value_avg"
    ],
    "organization_id": "bba76c3d-1bea-4a4c-9bcc-d7f373981911",
    "app_ids": [],
    "ad_network_ids": [],
    "group_by": "app_id"
  }
}
```

**Example: Group by app,conversion_value**

```json
{
  "data": [
    {
      "id": "2026-08-29.2195dd46-3658-44f9-8dce-15bfb1a65ffc.10",
      "type": "sk_ad_network_report",
      "attributes": {
        "date": "2026-08-29",
        "app_id": "2195dd46-3658-44f9-8dce-15bfb1a65ffc",
        "conversion_value": 10,
        "conversion_value_count": 5,
        "conversion_value_total": 50,
        "conversion_value_avg": 10,
        "redownload_count": 1,
        "redownload_cv_total": 10,
        "redownload_cv_avg": 10,
        "first_download_count": 4,
        "first_download_cv_total": 40,
        "first_download_cv_avg": 10,
        "assists": 2,
        "redownload_assists": 0,
        "first_download_assists": 2,
        "app_name": "Alpha",
        "bundle_id": "com.example.alpha",
        "store_id": "2000000001",
        "platform": "ios"
      }
    },
    {
      "id": "2026-08-29.2195dd46-3658-44f9-8dce-15bfb1a65ffc.20",
      "type": "sk_ad_network_report",
      "attributes": {
        "date": "2026-08-29",
        "app_id": "2195dd46-3658-44f9-8dce-15bfb1a65ffc",
        "conversion_value": 20,
        "conversion_value_count": 3,
        "conversion_value_total": 60,
        "conversion_value_avg": 20,
        "redownload_count": 0,
        "redownload_cv_total": 0,
        "redownload_cv_avg": null,
        "first_download_count": 3,
        "first_download_cv_total": 60,
        "first_download_cv_avg": 20,
        "assists": 1,
        "redownload_assists": 1,
        "first_download_assists": 0,
        "app_name": "Alpha",
        "bundle_id": "com.example.alpha",
        "store_id": "2000000001",
        "platform": "ios"
      }
    }
  ],
  "links": {
    "self": "https://api.tenjin.com/v2/reports/skan_apple?start_date=2026-08-29&end_date=2026-08-31&group_by=app%2Cconversion_value&metrics=conversion_value_count%2Cconversion_value_total%2Cconversion_value_avg%2Credownload_count%2Credownload_cv_total%2Credownload_cv_avg%2Cfirst_download_count%2Cfirst_download_cv_total%2Cfirst_download_cv_avg%2Cassists%2Credownload_assists%2Cfirst_download_assists&per_page=5",
    "last": "https://api.tenjin.com/v2/reports/skan_apple?end_date=2026-08-31&group_by=app%2Cconversion_value&metrics=conversion_value_count%2Cconversion_value_total%2Cconversion_value_avg%2Credownload_count%2Credownload_cv_total%2Credownload_cv_avg%2Cfirst_download_count%2Cfirst_download_cv_total%2Cfirst_download_cv_avg%2Cassists%2Credownload_assists%2Cfirst_download_assists&page=2&per_page=5&start_date=2026-08-29",
    "next": "https://api.tenjin.com/v2/reports/skan_apple?end_date=2026-08-31&group_by=app%2Cconversion_value&metrics=conversion_value_count%2Cconversion_value_total%2Cconversion_value_avg%2Credownload_count%2Credownload_cv_total%2Credownload_cv_avg%2Cfirst_download_count%2Cfirst_download_cv_total%2Cfirst_download_cv_avg%2Cassists%2Credownload_assists%2Cfirst_download_assists&page=2&per_page=5&start_date=2026-08-29"
  },
  "meta": {
    "count": 10,
    "per_page": 5,
    "start_date": "2026-08-29",
    "end_date": "2026-08-31",
    "granularity": "daily",
    "metrics": [
      "conversion_value_count",
      "conversion_value_total",
      "conversion_value_avg",
      "redownload_count",
      "redownload_cv_total",
      "redownload_cv_avg",
      "first_download_count",
      "first_download_cv_total",
      "first_download_cv_avg",
      "assists",
      "redownload_assists",
      "first_download_assists"
    ],
    "organization_id": "1304a5f4-7fbb-4ff9-ba03-e6d9649f9630",
    "app_ids": [],
    "ad_network_ids": [],
    "group_by": [
      "app_id",
      "conversion_value"
    ]
  }
}
```

### 400, 401, 403, 498

- `400` A param is missing or invalid, a record is not found, or the request cannot be served
- `401` Missing or invalid credentials, or no access to the requested data
- `403` Invalid token, or the user's role does not allow the request
- `498` Expired token, or a token with an invalid signature

**Content type:** `application/json`

schema: `Error`

- **`error` (required)**: `string`

  What went wrong

**Example:**

```json
{
  "error": ""
}
```

### 429 More than 100 report requests in a minute with one access token

**Headers:**

- **`X-Retry-After`**

  Length of the rate limit period, in seconds

  `integer`

**Content type:** `application/json`

*Schema `Error` is shown above.*

**Example:**

```json
{
  "error": ""
}
```

## Schemas

- `SkanReportDocument` — shown above.
- `Error` — shown above.
- `Links` — shown above.
- `SkanReportMeta` — shown above.
- `SkanReportResource` — shown above.

### SkanReportDimension

**Type:** `string`, possible values: `"app_id", "ad_network_id", "conversion_value", "fidelity_type", "sk_ad_network_id", "sk_campaign_id", "sk_source_app_id", "campaign_id"`
