Customer.io Track V2 API

This version of our edge API has only two endpoints, but supports the majority of our traditional v1 track operations and then some based on the `type` and `action` keys that you set in your request. You can use the `/batch` call to send multiple requests at the same time. Unlike the v1 API, you can also make requests affecting objects and deliveries. Objects are a grouping mechanism for people—like an account people belong to or an online course that they enroll in. Deliveries are events based on messages sent from Customer.io. The chart below lists the type of `action` you can perform for each `type`. Our requests below are broken out by `type`; use the `action` dropdown to see the specific payload structure for each action. | Action | Person | Object | Delivery | | :-- | :--: | :--: | :--: | | identify | ✅ | ✅ | | | delete | ✅ | ✅ | | | event | ✅ | | ✅ | | screen | ✅ | | | | page | ✅ | | | | add_relationships | ✅ | ✅ | | | delete_relationships | ✅ | ✅ | | | add_device | ✅ | | | | delete_device | ✅ | | | | merge | ✅ | | | | suppress | ✅ | | | | unsuppress | ✅ | | |

Operations 2

POST /api/v2/entity Make a single request #
POST /api/v2/batch Send multiple requests #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/customer-io-track-v2-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

customer-io-track-v2-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: 1.0.0
  title: Customer.io Track Track V2 API
  description: "# Overview\n\nOur Track API provides ways to send real-time customer data to your Customer.io workspace including customer identification and event tracking.\n\n# Use our Postman collection\n\nWe've generated a Postman collection to help you get started with our APIs.\n\nIf you fork this collection, you might want to disable the *Watch original collection* option. We automatically update our Postman collection whenever we release changes to our documentation, even if we don't change our APIs—which happens daily! Rather than being flooded with Postman notifications, you can check out our [Release Notes](/release-notes/) for updates to our APIs.\n\n**NOTE**: Postman endpoints default to our US APIs. If you're in our European (EU) region, you'll need to add `-eu` to the server variables (`track_api_url` and `app_api_url`).\n\n[<img src=\"https://run.pstmn.io/button.svg\" alt=\"Run In Postman\" style=\"width: 128px; height: 32px;\">](https://god.gw.postman.com/run-collection/23697545-0f7ae1e8-8177-46fc-808a-2fd363dd52b9?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D23697545-0f7ae1e8-8177-46fc-808a-2fd363dd52b9%26entityType%3Dcollection%26workspaceId%3Db886877f-fc09-475f-84fe-6221a98f4d18#?env%5BCustomer.io%20API%20Environment%5D=W3sia2V5IjoidHJhY2tfYXBpX3VybCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiJ0cmFjay5jdXN0b21lci5pbyIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYXBwX2FwaV91cmwiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiYXBpLmN1c3RvbWVyLmlvIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJzaXRlX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYXBpX2tleSIsInR5cGUiOiJzZWNyZXQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYmVhcmVyIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYnJvYWRjYXN0X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiaW1wb3J0X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiZW1haWxfYWRkcmVzcyIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6InN1cHByZXNzaW9uX3R5cGUiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJjb2xsZWN0aW9uX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5Ijoic25pcHBldF9uYW1lIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5Ijoid2ViaG9va19pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6InNlbmRlcl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImV4cG9ydF9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6Im1lc3NhZ2VfaWQiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJzZWdtZW50X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoibmV3c2xldHRlcl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImNvbnRlbnRfaWQiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJjYW1wYWlnbl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImFjdGlvbl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImN1c3RvbWVyX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoidHJhbnNhY3Rpb25hbF9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6InRyaWdnZXJfaWQiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJmb3JtX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiaWRlbnRpZmllciIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImRldmljZV9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImRlbGl2ZXJ5X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9XQ==)\n\n# Server addresses: US and EU\nCustomer.io hosts services in the United States (US) and European Union. Select the appropriate server address for your region.\n\n| Region | Server Address |\n| :-- | :-- |\n| US | https://track.customer.io |\n| EU | https://track-eu.customer.io |\n\nNote that if your account is in the EU region and you send traffic to our US endpoints, we'll redirect it accordingly but this traffic still passes through US servers and data could be logged in the US.\n\n# Authentication \n\nYou can find all of your API authentication information in your [Account Settings](https://fly.customer.io/settings/api_credentials). Our Tracking API uses HTTP basic authorization. The App API uses bearer authorization, and you can generate tokens supporting different scopes. Each operation in this document references the authorization header it requires.\n\n# v1 vs v2 APIs\n\nMost of the time, when we talk about *The Track API*, we're talking about the v1 API because the v2 API isn't used in any of our libraries and rarely used in libraries built by third parties; it's much more common that you'd encounter the v1 API.\n\nIf you're integrating with Customer.io using one of our libraries, or a third party customer data platform (CDP) like Segment or Rudderstack, you'll be using the v1 API.\n\nThe v2 API is newer and supports two important features that the v1 API doesn't natively support: objects and batching. But, if you're integrating directly with our API, we suggest you use the [Pipelines API](/integrations/api/cdp/). The Pipelines API supports both objects, batching, *and* all of our newest integrations and libraries are based on it.\n\n# Rate Limits\n\nThe Track API has a rate limit of 1000 requests per second for both active data integrations and historical backfill scripts. This limit applies to both our v1 and v2 APIs. \n\nWhile this rate is not strictly enforced, consistently exceeding it may lead to throttling or dropped data, especially during periods of high system load. If we detect a sustained high volume that could impact other customers, we may contact you to help adjust your integration or, in rare cases, temporarily block requests.\n\n**Rate limits are subject to change. We may adjust these thresholds to ensure stable performance for all customers.**\n\nBelow are the payload size limits for the Track API. If any of these limits are too restrictive for your needs, contact support to let us know your situation as we may be able to accommodate special circumstances. \n\n## Customer limits\n\nThese limits apply to people and their attributes, often referred to as \"customers\" in our APIs.\n\n| Data Type | Limit | Description |\n| -- | -- | -- |\n| ID | 150 bytes | Max length of a person's ID value |\n| Attribute Name | 150 bytes | Max length of each attribute name |\n| Attribute Value | 1000 bytes | Max length of attribute values |\n| Unique attributes | 300 | Max number of attributes allowed per person or Identify call |\n\n## Object and relationship limits\n\nObjects (groups) and relationships between people and objects can have their own attributes. Their limits are similar to people (customers).\n\n| Data Type | Limit | Description |\n| -- | -- | -- |\n| Object ID | 150 bytes | Max length of a object's ID |\n| Attribute Names | 150 bytes | Max length of each attribute name |\n| Attribute Values | 1000 bytes | Max length of attribute values |\n| Unique attributes | 300 | Max number of attributes allowed per object or relationship |\n| Total attribute size | 100 Kilobytes | Max size of all attributes associated with an object or relationship |\n\n## Track API Event limits\n\nThese limits apply to events that you'll send with the `/v1/track` call.\n\n| Data Type | Limit | Description |\n| -- | -- | -- |\n| Event Name | 100 bytes | Max length of each event name |\n| Event Data | 100000 bytes | Max length of each event data |\n\n\n## v2 API Limits\n\nThe v2 API has two endpoints, both of which have limits on the total size of requests. \n* `/entity` is limited to requests 32kb or smaller.\n* `/batch` is limited to requests 500kb or smaller.\n  \n  Each of the requests within a batch must also be 32kb or smaller.\n"
