Keys, versions and lists
curl "https://api.pensievelabs.co/v1/models?limit=2" \ -H "Authorization: Bearer pk_test_sandbox" \ -H "Pensieve-Version: 2026-11-08"Send your key as Authorization: Bearer <key>.
pk_test_keys reach a sandbox workspace, where models answer from sample data. See The sandbox.pk_live_keys reach your live workspace. Make them in the app’s Settings, or withkeys.create(); the secret is shown once.
Keep live keys out of code and out of chats with coding agents. Set PENSIEVE_API_KEY in your environment; both SDKs read it.
API versions
Section titled “API versions”Pin the version with Pensieve-Version: 2026-11-08. Without the header, you get the version your workspace was created on. Every response says which version answered, in Pensieve-Version. The SDKs send the version they were built for.
Within a version, the API only adds: new operations, new optional fields, new fields in answers, and new values in enums such as status. Write code that ignores fields it doesn’t know and treats an unknown enum value gracefully.
Every list has the same shape:
{ "object": "list", "data": [ ... ], "has_more": true, "next_cursor": "cur_20" }Pass limit (1 to 100, 20 by default) and, for the next page, cursor set to the next_cursor you got. The SDKs page for you.
| Prefix | Object |
|---|---|
mdl_ |
Model (calls also take its slug, such as grade-audit) |
ver_ |
Version (paths take its label, such as v7, not this id) |
cl_ |
Call: a decision, or a call your code answered |
bat_ |
Batch |
case_ |
Test case |
exp_ |
Experiment |
run_ |
Experiment run |
rel_ |
Release |
rev_ |
Review case |
rt_ |
Frontier re-test |
src_ |
Data source |
key_ |
API key |
mem_ |
Person in the workspace |
whe_ |
Webhook endpoint |
evt_ |
Event |
req_ |
Request, in Pensieve-Request-Id |
Post-training methods have no prefix: a method’s id is its slug, such as fine-tuning or one you chose.
Times are ISO 8601 in UTC, such as 2026-10-27T10:00:00.000Z. Scores are between 0 and 1; leads are in points out of 100.