REST API reference
Riverside API
12 endpoints for Riverside. Each one is a POST with a JSON body, called with your API key.
- Base URL
- https://cotlet.dev/api/v1/riverside
- Connects with
- Your own Riverside account (host, account owner, admin, director or editor, depending on the call)
- Integration page
- Riverside
| Endpoint | Access | Description |
|---|---|---|
| list_studios | read | Your studios with name, recording type and the studio link. |
| list_sessions | read | Sessions from the studio Planner, with time, time zone and invited people. |
| get_invite_links | read | The studio links to share with a guest, a producer or an audience. |
| list_recordings | read | Recordings in your projects, newest first, with duration, participants and upload status. |
| get_recording | read | One recording with its date, duration and each participant's tracks, with type and upload status. |
| get_transcript | read | The transcript of a recording with speaker names and timestamps. |
| download_tracks | read | Download links for the separate track of each participant in a recording. |
| create_studio | write | Create a new studio for a show. |
| schedule_session | write | Add a session to the studio Planner and email the people you invite. |
| update_session | write | Rename or reschedule a session, or change who is invited. |
| invite_guest | write | Email a studio invite for a scheduled session to a guest, producer or audience member. |
| cancel_session | write | Remove a scheduled session from the Planner. Recordings already made are kept. |
List studios
readPOST https://cotlet.dev/api/v1/riverside/list_studios
Returns every studio in your account, the ones you own and the ones you were added to. Use studio_id from each item in the other calls. Recording type is audio and video or audio only, as set in the studio.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/riverside/list_studios \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("riverside", "list_studios") const result = await cotlet.call('riverside', 'list_studios'); cotlet call riverside list_studios Example response
{
"studios": [
{
"studio_id": "std_8f2k41",
"name": "The Product Hour",
"recording_type": "audio_video",
"studio_url": "https://riverside.com/studio/the-product-hour"
},
{
"studio_id": "std_2m9c07",
"name": "Founders Q&A",
"recording_type": "audio_only",
"studio_url": "https://riverside.com/studio/founders-qa"
}
]
} List sessions
readPOST https://cotlet.dev/api/v1/riverside/list_sessions
Lists scheduled sessions in start order, soonest first. Each item has the invited guests, producers and audience members with their roles. Pass session_id to update_session, invite_guest or cancel_session.
Parameters
| Name | Type | Description |
|---|---|---|
| studio_id | string | Only this studio. Default: all studios. |
| from | date | Sessions on or after this date. Default: today. |
| to | date | Sessions on or before this date. |
| cursor | string | Next page cursor from the previous call. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/list_sessions \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("riverside", "list_sessions") const result = await cotlet.call('riverside', 'list_sessions'); cotlet call riverside list_sessions Example response
{
"sessions": [
{
"session_id": "ses_3vq9x7",
"studio_id": "std_8f2k41",
"name": "Episode 42: Pricing your first product",
"start": "2026-10-15T15:00:00+01:00",
"end": "2026-10-15T16:00:00+01:00",
"invited": [
{
"email": "guest@example.com",
"role": "guest"
}
]
}
],
"next_cursor": null
} Get invite links
readPOST https://cotlet.dev/api/v1/riverside/get_invite_links
Returns the studio link for each role. Guest and producer links let people join the studio; the audience link works only while audience public access is turned on in the studio. A link you share yourself does not expire, unlike the link in an invite email.
Parameters
| Name | Type | Description |
|---|---|---|
| studio_id required | string | Studio ID from list_studios. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/get_invite_links \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"studio_id":"studio_8c41d2"}' result = client.call("riverside", "get_invite_links", {"studio_id":"studio_8c41d2"}) const result = await cotlet.call('riverside', 'get_invite_links', {"studio_id":"studio_8c41d2"}); cotlet call riverside get_invite_links --data '{"studio_id":"studio_8c41d2"}' Example response
{
"studio_id": "std_8f2k41",
"links": {
"guest": "https://riverside.com/studio/the-product-hour?t=guest-token",
"producer": "https://riverside.com/studio/the-product-hour?t=producer-token",
"audience": null
}
} List recordings
readPOST https://cotlet.dev/api/v1/riverside/list_recordings
Lists recordings across your studios, newest first. Filter by studio or by date to find the latest episode. Upload status shows whether each participant's files are fully uploaded. Pass recording_id to get_recording, get_transcript and download_tracks.
Parameters
| Name | Type | Description |
|---|---|---|
| studio_id | string | Only this studio. Default: all studios. |
| since | date | Only recordings made on or after this date. |
| limit | integer | 1 to 50. Default: 20. |
| cursor | string | Next page cursor from the previous call. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/list_recordings \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("riverside", "list_recordings") const result = await cotlet.call('riverside', 'list_recordings'); cotlet call riverside list_recordings Example response
{
"recordings": [
{
"recording_id": "rec_71d3ab",
"studio_id": "std_8f2k41",
"title": "Episode 41: Launch week",
"recorded_at": "2026-10-08T15:02:00+01:00",
"duration_seconds": 3412,
"participants": [
"Host",
"Guest"
],
"upload_status": "complete"
}
],
"next_cursor": "eyJvZmZzZXQiOjIwfQ"
} Get recording
readPOST https://cotlet.dev/api/v1/riverside/get_recording
Returns one recording and the tracks of each participant. Each track has a type (audio or video, and screen share when one was recorded) and an upload status. Read it before download_tracks to see whether every track has finished uploading.
Parameters
| Name | Type | Description |
|---|---|---|
| recording_id required | string | Recording ID from list_recordings. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/get_recording \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"recording_id":"recording_8c41d2"}' result = client.call("riverside", "get_recording", {"recording_id":"recording_8c41d2"}) const result = await cotlet.call('riverside', 'get_recording', {"recording_id":"recording_8c41d2"}); cotlet call riverside get_recording --data '{"recording_id":"recording_8c41d2"}' Example response
{
"recording_id": "rec_71d3ab",
"title": "Episode 41: Launch week",
"duration_seconds": 3412,
"participants": [
{
"name": "Host",
"tracks": [
{
"type": "audio",
"upload_status": "complete"
},
{
"type": "video",
"upload_status": "complete"
}
]
},
{
"name": "Guest",
"tracks": [
{
"type": "audio",
"upload_status": "complete"
},
{
"type": "video",
"upload_status": "uploading"
}
]
}
]
} Get transcript
readPOST https://cotlet.dev/api/v1/riverside/get_transcript
Returns the transcript Riverside made for one recording, in speaker order with timestamps. Use format srt for subtitle files and txt for plain reading. The call fails if the recording has no transcript yet.
Parameters
| Name | Type | Description |
|---|---|---|
| recording_id required | string | Recording ID from list_recordings. |
| format | enum | txt or srt. Default: txt. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/get_transcript \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"recording_id":"recording_8c41d2"}' result = client.call("riverside", "get_transcript", {"recording_id":"recording_8c41d2"}) const result = await cotlet.call('riverside', 'get_transcript', {"recording_id":"recording_8c41d2"}); cotlet call riverside get_transcript --data '{"recording_id":"recording_8c41d2"}' Example response
{
"recording_id": "rec_71d3ab",
"format": "txt",
"text": "[00:00:04] Host: Welcome back to The Product Hour.\n[00:00:09] Guest: Thanks for having me."
} Download tracks
readPOST https://cotlet.dev/api/v1/riverside/download_tracks
Returns one download link per participant for the file type you choose: raw video, aligned video, raw audio or compressed audio, the options in the Riverside Download menu. Tracks that are still uploading are listed without a link. Screen share tracks in high quality exist only when the screen share was recorded with the Mac app. Edited tracks are not included; they come from an edit export.
Parameters
| Name | Type | Description |
|---|---|---|
| recording_id required | string | Recording ID from list_recordings. |
| file_type | enum | raw_video, aligned_video, raw_audio or compressed_audio, as named in the Riverside Download menu. Default: raw_audio. |
| participants | string[] | Only these participant names. Default: everyone. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/download_tracks \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"recording_id":"rec_71d3ab","file_type":"raw_audio"}' result = client.call("riverside", "download_tracks", {"recording_id":"rec_71d3ab","file_type":"raw_audio"}) const result = await cotlet.call('riverside', 'download_tracks', {"recording_id":"rec_71d3ab","file_type":"raw_audio"}); cotlet call riverside download_tracks --data '{"recording_id":"rec_71d3ab","file_type":"raw_audio"}' Example response
{
"recording_id": "rec_71d3ab",
"file_type": "raw_audio",
"files": [
{
"participant": "Host",
"url": "https://downloads.example.com/rec_71d3ab/host.wav",
"status": "ready"
},
{
"participant": "Guest",
"url": "https://downloads.example.com/rec_71d3ab/guest.wav",
"status": "ready"
}
]
} POST https://cotlet.dev/api/v1/riverside/create_studio
Creates a studio with the name and recording type you give. Studios count against the limit of your Riverside plan, so a new one can use up a slot. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| name required | string | Studio name, for example the show title. |
| recording_type | enum | audio_video or audio_only. Default: audio_video. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/create_studio \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Jane Doe"}' result = client.call("riverside", "create_studio", {"name":"Jane Doe"}) const result = await cotlet.call('riverside', 'create_studio', {"name":"Jane Doe"}); cotlet call riverside create_studio --data '{"name":"Jane Doe"}' Example response
{
"studio_id": "std_5t8n22",
"name": "Interview Series",
"recording_type": "audio_video",
"studio_url": "https://riverside.com/studio/interview-series"
} POST https://cotlet.dev/api/v1/riverside/schedule_session
Adds a session at the start and end time you give, in the time zone you set. Each guest in guest_emails gets an invite email with the session details and the studio link; the emailed link works until 24 hours after the start. Only the host, account owner, admins, directors and editors can schedule. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| studio_id required | string | Studio ID from list_studios. |
| name required | string | Session name, for example the episode title. |
| start required | datetime | ISO 8601 with time zone. |
| end required | datetime | ISO 8601 with time zone. |
| guest_emails | string[] | Guests to invite now. Default: none. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/schedule_session \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"studio_id":"std_8f2k41","name":"Episode 42: Pricing your first product","start":"2026-10-15T15:00:00+01:00","end":"2026-10-15T16:00:00+01:00","guest_emails":["guest@example.com"]}' result = client.call("riverside", "schedule_session", {"studio_id":"std_8f2k41","name":"Episode 42: Pricing your first product","start":"2026-10-15T15:00:00+01:00","end":"2026-10-15T16:00:00+01:00","guest_emails":["guest@example.com"]}) const result = await cotlet.call('riverside', 'schedule_session', {"studio_id":"std_8f2k41","name":"Episode 42: Pricing your first product","start":"2026-10-15T15:00:00+01:00","end":"2026-10-15T16:00:00+01:00","guest_emails":["guest@example.com"]}); cotlet call riverside schedule_session --data '{"studio_id":"std_8f2k41","name":"Episode 42: Pricing your first product","start":"2026-10-15T15:00:00+01:00","end":"2026-10-15T16:00:00+01:00","guest_emails":["guest@example.com"]}' Example response
{
"session_id": "ses_3vq9x7",
"studio_id": "std_8f2k41",
"status": "scheduled",
"start": "2026-10-15T15:00:00+01:00",
"invited": [
{
"email": "guest@example.com",
"role": "guest",
"email_sent": true
}
]
} POST https://cotlet.dev/api/v1/riverside/update_session
Changes the fields you pass and leaves the rest. When the date or time changes, Riverside emails the guests, producer and audience members that the session was updated, and the Google Calendar invite updates automatically. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| session_id required | string | Session ID from list_sessions. |
| name | string | New session name. |
| start | datetime | New start, ISO 8601 with time zone. |
| end | datetime | New end, ISO 8601 with time zone. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/update_session \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"session_id":"ses_3vq9x7","start":"2026-10-16T11:00:00+01:00","end":"2026-10-16T12:00:00+01:00"}' result = client.call("riverside", "update_session", {"session_id":"ses_3vq9x7","start":"2026-10-16T11:00:00+01:00","end":"2026-10-16T12:00:00+01:00"}) const result = await cotlet.call('riverside', 'update_session', {"session_id":"ses_3vq9x7","start":"2026-10-16T11:00:00+01:00","end":"2026-10-16T12:00:00+01:00"}); cotlet call riverside update_session --data '{"session_id":"ses_3vq9x7","start":"2026-10-16T11:00:00+01:00","end":"2026-10-16T12:00:00+01:00"}' Example response
{
"session_id": "ses_3vq9x7",
"status": "updated",
"start": "2026-10-16T11:00:00+01:00",
"end": "2026-10-16T12:00:00+01:00",
"notified": [
"guest@example.com"
]
} POST https://cotlet.dev/api/v1/riverside/invite_guest
Adds one person to a scheduled session and sends them an invite email with the session details and the studio link. Role is guest by default. Inviting the same email again resends the invite. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| session_id required | string | Session ID from list_sessions. |
| email required | string | Who to invite. |
| role | enum | guest, producer or audience. Default: guest. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/invite_guest \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"session_id":"session_8c41d2","email":"jane@example.com"}' result = client.call("riverside", "invite_guest", {"session_id":"session_8c41d2","email":"jane@example.com"}) const result = await cotlet.call('riverside', 'invite_guest', {"session_id":"session_8c41d2","email":"jane@example.com"}); cotlet call riverside invite_guest --data '{"session_id":"session_8c41d2","email":"jane@example.com"}' Example response
{
"session_id": "ses_3vq9x7",
"email": "producer@example.com",
"role": "producer",
"email_sent": true
} POST https://cotlet.dev/api/v1/riverside/cancel_session
Cancels the session and removes it from the Planner and the project folder. Recordings that were already made stay in your account. Cancelling cannot be undone with one call; schedule the session again to restore it. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| session_id required | string | Session ID from list_sessions. |
Request
curl -X POST https://cotlet.dev/api/v1/riverside/cancel_session \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"session_id":"session_8c41d2"}' result = client.call("riverside", "cancel_session", {"session_id":"session_8c41d2"}) const result = await cotlet.call('riverside', 'cancel_session', {"session_id":"session_8c41d2"}); cotlet call riverside cancel_session --data '{"session_id":"session_8c41d2"}' Example response
{
"session_id": "ses_3vq9x7",
"status": "cancelled"
}