# API: Recording

| Method | Path | What it does | Scope |
|---|---|---|---|
| POST | `/v1/activities/:id/clips` | Clip a moment of a recorded conversation (a time range) | `transcripts:write` |
| GET | `/v1/clips` | The clip library: by kind, theme, account, deal, conversation or words | `transcripts:read` |
| DELETE | `/v1/clips/:id` | Delete a clip (yours, or any as an owner) | `transcripts:write` |
| GET | `/v1/clips/:id/media` | A fresh, short-lived link to the clip's recording, with its start and end | `transcripts:read` |
| GET | `/v1/desktop/config` | For the desktop app: whether it may record for you, Recall's API URL for the region, your disclosure answer and its current text, and the reminder to show before each recording | `transcripts:write` |
| POST | `/v1/desktop/consent` | Answer the desktop recording disclosure (its current version), from the desktop app | `transcripts:write` |
| GET | `/v1/desktop/recordings` | Your recordings from the desktop app: their status, and the transcript's activity once it's in | `transcripts:write` |
| POST | `/v1/desktop/recordings` | Start recording a meeting from the desktop app: after your disclosure answer, the reminder and the outbound policy, an upload token for the Recall Desktop SDK | `transcripts:write` |
| POST | `/v1/desktop/recordings/:id/ended` | The desktop app's recording ended (the transcript follows through the usual pipeline; the media is then deleted at Recall) | `transcripts:write` |
| GET | `/v1/me/recording` | Your recording mode, recorder priority and disclosure answers | — |
| PUT | `/v1/me/recording` | Set your recording mode (unless the organization locked it) and recorder priority | — |
| POST | `/v1/me/recording/consent` | Answer a first-use recording disclosure (accept, or decline and take notes by hand) | — |
| GET | `/v1/meetings/:id/recording` | Whether this meeting is recorded and why, its bots, and any override | `transcripts:read` |
| PUT | `/v1/meetings/:id/recording` | Record this meeting, or don't (null = follow the settings) | `transcripts:write` |
| POST | `/v1/meetings/:id/recording/now` | Send the recorder to this meeting now | `transcripts:write` |
| GET | `/v1/recording/bots` | Recorder bots, newest first | `transcripts:read` |
| POST | `/v1/recording/bots` | Send the recorder to a meeting link (owner; a meeting record is created for it) | `settings:write` |
| POST | `/v1/recording/bots/:id/stop` | Stop a recording (the bot leaves, the recording is deleted, no transcript) | `transcripts:write` |
| GET | `/v1/settings/desktop-recorder` | The desktop recorder: whether it's on, the Recall region, and whether the organization's Recall key is set (never the key) (web app only) | — |
| PUT | `/v1/settings/desktop-recorder` | Turn the desktop recorder on or off, set the Recall region, or set (or remove, with null) the organization's own Recall API key (owners) (web app only) | — |
| GET | `/v1/settings/recording` | The organization's recording policy (MTG-002) | `transcripts:read` |
| PUT | `/v1/settings/recording` | Set the organization's recording policy (owner) | `settings:write` |

## Examples

### POST /v1/activities/$ID/clips

Clip a moment of a recorded conversation (a time range)

```bash
curl -s -X POST "https://api.closefinch.com/v1/activities/$ID/clips" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/activities/${id}/clips`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### GET /v1/clips

The clip library: by kind, theme, account, deal, conversation or words

```bash
curl -s "https://api.closefinch.com/v1/clips" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/clips`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### DELETE /v1/clips/$ID

Delete a clip (yours, or any as an owner)

