---
title: "Contact Integrations API Reference"
description: "Add the people who scan your QR codes and fill your forms to the tools you reach your customers with (Bird and more), as contacts and to a list or audience."
canonical: "https://linkbreakers.com/help/api/contact-integrations"
---

# Contact Integrations

Add the people who scan your QR codes and fill your forms to the tools you reach your customers with (Bird and more), as contacts and to a list or audience.

## Contact Integrations

## [#](#contact-integrations-object)The Contact Field object

ContactField is one custom field of a tool.

key

string

The key mappings use.

type

string

The field's type in the tool: string, number, boolean or datetime.

Example object

```json
{
  "key": "string",
  "type": "string"
}
```

GET

`/v1/integrations/contacts`

Requires auth

## [#](#list-contact-integrations)List contact integrations

Return every contact tool the workspace syncs identified visitors to, without credentials. Requires the \`integrations:read\` scope.

### [#](#list-contact-integrations-parameters)Parameters

This endpoint does not accept any parameters.

### [#](#list-contact-integrations-response)Response

200

Everything worked as expected.

connections

array<object>

Every tool the workspace syncs contacts to.

### [#](#list-contact-integrations-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/integrations/contacts" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "connections": [
    {
      "accountLabel": "string",
      "capabilities": {
        "acceptsAnyField": false,
        "consent": false,
        "doubleOptIn": false,
        "listNoun": "string",
        "recordKinds": [],
        "tags": false
      },
      "contactListId": "string",
      "contactListName": "string",
      "contactsSynced": 0,
      "createdAt": "2026-11-09T16:53:33.054Z",
      "delivery": {
        "directoryIds": [],
        "linkIds": [],
        "moments": [],
        "stepIds": [],
        "tagIds": [],
        "targetsGone": false,
        "visitorAttributeKeys": [],
        "visitorData": "INTEGRATION_VISITOR_DATA_UNSPECIFIED"
      },
      "lastError": "string",
      "lastErrorAt": "2026-11-09T16:53:33.054Z",
      "lastSyncedAt": "2026-11-09T16:53:33.054Z",
      "options": {
        "consentAttributeKey": "string",
        "doubleOptIn": false,
        "fieldMappings": [],
        "listRequiresConsent": false,
        "pipelineId": "string",
        "recordKind": "CONTACT_RECORD_KIND_UNSPECIFIED",
        "recordTitle": "string",
        "stageId": "string",
        "tags": []
      },
      "tool": "CONTACT_TOOL_UNSPECIFIED",
      "updatedAt": "2026-11-09T16:53:33.054Z"
    }
  ]
}
```

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

GET

`/v1/integrations/contacts/{tool}`

Requires auth

## [#](#get-a-contact-integration)Get a contact integration

Return the workspace's connection to one contact tool, without its credential. Requires the \`integrations:read\` scope.

### [#](#get-a-contact-integration-parameters)Parameters

#### path parameters

tool

string

Required

path

The tool.

### [#](#get-a-contact-integration-response)Response

200

Everything worked as expected.

connection

object

One tool a workspace syncs its identified visitors to.