servers:
- url: https://track.customer.io
  description: The base URL for the Track API. Track endpoints use basic authentication with your Site ID as the user name and your secret key as the password.
- url: https://track-eu.customer.io
  description: The base URL for the Track API (EU region). Track endpoints use basic authentication with your Site ID as the user name and your secret key as the password.
tags:
- name: track_v2
  x-displayName: Track v2 API
  description: "This version of our edge API has only two endpoints, but supports the majority of our traditional v1 track operations and then some based on the `type` and `action` keys that you set in your request. \n  \nYou can use the `/batch` call to send multiple requests at the same time. Unlike the v1 API, you can also make requests affecting objects and deliveries. Objects are a grouping mechanism for people—like an account people belong to or an online course that they enroll in. Deliveries are events based on messages sent from Customer.io.\n\nThe chart below lists the type of `action` you can perform for each `type`. Our requests below are broken out by `type`; use the `action` dropdown to see the specific payload structure for each action.\n\n| Action | Person | Object | Delivery | \n| :-- | :--: | :--: | :--: |\n| identify | &#9989; | &#9989; | |\n| delete | &#9989; | &#9989; | |\n| event | &#9989; | | &#9989; |\n| screen | &#9989; | | |\n| page | &#9989; | | |\n| add_relationships | &#9989; | &#9989; | |\n| delete_relationships | &#9989; | &#9989; | |\n| add_device | &#9989; | | | \n| delete_device | &#9989; | | |\n| merge | &#9989; | | |\n| suppress | &#9989; | | |\n| unsuppress | &#9989; | | |\n"
