Skip to main content

1. Get an API key

A workspace admin can mint a key in the Parable app under Settings → API. The full token — parable_ followed by 32 random characters — is shown exactly once at creation; Parable stores only a hash. Keys are workspace-scoped and read all processed captures in the workspace. Treat them like passwords.

2. Pull the first page

curl -H "Authorization: Bearer parable_..." \
  "https://api.parable.so/api/v1/captures?limit=2"
{
  "captures": [{ "id": "9f2c...", "title": "Device demo", "segments": [...] }],
  "pageInfo": {
    "endCursor": "djE6NDI",
    "hasNextPage": true
  }
}
Each list item is a complete transcript document — one request is a complete ingest step, no follow-up fetches needed.

3. Run the cursor loop

Treat cursors as opaque strings: store and echo them, never interpret them.
cursor = load_stored_cursor()          # None on first run
while True:
    url = "https://api.parable.so/api/v1/captures?limit=100"
    if cursor:
        url += f"&after={cursor}"
    page = get(url)                    # with the Authorization header
    ingest(page["captures"])           # append-only; no upserts needed
    if page["pageInfo"]["endCursor"]:
        cursor = page["pageInfo"]["endCursor"]
        store_cursor(cursor)           # persist after each page
    if not page["pageInfo"]["hasNextPage"]:
        break
Run that on a cron (for example every minute). The first un-cursored run pages through full history; after that each run picks up only what’s new.
The stream never emits a capture behind a cursor you have already advanced past, so this loop cannot skip data. endCursor is null when a page is empty — keep your previous cursor.

4. Optionally, add a webhook

If you’d rather be pushed to than poll, Parable can POST each finished transcript to your endpoint — see Webhooks. The pull API remains your recovery path: anything that exhausts webhook retries is still in the stream.