# Transactions


Read-only catalogs of the affinity purchase data. They back two things: the
`AffinityTransactions` dataset on
[Create Audience](/api/v2/audiences#post-apiv2analysesaudiencescreate), and the
target values a [cross purchase analysis](/api/v2/audiences#crosspurchase) is
scoped to.

The purchase taxonomy cascades: pick categories, use them to read
sub-categories, and both to read brands:

```
categories -> subcategories (?categories[]) -> brands (?categories[], ?subcategories[])
```

Four flat demographic dictionaries - incomes, ages, genders and ethnicities -
sit alongside the taxonomy and take no cascade parameters.

Every read here is authenticated and JSON-only (bearer token + `Accept:
application/json`) and uses the read rate bucket (120 requests/min per caller).

## Get Affinity Categories {#get-apiv2analysesreferenceaffinity-transactionscategories}

`GET /api/v2/analyses/reference/affinity-transactions/categories`

The affinity purchase categories. Flat list of `{ value, text }` pairs where
`value` is the category id an `AffinityTransactions` dataset's `categories` and
the create body's `crosspurchase.target_categories` take.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `search` | string | No | Optional free-text filter on the category name (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/categories" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/categories",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
  )
  categories = res.json()["data"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/categories",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const categories = (await res.json()).data;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/categories');
  $categories = $res->json('data');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": [
    { "value": 1, "text": "Dining" },
    { "value": 2, "text": "Retail" }
  ]
}
```

## Get Affinity Subcategories {#get-apiv2analysesreferenceaffinity-transactionssubcategories}

`GET /api/v2/analyses/reference/affinity-transactions/subcategories`

The affinity purchase sub-categories (merchant category descriptions),
optionally cascading from the selected category ids. `value` and `text` are
both the literal sub-category string an `AffinityTransactions` dataset's
`subcategories` and the create body's `crosspurchase.target_subcategories`
take. Paginated.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `categories` | integer[] | No | Affinity category ids to cascade the sub-categories from (e.g. `[1, 2]`). |
| `page` | integer | No | Page number (standard pagination). |
| `per_page` | integer | No | Items per page, capped at 500. |
| `search` | string | No | Optional free-text filter on the sub-category (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/subcategories?categories[]=1" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/subcategories",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
      params={"categories[]": 1},
  )
  subcategories = res.json()["data"]["items"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/subcategories?categories[]=1",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const subcategories = (await res.json()).data.items;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/subcategories', ['categories' => [1]]);
  $subcategories = $res->json('data.items');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": {
    "items": [
      { "value": "Eating Places, Restaurants", "text": "Eating Places, Restaurants" }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 500,
      "total": 1,
      "last_page": 1
    }
  }
}
```

## Get Affinity Brands {#get-apiv2analysesreferenceaffinity-transactionsbrands}

`GET /api/v2/analyses/reference/affinity-transactions/brands`

The affinity purchase brands, optionally cascading from the selected category
ids and/or sub-categories. `value` is the brand id **string** an
`AffinityTransactions` dataset's `brands` and the create body's
`crosspurchase.target_brands` take; `text` is the brand name. Paginated.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `categories` | integer[] | No | Affinity category ids to cascade the brands from (e.g. `[1, 2]`). |
| `subcategories` | string[] | No | Sub-category strings to cascade the brands from. |
| `page` | integer | No | Page number (standard pagination). |
| `per_page` | integer | No | Items per page, capped at 500. |
| `search` | string | No | Optional free-text filter on the brand name (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/brands?categories[]=1&search=coffee" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/brands",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
      params={"categories[]": 1, "search": "coffee"},
  )
  brands = res.json()["data"]["items"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/brands?categories[]=1&search=coffee",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const brands = (await res.json()).data.items;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/brands', [
          'categories' => [1],
          'search' => 'coffee',
      ]);
  $brands = $res->json('data.items');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": {
    "items": [
      { "value": "501", "text": "Coffee Co" }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 500,
      "total": 1,
      "last_page": 1
    }
  }
}
```

## Get Affinity Incomes {#get-apiv2analysesreferenceaffinity-transactionsincomes}

`GET /api/v2/analyses/reference/affinity-transactions/incomes`

The affinity income bands. `value` and `text` are both the literal band string
an `AffinityTransactions` dataset's `incomes` takes. Paginated.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | integer | No | Page number (standard pagination). |
| `per_page` | integer | No | Items per page, capped at 500. |
| `search` | string | No | Optional free-text filter on the band (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/incomes" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/incomes",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
  )
  incomes = res.json()["data"]["items"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/incomes",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const incomes = (await res.json()).data.items;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/incomes');
  $incomes = $res->json('data.items');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": {
    "items": [
      { "value": "100k-150k", "text": "100k-150k" }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 500,
      "total": 1,
      "last_page": 1
    }
  }
}
```

