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.