### [#](#get-a-contact-integration-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/integrations/contacts/{tool}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "connection": {
    "accountLabel": "string",
    "capabilities": {
      "acceptsAnyField": false,
      "consent": false,
      "doubleOptIn": false,
      "listNoun": "string",
      "recordKinds": [
        "CONTACT_RECORD_KIND_UNSPECIFIED"
      ],
      "tags": false
    },
    "contactListId": "string",
    "contactListName": "string",
    "contactsSynced": 0,
    "createdAt": "2026-11-09T16:53:33.054Z",
    "delivery": {
      "directoryIds": [
        "string"
      ],
      "linkIds": [
        "string"
      ],
      "moments": [
        "KIND_UNSPECIFIED"
      ],
      "stepIds": [
        "string"
      ],
      "tagIds": [
        "string"
      ],
      "targetsGone": false,
      "visitorAttributeKeys": [
        "string"
      ],
      "visitorData": "INTEGRATION_VISITOR_DATA_UNSPECIFIED"
    },
    "lastError": "string",
    "lastErrorAt": "2026-11-09T16:53:33.054Z",
    "lastSyncedAt": "2026-11-09T16:53:33.055Z",
    "options": {
      "consentAttributeKey": "string",
      "doubleOptIn": false,
      "fieldMappings": [
        {}
      ],
      "listRequiresConsent": false,
      "pipelineId": "string",
      "recordKind": "CONTACT_RECORD_KIND_UNSPECIFIED",
      "recordTitle": "string",
      "stageId": "string",
      "tags": [
        "string"
      ]
    },
    "tool": "CONTACT_TOOL_UNSPECIFIED",
    "updatedAt": "2026-11-09T16:53:33.055Z"
  }
}
```

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

GET

`/v1/integrations/contacts/{tool}/fields`

Requires auth

## [#](#list-a-contact-tool-s-fields)List a contact tool's fields

Return the custom fields of the connected tool, with their types. Requires the \`integrations:read\` scope.

### [#](#list-a-contact-tool-s-fields-parameters)Parameters

#### path parameters

tool

string

Required

path

The connected tool.

### [#](#list-a-contact-tool-s-fields-response)Response

200

Everything worked as expected.

fields

array<object>

### [#](#list-a-contact-tool-s-fields-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/integrations/contacts/{tool}/fields" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "fields": [
    {
      "key": "string",
      "type": "string"
    }
  ]
}
```

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

GET

`/v1/integrations/contacts/{tool}/lists`

Requires auth

## [#](#list-a-contact-tool-s-lists)List a contact tool's lists

Return the lists, audiences or groups of the connected tool. Requires the \`integrations:read\` scope.

### [#](#list-a-contact-tool-s-lists-parameters)Parameters

#### path parameters

tool

string

Required

path

The connected tool.

### [#](#list-a-contact-tool-s-lists-response)Response

200

Everything worked as expected.

lists

array<object>

The tool's lists, audiences or groups.

### [#](#list-a-contact-tool-s-lists-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/integrations/contacts/{tool}/lists" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "lists": [
    {
      "id": "string",
      "name": "string"
    }
  ]
}
```

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

GET

`/v1/integrations/contacts/{tool}/pipelines`

Requires auth

## [#](#list-a-crm-s-pipelines)List a CRM's pipelines

Return the pipelines of the connected CRM and their stages. Requires the \`integrations:read\` scope.

### [#](#list-a-crm-s-pipelines-parameters)Parameters

#### path parameters

tool

string

Required

path

The connected CRM.

### [#](#list-a-crm-s-pipelines-response)Response

200

Everything worked as expected.

pipelines

array<object>

### [#](#list-a-crm-s-pipelines-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/integrations/contacts/{tool}/pipelines" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "pipelines": [
    {
      "id": "string",
      "name": "string",
      "stages": [
        {}
      ]
    }
  ]
}
```

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

POST

`/v1/integrations/contacts/{tool}/connect`

Requires auth

## [#](#connect-a-contact-tool)Connect a contact tool

Connect a contact tool with its credential, or replace the stored one. The credential is checked against the tool first. Identified visitors are then created or updated as contacts there, at every step of every link until the delivery setting narrows it. Requires the \`integrations:write\` scope.

### [#](#connect-a-contact-tool-parameters)Parameters

#### path parameters

tool

string

Required

path

The tool to connect.

#### header parameters

Idempotency-Key

string

header

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

### [#](#connect-a-contact-tool-request)Request body

account

string

What the credential belongs to, for the tools that need it next to the key: an account URL, a domain, a site id. Empty for the others (Bird).

apiKey

string

Its credential: the tool's API key or token. Bird: a workspace API key (bk\_us1\_... or bk\_eu1\_...) with the email\_marketing write scope; the others: see contact\_integration\_connect.

### [#](#connect-a-contact-tool-response)Response

200

Everything worked as expected.

connection

object

One tool a workspace syncs its identified visitors to.

### [#](#connect-a-contact-tool-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/integrations/contacts/{tool}/connect" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"account":"string","apiKey":"string"}'
```

