Customer.io Page API
Record page views from web applications.
Record page views from web applications.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/customer-io-page-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
version: 1.0.0
title: Pipelines Page API
description: '# Overview
In general, you''ll consume this API through one of our source libraries—our JavaScript client library or any of our server packages.'
servers:
- url: https://cdp.customer.io/v1
description: The base URL for all Data Pipelines calls in our United States (US) region.
- url: https://cdp-eu.customer.io/v1
description: The base URL for all Data Pipelines calls in our European Union (EU) region.
tags:
- name: Page
paths:
/page:
post:
operationId: page
summary: Track pageviews
description: 'Sends a page view event. If you use our JavaScript source, it automatically records `page` events whenever it loads (every page). If you use a single-page app, you''ll need to call the `page` method people change routes.
The request consists of the page `name` and additional properties about the page.
If you use our JavaScript library, the page name and URL are automatically gathered and passed as event properties.
**When you use our libraries, you''ll typically only provide a user ID/anonymous ID and the `name` of the page. The libraries fill in the rest of the payload automatically.**'
servers:
- url: https://cdp.customer.io/v1
description: This is a Data Pipeline API.
security:
- Basic-Auth: []
parameters:
- name: X-Strict-Mode
in: header
description: 'When set to `1`, enables strict validation that returns proper HTTP error codes (400/401) for validation failures. When not set or set to any other value, the API operates in permissive mode, logging errors but returning HTTP 200. [Learn more](/integrations/api/track-vs-cdp-api#pipelines-strict-mode)
'
required: false
schema:
type: string
enum:
- '1'
example: '1'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/page'
x-codeSamples:
- lang: json
label: JSON
source: "{\n \"anonymousId\": \"507f191e810c19729de860ea\",\n \"channel\": \"browser\",\n \"context\": {\n \"ip\": \"8.8.8.8\",\n \"userAgent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML like Gecko) Chrome/40.0.2214.115 Safari/537.36\"\n },\n \"integrations\": {\n \"All\": true,\n \"Mixpanel\": false,\n \"Salesforce\": false\n },\n \"messageId\": \"022bb90c-bbac-11e4-8dfc-aa07a5b093db\",\n \"name\": \"Home\",\n \"properties\": {\n \"title\": \"Welcome | ACME, Inc.\",\n \"url\": \"https://www.example.com\"\n },\n \"receivedAt\": \"2015-02-23T22:28:55.387Z\",\n \"sentAt\": \"2015-02-23T22:28:55.111Z\",\n \"timestamp\": \"2015-02-23T22:28:55.111Z\",\n \"type\": \"page\",\n \"userId\": \"97980cfea0067\",\n \"version\": 1.1\n}"
- label: Curl
lang: shell
source: "curl --request POST \\\n --url https://cdp.customer.io/v1/page \\\n -u api_key: \\\n -H 'content-type: application/json' \\\n --data-raw '\n {\n \"userId\": \"f4ca124298\",\n \"name\": \"Home\",\n \"properties\": {\n \"title\": \"Welcome | ACME, Inc.\",\n \"url\": \"https://www.example.com\"\n }\n }'\n"
- label: JavaScript (SDK)
lang: javascript
source: "analytics.page(\"Retail Page\",\"shoes\", {\n affiliate: \"Pro annual\",\n accountType: \"Facebook\"\n});\n"
- label: Node.js (SDK)
lang: javascript
source: "analytics.page({\n userId: '019mr8mf4r',\n category: 'Docs',\n name: 'Customer.io Data Pipelines',\n properties: {\n url: 'https://customer.io/cdp/',\n path: '/cdp/',\n title: 'Customer.io Data Pipelines',\n referrer: 'https://customer.io'\n }\n});\n"
- label: Python (SDK)
lang: python
source: "analytics.page('<user_id>', 'Retail Page', 'shoes', {\n 'url': 'https://example.com/products/showes'\n})\n"
- label: Go (SDK)
lang: go
source: "client.Enqueue(analytics.Page{\n UserId: \"f4ca124298\",\n Name: \"Customer.io Data Pipelines\",\n Category: \"Docs\",\n Properties: analytics.NewProperties().\n SetURL(\"https://customer.io/cdp/\"),\n})\n"
responses:
'200':
$ref: '#/components/responses/200'
tags:
- Page
components:
schemas:
context_common:
x-scalar-ignore: true
type: object
description: Contains contextual information about the event.
properties:
active:
type: boolean
description: 'Whether a user is active.
This is usually used when you send an .identify() call to update the traits independently of when you''ve “last seen” a user.
'
ip:
type: string
description: The user's IP address. This isn't captured by our libraries, but by our servers when we receive client-side events (like from our JavaScript source).
locale:
type: string
description: The locale string for the current user, e.g. `en-US`.
userAgent:
type: string
description: The user agent of the device making the request
channel:
type: string
enum:
- browser
- server
- mobile
description: The channel the event originated from.
context_page:
x-scalar-ignore: true
type: object
description: Contains information about the current page in the browser. This is automatically collected by our JavaScript source.
properties:
name:
type: string
description: 'The name of the page. Reserved for future use.
'
path:
type: string
description: The path portion of the page's URL. Equivalent to the canonical `path` which defaults to `location.pathname` from the DOM API.
referrer:
type: string
description: The previous page's full URL. Equivalent to `document.referrer` from the DOM API.
search:
type: string
description: The query string portion of the page's URL. Equivalent to `location.search` from the DOM API.
title:
type: string
description: The page's title. Equivalent to `document.title` from the DOM API.
url:
type: string
description: A page's full URL. We first look for the canonical URL. If the canonical URL is not provided, we'll use `location.href` from the DOM API.
keywords:
type: array
description: A list/array of keywords describing the page's content. The keywords are likely the same as, or similar to, the keywords you would find in an HTML `meta` tag for SEO purposes. This property is mainly used by content publishers that rely heavily on pageview tracking. This isn't automatically collected.
items:
type: string
userId:
x-scalar-ignore: true
type: string
description: The unique identifier for a person. This value should be unique across systems, so you recognize the same person in your sources _and_ destinations.
example: 241ma8mf4a
context_non_mobile:
x-scalar-ignore: true
description: A dictionary of context about a source call/event, like the user’s IP address or locale. Context is automatically collected by our source libraries.
title: Non-mobile
allOf:
- $ref: '#/components/schemas/context_common'
- type: object
properties:
campaign:
type: object
description: 'Contains information about the campaign that resulted in the API call, gathered from, or mapping to, UTM parameters (e.g. `utm_source`).
'
properties:
name:
type: string
description: The campaign name.
source:
type: string
description: The source of traffic—like the name of your email list, Facebook, Google, etc.
medium:
type: string
description: The type of traffic a person/event originates from, like `email`, or `referral`.
term:
type: string
description: The keyword term(s) a user came from.
content:
type: string
additionalProperties:
type: string
x-additionalPropertiesName: Additional UTM Parameters
page:
$ref: '#/components/schemas/context_page'
page_common_fields:
x-scalar-ignore: true
allOf:
- $ref: '#/components/schemas/common_fields'
- type: object
properties:
context:
$ref: '#/components/schemas/context_non_mobile'
page:
x-scalar-ignore: true
oneOf:
- title: Known User
allOf:
- type: object
required:
- userId
properties:
userId:
$ref: '#/components/schemas/userId'
type:
type: string
enum:
- page
description: The event type. This is set automatically by the request method/endpoint.
name:
type: string
description: The name of the page.
example: home
properties:
type: object
description: Additional `page` properties. Analytics.js automatically collects `url`, `title`, `referrer`, `path`, and `search` properties. But, if you use our other sources or you write your own integration, you should consider sending these properties yourself. Destination actions that take `page` events often rely on the `url` and `title` properties.
properties:
category:
type: string
description: The category of the page. This might be useful if you have a single page routes or have a flattened URL structure.
url:
type: string
description: The URL of the page. This defaults to a canonical url if available, and falls back to `document.location.href`.
example: https://www.example.com/page/
title:
type: string
description: The title of the page. This defaults to `document.title`, but can be overridden.
example: Page | Example.com
referrer:
type: string
description: The referrer of the page, if applicable. This defaults to `document.referrer`, but can be overridden.
example: http://www.google.com/search?q=example
path:
type: string
description: The path of the page. This defaults to `location.pathname`, but can be overridden.
example: /page
search:
type: string
description: The search query in the URL, if present. This defaults to `location.search`, but can be overridden.
example: ?q=sfgiants
additionalProperties:
x-additionalPropertiesName: Page Properties
- $ref: '#/components/schemas/page_common_fields'
- title: Anonymous User
allOf:
- type: object
required:
- anonymousId
properties:
anonymousId:
$ref: '#/components/schemas/anonymousId'
type:
type: string
enum:
- page
description: The event type. This is set automatically by the request method/endpoint.
name:
type: string
description: The name of the page.
example: home
properties:
type: object
description: Additional properties for your event.
properties:
category:
type: string
description: The category of the page. This might be useful if you have a single page routes or have a flattened URL structure.
url:
type: string
description: The URL of the page.
title:
type: string
description: The title of the page. This defaults to `document.title`, but can be overridden.
example: Page | Example.com
referrer:
type: string
description: The referrer of the page, if applicable. This defaults to document.referrer, but can be overridden.
example: http://www.google.com/search?q=example
path:
type: string
description: The path of the page. This defaults to location.pathname, but can be overridden.
example: /page
search:
type: string
description: The search query in the URL, if present. This defaults to location.search, but can be overridden.
example: ?q=sfgiants
additionalProperties:
x-additionalPropertiesName: Page Properties
- $ref: '#/components/schemas/page_common_fields'
example:
anonymousId: 507f191e810c19729de860ea
channel: browser
context:
ip: 8.8.8.8
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML like Gecko) Chrome/40.0.2214.115 Safari/537.36
integrations:
All: true
Mixpanel: false
Salesforce: false
messageId: 022bb90c-bbac-11e4-8dfc-aa07a5b093db
name: Home
properties:
title: Welcome | ACME, Inc.
url: https://www.example.com
receivedAt: '2015-02-23T22:28:55.387Z'
sentAt: '2015-02-23T22:28:55.111Z'
timestamp: '2015-02-23T22:28:55.111Z'
type: page
userId: 97980cfea0067
version: 1.1
integrations:
x-scalar-ignore: true
type: object
description: 'Contains a list of booleans indicating the integrations that are enabled (true) or disabled (false). By default, all integrations are enabled (returning an empty object). Set `"All": false` to reverse this behavior.
'
additionalProperties:
type: boolean
x-additionalPropertiesName: Enabled/Disabled integrations
example:
All: true
Salesforce: false
anonymousId:
x-scalar-ignore: true
type: string
description: A unique substitute for a User ID in cases when you don’t have an absolutely unique identifier. Our libraries generate this value automatically to help you track people before they sign up, log in, provide their email, etc.
example: c0e5cae6-6f04-46e4-97a8-25076e8bdc0b
common_fields:
x-scalar-ignore: true
type: object
properties:
integrations:
$ref: '#/components/schemas/integrations'
messageId:
type: string
description: A unique identifier for a Data Pipelines call, ensuring that each individual event is unique. This is set by Customer.io
receivedAt:
type: string
format: date-time
readOnly: true
description: The ISO-8601 timestamp when Data Pipelines receives an event.
sentAt:
type: string
format: date-time
description: The ISO-8601 timestamp when a library sends an event to Data Pipelines.
originalTimestamp:
type: string
format: date-time
description: In general, you can use `timestamp` rather than this field if you want to back-date events. This is the timestamp on the client device you invoke a call or the timestamp value you manually passed in a server-side library call.
timestamp:
type: string
format: date-time
description: The ISO-8601 timestamp when the event originally took place. This is mostly useful when you backfill past events. If you're not backfilling data, you can leave this field empty and we'll use the current time or server time.
type:
readOnly: true
type: string
enum:
- identify
- group
- track
- page
- screen
- alias
description: The type of source event. This is implicit and set by Customer.io based on the endpoint/method you use (e.g. `identify`).
version:
readOnly: true
type: number
description: The version of the API that received the event, automatically set by Customer.io.
responses:
'200':
description: A successful request returns an empty object response.
securitySchemes:
Basic-Auth:
type: http
scheme: basic
description: 'The Data Pipelines API uses a basic authentication scheme with your API key. Because basic authorization typically expects a username and password combination, you''ll use the API Key as the username and leave the password blank—base64 encoding your credentials in the format `API_key:`.
'