---
title: "Visitors API Reference"
description: "Identify and manage visitors. Accepts system fields like $email, $phone and arbitrary key/value attributes."
canonical: "https://linkbreakers.com/help/api/visitors"
---

# Visitors

Identify and manage visitors. Accepts system fields like $email, $phone and arbitrary key/value attributes.

## Visitors

## [#](#visitors-object)The Visitor object

Captures the cross-link profile Linkbreakers builds for someone who scans or clicks, combining reserved identity fields, attributed devices, events, and custom traits gathered from forms.

attributes

array<object>

Arbitrary attributes provided without "$" prefix, with the type each value was captured as.

createdAt

string (date-time)

Timestamps

deviceCount

integer (int64)

Number of devices attributed to this visitor

devices

array<object>

Device information collected during visitor interactions

email

string

from "$email"

events

array<object>

Events associated with this visitor

firstName

string

from "$firstName" (optional)

id

string

Unique ID (UUID)

lastName

string

from "$lastName" (optional)

links

array<object>

Links associated with this visitor via events (included only on demand)

phone

string

from "$phone"

qrcodeCount

integer (int64)

Number of distinct QR codes / links this visitor has interacted with

updatedAt

string (date-time)

visitCount

integer (int64)

Total number of events (visits) recorded for this visitor

workspaceId

string

Workspace that owns this visitor (UUID)

