For customer data that isn't on their website (dashboards, help docs, CRM notes), push it in through the [Custom Connections API](/docs/custom-connections) with that customer's token.

You'll almost always want exactly **one custom connection per customer**: create it once right after provisioning and store the returned connection id as `CONN_ID` alongside the token. Then [upsert documents into it](/docs/white-label/upsert-post) whenever your source data changes.

```bash
curl -X POST "https://context-link.ai/api/v1/custom_connections" \
  -H "Authorization: Bearer $ACME_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Acme app data" }'
```

```json
{
  "connection": {
    "id": 5501,
    "name": "Acme app data",
    "scope": "personal",
    "created_by_user_id": 4211,
    "post_count": 0,
    "last_synced_at": null,
    "created_at": "2026-08-31T10:16:04Z"
  }
}
```

## Request fields

| Field | Type | Description |
|---|---|---|
| `name` | string | Required. What the connection is called in Context Link, up to 255 characters. |

## Response fields

| Field | Type | Description |
|---|---|---|
| `connection` | object | The custom connection that was created. |
| `connection.id` | integer | The connection id to store as `CONN_ID` and use in every later upsert. |
| `connection.name` | string | The name you gave the connection. |
| `connection.scope` | string | Always `personal` for an API account, so its content stays private to that customer. |
| `connection.created_by_user_id` | integer | The id of the account whose token created the connection. |
| `connection.post_count` | integer | Documents currently in the connection, so `0` on creation. |
| `connection.last_synced_at` | timestamp | When content was last pushed, `null` until the first upsert. |
| `connection.created_at` | timestamp | When the connection was created. |

Content pushed as a customer is only ever visible to that customer. **Personal scope is enforced server-side for API accounts**; there is no `scope` parameter to get wrong.

## Shared content across all customers

> **Organisation-level content is fleet-visible.** Anything indexed at organisation level is blended into **every** customer's results, and every customer's answers can cite it. That is the point (shared help docs, a product glossary, an FAQ), but it also means one customer's data must never be indexed there. If in doubt, push through the customer's token: content pushed as an API account can never leak sideways.

To make something retrievable by every customer, push it **as yourself**, not as an API account: the partner admin's own custom-connections token (from Settings) creates organisation-level connections. Tenant content in through the customer's token; fleet-wide content through yours.

The same asymmetry applies to [namespaces](/docs/white-label/namespaces): an API account's note lands in that account's **private** memory, never the organisation's.