Sample payload (application/json)

```json
{
  "account": "string",
  "apiKey": "string"
}
```

Typical response

```json
{
  "connection": {
    "accountLabel": "string",
    "capabilities": {
      "acceptsAnyField": false,
      "consent": false,
      "doubleOptIn": false,
      "listNoun": "string",
      "recordKinds": [
        "CONTACT_RECORD_KIND_UNSPECIFIED"
      ],
      "tags": false
    },
    "contactListId": "string",
    "contactListName": "string",
    "contactsSynced": 0,
    "createdAt": "2026-11-09T16:53:33.058Z",
    "delivery": {
      "directoryIds": [
        "string"
      ],
      "linkIds": [
        "string"
      ],
      "moments": [
        "KIND_UNSPECIFIED"
      ],
      "stepIds": [
        "string"
      ],
      "tagIds": [
        "string"
      ],
      "targetsGone": false,
      "visitorAttributeKeys": [
        "string"
      ],
      "visitorData": "INTEGRATION_VISITOR_DATA_UNSPECIFIED"
    },
    "lastError": "string",
    "lastErrorAt": "2026-11-09T16:53:33.058Z",
    "lastSyncedAt": "2026-11-09T16:53:33.058Z",
    "options": {
      "consentAttributeKey": "string",
      "doubleOptIn": false,
      "fieldMappings": [
        {}
      ],
      "listRequiresConsent": false,
      "pipelineId": "string",
      "recordKind": "CONTACT_RECORD_KIND_UNSPECIFIED",
      "recordTitle": "string",
      "stageId": "string",
      "tags": [
        "string"
      ]
    },
    "tool": "CONTACT_TOOL_UNSPECIFIED",
    "updatedAt": "2026-11-09T16:53:33.058Z"
  }
}
```

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

POST

`/v1/integrations/contacts/{tool}/test`

Requires auth

## [#](#test-a-contact-integration)Test a contact integration

Check the stored credential against the tool and list its custom field keys. Nothing is written to the tool. Requires the \`integrations:write\` scope.

### [#](#test-a-contact-integration-parameters)Parameters

#### path parameters

tool

string

Required

path

The connected tool.

#### header parameters

Idempotency-Key

string

header

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

### [#](#test-a-contact-integration-request)Request body

No structured schema available for this section.

### [#](#test-a-contact-integration-response)Response

200

Everything worked as expected.

acceptsAnyField

boolean

The tool takes any key as a custom field, so every answer the delivery setting sends reaches the contact.

customFieldKeys

array<string>

The tool's custom field keys, the keys visitor data can be saved to. Visitor attributes with other keys are left out.

### [#](#test-a-contact-integration-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/integrations/contacts/{tool}/test" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{}'
```

Sample payload (application/json)

```json
{}
```

Typical response

```json
{
  "acceptsAnyField": false,
  "customFieldKeys": [
    "string"
  ]
}
```

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

PATCH

`/v1/integrations/contacts/{tool}`

Requires auth

## [#](#update-a-contact-integration)Update a contact integration

Change the list or audience contacts are added to, and where, when and what is synced. Requires the \`integrations:write\` scope.

### [#](#update-a-contact-integration-parameters)Parameters

#### path parameters

tool

string

Required

path

The connected tool.

#### header parameters

Idempotency-Key

string

header

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

### [#](#update-a-contact-integration-request)Request body

contactListId

string

The list or audience to add contacts to, from contact\_integration\_lists. An empty string adds them to none; omit it to keep the current one.

delivery

object

IntegrationDelivery is the same three settings on every integration that sends data out: where (which links), when (which moments or steps) and what (how much visitor data). Everything has a default, so an integration works the moment it is connected and this is only for refining it.

options

object

ContactSyncOptions is how contacts are made in a tool.

### [#](#update-a-contact-integration-response)Response

200

Everything worked as expected.

connection

object

One tool a workspace syncs its identified visitors to.

### [#](#update-a-contact-integration-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/integrations/contacts/{tool}" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"contactListId":"string","delivery":{"directoryIds":["string"],"linkIds":["string"],"moments":["KIND_UNSPECIFIED"],"stepIds":["string"],"tagIds":["string"],"targetsGone":false,"visitorAttributeKeys":["string"],"visitorData":"INTEGRATION_VISITOR_DATA_UNSPECIFIED"},"options":{"consentAttributeKey":"string","doubleOptIn":false,"fieldMappings":[{"attributeKey":"string","toolField":"string"}],"listRequiresConsent":false,"pipelineId":"string","recordKind":"CONTACT_RECORD_KIND_UNSPECIFIED","recordTitle":"string","stageId":"string","tags":["string"]}}'
```