[Learn moreLearn more about visitor profiles in Linkbreakers.](https://linkbreakers.com/help/article/whats-a-visitor)

Example object

```json
{
  "attributes": [
    {
      "boolValue": false,
      "dateValue": "2026-10-25T09:20:08.960Z",
      "key": "rating",
      "numberValue": 0,
      "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
      "value": "8"
    }
  ],
  "createdAt": "2026-10-25T09:20:08.960Z",
  "deviceCount": 2,
  "devices": [
    {
      "asn": 7922,
      "browserLanguage": "en-US,en;q=0.9",
      "browserName": "Chrome",
      "browserVersion": "99.0.4844.51",
      "city": "New York",
      "country": "US",
      "createdAt": "2026-10-25T09:20:08.960Z",
      "deviceActor": "DEVICE_ACTOR_HUMAN",
      "deviceActorName": "GPTBot",
      "deviceActorOrigin": "OpenAI",
      "deviceBrand": "Apple",
      "deviceConcurrency": 4,
      "deviceMemory": 6,
      "deviceName": "iPhone 14 Pro",
      "deviceType": "DEVICE_TYPE_MOBILE",
      "gpu": "Apple GPU",
      "id": "6f1b2e90-1234-4c8f-91e1-63cd927bf908",
      "ipAddress": "203.0.113.42",
      "isp": "Comcast Cable Communications",
      "lastUsedAt": "2026-10-25T09:20:08.960Z",
      "networkBandwidth": 10,
      "networkConnection": "4g",
      "networkRtt": 50,
      "platformName": "macOS",
      "platformVersion": "10.15.7",
      "region": "CRF",
      "screenHeight": 1117,
      "screenRatio": 1.55,
      "screenWidth": 1728,
      "state": "NY",
      "timezone": "Europe/London",
      "touchScreen": true,
      "updatedAt": "2026-10-25T09:20:08.960Z",
      "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1"
    }
  ],
  "email": "sam.visitor@example.com",
  "events": [
    {
      "action": "SCAN",
      "createdAt": "2026-10-25T09:20:08.960Z",
      "id": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
      "linkId": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
      "scannedAt": "2026-10-25T09:20:08.960Z",
      "visitType": "FIRST"
    }
  ],
  "firstName": "Sam",
  "id": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
  "lastName": "Rivera",
  "links": [
    {
      "entrypoint": "https://linkbreak.ing/4BnH-R19p",
      "eventCount": 12,
      "firstVisitedAt": "2026-10-25T09:20:08.960Z",
      "id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
      "lastVisitedAt": "2026-10-25T09:20:08.960Z",
      "name": "Spring Launch Campaign",
      "shortlink": "4BnH-R19p"
    }
  ],
  "phone": "+15551234567",
  "qrcodeCount": 3,
  "updatedAt": "2026-10-25T09:20:08.960Z",
  "visitCount": 42,
  "workspaceId": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0"
}
```

GET

`/v1/visitors`

Requires auth

## [#](#list-visitors)List visitors

Returns a paginated collection of visitors with optional filters, includes, and CSV export. To filter on visitor attributes, use POST /v1/visitors/search, which takes the same parameters as a JSON body. Requires the \`visitors:read\` scope.

### [#](#list-visitors-parameters)Parameters

#### query parameters

pageSize

integer (int64)

query

Maximum number of visitors to return (default 50, max 200)

pageToken

string

query

Cursor token to retrieve the next page of results

email

string

query

optional exact match filter

search

string

query

optional fuzzy search across known fields

include

array<string>

query

linkId

string

query

optional filter by link ID (UUID; visitors who have interacted with this link)

responseFormat

string

query

 \- RESPONSE\_FORMAT\_UNSPECIFIED: Response format not specified - RESPONSE\_FORMAT\_JSON: Response format JSON - RESPONSE\_FORMAT\_CSV: Response format CSV

##### Allowed values

`RESPONSE_FORMAT_UNSPECIFIED`

Response format not specified

`RESPONSE_FORMAT_JSON`

Response format JSON

`RESPONSE_FORMAT_CSV`

Response format CSV

sortField

string

query

Field to sort by. Defaults to created\_at (newest first).

##### Allowed values

`VISITOR_SORT_FIELD_UNSPECIFIED`

Sort field not specified (defaults to created\_at)

`VISITOR_SORT_FIELD_CREATED_AT`

Sort by the date the visitor was first seen

`VISITOR_SORT_FIELD_VISIT_COUNT`

Sort by total number of visits (events)

`VISITOR_SORT_FIELD_DEVICE_COUNT`

Sort by number of attributed devices

`VISITOR_SORT_FIELD_QRCODE_COUNT`

Sort by number of distinct QR codes interacted with

sortDirection

string

query

Sort direction. Defaults to descending.

##### Allowed values

`SORT_DIRECTION_UNSPECIFIED`

Sort direction not specified (defaults to descending)

`SORT_DIRECTION_ASC`

Sort in ascending order

`SORT_DIRECTION_DESC`

Sort in descending order

cursor

string

query

Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.

### [#](#list-visitors-response)Response

200

Everything worked as expected.

csv

object

ListVisitorsCsvResponse carries the raw CSV when ResponseFormat is set to RESPONSE\_FORMAT\_CSV.

json

object

ListVisitorsJsonResponse is the default structured payload used by dashboards.

### [#](#list-visitors-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X GET "https://api.linkbreakers.com/v1/visitors?pageSize={pageSize}&pageToken={pageToken}&email={email}&search={search}&include={include}&linkId={linkId}&responseFormat={responseFormat}&sortField={sortField}&sortDirection={sortDirection}&cursor={cursor}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "csv": {
    "contentType": "string",
    "csvData": "string"
  },
  "json": {
    "hasMore": false,
    "nextPageToken": "eyJ2aXNpdG9ySWQiOiI0ZGEzIn0=",
    "totalCount": 128,
    "visitors": [
      {
        "attributes": [],
        "createdAt": "2026-10-25T09:20:08.958Z",
        "deviceCount": 2,
        "devices": [],
        "email": "sam.visitor@example.com",
        "events": [],
        "firstName": "Sam",
        "id": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
        "lastName": "Rivera",
        "links": [],
        "phone": "+15551234567",
        "qrcodeCount": 3,
        "updatedAt": "2026-10-25T09:20:08.958Z",
        "visitCount": 42,
        "workspaceId": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0"
      }
    ]
  }
}
```

Base URL: `https://api.linkbreakers.com`

GET

`/v1/visitors/{id}`

Requires auth

## [#](#get-a-visitor)Get a visitor

Retrieves a visitor profile by ID with optional devices, events, or links included. Requires the \`visitors:read\` scope.

### [#](#get-a-visitor-parameters)Parameters

#### path parameters

id

string

Required

path

Visitor identifier (UUID)

#### query parameters

include

array<string>

query

Optional relationships to hydrate ("devices", "events", "links")

### [#](#get-a-visitor-response)Response

200

Everything worked as expected.

attributes

array<object>

Arbitrary attributes provided without "$" prefix, with the type each value was captured as.

createdAt

string (date-time)

Timestamps

deviceCount

integer (int64)

Number of devices attributed to this visitor

devices

array<object>

Device information collected during visitor interactions

email

string

from "$email"

events

array<object>

Events associated with this visitor

firstName

string

from "$firstName" (optional)

id

string

Unique ID (UUID)

lastName

string

from "$lastName" (optional)

links

array<object>

Links associated with this visitor via events (included only on demand)

phone

string

from "$phone"

qrcodeCount

integer (int64)

Number of distinct QR codes / links this visitor has interacted with

updatedAt

string (date-time)

visitCount

integer (int64)

Total number of events (visits) recorded for this visitor

workspaceId

string

Workspace that owns this visitor (UUID)

### [#](#get-a-visitor-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X GET "https://api.linkbreakers.com/v1/visitors/{id}?include={include}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "attributes": [
    {
      "boolValue": false,
      "dateValue": "2026-10-25T09:20:08.959Z",
      "key": "rating",
      "numberValue": 0,
      "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
      "value": "8"
    }
  ],
  "createdAt": "2026-10-25T09:20:08.959Z",
  "deviceCount": 2,
  "devices": [
    {
      "asn": 7922,
      "browserLanguage": "en-US,en;q=0.9",
      "browserName": "Chrome",
      "browserVersion": "99.0.4844.51",
      "city": "New York",
      "country": "US",
      "createdAt": "2026-10-25T09:20:08.959Z",
      "deviceActor": "DEVICE_ACTOR_HUMAN",
      "deviceActorName": "GPTBot",
      "deviceActorOrigin": "OpenAI",
      "deviceBrand": "Apple",
      "deviceConcurrency": 4,
      "deviceMemory": 6,
      "deviceName": "iPhone 14 Pro",
      "deviceType": "DEVICE_TYPE_MOBILE",
      "gpu": "Apple GPU",
      "id": "6f1b2e90-1234-4c8f-91e1-63cd927bf908",
      "ipAddress": "203.0.113.42",
      "isp": "Comcast Cable Communications",
      "lastUsedAt": "2026-10-25T09:20:08.959Z",
      "networkBandwidth": 10,
      "networkConnection": "4g",
      "networkRtt": 50,
      "platformName": "macOS",
      "platformVersion": "10.15.7",
      "region": "CRF",
      "screenHeight": 1117,
      "screenRatio": 1.55,
      "screenWidth": 1728,
      "state": "NY",
      "timezone": "Europe/London",
      "touchScreen": true,
      "updatedAt": "2026-10-25T09:20:08.959Z",
      "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1"
    }
  ],
  "email": "sam.visitor@example.com",
  "events": [
    {
      "action": "SCAN",
      "createdAt": "2026-10-25T09:20:08.959Z",
      "id": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
      "linkId": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
      "scannedAt": "2026-10-25T09:20:08.959Z",
      "visitType": "FIRST"
    }
  ],
  "firstName": "Sam",
  "id": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
  "lastName": "Rivera",
  "links": [
    {
      "entrypoint": "https://linkbreak.ing/4BnH-R19p",
      "eventCount": 12,
      "firstVisitedAt": "2026-10-25T09:20:08.959Z",
      "id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
      "lastVisitedAt": "2026-10-25T09:20:08.959Z",
      "name": "Spring Launch Campaign",
      "shortlink": "4BnH-R19p"
    }
  ],
  "phone": "+15551234567",
  "qrcodeCount": 3,
  "updatedAt": "2026-10-25T09:20:08.959Z",
  "visitCount": 42,
  "workspaceId": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0"
}
```

Base URL: `https://api.linkbreakers.com`

GET

`/v1/visitors/attributes`

Requires auth

## [#](#list-visitor-attribute-keys)List visitor attribute keys

Returns the distinct visitor attribute keys available in the workspace or scoped to a single link. Requires the \`visitors:read\` scope.

### [#](#list-visitor-attribute-keys-parameters)Parameters

#### query parameters

linkId

string

query

Optional link identifier (UUID). When set, returns keys observed on visitors who interacted with this link.

### [#](#list-visitor-attribute-keys-response)Response

200

Everything worked as expected.

attributeKeys

array<string>

Distinct selectable visitor attribute keys, including reserved system fields such as $email and $phone.

attributes

array<object>

The same keys with the type their values were captured as, so a client can offer the filter operators that fit each one.

### [#](#list-visitor-attribute-keys-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X GET "https://api.linkbreakers.com/v1/visitors/attributes?linkId={linkId}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "attributeKeys": [
    "$email",
    "$phone",
    "$firstName",
    "$lastName",
    "company",
    "plan"
  ],
  "attributes": [
    {
      "key": "budget",
      "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED"
    }
  ]
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/visitor/identify`

Requires auth

## [#](#identify-visitor)Identify visitor

Identifies a visitor from an LBID. Anonymous visitors (created at scan time) are promoted or merged into existing identified visitors. If the identity matches an existing visitor, devices and events converge into that source-of-truth record. Requires the \`visitors:write\` scope.

### [#](#identify-visitor-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#identify-visitor-request)Request body

lbid

string

LBID (base64 encoded event ID) that initiated the visit (click/scan)

setOnce

boolean

If true, only set fields that are empty (set-once semantics); defaults to false (merge/overwrite)

visitor

object

Input payload for identifying/updating a visitor - Reserved keys (system fields) have a "$" prefix, e.g. "$email", "$phone", "$firstName", "$lastName". - All other keys are treated as custom attributes and stored in \`attributes\`.

### [#](#identify-visitor-response)Response

200

Everything worked as expected.

created

boolean

Indicates whether a new visitor profile was created as part of the identification

visitor

object

Captures the cross-link profile Linkbreakers builds for someone who scans or clicks, combining reserved identity fields, attributed devices, events, and custom traits gathered from forms.

### [#](#identify-visitor-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/visitor/identify" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"lbid":"string","setOnce":false,"visitor":{"data":{}}}'
```

Sample payload (application/json)

```json
{
  "lbid": "string",
  "setOnce": false,
  "visitor": {
    "data": {}
  }
}
```

Typical response

```json
{
  "created": false,
  "visitor": {
    "attributes": [
      {
        "boolValue": false,
        "dateValue": "2026-10-25T09:20:08.958Z",
        "key": "rating",
        "numberValue": 0,
        "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
        "value": "8"
      }
    ],
    "createdAt": "2026-10-25T09:20:08.958Z",
    "deviceCount": 2,
    "devices": [
      {
        "asn": 7922,
        "browserLanguage": "en-US,en;q=0.9",
        "browserName": "Chrome",
        "browserVersion": "99.0.4844.51",
        "city": "New York",
        "country": "US",
        "createdAt": "2026-10-25T09:20:08.958Z",
        "deviceActor": "DEVICE_ACTOR_HUMAN",
        "deviceActorName": "GPTBot",
        "deviceActorOrigin": "OpenAI",
        "deviceBrand": "Apple",
        "deviceConcurrency": 4,
        "deviceMemory": 6,
        "deviceName": "iPhone 14 Pro",
        "deviceType": "DEVICE_TYPE_MOBILE",
        "gpu": "Apple GPU",
        "id": "6f1b2e90-1234-4c8f-91e1-63cd927bf908",
        "ipAddress": "203.0.113.42",
        "isp": "Comcast Cable Communications",
        "lastUsedAt": "2026-10-25T09:20:08.958Z",
        "networkBandwidth": 10,
        "networkConnection": "4g",
        "networkRtt": 50,
        "platformName": "macOS",
        "platformVersion": "10.15.7",
        "region": "CRF",
        "screenHeight": 1117,
        "screenRatio": 1.55,
        "screenWidth": 1728,
        "state": "NY",
        "timezone": "Europe/London",
        "touchScreen": true,
        "updatedAt": "2026-10-25T09:20:08.958Z",
        "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1"
      }
    ],
    "email": "sam.visitor@example.com",
    "events": [
      {
        "action": "SCAN",
        "createdAt": "2026-10-25T09:20:08.958Z",
        "id": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
        "linkId": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
        "scannedAt": "2026-10-25T09:20:08.958Z",
        "visitType": "FIRST"
      }
    ],
    "firstName": "Sam",
    "id": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
    "lastName": "Rivera",
    "links": [
      {
        "entrypoint": "https://linkbreak.ing/4BnH-R19p",
        "eventCount": 12,
        "firstVisitedAt": "2026-10-25T09:20:08.958Z",
        "id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
        "lastVisitedAt": "2026-10-25T09:20:08.958Z",
        "name": "Spring Launch Campaign",
        "shortlink": "4BnH-R19p"
      }
    ],
    "phone": "+15551234567",
    "qrcodeCount": 3,
    "updatedAt": "2026-10-25T09:20:08.958Z",
    "visitCount": 42,
    "workspaceId": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0"
  }
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/visitors/search`

Requires auth

## [#](#search-visitors)Search visitors

Same as List visitors, with the parameters sent as a JSON body so they can include attributeFilters. Every filter must match, for example budget at least 800000 and timeline equal to under\_6\_months. Requires the \`visitors:read\` scope.

### [#](#search-visitors-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#search-visitors-request)Request body

attributeFilters

array<object>

Only return visitors matching every filter, for example budget >= 800000 and timeline = "under\_6\_months". At most 20\. Over REST, use POST /v1/visitors/search: a query string cannot carry them.

email

string

optional exact match filter

include

array<string>

linkId

string

optional filter by link ID (UUID; visitors who have interacted with this link)

pageSize

integer (int64)

Maximum number of visitors to return (default 50, max 200)

pageToken

string

Cursor token to retrieve the next page of results

responseFormat

string (enum)

ResponseFormat defines the transport format the API should return for list-style endpoints.

##### Allowed values

`RESPONSE_FORMAT_UNSPECIFIED`

Response format not specified

`RESPONSE_FORMAT_JSON`

Response format JSON

`RESPONSE_FORMAT_CSV`

Response format CSV

search

string

optional fuzzy search across known fields

sortDirection

string (enum)

SortDirection is the ordering applied to any sortable list endpoint. Shared across resources so a caller learns it once.

##### Allowed values

`SORT_DIRECTION_UNSPECIFIED`

Sort direction not specified (defaults to descending)

`SORT_DIRECTION_ASC`

Sort in ascending order

`SORT_DIRECTION_DESC`

Sort in descending order

sortField

string (enum)

Fields that can be used to sort visitors

##### Allowed values

`VISITOR_SORT_FIELD_UNSPECIFIED`

Sort field not specified (defaults to created\_at)

`VISITOR_SORT_FIELD_CREATED_AT`

Sort by the date the visitor was first seen

`VISITOR_SORT_FIELD_VISIT_COUNT`

Sort by total number of visits (events)

`VISITOR_SORT_FIELD_DEVICE_COUNT`

Sort by number of attributed devices

`VISITOR_SORT_FIELD_QRCODE_COUNT`

Sort by number of distinct QR codes interacted with

### [#](#search-visitors-response)Response

200

Everything worked as expected.

csv

object

ListVisitorsCsvResponse carries the raw CSV when ResponseFormat is set to RESPONSE\_FORMAT\_CSV.

json

object

ListVisitorsJsonResponse is the default structured payload used by dashboards.

### [#](#search-visitors-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/visitors/search" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"attributeFilters":[{"key":"budget","operator":"VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_OR_EQUAL","value":"800000"}],"email":"string","include":["devices","events","links"],"linkId":"1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed","pageSize":0,"pageToken":"string","responseFormat":"RESPONSE_FORMAT_JSON","search":"string","sortDirection":"SORT_DIRECTION_DESC","sortField":"VISITOR_SORT_FIELD_VISIT_COUNT"}'
```

Sample payload (application/json)

```json
{
  "attributeFilters": [
    {
      "key": "budget",
      "operator": "VISITOR_ATTRIBUTE_FILTER_OPERATOR_NUMBER_GREATER_OR_EQUAL",
      "value": "800000"
    }
  ],
  "email": "string",
  "include": [
    "devices",
    "events",
    "links"
  ],
  "linkId": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
  "pageSize": 0,
  "pageToken": "string",
  "responseFormat": "RESPONSE_FORMAT_JSON",
  "search": "string",
  "sortDirection": "SORT_DIRECTION_DESC",
  "sortField": "VISITOR_SORT_FIELD_VISIT_COUNT"
}
```

Typical response

```json
{
  "csv": {
    "contentType": "string",
    "csvData": "string"
  },
  "json": {
    "hasMore": false,
    "nextPageToken": "eyJ2aXNpdG9ySWQiOiI0ZGEzIn0=",
    "totalCount": 128,
    "visitors": [
      {
        "attributes": [],
        "createdAt": "2026-10-25T09:20:08.959Z",
        "deviceCount": 2,
        "devices": [],
        "email": "sam.visitor@example.com",
        "events": [],
        "firstName": "Sam",
        "id": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
        "lastName": "Rivera",
        "links": [],
        "phone": "+15551234567",
        "qrcodeCount": 3,
        "updatedAt": "2026-10-25T09:20:08.959Z",
        "visitCount": 42,
        "workspaceId": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0"
      }
    ]
  }
}
```

Base URL: `https://api.linkbreakers.com`

PATCH

`/v1/visitors/{id}`

Requires auth

## [#](#update-a-visitor)Update a visitor

Applies partial attribute updates to an existing visitor profile. Requires the \`visitors:write\` scope.

### [#](#update-a-visitor-parameters)Parameters

#### path parameters

id

string

Required

path

Visitor identifier (UUID)

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#update-a-visitor-request)Request body

visitor

object

Input payload for identifying/updating a visitor - Reserved keys (system fields) have a "$" prefix, e.g. "$email", "$phone", "$firstName", "$lastName". - All other keys are treated as custom attributes and stored in \`attributes\`.

### [#](#update-a-visitor-response)Response

200

Everything worked as expected.

attributes

array<object>

Arbitrary attributes provided without "$" prefix, with the type each value was captured as.

createdAt

string (date-time)

Timestamps

deviceCount

integer (int64)

Number of devices attributed to this visitor

devices

array<object>

Device information collected during visitor interactions

email

string

from "$email"

events

array<object>

Events associated with this visitor

firstName

string

from "$firstName" (optional)

id

string

Unique ID (UUID)

lastName

string

from "$lastName" (optional)

links

array<object>

Links associated with this visitor via events (included only on demand)

phone

string

from "$phone"

qrcodeCount

integer (int64)

Number of distinct QR codes / links this visitor has interacted with

updatedAt

string (date-time)

visitCount

integer (int64)

Total number of events (visits) recorded for this visitor

workspaceId

string

Workspace that owns this visitor (UUID)

### [#](#update-a-visitor-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X PATCH "https://api.linkbreakers.com/v1/visitors/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"visitor":{"data":{}}}'
```

Sample payload (application/json)

```json
{
  "visitor": {
    "data": {}
  }
}
```

Typical response

```json
{
  "attributes": [
    {
      "boolValue": false,
      "dateValue": "2026-10-25T09:20:08.959Z",
      "key": "rating",
      "numberValue": 0,
      "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
      "value": "8"
    }
  ],
  "createdAt": "2026-10-25T09:20:08.959Z",
  "deviceCount": 2,
  "devices": [
    {
      "asn": 7922,
      "browserLanguage": "en-US,en;q=0.9",
      "browserName": "Chrome",
      "browserVersion": "99.0.4844.51",
      "city": "New York",
      "country": "US",
      "createdAt": "2026-10-25T09:20:08.959Z",
      "deviceActor": "DEVICE_ACTOR_HUMAN",
      "deviceActorName": "GPTBot",
      "deviceActorOrigin": "OpenAI",
      "deviceBrand": "Apple",
      "deviceConcurrency": 4,
      "deviceMemory": 6,
      "deviceName": "iPhone 14 Pro",
      "deviceType": "DEVICE_TYPE_MOBILE",
      "gpu": "Apple GPU",
      "id": "6f1b2e90-1234-4c8f-91e1-63cd927bf908",
      "ipAddress": "203.0.113.42",
      "isp": "Comcast Cable Communications",
      "lastUsedAt": "2026-10-25T09:20:08.959Z",
      "networkBandwidth": 10,
      "networkConnection": "4g",
      "networkRtt": 50,
      "platformName": "macOS",
      "platformVersion": "10.15.7",
      "region": "CRF",
      "screenHeight": 1117,
      "screenRatio": 1.55,
      "screenWidth": 1728,
      "state": "NY",
      "timezone": "Europe/London",
      "touchScreen": true,
      "updatedAt": "2026-10-25T09:20:08.960Z",
      "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1"
    }
  ],
  "email": "sam.visitor@example.com",
  "events": [
    {
      "action": "SCAN",
      "createdAt": "2026-10-25T09:20:08.960Z",
      "id": "8b6e1a2c-7d4f-4fd2-8b35-9a4c1f2d993a",
      "linkId": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
      "scannedAt": "2026-10-25T09:20:08.960Z",
      "visitType": "FIRST"
    }
  ],
  "firstName": "Sam",
  "id": "4da3e6a2-2d54-4b0f-9e17-4b6c2af7e9c5",
  "lastName": "Rivera",
  "links": [
    {
      "entrypoint": "https://linkbreak.ing/4BnH-R19p",
      "eventCount": 12,
      "firstVisitedAt": "2026-10-25T09:20:08.960Z",
      "id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
      "lastVisitedAt": "2026-10-25T09:20:08.960Z",
      "name": "Spring Launch Campaign",
      "shortlink": "4BnH-R19p"
    }
  ],
  "phone": "+15551234567",
  "qrcodeCount": 3,
  "updatedAt": "2026-10-25T09:20:08.960Z",
  "visitCount": 42,
  "workspaceId": "c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0"
}
```

Base URL: `https://api.linkbreakers.com`

DELETE

`/v1/visitors/{id}`

Requires auth

## [#](#delete-a-visitor)Delete a visitor

Removes a visitor profile and its stored attributes from the workspace. Requires the \`visitors:write\` scope.

### [#](#delete-a-visitor-parameters)Parameters

#### path parameters

id

string

Required

path

Visitor identifier to remove (UUID)

### [#](#delete-a-visitor-response)Response

200

Everything worked as expected.

success

boolean

Indicates whether the visitor record was deleted

### [#](#delete-a-visitor-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X DELETE "https://api.linkbreakers.com/v1/visitors/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "success": false
}
```

Base URL: `https://api.linkbreakers.com`

DELETE

`/v1/visitors/{id}/attributes/{attributeKey}`

Requires auth

## [#](#delete-a-visitor-attribute)Delete a visitor attribute

Deletes a single attribute from the visitor profile without affecting other data. Requires the \`visitors:write\` scope.

### [#](#delete-a-visitor-attribute-parameters)Parameters

#### path parameters

id

string

Required

path

Visitor identifier whose attribute should be removed (UUID)

attributeKey

string

Required

path

Attribute key to delete (without "$" prefix)

### [#](#delete-a-visitor-attribute-response)Response

200

Everything worked as expected.

success

boolean

Indicates whether the attribute was removed

### [#](#delete-a-visitor-attribute-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X DELETE "https://api.linkbreakers.com/v1/visitors/{id}/attributes/{attributeKey}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "success": false
}
```

Base URL: `https://api.linkbreakers.com`

---

Source: https://linkbreakers.com/help/api/visitors
