This endpoint lists every source one customer has connected, and what each one is doing right now. It is also how you discover connections you have no uid stored for. That happens after a `connection_type.revoked`, or when you are reconciling a partial signup.

```bash
curl "https://context-link.ai/api/v1/api_accounts/tf-cust-8841/connections" \
  -H "Authorization: Bearer $PROVISIONING_TOKEN"
```

```json
{
  "connections": [
    {
      "id": 9012,
      "uid": "acme-yt-main",
      "connection_type": "youtube",
      "name": "Youtube",
      "status": "connected",
      "auth_status": "authorised",
      "sync_status": "synced",
      "post_count": 214,
      "last_synced_at": "2026-09-12T11:42:07Z"
    },
    {
      "id": 9013,
      "uid": "acme-gdrive",
      "connection_type": "google_doc",
      "name": "GoogleDoc",
      "status": "redirect_required",
      "auth_status": "auth_failed",
      "sync_status": "error_syncing",
      "post_count": 1893,
      "last_synced_at": "2026-09-01T09:03:44Z"
    }
  ]
}
```

`GET /api/v1/api_accounts/:uid/connections/:connection_uid` returns the same shape for one row. An unknown connection uid, or one belonging to another customer, is a `404`.

## Response fields

| Field | Type | Description |
|---|---|---|
| `id` | integer | Context Link's own id for the connection. |
| `uid` | string | The uid you chose when you connected it. The website connection is the exception: it is created from `site_url` when you provision the account, so its uid is always `site`. |
| `connection_type` | string | The type, in the same form you sent it. |
| `name` | string | The type's display name. Never partner-supplied. |
| `status` | string | The three-value summary: `redirect_required`, `pending` or `connected`. |
| `auth_status` | string | `pending_auth`, `authorised`, `auth_failed` or `disconnected`. |
| `sync_status` | string | `unsynced`, `syncing`, `synced` or `error_syncing`. A source that has not yet attempted a fetch is `unsynced`, never `null`. |
| `post_count` | integer | Documents currently indexed from this source. |
| `post_request_limit` | integer | The ceiling on documents fetched per sync for this connection: 500 for most types, 30 for YouTube, 50 for Web Mentions. Always a number on a fleet connection, and lower than the default if we have turned this one down for you. |
| `last_synced_at` | timestamp | When it last finished a sync, `null` if it never has. |

The customer's memory connection is deliberately not listed. It holds what your product pushed, rather than a source the customer connected.

## Reading the two statuses together

`auth_status` answers "can we still reach the source". `sync_status` answers "how did the last fetch go". They move independently, so a support screen should show both.

| Combination | What has happened |
|---|---|
| `pending_auth` + `null` | Waiting on the customer at the provider's consent screen. |
| `authorised` + `syncing` | Connected, first or subsequent fetch in flight. |
| `authorised` + `synced` | Healthy. |
| `authorised` + `error_syncing` | The source itself failed: an API outage, a removed folder. It retries on the next scheduled sync. |
| `auth_failed` + anything | The grant died. Content is kept; the customer must [re-authorise](/docs/white-label/connect-source#re-authorising-a-dead-connection). |

Polling is the fallback, not the plan. The `connection.authorised` and `connection.auth_failed` [webhooks](/docs/white-label/webhooks) fire the moment either happens, and the per-organisation rate limit is shared across your entire fleet.