Sample payload (application/json)

```json
{
  "contactListId": "string",
  "delivery": {
    "directoryIds": [
      "string"
    ],
    "linkIds": [
      "string"
    ],
    "moments": [
      "KIND_UNSPECIFIED"
    ],
    "stepIds": [
      "string"
    ],
    "tagIds": [
      "string"
    ],
    "targetsGone": false,
    "visitorAttributeKeys": [
      "string"
    ],
    "visitorData": "INTEGRATION_VISITOR_DATA_UNSPECIFIED"
  },
  "options": {
    "consentAttributeKey": "string",
    "doubleOptIn": false,
    "fieldMappings": [
      {
        "attributeKey": "string",
        "toolField": "string"
      }
    ],
    "listRequiresConsent": false,
    "pipelineId": "string",
    "recordKind": "CONTACT_RECORD_KIND_UNSPECIFIED",
    "recordTitle": "string",
    "stageId": "string",
    "tags": [
      "string"
    ]
  }
}
```

Typical response

```json
{
  "connection": {
    "accountLabel": "string",
    "capabilities": {
      "acceptsAnyField": false,
      "consent": false,
      "doubleOptIn": false,
      "listNoun": "string",
      "recordKinds": [
        "CONTACT_RECORD_KIND_UNSPECIFIED"
      ],
      "tags": false
    },
    "contactListId": "string",
    "contactListName": "string",
    "contactsSynced": 0,
    "createdAt": "2026-11-09T16:53:33.057Z",
    "delivery": {
      "directoryIds": [
        "string"
      ],
      "linkIds": [
        "string"
      ],
      "moments": [
        "KIND_UNSPECIFIED"
      ],
      "stepIds": [
        "string"
      ],
      "tagIds": [
        "string"
      ],
      "targetsGone": false,
      "visitorAttributeKeys": [
        "string"
      ],
      "visitorData": "INTEGRATION_VISITOR_DATA_UNSPECIFIED"
    },
    "lastError": "string",
    "lastErrorAt": "2026-11-09T16:53:33.057Z",
    "lastSyncedAt": "2026-11-09T16:53:33.057Z",
    "options": {
      "consentAttributeKey": "string",
      "doubleOptIn": false,
      "fieldMappings": [
        {}
      ],
      "listRequiresConsent": false,
      "pipelineId": "string",
      "recordKind": "CONTACT_RECORD_KIND_UNSPECIFIED",
      "recordTitle": "string",
      "stageId": "string",
      "tags": [
        "string"
      ]
    },
    "tool": "CONTACT_TOOL_UNSPECIFIED",
    "updatedAt": "2026-11-09T16:53:33.057Z"
  }
}
```

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

DELETE

`/v1/integrations/contacts/{tool}`

Requires auth

## [#](#disconnect-a-contact-tool)Disconnect a contact tool

Stop syncing visitors to the tool and delete the stored credential. Contacts already synced are left as they are. Requires the \`integrations:write\` scope.

### [#](#disconnect-a-contact-tool-parameters)Parameters

#### path parameters

tool

string

Required

path

The tool to disconnect.

### [#](#disconnect-a-contact-tool-response)Response

200

Everything worked as expected.

No structured schema available for this section.

### [#](#disconnect-a-contact-tool-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/integrations/contacts/{tool}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{}
```

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

---

Source: https://linkbreakers.com/help/api/contact-integrations