## Get Affinity Ages {#get-apiv2analysesreferenceaffinity-transactionsages}

`GET /api/v2/analyses/reference/affinity-transactions/ages`

The affinity age bands. `value` and `text` are both the literal band string an
`AffinityTransactions` dataset's `ages` takes. Paginated.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | integer | No | Page number (standard pagination). |
| `per_page` | integer | No | Items per page, capped at 500. |
| `search` | string | No | Optional free-text filter on the band (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ages" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ages",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
  )
  ages = res.json()["data"]["items"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ages",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const ages = (await res.json()).data.items;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ages');
  $ages = $res->json('data.items');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": {
    "items": [
      { "value": "25-34", "text": "25-34" }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 500,
      "total": 1,
      "last_page": 1
    }
  }
}
```

## Get Affinity Genders {#get-apiv2analysesreferenceaffinity-transactionsgenders}

`GET /api/v2/analyses/reference/affinity-transactions/genders`

The affinity gender values. `value` and `text` are both the literal value an
`AffinityTransactions` dataset's `genders` takes. Paginated.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | integer | No | Page number (standard pagination). |
| `per_page` | integer | No | Items per page, capped at 500. |
| `search` | string | No | Optional free-text filter on the value (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/genders" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/genders",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
  )
  genders = res.json()["data"]["items"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/genders",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const genders = (await res.json()).data.items;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/genders');
  $genders = $res->json('data.items');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": {
    "items": [
      { "value": "F", "text": "F" },
      { "value": "M", "text": "M" }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 500,
      "total": 2,
      "last_page": 1
    }
  }
}
```

## Get Affinity Ethnicities {#get-apiv2analysesreferenceaffinity-transactionsethnicities}

`GET /api/v2/analyses/reference/affinity-transactions/ethnicities`

The affinity ethnicity values. `value` and `text` are both the literal value an
`AffinityTransactions` dataset's `ethnicities` takes. Paginated.

### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | integer | No | Page number (standard pagination). |
| `per_page` | integer | No | Items per page, capped at 500. |
| `search` | string | No | Optional free-text filter on the value (case-insensitive contains). |

{{< tabs >}}

  {{< tab name="cURL" >}}
  ```bash
  curl "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ethnicities" \
    -H "Authorization: Bearer <YOUR_TOKEN>" \
    -H "Accept: application/json"
  ```
  {{< /tab >}}

  {{< tab name="Python" >}}
  ```python
  import requests

  res = requests.get(
      "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ethnicities",
      headers={"Authorization": "Bearer <YOUR_TOKEN>", "Accept": "application/json"},
  )
  ethnicities = res.json()["data"]["items"]
  ```
  {{< /tab >}}

  {{< tab name="JavaScript" >}}
  ```javascript
  const res = await fetch(
    "https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ethnicities",
    { headers: { Authorization: "Bearer <YOUR_TOKEN>", Accept: "application/json" } }
  );
  const ethnicities = (await res.json()).data.items;
  ```
  {{< /tab >}}

  {{< tab name="PHP" >}}
  ```php
  $res = Http::withToken('<YOUR_TOKEN>')->acceptJson()
      ->get('https://console.intuizi.com/api/v2/analyses/reference/affinity-transactions/ethnicities');
  $ethnicities = $res->json('data.items');
  ```
  {{< /tab >}}

{{< /tabs >}}

### Response

```json
{
  "status": "success",
  "code": 200,
  "message": "Resources fetched successfully.",
  "data": {
    "items": [
      { "value": "Hispanic", "text": "Hispanic" }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 500,
      "total": 1,
      "last_page": 1
    }
  }
}
```