paths:
  /api/v2/entity:
    post:
      operationId: entity
      tags:
      - track_v2
      summary: Make a single request
      description: "This endpoint lets you create, update, or delete a single person or object—including managing relationships between objects and people. \n\nAn \"object\" is any kind of non-person entity that you want to associate with one or more people—like a company, an educational course that people signed up for, a product, etc. \n\nYour request must be smaller than 32kb. \n"
      servers:
      - url: https://track.customer.io
        description: This endpoint is a part of the Track API. Track endpoints use basic authentication with your Site ID as the user name and your secret key as the password.
      security:
      - Tracking-API-Key: []
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
              - $ref: '#/components/schemas/person_operations'
              - $ref: '#/components/schemas/object_operations'
              - $ref: '#/components/schemas/delivery_operations'
      responses:
        '200':
          $ref: '#/components/responses/200'
        '400':
          description: The request was malformed or invalid.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    $ref: '#/components/schemas/errors'
        '401':
          $ref: '#/components/responses/401'
      x-codeSamples:
      - lang: json
        label: JSON
        source: "{\n  \"type\": \"person\",\n  \"identifiers\": {\n    \"id\": \"42\"\n  },\n  \"action\": \"identify\",\n  \"attributes\": {\n    \"first_name\": \"Jane\"\n  }\n}"
  /api/v2/batch:
    post:
      operationId: batch
      tags:
      - track_v2
      summary: Send multiple requests
      description: "This endpoint lets you batch requests for different people and objects in a single request. Each object in your array represents an individual \"entity\" operation—it represents a change for a person, an object, or a delivery. \n\nYou can mix types in this request; you are not limited to a batch containing only objects or only people. An \"object\" is a non-person entity that you want to associate with one or more people—like a company, an educational course that people enroll in, etc.\n\nYour batch request must be smaller than 500kb. Each of the requests within the batch must also be 32kb or smaller.\n"
      servers:
      - url: https://track.customer.io
        description: This endpoint is a part of the Track API. Track endpoints use basic authentication with your Site ID as the user name and your secret key as the password.
      security:
      - Tracking-API-Key: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              example:
                batch:
                - type: person
                  identifiers:
                    id: '42'
                  action: identify
                  attributes:
                    first_name: Jane
                    last_name: Doe
                    plan: premium
                - type: object
                  identifiers:
                    object_type_id: '1'
                    object_id: acme
                  action: identify
                  attributes:
                    name: Acme Corp
                    plan: enterprise
                    seats: 50
                - type: object
                  identifiers:
                    object_type_id: '1'
                    object_id: acme
                  action: add_relationships
                  cio_relationships:
                  - identifiers:
                      id: '42'
                    relationship_attributes:
                      role: admin
              properties:
                batch:
                  description: A batch of requests, where each object is any individual [entity payload](##tag/v2_entity/operation/entity)—modifying a single person or object.
                  type: array
                  items:
                    anyOf:
                    - title: Person
                      anyOf:
                      - $ref: '#/components/schemas/identify_person'
                      - $ref: '#/components/schemas/person_delete'
                      - $ref: '#/components/schemas/person_event'
                      - $ref: '#/components/schemas/person_screen'
                      - $ref: '#/components/schemas/person_page'
                      - $ref: '#/components/schemas/person_add_relationships'
                      - $ref: '#/components/schemas/person_delete_relationships'
                      - $ref: '#/components/schemas/person_add_device'
                      - $ref: '#/components/schemas/person_delete_device'
                      - $ref: '#/components/schemas/person_merge'
                      - $ref: '#/components/schemas/person_suppress'
                      - $ref: '#/components/schemas/person_unsuppress'
                      discriminator:
                        propertyName: action
                    - title: Object
                      anyOf:
                      - $ref: '#/components/schemas/object_identify'
                      - $ref: '#/components/schemas/object_identify_anonymous'
                      - $ref: '#/components/schemas/object_delete'
                      - $ref: '#/components/schemas/object_add_relationships'
                      - $ref: '#/components/schemas/object_delete_relationships'
                      discriminator:
                        propertyName: action
                    - $ref: '#/components/schemas/delivery_operations'
      responses:
        '200':
          $ref: '#/components/responses/200'
        '207':
          description: At least one object in the batch was invalid; all other requests are accepted. This response contains a list of errors for the invalid objects in the batch.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    description: An array of objects, where each object represents an error. The `batch_index` field for each object is the 0-indexed position of the failing object in your request.
                    items:
                      type: object
                      properties:
                        batch_index:
                          type: integer
                          description: The 0-indexed position of the failing object in your request.
                        reason:
                          type: string
                          description: The reason for the error.
                        field:
                          type: string
                          description: The field containing the error.
                        message:
                          type: string
                          description: A detailed description of the error in the offending field.
        '400':
          description: The entire request was malformed or invalid.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    $ref: '#/components/schemas/errors'
        '401':
          $ref: '#/components/responses/401'
      x-codeSamples:
      - lang: json
        label: JSON
        source: "{\n  \"batch\": [\n    {\n      \"type\": \"person\",\n      \"identifiers\": {\n        \"id\": \"42\"\n      },\n      \"action\": \"identify\",\n      \"attributes\": {\n        \"first_name\": \"Jane\",\n        \"last_name\": \"Doe\",\n        \"plan\": \"premium\"\n      }\n    },\n    {\n      \"type\": \"object\",\n      \"identifiers\": {\n        \"object_type_id\": \"1\",\n        \"object_id\": \"acme\"\n      },\n      \"action\": \"identify\",\n      \"attributes\": {\n        \"name\": \"Acme Corp\",\n        \"plan\": \"enterprise\",\n        \"seats\": 50\n      }\n    },\n    {\n      \"type\": \"object\",\n      \"identifiers\": {\n        \"object_type_id\": \"1\",\n        \"object_id\": \"acme\"\n      },\n      \"action\": \"add_relationships\",\n      \"cio_relationships\": [\n        {\n          \"identifiers\": {\n            \"id\": \"42\"\n          },\n          \"relationship_attributes\": {\n            \"role\": \"admin\"\n          }\n        }\n      ]\n    }\n  ]\n}"
components:
  schemas:
    object_delete:
      title: 'Object: Delete'
      description: 'Delete an object. This also removes relationships from people.

        '
      example:
        type: object
        identifiers:
          object_type_id: '1'
          object_id: acme
        action: delete
      allOf:
      - $ref: '#/components/schemas/object_common'
      - type: object
        required:
        - action
        properties:
          action:
            type: string
            description: Indicates that the operation will `delete` the the item of the specified `type`.
            enum:
            - delete
    object_delete_relationships:
      title: 'Object: Delete relationships'
      description: Delete relationships between an object and one or more people.
      example:
        type: object
        identifiers:
          object_type_id: '1'
          object_id: acme
        action: delete_relationships
        cio_relationships:
        - identifiers:
            id: '42'
      allOf:
      - $ref: '#/components/schemas/object_common'
      - type: object
        required:
        - action
        - cio_relationships
        properties:
          action:
            type: string
            description: This operation deletes an object relationship from one or more people.
            enum:
            - delete_relationships
          cio_relationships:
            $ref: '#/components/schemas/v2_cio_relationships'
    person_screen:
      title: 'Person: Screen view'
      description: A mobile "screenview" event attributed to a person. Our `screen` and `page` event types are more specific than our standard `event`, and help you track and target people based on the pages people visit in your mobile app or website.
      example:
        type: person
        identifiers:
          id: '42'
        action: screen
        name: Dashboard
        attributes:
          app_version: 2.1.0
      allOf:
      - $ref: '#/components/schemas/person_common'
      - type: object
        required:
        - action
        - name
        properties:
          action:
            type: string
            description: A mobile "screenview" event attributed to a person. Our `screen` and `page` event types are more specific than our standard `event`, and help you track and target people based on the pages people visit in your mobile app or website.
            enum:
            - screen
          id:
            type: string
            format: ULID
            description: A valid ULID used to deduplicate events. Note - our Python and Ruby libraries do not pass this id.
          name:
            type: string
            description: The name of the screen a person visited. This is how you'll find and select screen view events in Customer.io.
          timestamp:
            type: integer
            description: The Unix timestamp when the event happened.
          attributes:
            type: object
            description: Additional information that you might want to reference in a message using liquid or use to set attributes on the identified person.
            additionalProperties:
              x-additionalPropertiesName: liquid merge data
              description: Insert key-values that you want to reference in your message here.
    person_add_relationships:
      title: 'Person: Add relationships'
      description: Associate multiple objects with a person.
      example:
        type: person
        identifiers:
          id: '42'
        action: add_relationships
        cio_relationships:
        - identifiers:
            object_type_id: '1'
            object_id: acme
          relationship_attributes:
            role: admin
      allOf:
      - $ref: '#/components/schemas/person_common'
      - type: object
        required:
        - action
        - cio_relationships
        properties:
          action:
            type: string
            description: This operation associates a person with one or more objects.
            enum:
            - add_relationships
          cio_relationships:
            $ref: '#/components/schemas/object_relationships'
    object_identify_anonymous:
      title: 'Object: Identify anonymous'
      description: The `identify_anonymous` action lets you relate an object to a person who hasn't yet identified themselves by anonymous_id. When you identify the person, their anonymous relationship will carry over to the identified profile.
      example:
        type: object
        identifiers:
          object_type_id: '1'
          object_id: acme
        action: identify_anonymous
        anonymous_id: anon-abc-123
      allOf:
      - $ref: '#/components/schemas/object_common_identify'
      - type: object
        required:
        - action
        properties:
          action:
            type: string
            description: Indicates that the operation will `identify` the item of the specified `type` and relate it to an `anonymous_id`.
            enum:
            - identify_anonymous
          attributes:
            $ref: '#/components/schemas/object_attributes'
          cio_relationships:
            type: array
            description: The anonymous people you want to associate with an object. Each object in the array contains an `anonymous_id` representing a person you haven't yet identified by `id` or `email`.
            items:
              type: object
              properties:
                identifiers:
                  type: object
                  properties:
                    anonymous_id:
                      $ref: '#/components/schemas/anonymous_id'
                relationship_attributes:
                  type: object
                  description: Coming October 2023 - The attributes associated with a relationship. Passing null or an empty string removes the attribute from the relationship.
    identify_person:
      title: 'Person: Identify'
      description: Add or update a person.
      example:
        type: person
        identifiers:
          id: '42'
        action: identify
        attributes:
          first_name: Jane
          last_name: Doe
          plan: premium
      allOf:
      - $ref: '#/components/schemas/person_common'
      - type: object
        required:
        - action
        properties:
          action:
            type: string
            description: Indicates that the operation will `identify` the the item of the specified `type`.
            enum:
            - identify
          timestamp:
            type: integer
            description: The Unix timestamp for when the attribute update occurred. This can be used to control the order of attribute updates when multiple requests are sent in rapid succession.
            example: 1772013598
          attributes:
            type: object
            description: Attributes that you want to add or update for this person. You can pass properties that aren't defined below to set custom attributes; the defined properties are reserved in the Customer.io Track API.
            properties:
              cio_subscription_preferences:
                $ref: '#/components/schemas/cio_subscription_preferences'
              _update:
                type: boolean
                default: false
                description: If `true`, update only existing people and prevent accidental profile creation. If no person matches the identifiers, the request does nothing.
            additionalProperties:
              x-additionalPropertiesName: additional attributes
              description: Custom properties that you want to set as attributes on this person.
          cio_relationships:
            $ref: '#/components/schemas/object_relationships'
    person_suppress:
      title: 'Person: Suppress'
      description: Suppress a person's identifier(s) in Customer.io, so that you can't message a person or add their identifiers back to your workspace. This is separate from suppressions performed by your email provider.
      example:
        type: person
        identifiers:
          id: '42'
        action: suppress
      allOf:
      - $ref: '#/components/schemas/person_common'
      - type: object
        required:
        - action
        properties:
          action:
            type: string
            description: Suppress a person's identifier(s) in Customer.io, so that you can't message a person or add their identifiers back to your workspace. This is separate from suppressions performed by your email provider.
            enum:
            - suppress
    errors:
      x-scalar-ignore: true
      type: array
      description: An array of errors, where each object represents a different error.
      items:
        type: object
        properties:
          reason:
            type: string
            description: The reason for the error.
          field:
            type: string
            description: The field containing the error.
          message:
            type: string
            description: A detailed description of the error in the offending field.
    delivery_operations:
      title: 'Delivery: Event'
      description: The "delivery" type lets you attribute metrics to messages that don't self-report back to Customer.io, like push and in-app notifications.
      example:
        type: delivery
        identifiers:
          id: RPIyMTM6OjEyMzQ=
        action: event
        name: opened
        attributes:
          device_token: a83b219c-e756-4c5b-a8e3-d1a5c5b2f3c1
      type: object
      required:
      - type
      - action
      - identifiers
      - name
      - attributes
      properties:
        type:
          type: string
          description: The "delivery" type lets you attribute metrics to messages that don't self-report back to Customer.io, like push and in-app notifications.
          enum:
          - delivery
        action:
          type: string
          description: An `event` action indicates a delivery event. Use the `name` to determine the specific metric that you want to attribute to this delivery.
          enum:
          - event
        identifiers:
          type: object
          description: Contains identifiers for the delivery itself.
          properties:
            id:
              type: string
              description: The `delivery_id` for the delivery that you want to attribute metrics to.
        name:
          type: string
          description: The name of the metric you want to attribute to this "delivery".
          enum:
          - opened
          - converted
          - delivered
        attributes:
          type: object
          required:
          - device_token
          description: Contains information about the delivery and the individual who received the message.
          properties:
            device_token:
              type: string
              description: The device that received the message.
    person_unsuppress:
      title: 'Person: Unsuppress'
      description: Unsuppress a person's identifier(s) in Customer.io, so that you can message a person or add their identifiers back to your workspace. This does not unsuppress addresses that were previously suppressed by your email provider.
      example:
        type: person
        identifiers:
          id: '42'
        action: unsuppress
      allOf:
      - $ref: '#/components/schemas/person_common'
      - type: object
        required:
        - action
        properties:
          action:
            type: string
            description: Unsuppress a person's identifier(s) in Customer.io, so that you can message a person or add their identifiers back to your workspace. This does not unsuppress addresses that were previously suppressed by your email provider.
            enum:
            - unsuppress
    relationship_attributes:
      x-scalar-ignore: true
      type: object
      description: 'The attributes associated with a relationship. Passing null or an empty string removes the attribute from the relationship.

        '
      additionalProperties:
        x-additionalPropertiesName: Relationship Attributes
      example:
        role: admin
    cio_id:
      x-scalar-ignore: true
      type: string
      description: A unique identifier set by Customer.io, used to reference a person if you want to update their identifiers.
      example: a3000001
    person_delete:
      title: 'Person: Delete'
      description: Delete a person from your workspace.
      example:
        type: person
        identifiers:
          id: '42'
        action: delete
      allOf:
      - $ref: '#/components/schemas/person_common'
      - type: object
        required:
        - action
        properties:
          action:
            type: string
            description: Indicates that the operation will `delete` the the item of the specified `type`.
            enum:
            - delete
    cio_subscription_preferences:
      x-scalar-ignore: true
      description: A person's [subscription center](/journeys/channels/subscriptions/center/) preferences. Use JSON dot notation, such as `cio_subscription_preferences.topics.topic_<id>`, to update one topic without replacing others.
      type: object
      properties:
        topics:
          type: object
          description: Contains active topics in your workspace, named `topic_<id>`.
          additionalProperties:
            x-additionalPropertiesName: topic_<id>
            description: Boolean preference for a topic named `topic_<id>`; `true` subscribes, `false` unsubscribes, and empty or missing values use the topic default. Find topic IDs with [getTopics](#tag/subscription-center/getTopics).
            type: boolean
      example:
        topics:
          topic_1: true
          topic_2: false
          topic_3: true
    person_merge:
      title: 'Person: Merge'
      example:
        primary:
          id: '42'
        secondary:
          id: known-user-456
      type: object
      description: Merges `secondary` into `primary`, then deletes `secondary`. The operation is not reversible, and `primary` must already exist. See [merging duplicate people](/journeys/people/manage/merge-people/).
      required:
      - type
      - primary
      - secondary
      - action
      properties:
        type:
          description: The operation modifies a person in Customer.io
          type: string
          enum:
          - person
        action:
          type: string
          description: Merges `secondary` into `

# --- truncated at 32 KB (55 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/customer-io/refs/heads/main/openapi/customer-io-track-v2-api-openapi.yml