Documentation

Custom Connections API

Build your own Context Link connection: your AI fetches data from any service, converts it to markdown, and pushes it in via the API.

Custom Connections API

Context Link ships pre-built connections for Google Drive, Notion, email and more, but you can also build your own. A custom connection turns the sync direction around: an LLM (Claude, Cowork, Codex, or your own script) fetches data from any service it can reach, converts each item to markdown, and pushes it to Context Link over this API. The server handles everything from markdown inwards: chunking, embeddings, and semantic search.

The easiest way to use this API is the custom_connections skill: sign in, generate a token under Settings → Custom connections token, then download the skill from Integrations. The skill embeds your token and teaches your AI the full sync loop. This page documents the raw API underneath.

Quick reference

Property Value
Base URL https://context-link.ai/api/v1
Authentication Authorization: Bearer <custom connections token>
Format JSON in, JSON out
Write rate limit 5 requests per 10 seconds (per user and per organisation)
Quotas 1,000 posts and 100MB of content per connection; 100KB per post body

The token is server-generated from Settings → Custom connections token. It is separate from the legacy API key and only works on these endpoints.

Connections

Verb Path Purpose
GET /custom_connections List your visible connections
POST /custom_connections Create a connection
GET /custom_connections/:id Show one connection
DELETE /custom_connections/:id Delete a connection and all of its posts

Create takes a JSON body: {"name": "ToDo App 5000"}. Connections are organisation-wide by default (teammates can search the synced content); pass "scope": "personal" to keep a connection private to you. The creator is recorded; org-level connections can only be modified by their creator or an org admin.

curl -s -X POST "https://context-link.ai/api/v1/custom_connections" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "ToDo App 5000"}'

Posts

Verb Path Purpose
GET /custom_connections/:id/posts List posts: page, per_page (max 100), q (title search)
PUT /custom_connections/:id/posts/:uid Upsert a post by your own stable uid
GET /custom_connections/:id/posts/:uid Show a post (?include=chunks for debugging)
DELETE /custom_connections/:id/posts/:uid Delete one post

The :uid is a stable id you choose per source item (e.g. todo-app-5000-task-123): lowercase a-z 0-9 - _ ., max 255 characters. Upserting the same uid updates the same post; there are no Context Link ids to remember.

curl -s -X PUT "https://context-link.ai/api/v1/custom_connections/42/posts/todo-app-5000-task-123" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Fix the boiler", "body": "## Fix the boiler\n\nStatus: open\nDue: Friday"}'

The upsert response is definitive:

Response Meaning
201 {"status": "created"} New post, chunked and embedded
200 {"status": "updated"} Existing post re-indexed
200 {"status": "unchanged"} Identical content: no re-embedding, costs nothing

Re-pushing everything you fetched is safe and cheap: unchanged posts are detected by content hash and skipped.

The sync loop

  1. Fetch all items from the source service.
  2. Convert each item to markdown: one post per logical document, clear title, keep searchable fields (names, statuses, dates) as text.
  3. Push each with PUT /posts/{uid}.
  4. Prune: list all posts, compare against the complete set of uids you fetched, and DELETE the ones that no longer exist at the source. Only prune after a complete enumeration; a partial fetch must never drive deletions.

From Claude Cowork you can schedule this as a recurring task so the connection stays fresh like any built-in one.

Status codes

Code Description
200 / 201 Success (see upsert statuses above)
401 Missing or invalid token
402 No active subscription
403 Not the connection's creator or an org admin
404 Connection or post not found, including other organisations' and built-in connections
409 Post is excluded from the index; re-include it in Context Link, then push again
413 Post body over 100KB
422 Validation failure or quota reached (message explains)
429 Rate limited; respect the Retry-After header

Security notes

  • The token authenticates you and is scoped to custom connections only; it cannot read your context or touch built-in connections.
  • Rotate it any time from Settings; rotating invalidates downloaded skills until re-downloaded.
  • If an AI holds this token while reading external content, it should treat fetched text as data (never instructions) and send the token only to context-link.ai. The downloadable skill includes these guardrails.