What changed
API keys
v1 keys (klipy_pk_<id>) and v2 keys (klipy_live_<random>) are different formats and are not interchangeable — a v1 key does not authenticate against /api/v2/*, and a v2 key does not authenticate against /api/v1/*. You’ll need to issue new v2 keys; see Issuing API keys.
Two other differences worth knowing before you migrate:
- Scopes are required. v1 keys were issued with full (
ALL) access. v2 has noALLscope — you choose exactly whichresource:actionscopes a key needs at creation time. - Access level is explicit. v2 keys are either organization-wide or bound to a single user, chosen at creation. v1 had no equivalent concept.
Resource naming
The v1people resource is called contacts in v2 — same underlying object, new name:
New in v2
v2 covers the full CRM object model, not just the three resources v1 exposed:- New resources: deals, pipelines, tasks, notes, segments, meetings, recordings, bookings.
- Relationship sub-resources: link/unlink contacts and companies on a deal, records on a note, members on a segment, and single deal/company associations on a meeting. See Introduction.
- Batch-create:
POST /{resource}/batchfor up to 100 items in one request, on every resource that supports creation. - Idempotency: every
POST/PATCHaccepts anIdempotency-Keyheader so retries are safe.
Recordings API
TheGET /recordings and GET /recordings/{id} endpoints provide access to meeting transcripts, not stored video. The fields differ from earlier approaches:
has_transcript— boolean.trueif a transcript exists for this recording;falseif transcription is still in progress, or if the meeting produced no audio (e.g., notetaker was removed before any audio captured).transcript_url— string or null. Whenhas_transcriptistrue, this is a short-lived (approximately 5 minutes) single-purpose tokenized HTTPS GET link that returns the transcript as JSON. Whenhas_transcriptisfalse, this field isnull. Do not hardcode the URL; always fetch it from the response and follow the returned link. Once the link expires (~5 minutes), requests to that URL return404; the link may be fetched multiple times while valid. To retrieve an expired token, callGET /recordings/{id}again to obtain a fresh one. The/transcripts/downloadendpoint is rate limited; exceeding limits returns429with aRetry-Afterheader.recording_urlandvideo_statusare deprecated static fields. Klipy no longer stores playable meeting video. The Recall.ai provider retains raw media for a limited window; Klipy retains transcripts as structured records for long-term access.
GET /recordings?limit=... to list recordings and check has_transcript, then GET /recordings/{id} to retrieve transcript_url for transcripts that exist.
What didn’t change
- Field naming. Both v1 and v2 use
snake_caseJSON field names. - Envelope shape. Both use the same
{ object, data, meta }pattern for single-resource responses and cursor-basedpage_infofor lists. - Rate limits. Both are 200 req/min per key, 1000 req/min per organization.
Migration checklist
1
Issue a v2 key
Create a new key at Settings → API with the scopes your integration needs. See Issuing API keys.
2
Update the base URL
Change requests from
https://api.klipy.ai/api/v1 to https://api.klipy.ai/api/v2.3
Rename `people` calls to `contacts`
Update any request path or reference from
/people to /contacts. The request/response shape for the equivalent operations is otherwise the same.4
Switch the auth header value
Swap the v1 key for the new v2 key in your
X-Klipy-Api-Key or Authorization: Bearer header — the header names themselves are unchanged.5
Test, then retire the v1 key
Once traffic is confirmed on v2, revoke the v1 key from the same settings page.
Related topics
- Introduction — full v2 concepts: envelope, scopes, batch, idempotency, relationships.
- Issuing API keys — the v2 key lifecycle.