One account, by the `uid` you provisioned it with. This is also the polling fallback if you would rather not receive [the index-ready webhook](/docs/white-label/webhooks).

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

```json
{
  "api_account": {
    "id": 4211,
    "uid": "tf-cust-8841",
    "label": "Acme Supply Co",
    "site_url": "https://acme.com",
    "connection_id": 9876,
    "sync_status": "synced",
    "index_ready": true,
    "last_synced_at": "2026-08-31T11:42:07Z",
    "posts": 214,
    "chunks": 1893,
    "top_level_context": "Acme Supply Co sells industrial fasteners and fixings to UK trade customers, mostly construction and light manufacturing. They position on next-day despatch and on stocking the long-tail sizes the big merchants drop.",
    "created_at": "2026-08-31T10:15:00Z"
  }
}
```

## Response fields

| Field | Type | Description |
|---|---|---|
| `api_account` | object | The account addressed by the `uid` in the path. |
| `api_account.id` | integer | Context Link's own id for the account. |
| `api_account.uid` | string | The customer id you provisioned the account with. |
| `api_account.label` | string | The account's display name, falling back to the uid. |
| `api_account.site_url` | string | The website being crawled, `null` for an account with no website. |
| `api_account.connection_id` | integer | The website connection's id, `null` for an account with no website. |
| `api_account.sync_status` | string | The crawl state: `unsynced`, `syncing`, `synced`, `error_syncing`, or `no_site` for an account with no website. |
| `api_account.index_ready` | boolean | Whether the account's website has completed a successful crawl. |
| `api_account.last_synced_at` | timestamp | When the website last finished syncing, `null` until the first crawl completes and for an account with no website. |
| `api_account.posts` | integer | Documents indexed across every connection the account owns. |
| `api_account.chunks` | integer | Embedded passages indexed across every connection the account owns. |
| `api_account.top_level_context` | string | A short paragraph describing who the customer is, `null` until there is content to describe it from. |
| `api_account.created_at` | timestamp | When the account was provisioned. |

`sync_status` is one of `unsynced`, `syncing`, `synced`, `error_syncing`, or `no_site` for an account with no website. `index_ready` turns `true` once the first crawl has completed successfully. Tokens are never included in this response.

Site-less accounts skip the crawl entirely; they are queryable as soon as content is [pushed](/docs/white-label/upsert-post).

## Who is this customer?

`top_level_context` is a short plain-text paragraph describing the account: what they do, who they serve, the category they sit in. It saves you running your own summarisation pass before you can personalise a screen, a prompt or an onboarding email.

It is written once, automatically, as soon as there is something to describe: the first successful crawl of the account's website, or the first post [pushed](/docs/white-label/upsert-post) into it for an account with no site. Until then it is `null`, so treat it the way you treat `index_ready` — poll or wait for the webhook rather than blocking a signup on it. An account too thin to describe stays `null` and is retried on its next sync, rather than being frozen with a placeholder.

It is derived from that account's own material and nothing else. It never carries your organisation's description, and never another customer's.

> The paragraph is generated from customer content, so treat it as **untrusted text** wherever you use it: render it as plain text, and if you feed it into a prompt, tell the model to describe it rather than follow it.
