Data Hub API Reference
Programmatic access to user attributes and event attributes.
Data Hub API Reference
Covers two resource families: user attributes and event attributes. Both follow the standard /v1/{orgName}/projects/{projectName}/... path pattern.
📘 Authentication
These endpoints authenticate with a JWT bearer token (Authorization: Bearer <jwt>), the same as a signed-in console session — not an apiKey query parameter like the ingestion endpoints (Track Data, Consent, Choose API). See Authentication for how to obtain one.
List Attributes
GET /v1/{orgName}/projects/{projectName}/attributes
Returns user attributes for the project, with optional filters and pagination.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number (via pageable) |
size | integer | No | Page size (via pageable) |
attributeType | string | No | One of extracted, predicted, scoring, calculated, metric |
scoringType | string | No | Scoring subtype, when attributeType is scoring |
name | string | No | Filter by attribute name |
title | string | No | Filter by attribute title |
createdBy | integer | No | Filter by creator's person ID |
Examples
List all scoring attributes
GET /v1/{orgName}/projects/{projectName}/attributes?attributeType=scoringResponses
200 OK
Returns an object with a userAttributes array and a total count — not a bare array.
{
"userAttributes": [
{
"id": "1",
"name": "user_owner",
"attributeType": "extracted",
"type": "user",
"title": "User owner",
"description": "Intempt user owner.",
"example": "",
"active": true,
"createdAt": "2026-03-11T09:08:30.328772Z",
"updatedAt": "2026-03-11T09:08:30.328772Z",
"createdBy": {
"id": "system",
"type": "system",
"name": "System",
"pictureUrl": null
},
"updatedBy": {
"id": "system",
"type": "system",
"name": "System",
"pictureUrl": null
},
"segmentationAvailable": true,
"pii": true,
"unique": true,
"schema": {
"type": "record",
"name": "schema",
"fields": [
{
"name": "intempt_user_owner",
"type": ["null", "long"],
"default": null
}
]
},
"fields": [
{
"id": null,
"name": "intempt_user_owner",
"title": "User owner",
"objectType": "long",
"itemsType": null,
"items": null,
"possibleValues": null
}
],
"system": true,
"fieldNames": [],
"strategy": "last"
}
],
"total": 162
}400 Bad Request
Invalid filter parameters.
Response Fields
| Field | Type | Description |
|---|---|---|
userAttributes | array | The list of attribute objects (see below) |
total | integer | Total number of attributes matching the query, across all pages |
userAttributes[].id | string | Attribute ID |
userAttributes[].name | string | Attribute name |
userAttributes[].attributeType | string | extracted, predicted, scoring, calculated, or metric |
userAttributes[].type | string | user or account |
userAttributes[].title | string | Display title |
userAttributes[].description | string | Description |
userAttributes[].example | string | Example value |
userAttributes[].active | boolean | Whether the attribute is active |
userAttributes[].createdAt | string (date-time) | Creation timestamp |
userAttributes[].updatedAt | string (date-time) | Last update timestamp |
userAttributes[].createdBy | object | Who created it — {id, type, name, pictureUrl} |
userAttributes[].updatedBy | object | Who last updated it — same shape as createdBy |
userAttributes[].segmentationAvailable | boolean | Whether this attribute can be used in segment conditions |
userAttributes[].pii | boolean | Whether the attribute holds personally identifiable information |
userAttributes[].unique | boolean | Whether values must be unique |
userAttributes[].system | boolean | Whether this is a system-defined attribute |
userAttributes[].schema | object | Avro-style schema describing the attribute's underlying field |
userAttributes[].fields | array | Field definitions backing this attribute |
userAttributes[].fieldNames | array | Underlying field names, when applicable |
userAttributes[].strategy | string | Aggregation/resolution strategy (e.g. "last") |
Create Attribute
POST /v1/{orgName}/projects/{projectName}/attributes
Creates a user attribute. Required fields are attributeType and title. The exact shape of the request varies by attributeType (for example, extracted and scoring attributes each accept type-specific fields beyond the ones listed below).
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
attributeType | string | Yes | extracted, predicted, scoring, calculated, or metric |
title | string | Yes | Display title |
description | string | No | Description |
example | string | No | Example value |
type | string | No | user or account |
active | boolean | No | Whether the attribute is active |
segmentationAvailable | boolean | No | Whether this attribute can be used in segment conditions |
pii | boolean | No | Whether the attribute holds personally identifiable information |
unique | boolean | No | Whether values must be unique |
Retrieve, Update, Delete a Single Attribute
GET /v1/{orgName}/projects/{projectName}/attributes/{attributeId}
PUT /v1/{orgName}/projects/{projectName}/attributes/{attributeId}
DELETE /v1/{orgName}/projects/{projectName}/attributes/{attributeId}
GET returns a single attribute object — the same shape as one item inside List Attributes' userAttributes array, not wrapped in that envelope. PUT accepts the same body as Create Attribute. DELETE takes no body.
List Event Attributes
GET /v1/{orgName}/projects/{projectName}/event-attributes
Returns event attributes for a collection.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
collectionId | string | Yes | The event collection to list attributes for |
200 OK
Returns an _embedded array and a total count — not the same envelope shape as List Attributes (userAttributes).
{
"_embedded": [
{
"id": "696107",
"name": "transformer",
"displayName": "transformer",
"events": null,
"collectionId": "1729891230671200257",
"description": "",
"example": "",
"visibility": true,
"objectType": "string",
"itemsType": null,
"items": null,
"type": "EVENT",
"typeLabel": "Event attributes",
"fullPath": "data.transformer"
}
],
"total": 2
}Response Fields
| Field | Type | Description |
|---|---|---|
_embedded | array | The list of event attributes in this collection |
_embedded[].id | string | Attribute ID |
_embedded[].name | string | Attribute name |
_embedded[].displayName | string | Display name |
_embedded[].collectionId | string | The event collection this attribute belongs to |
_embedded[].description | string | Description |
_embedded[].example | string | Example value |
_embedded[].visibility | boolean | Whether the attribute is visible |
_embedded[].objectType | string | Underlying data type (e.g. string) |
_embedded[].type | string | Always EVENT for this endpoint |
_embedded[].typeLabel | string | Human-readable type label |
_embedded[].fullPath | string | Dot-notation path to this attribute on the event payload (e.g. data.transformer) |
total | integer | Total number of attributes in this collection |
Search Event Attributes
POST /v1/{orgName}/projects/{projectName}/event-attributes
Despite the POST method, this searches and filters existing event attributes rather than creating one. Use this when you need filters beyond what collectionId alone supports on the GET endpoint above.
📘 Good to know
The GET and POST methods on this same path do different things: GET lists by collection, POST searches by a filter body. Don't assume POST here means create.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
collectionId | string | No | Limit the search to one event collection. Omit to search across all collections |
filters | array | Yes | Filter conditions — pass [] for no filters. Cannot be omitted or null |
pageSize | integer | Yes | Number of results per page |
pageNumber | integer | Yes | Page number to return |
{
"filters": [],
"pageSize": 10,
"pageNumber": 0
}Responses
200 OK
Returns an _embedded array of event attributes.
{
"_embedded": [
{
"id": "696107",
"name": "transformer",
"displayName": "transformer",
"events": null,
"collectionId": "1729891230671200257",
"description": "",
"example": "",
"visibility": true,
"objectType": "string",
"itemsType": null,
"items": null,
"type": "EVENT",
"typeLabel": "Event attributes",
"fullPath": "data.transformer"
}
],
"total": 2
}400 Bad Request
Returned both for a malformed request (e.g. missing filters, pageSize, or pageNumber) and when no event attributes match the search:
{
"errors": [
{
"message": "Event attributes not found"
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
_embedded | array | The list of matching event attributes |
_embedded[].id | string | Attribute ID |
_embedded[].name | string | Attribute name |
_embedded[].displayName | string | Display name |
_embedded[].collectionId | string | The event collection this attribute belongs to |
_embedded[].description | string | Description |
_embedded[].example | string | Example value |
_embedded[].visibility | boolean | Whether the attribute is visible |
_embedded[].objectType | string | Underlying data type (e.g. string) |
_embedded[].type | string | Always EVENT for this endpoint |
_embedded[].typeLabel | string | Human-readable type label |
_embedded[].fullPath | string | Dot-notation path to this attribute on the event payload (e.g. data.transformer) |
total | integer | Total number of matching attributes |