```bash
curl -s -X DELETE "https://api.closefinch.com/v1/clips/$ID" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/clips/${id}`, {
  method: "DELETE",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### GET /v1/clips/$ID/media

A fresh, short-lived link to the clip's recording, with its start and end

```bash
curl -s "https://api.closefinch.com/v1/clips/$ID/media" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/clips/${id}/media`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### GET /v1/desktop/config

For the desktop app: whether it may record for you, Recall's API URL for the region, your disclosure answer and its current text, and the reminder to show before each recording

```bash
curl -s "https://api.closefinch.com/v1/desktop/config" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/desktop/config`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### POST /v1/desktop/consent

Answer the desktop recording disclosure (its current version), from the desktop app

```bash
curl -s -X POST "https://api.closefinch.com/v1/desktop/consent" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/desktop/consent`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### GET /v1/desktop/recordings

Your recordings from the desktop app: their status, and the transcript's activity once it's in

```bash
curl -s "https://api.closefinch.com/v1/desktop/recordings" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/desktop/recordings`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### POST /v1/desktop/recordings

Start recording a meeting from the desktop app: after your disclosure answer, the reminder and the outbound policy, an upload token for the Recall Desktop SDK

```bash
curl -s -X POST "https://api.closefinch.com/v1/desktop/recordings" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/desktop/recordings`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### POST /v1/desktop/recordings/$ID/ended

The desktop app's recording ended (the transcript follows through the usual pipeline; the media is then deleted at Recall)

```bash
curl -s -X POST "https://api.closefinch.com/v1/desktop/recordings/$ID/ended" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/desktop/recordings/${id}/ended`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### GET /v1/me/recording

Your recording mode, recorder priority and disclosure answers

```bash
curl -s "https://api.closefinch.com/v1/me/recording" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/me/recording`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### PUT /v1/me/recording

Set your recording mode (unless the organization locked it) and recorder priority

```bash
curl -s -X PUT "https://api.closefinch.com/v1/me/recording" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/me/recording`, {
  method: "PUT",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### POST /v1/me/recording/consent

Answer a first-use recording disclosure (accept, or decline and take notes by hand)

```bash
curl -s -X POST "https://api.closefinch.com/v1/me/recording/consent" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/me/recording/consent`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### GET /v1/meetings/$ID/recording

Whether this meeting is recorded and why, its bots, and any override

```bash
curl -s "https://api.closefinch.com/v1/meetings/$ID/recording" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/meetings/${id}/recording`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### PUT /v1/meetings/$ID/recording

Record this meeting, or don't (null = follow the settings)

```bash
curl -s -X PUT "https://api.closefinch.com/v1/meetings/$ID/recording" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/meetings/${id}/recording`, {
  method: "PUT",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### POST /v1/meetings/$ID/recording/now

Send the recorder to this meeting now

```bash
curl -s -X POST "https://api.closefinch.com/v1/meetings/$ID/recording/now" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/meetings/${id}/recording/now`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### GET /v1/recording/bots

Recorder bots, newest first

```bash
curl -s "https://api.closefinch.com/v1/recording/bots" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/recording/bots`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### POST /v1/recording/bots

Send the recorder to a meeting link (owner; a meeting record is created for it)

```bash
curl -s -X POST "https://api.closefinch.com/v1/recording/bots" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/recording/bots`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### POST /v1/recording/bots/$ID/stop

Stop a recording (the bot leaves, the recording is deleted, no transcript)

```bash
curl -s -X POST "https://api.closefinch.com/v1/recording/bots/$ID/stop" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/recording/bots/${id}/stop`, {
  method: "POST",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

### GET /v1/settings/recording

The organization's recording policy (MTG-002)

```bash
curl -s "https://api.closefinch.com/v1/settings/recording" \
  -H "Authorization: Bearer $RA_API_KEY"
```

```js
const res = await fetch(`https://api.closefinch.com/v1/settings/recording`, {
  method: "GET",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}` },
});
const data = await res.json();
```

### PUT /v1/settings/recording

Set the organization's recording policy (owner)

```bash
curl -s -X PUT "https://api.closefinch.com/v1/settings/recording" \
  -H "Authorization: Bearer $RA_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```js
const res = await fetch(`https://api.closefinch.com/v1/settings/recording`, {
  method: "PUT",
  headers: { authorization: `Bearer ${process.env.RA_API_KEY}`, "content-type": "application/json" },
  body: JSON.stringify({}), // fields: see the OpenAPI schema
});
const data = await res.json();
```

Request and response schemas: [https://www.closefinch.com/openapi.json](https://www.closefinch.com/openapi.json). All resources: [API reference](https://www.closefinch.com/docs/api).
