---
title: "Customer"
permalink: "/docs/api-v2/customer"
description: "Open API Reference Docs for the API"
original_source: "openapi-spec/api-v2.yaml"
---

> **AI agents:** This is the Markdown version of a RevenueCat documentation page. For the complete documentation index, see [llms.txt](https://www.revenuecat.com/docs/llms.txt).


# Developer API (2.0.0)

Download OpenAPI specification:[Download](https://www.revenuecat.com/docs/redocusaurus/openapi-v2-customer.yaml)

## <a id="tag/Customer"></a>Customer

Part of the [REST API v2 Reference](/docs/api-v2). More Customer endpoints: [Customer Resources](/docs/api-v2/customer/resources).

Operations about customers.

#### Endpoints

-   [List or search customers](#tag/Customer/operation/list-customers) — `GET /projects/{project_id}/customers`
-   [Create a customer](#tag/Customer/operation/create-customer) — `POST /projects/{project_id}/customers`
-   [Delete a customer](#tag/Customer/operation/delete-customer) — `DELETE /projects/{project_id}/customers/{customer_id}`
-   [Get a customer](#tag/Customer/operation/get-customer) — `GET /projects/{project_id}/customers/{customer_id}`
-   [Assign or clear an offering override for a customer](#tag/Customer/operation/assign-customer-offering) — `POST /projects/{project_id}/customers/{customer_id}/actions/assign_offering`
-   [Grant an entitlement to a customer](#tag/Customer/operation/grant-customer-entitlement) — `POST /projects/{project_id}/customers/{customer_id}/actions/grant_entitlement`
-   [Restore a Google Play purchase by order ID](#tag/Customer/operation/restore-purchase-by-order-id) — `POST /projects/{project_id}/customers/{customer_id}/actions/restore_purchase_by_order_id`
-   [Revoke a granted entitlement from a customer](#tag/Customer/operation/revoke-customer-granted-entitlement) — `POST /projects/{project_id}/customers/{customer_id}/actions/revoke_granted_entitlement`
-   [Transfer customer's subscriptions and one-time purchases to another customer](#tag/Customer/operation/transfer-customer-data) — `POST /projects/{project_id}/customers/{customer_id}/actions/transfer`
-   [Get a list of the customer's aliases](#tag/Customer/operation/list-customer-aliases) — `GET /projects/{project_id}/customers/{customer_id}/aliases`
-   [Get a list of the customer's attributes](#tag/Customer/operation/list-customer-attributes) — `GET /projects/{project_id}/customers/{customer_id}/attributes`
-   [Set a customer's attributes](#tag/Customer/operation/set-customer-attributes) — `POST /projects/{project_id}/customers/{customer_id}/attributes`

## <a id="tag/Customer/operation/list-customers"></a>List or search customers

get/projects/{project_id}/customers

https://api.revenuecat.com/v2/projects/{project_id}/customers

This endpoint requires the following permission(s): `customer_information:customers:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

##### query Parameters

- `starting_after`: string Example: starting_after=ent12354 — Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page.
- `limit`: integer Default: 20 Example: limit=10 — Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected.
- `search`: string [ 1 .. 255 ] characters Example: search=example@example.com — Search term used to find matching customers within the project. The term is matched against, in order: the $email attribute (exact match), the customer's app user IDs, store transaction identifiers (Apple, Google Play and Amazon), and Apple order IDs. Email searches are paginated; all other identifier searches return a single page of matches.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "customer",
      "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
      "project_id": "proj1ab2c3d4",
      "first_seen_at": 1658399423658,
      "last_seen_at": 1658399423658,
      "last_seen_app_version": "1.0.0",
      "last_seen_country": "US",
      "last_seen_platform": "android",
      "last_seen_platform_version": "35",
      "active_entitlements": {
        "object": "list",
        "items": [
          {
            "object": "customer.active_entitlement",
            "entitlement_id": "entla1b2c3d4e5",
            "expires_at": 1658399423658
          }
        ],
        "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
        "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
      },
      "experiment": {
        "object": "experiment_enrollment",
        "id": "string",
        "name": "string",
        "variant": "a"
      },
      "attributes": {
        "object": "list",
        "items": [
          {
            "object": "customer.attribute",
            "name": "$email",
            "value": "garfield@revenuecat.com",
            "updated_at": 1658399423658
          }
        ],
        "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
        "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
      }
    }
  ],
  "next_page": "/v2/projects/projec1a2b3c4d/customers?starting_after=223xx1100",
  "url": "/v2/projects/projec1a2b3c4d/customers"
}
```

## <a id="tag/Customer/operation/create-customer"></a>Create a customer

post/projects/{project_id}/customers

https://api.revenuecat.com/v2/projects/{project_id}/customers

This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

##### Request Body schema: application/json

required

- `id` (required): string [ 1 .. 1500 ] characters ^[0-9a-zA-Z\_-]\*$ — The ID of the customer
- `attributes`: Array of objects <= 50 characters
  - `name` (required): CustomerAttributeReservedName (string) or CustomerAttributeCustomName (string) [ 1 .. 40 ] characters — The name of the attribute
  - `value` (required): string <= 500 characters — The value of the attribute

### Responses

**201**

Success. The customer was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

 

```json
{
  "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
  "attributes": [
    {
      "name": "$email",
      "value": "cat@revenuecat.com"
    }
  ]
}
```

### Response samples

Content type

application/json

 

```json
{
  "object": "customer",
  "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
  "project_id": "proj1ab2c3d4",
  "first_seen_at": 1658399423658,
  "last_seen_at": 1658399423658,
  "last_seen_app_version": "1.0.0",
  "last_seen_country": "US",
  "last_seen_platform": "android",
  "last_seen_platform_version": "35",
  "active_entitlements": {
    "object": "list",
    "items": [
      {
        "object": "customer.active_entitlement",
        "entitlement_id": "entla1b2c3d4e5",
        "expires_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
  },
  "experiment": {
    "object": "experiment_enrollment",
    "id": "string",
    "name": "string",
    "variant": "a"
  },
  "attributes": {
    "object": "list",
    "items": [
      {
        "object": "customer.attribute",
        "name": "$email",
        "value": "garfield@revenuecat.com",
        "updated_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
  }
}
```

## <a id="tag/Customer/operation/delete-customer"></a>Delete a customer

delete/projects/{project_id}/customers/{customer_id}

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}

This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

### Responses

**200**

The customer deletion was queued and will be processed asynchronously.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

```json
{
  "object": "customer",
  "id": "b5b7bfd2-66fb-4091-af50-7c3cdccfdf24",
  "deleted_at": 1658399423658
}
```

## <a id="tag/Customer/operation/get-customer"></a>Get a customer

get/projects/{project_id}/customers/{customer_id}

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}

This endpoint requires the following permission(s): `customer_information:customers:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### query Parameters

- `expand`: Array of strings[ items [ 1 .. 5000 ] characters ] Items Value: "attributes" Example: expand=attributes — Specifies which fields in the response should be expanded. Accepted values are: `attributes` (requires `customer_information:customers:read` permission).

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "customer",
  "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
  "project_id": "proj1ab2c3d4",
  "first_seen_at": 1658399423658,
  "last_seen_at": 1658399423658,
  "last_seen_app_version": "1.0.0",
  "last_seen_country": "US",
  "last_seen_platform": "android",
  "last_seen_platform_version": "35",
  "active_entitlements": {
    "object": "list",
    "items": [
      {
        "object": "customer.active_entitlement",
        "entitlement_id": "entla1b2c3d4e5",
        "expires_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
  },
  "experiment": {
    "object": "experiment_enrollment",
    "id": "string",
    "name": "string",
    "variant": "a"
  },
  "attributes": {
    "object": "list",
    "items": [
      {
        "object": "customer.attribute",
        "name": "$email",
        "value": "garfield@revenuecat.com",
        "updated_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
  }
}
```

## <a id="tag/Customer/operation/assign-customer-offering"></a>Assign or clear an offering override for a customer

post/projects/{project_id}/customers/{customer_id}/actions/assign_offering

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/actions/assign_offering

This endpoint requires the following permission(s): `project_configuration:offerings:read`, `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### Request Body schema: application/json

required

- `offering_id` (required): string or null [ 1 .. 255 ] characters — The ID of the offering to assign to the customer. Set to null to clear any existing override.

### Responses

**200**

Offering assigned successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

```json
{
  "offering_id": "offrng1b2c3d4e5"
}
```

### Response samples

Content type

application/json

Example

parameter_errorinvalid_requestparameter_error

```json
{
  "object": "error",
  "type": "parameter_error",
  "param": "customer_id",
  "message": "id is too long",
  "retryable": false,
  "doc_url": "https://errors.rev.cat/parameter-error"
}
```

## <a id="tag/Customer/operation/grant-customer-entitlement"></a>Grant an entitlement to a customer

post/projects/{project_id}/customers/{customer_id}/actions/grant_entitlement

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/actions/grant_entitlement

Grants a promotional entitlement until `expires_at`, and creates a promotional subscription, but only if `expires_at` is at least two hours away from any existing promotional grant for the same entitlement.

To extend access, call again with a new `expires_at` that is at least two hours later than the existing grant. To shorten access, revoke the existing grant, then grant again with the desired `expires_at`. For store billing-period extensions, use `/subscriptions/{subscription_id}/actions/extend` (Apple, Google Play, and Web Billing only). This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### Request Body schema: application/json

required

- `entitlement_id` (required): string [ 1 .. 255 ] characters — The ID of the entitlement to grant to the customer.
- `expires_at` (required): integer `int64` — Expiry in milliseconds since epoch (must be in the future). If another promotional grant for this entitlement already has an expiry within two hours of this value, the request is ignored as a duplicate.

### Responses

**201**

Entitlement granted successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

```json
{
  "entitlement_id": "entla1b2c3d4e5",
  "expires_at": 1658399423658
}
```

### Response samples

Content type

application/json

 

```json
{
  "object": "customer",
  "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
  "project_id": "proj1ab2c3d4",
  "first_seen_at": 1658399423658,
  "last_seen_at": 1658399423658,
  "last_seen_app_version": "1.0.0",
  "last_seen_country": "US",
  "last_seen_platform": "android",
  "last_seen_platform_version": "35",
  "active_entitlements": {
    "object": "list",
    "items": [
      {
        "object": "customer.active_entitlement",
        "entitlement_id": "entla1b2c3d4e5",
        "expires_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
  },
  "experiment": {
    "object": "experiment_enrollment",
    "id": "string",
    "name": "string",
    "variant": "a"
  },
  "attributes": {
    "object": "list",
    "items": [
      {
        "object": "customer.attribute",
        "name": "$email",
        "value": "garfield@revenuecat.com",
        "updated_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
  }
}
```

## <a id="tag/Customer/operation/restore-purchase-by-order-id"></a>Restore a Google Play purchase by order ID

post/projects/{project_id}/customers/{customer_id}/actions/restore_purchase_by_order_id

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/actions/restore_purchase_by_order_id

Restores a Google Play purchase to the specified customer using a Google Play order ID. This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### Request Body schema: application/json

required

- `order_id` (required): string non-empty — The Google Play order ID to restore.

### Responses

**200**

Purchase restored successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

```json
{
  "order_id": "GPA.1234-5678-9012-34567"
}
```

### Response samples

Content type

application/json

 

```json
{
  "object": "customer",
  "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
  "project_id": "proj1ab2c3d4",
  "first_seen_at": 1658399423658,
  "last_seen_at": 1658399423658,
  "last_seen_app_version": "1.0.0",
  "last_seen_country": "US",
  "last_seen_platform": "android",
  "last_seen_platform_version": "35",
  "active_entitlements": {
    "object": "list",
    "items": [
      {
        "object": "customer.active_entitlement",
        "entitlement_id": "entla1b2c3d4e5",
        "expires_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
  },
  "experiment": {
    "object": "experiment_enrollment",
    "id": "string",
    "name": "string",
    "variant": "a"
  },
  "attributes": {
    "object": "list",
    "items": [
      {
        "object": "customer.attribute",
        "name": "$email",
        "value": "garfield@revenuecat.com",
        "updated_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
  }
}
```

## <a id="tag/Customer/operation/revoke-customer-granted-entitlement"></a>Revoke a granted entitlement from a customer

post/projects/{project_id}/customers/{customer_id}/actions/revoke_granted_entitlement

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/actions/revoke_granted_entitlement

Revokes all active promotional grants of this entitlement. Associated promotional subscriptions are expired and access ends immediately. This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### Request Body schema: application/json

required

- `entitlement_id` (required): string [ 1 .. 255 ] characters — The ID of the granted entitlement to revoke from the customer.

### Responses

**200**

Entitlement revoked successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

```json
{
  "entitlement_id": "entla1b2c3d4e5"
}
```

### Response samples

Content type

application/json

 

```json
{
  "object": "customer",
  "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
  "project_id": "proj1ab2c3d4",
  "first_seen_at": 1658399423658,
  "last_seen_at": 1658399423658,
  "last_seen_app_version": "1.0.0",
  "last_seen_country": "US",
  "last_seen_platform": "android",
  "last_seen_platform_version": "35",
  "active_entitlements": {
    "object": "list",
    "items": [
      {
        "object": "customer.active_entitlement",
        "entitlement_id": "entla1b2c3d4e5",
        "expires_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
  },
  "experiment": {
    "object": "experiment_enrollment",
    "id": "string",
    "name": "string",
    "variant": "a"
  },
  "attributes": {
    "object": "list",
    "items": [
      {
        "object": "customer.attribute",
        "name": "$email",
        "value": "garfield@revenuecat.com",
        "updated_at": 1658399423658
      }
    ],
    "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
    "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
  }
}
```

## <a id="tag/Customer/operation/transfer-customer-data"></a>Transfer customer's subscriptions and one-time purchases to another customer

post/projects/{project_id}/customers/{customer_id}/actions/transfer

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/actions/transfer

This endpoint requires the following permission(s): `customer_information:customers:read_write`, `customer_information:subscriptions:read_write`, `customer_information:purchases:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### Request Body schema: application/json

required

- `target_customer_id` (required): string — The ID of the customer to whom the subscriptions and one-time purchases will be transferred.
- `app_ids`: Array of strings or null[ items [ 1 .. 255 ] characters ] — Optional. The IDs of the apps to filter the transfer by. When specified, only purchases and subscriptions associated with these apps will be transferred.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

 

```json
{
  "target_customer_id": "string",
  "app_ids": [
    "appa2b3c4d5e"
  ]
}
```

### Response samples

Content type

application/json

 

```json
{
  "source_customer": {
    "object": "customer",
    "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
    "project_id": "proj1ab2c3d4",
    "first_seen_at": 1658399423658,
    "last_seen_at": 1658399423658,
    "last_seen_app_version": "1.0.0",
    "last_seen_country": "US",
    "last_seen_platform": "android",
    "last_seen_platform_version": "35",
    "active_entitlements": {
      "object": "list",
      "items": [
        {
          "object": "customer.active_entitlement",
          "entitlement_id": "entla1b2c3d4e5",
          "expires_at": 1658399423658
        }
      ],
      "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
      "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
    },
    "experiment": {
      "object": "experiment_enrollment",
      "id": "string",
      "name": "string",
      "variant": "a"
    },
    "attributes": {
      "object": "list",
      "items": [
        {
          "object": "customer.attribute",
          "name": "$email",
          "value": "garfield@revenuecat.com",
          "updated_at": 1658399423658
        }
      ],
      "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
      "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
    }
  },
  "target_customer": {
    "object": "customer",
    "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
    "project_id": "proj1ab2c3d4",
    "first_seen_at": 1658399423658,
    "last_seen_at": 1658399423658,
    "last_seen_app_version": "1.0.0",
    "last_seen_country": "US",
    "last_seen_platform": "android",
    "last_seen_platform_version": "35",
    "active_entitlements": {
      "object": "list",
      "items": [
        {
          "object": "customer.active_entitlement",
          "entitlement_id": "entla1b2c3d4e5",
          "expires_at": 1658399423658
        }
      ],
      "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",
      "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"
    },
    "experiment": {
      "object": "experiment_enrollment",
      "id": "string",
      "name": "string",
      "variant": "a"
    },
    "attributes": {
      "object": "list",
      "items": [
        {
          "object": "customer.attribute",
          "name": "$email",
          "value": "garfield@revenuecat.com",
          "updated_at": 1658399423658
        }
      ],
      "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
      "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
    }
  }
}
```

## <a id="tag/Customer/operation/list-customer-aliases"></a>Get a list of the customer's aliases

get/projects/{project_id}/customers/{customer_id}/aliases

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/aliases

This endpoint requires the following permission(s): `customer_information:customers:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### query Parameters

- `starting_after`: string Example: starting_after=ent12354 — Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page.
- `limit`: integer Default: 20 Example: limit=10 — Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "customer.alias",
      "id": "19b8de26-77c1-49f1-aa18-019a391603e2",
      "created_at": 1658399423658
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/aliases?starting_after=9fjeja8fjed",
  "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/aliases"
}
```

## <a id="tag/Customer/operation/list-customer-attributes"></a>Get a list of the customer's attributes

get/projects/{project_id}/customers/{customer_id}/attributes

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/attributes

This endpoint requires the following permission(s): `customer_information:customers:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### query Parameters

- `starting_after`: string Example: starting_after=ent12354 — Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page.
- `limit`: integer Default: 20 Example: limit=10 — Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "customer.attribute",
      "name": "$email",
      "value": "garfield@revenuecat.com",
      "updated_at": 1658399423658
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
  "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
}
```

## <a id="tag/Customer/operation/set-customer-attributes"></a>Set a customer's attributes

post/projects/{project_id}/customers/{customer_id}/attributes

https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/attributes

This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `customer_id` (required): string [ 1 .. 1500 ] characters Example: 19b8de26-77c1-49f1-aa18-019a391603e2 — ID of the customer

##### Request Body schema: application/json

required

- `attributes` (required): Array of objects [ 1 .. 50 ] items
  - `name` (required): CustomerAttributeReservedName (string) or CustomerAttributeCustomName (string) [ 1 .. 40 ] characters — The name of the attribute
  - `value` (required): string or null <= 500 characters — The value of the attribute. Use null to delete the attribute.

### Responses

**200**

Success. The customer attributes were set

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

 

```json
{
  "attributes": [
    {
      "name": "$email",
      "value": "support@revenuecat.com"
    },
    {
      "name": "$displayName",
      "value": "John Appleseed"
    },
    {
      "name": "my_custom_attr",
      "value": "custom value"
    }
  ]
}
```

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "customer.attribute",
      "name": "$email",
      "value": "garfield@revenuecat.com",
      "updated_at": 1658399423658
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",
  "url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"
}
```

## <a id="tag/Endpoint-Reference"></a>Endpoint Reference

All API v2 resources, one page each. General concepts (authentication, pagination, rate limits, error handling) live on the [API v2 overview](/docs/api-v2).

-   [App](/docs/api-v2/app) — 7 endpoints
-   [Audience](/docs/api-v2/audience) — 6 endpoints
-   [Audit Log](/docs/api-v2/audit-log) — 1 endpoint
-   [Charts & Metrics](/docs/api-v2/charts-and-metrics) — 4 endpoints
-   [Collaborator](/docs/api-v2/collaborator) — 1 endpoint
-   [Customer](/docs/api-v2/customer) — 12 endpoints
-   [Customer Resources](/docs/api-v2/customer/resources) — 5 endpoints
-   [Discount](/docs/api-v2/discount) — 10 endpoints
-   [Entitlement](/docs/api-v2/entitlement) — 10 endpoints
-   [IAM](/docs/api-v2/iam) — 1 endpoint
-   [Integration](/docs/api-v2/integration) — 5 endpoints
-   [Invoice](/docs/api-v2/invoice) — 2 endpoints
-   [Offering](/docs/api-v2/offering) — 7 endpoints
-   [Package](/docs/api-v2/package) — 8 endpoints
-   [Paywall](/docs/api-v2/paywall) — 5 endpoints
-   [Paywall Fonts & Media](/docs/api-v2/paywall/assets) — 4 endpoints
-   [Paywall Publishing](/docs/api-v2/paywall/publishing) — 7 endpoints
-   [Product](/docs/api-v2/product) — 8 endpoints
-   [Project](/docs/api-v2/project) — 2 endpoints
-   [Purchase](/docs/api-v2/purchase) — 4 endpoints
-   [Subscription](/docs/api-v2/subscription) — 7 endpoints
-   [Subscription Data Model](/docs/api-v2/subscription-data-model) — full schema reference
-   [Subscription Transactions](/docs/api-v2/subscription-transactions) — 2 endpoints
-   [Virtual Currency](/docs/api-v2/virtual-currency) — 10 endpoints

## Response schema reference

Response examples above mirror the rendered API reference. These field definitions come from the same OpenAPI specification.

### ListCustomers

- Used by `GET /projects/{project_id}/customers (200) — List or search customers`

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of Customer — Details about each object.
  - `object` (required): string — one of `customer`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 0–1500
  - `project_id` (required): string — length 1–20; ID of the project to which the customer belongs
  - `first_seen_at` (required): integer (format: `int64`) — The earliest date we have for this customer, whichever comes first: when the SDK first saw them, their first purchase, the App Store install date, or when the record was created. Matches the 'First seen or purchased' date shown in the dashboard.
  - `last_seen_at` (required): integer or null (format: `int64`) — The last time the customer was seen
  - `last_seen_app_version` (required): string or null — The last app version the customer was seen on
  - `last_seen_country` (required): string or null — The last country the customer was seen in
  - `last_seen_platform` (required): string or null — The last platform the customer was seen on
  - `last_seen_platform_version` (required): string or null — The last platform version the customer was seen on
  - `active_entitlements`: ListCustomerActiveEntitlements or null — List of the entitlements currently active for the customer. This property is only available in the "Get a customer" endpoint.
    - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
    - `items` (required): array of CustomerEntitlement — Details about each object.
    - `next_page` (required): string or null — URL to access the next page of the customer's active entitlements. If not present / null, there is no next page
    - `url` (required): string — length 0–5000; The URL where this list can be accessed.
  - `experiment`: ExperimentEnrollment or null
    - `object` (required): string — one of `experiment_enrollment`; String representing the object's type. Objects of the same type share the same value.
    - `id` (required): string — length 0–1500
    - `name` (required): string — length 0–1500
    - `variant` (required): string — length 1–1; The variant of the Experiment that the Customer was or is assigned to, where 'a' represents the Control, and 'b' represents the Treatment.
  - `attributes`: ListCustomerAttributes or null — List of the attributes of the customer. This is an expandable property, only available in the "Get a customer" endpoint.
    - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
    - `items` (required): array of CustomerAttribute — Details about each object.
    - `next_page` (required): string or null — URL to access the next page of the customer's aliases. If not present / null, there is no next page
    - `url` (required): string — length 0–5000; The URL where this list can be accessed.
- `next_page` (required): string or null — URL to access the next page of the project's customers. If not present / null, there is no next page
- `url` (required): string — length 0–5000; The URL where this list can be accessed.

### Customer

- Used by `POST /projects/{project_id}/customers (201) — Create a customer`
- Used by `GET /projects/{project_id}/customers/{customer_id} (200) — Get a customer`
- Used by `POST /projects/{project_id}/customers/{customer_id}/actions/grant_entitlement (201) — Grant an entitlement to a customer`
- Used by `POST /projects/{project_id}/customers/{customer_id}/actions/restore_purchase_by_order_id (200) — Restore a Google Play purchase by order ID`
- Used by `POST /projects/{project_id}/customers/{customer_id}/actions/revoke_granted_entitlement (200) — Revoke a granted entitlement from a customer`

- `object` (required): string — one of `customer`; String representing the object's type. Objects of the same type share the same value.
- `id` (required): string — length 0–1500
- `project_id` (required): string — length 1–20; ID of the project to which the customer belongs
- `first_seen_at` (required): integer (format: `int64`) — The earliest date we have for this customer, whichever comes first: when the SDK first saw them, their first purchase, the App Store install date, or when the record was created. Matches the 'First seen or purchased' date shown in the dashboard.
- `last_seen_at` (required): integer or null (format: `int64`) — The last time the customer was seen
- `last_seen_app_version` (required): string or null — The last app version the customer was seen on
- `last_seen_country` (required): string or null — The last country the customer was seen in
- `last_seen_platform` (required): string or null — The last platform the customer was seen on
- `last_seen_platform_version` (required): string or null — The last platform version the customer was seen on
- `active_entitlements`: ListCustomerActiveEntitlements or null — List of the entitlements currently active for the customer. This property is only available in the "Get a customer" endpoint.
  - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
  - `items` (required): array of CustomerEntitlement — Details about each object.
    - `object` (required): string — one of `customer.active_entitlement`; String representing the object's type. Objects of the same type share the same value.
    - `entitlement_id` (required): string — length 1–255; ID of the entitlement granted to the customer
    - `expires_at` (required): integer or null (format: `int64`) — The date after which the access to the entitlement expires in ms since epoch
  - `next_page` (required): string or null — URL to access the next page of the customer's active entitlements. If not present / null, there is no next page
  - `url` (required): string — length 0–5000; The URL where this list can be accessed.
- `experiment`: ExperimentEnrollment or null
  - `object` (required): string — one of `experiment_enrollment`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 0–1500
  - `name` (required): string — length 0–1500
  - `variant` (required): string — length 1–1; The variant of the Experiment that the Customer was or is assigned to, where 'a' represents the Control, and 'b' represents the Treatment.
- `attributes`: ListCustomerAttributes or null — List of the attributes of the customer. This is an expandable property, only available in the "Get a customer" endpoint.
  - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
  - `items` (required): array of CustomerAttribute — Details about each object.
    - `object` (required): string — one of `customer.attribute`; String representing the object's type. Objects of the same type share the same value.
    - `name` (required): string — length 0–1500; The name of the attribute. Reserved attributes are prefixed with a `$`.
    - `value` (required): string or null — The value of the attribute.
    - `updated_at` (required): integer (format: `int64`) — The time when the attribute was last updated.
  - `next_page` (required): string or null — URL to access the next page of the customer's aliases. If not present / null, there is no next page
  - `url` (required): string — length 0–5000; The URL where this list can be accessed.

### DeletedObject

- Used by `DELETE /projects/{project_id}/customers/{customer_id} (200) — Delete a customer`

- `object` (required): string — one of `app`, `chart_annotation`, `customer`, `discount`, `discount_code`, `entitlement`, `experiment`, `offering`, `package`, `paywall`, `product`, `targeting_rule`, `virtual_currency`, `webhook_integration`; The type of the deleted object
- `id` (required): string — The ID of the deleted object
- `deleted_at` (required): integer (format: `int64`) — The date when the object was deleted in ms since epoch

### Transfer

- Used by `POST /projects/{project_id}/customers/{customer_id}/actions/transfer (200) — Transfer customer's subscriptions and one-time purchases to another customer`

- `source_customer` (required): Customer
  - `object` (required): string — one of `customer`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 0–1500
  - `project_id` (required): string — length 1–20; ID of the project to which the customer belongs
  - `first_seen_at` (required): integer (format: `int64`) — The earliest date we have for this customer, whichever comes first: when the SDK first saw them, their first purchase, the App Store install date, or when the record was created. Matches the 'First seen or purchased' date shown in the dashboard.
  - `last_seen_at` (required): integer or null (format: `int64`) — The last time the customer was seen
  - `last_seen_app_version` (required): string or null — The last app version the customer was seen on
  - `last_seen_country` (required): string or null — The last country the customer was seen in
  - `last_seen_platform` (required): string or null — The last platform the customer was seen on
  - `last_seen_platform_version` (required): string or null — The last platform version the customer was seen on
  - `active_entitlements`: ListCustomerActiveEntitlements or null — List of the entitlements currently active for the customer. This property is only available in the "Get a customer" endpoint.
    - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
    - `items` (required): array of CustomerEntitlement — Details about each object.
    - `next_page` (required): string or null — URL to access the next page of the customer's active entitlements. If not present / null, there is no next page
    - `url` (required): string — length 0–5000; The URL where this list can be accessed.
  - `experiment`: ExperimentEnrollment or null
    - `object` (required): string — one of `experiment_enrollment`; String representing the object's type. Objects of the same type share the same value.
    - `id` (required): string — length 0–1500
    - `name` (required): string — length 0–1500
    - `variant` (required): string — length 1–1; The variant of the Experiment that the Customer was or is assigned to, where 'a' represents the Control, and 'b' represents the Treatment.
  - `attributes`: ListCustomerAttributes or null — List of the attributes of the customer. This is an expandable property, only available in the "Get a customer" endpoint.
    - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
    - `items` (required): array of CustomerAttribute — Details about each object.
    - `next_page` (required): string or null — URL to access the next page of the customer's aliases. If not present / null, there is no next page
    - `url` (required): string — length 0–5000; The URL where this list can be accessed.
- `target_customer` (required): Customer
  - `object` (required): string — one of `customer`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 0–1500
  - `project_id` (required): string — length 1–20; ID of the project to which the customer belongs
  - `first_seen_at` (required): integer (format: `int64`) — The earliest date we have for this customer, whichever comes first: when the SDK first saw them, their first purchase, the App Store install date, or when the record was created. Matches the 'First seen or purchased' date shown in the dashboard.
  - `last_seen_at` (required): integer or null (format: `int64`) — The last time the customer was seen
  - `last_seen_app_version` (required): string or null — The last app version the customer was seen on
  - `last_seen_country` (required): string or null — The last country the customer was seen in
  - `last_seen_platform` (required): string or null — The last platform the customer was seen on
  - `last_seen_platform_version` (required): string or null — The last platform version the customer was seen on
  - `active_entitlements`: ListCustomerActiveEntitlements or null — List of the entitlements currently active for the customer. This property is only available in the "Get a customer" endpoint.
    - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
    - `items` (required): array of CustomerEntitlement — Details about each object.
    - `next_page` (required): string or null — URL to access the next page of the customer's active entitlements. If not present / null, there is no next page
    - `url` (required): string — length 0–5000; The URL where this list can be accessed.
  - `experiment`: ExperimentEnrollment or null
    - `object` (required): string — one of `experiment_enrollment`; String representing the object's type. Objects of the same type share the same value.
    - `id` (required): string — length 0–1500
    - `name` (required): string — length 0–1500
    - `variant` (required): string — length 1–1; The variant of the Experiment that the Customer was or is assigned to, where 'a' represents the Control, and 'b' represents the Treatment.
  - `attributes`: ListCustomerAttributes or null — List of the attributes of the customer. This is an expandable property, only available in the "Get a customer" endpoint.
    - `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
    - `items` (required): array of CustomerAttribute — Details about each object.
    - `next_page` (required): string or null — URL to access the next page of the customer's aliases. If not present / null, there is no next page
    - `url` (required): string — length 0–5000; The URL where this list can be accessed.

### ListCustomerAliases

- Used by `GET /projects/{project_id}/customers/{customer_id}/aliases (200) — Get a list of the customer's aliases`

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of CustomerAlias — Details about each object.
  - `object` (required): string — one of `customer.alias`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 0–1500
  - `created_at` (required): integer (format: `int64`) — The time when the alias was created
- `next_page` (required): string or null — URL to access the next page of the customer's aliases. If not present / null, there is no next page
- `url` (required): string — length 0–5000; The URL where this list can be accessed.

### ListCustomerAttributes

- Used by `GET /projects/{project_id}/customers/{customer_id}/attributes (200) — Get a list of the customer's attributes`
- Used by `POST /projects/{project_id}/customers/{customer_id}/attributes (200) — Set a customer's attributes`

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of CustomerAttribute — Details about each object.
  - `object` (required): string — one of `customer.attribute`; String representing the object's type. Objects of the same type share the same value.
  - `name` (required): string — length 0–1500; The name of the attribute. Reserved attributes are prefixed with a `$`.
  - `value` (required): string or null — The value of the attribute.
  - `updated_at` (required): integer (format: `int64`) — The time when the attribute was last updated.
- `next_page` (required): string or null — URL to access the next page of the customer's aliases. If not present / null, there is no next page
- `url` (required): string — length 0–5000; The URL where this list can be accessed.
