Storage and Data Retention

Storage Duration

By default, all media associated with a recording is retained forever. This applies for all accounts created after June 12, 2025. For accounts created before this date, the default retention window is 7 days.

Recall supports specifying custom retention for the recordings (all recording data, defined below in the Recording Media section) captured by a bot or the Desktop Recording SDK via the recording_config.retention field in Create Bot or Create SDK Upload request. Two retention types are supported:

  1. Timed Allows you to specify a custom retention duration in hours via the required hours property (e.g., hours: 72 for 3 days). The recording will expire after the specified number of hours from creation.
    {
      "type": "timed",
      "hours": <NUMBER_OF_HOURS_TO_RETAIN>
    }
  2. Forever The recording will never expire and will be retained indefinitely unless explicitly deleted.
    {
      "type": "forever"
    }

The retention period starts counting after the recording status changes to done which occurs almost immediately after the meeting ends.

Pricing

How storage billing works:

  • Storage fees only apply to recording media stored for more than 7 days on Recall.
  • Once recording media is stored for more than 7 days, recording media is billed at $0.000069 USD per hour for every hour of recording media stored on Recall (where an hour of recording media could be one hour of video).
  • This is equivalent to $0.05 per recording media hour stored for 30 days.

When viewing usage in the dashboard, you can get the storage costs per day by taking the usage shown for a given day and multiplying it by $0.000069 USD.

Example: recording (audio, video, and transcripts) is configured to expire after 6 days

Example: You capture the audio, video, and transcripts for a one 1-hour meeting (so you have 1 recording-hour). You store it for 6 days with the following recording config:

{
  // other configs
  recording_config: {
    retention: {
      type: "timed",
      hours: 144 // 6 days
    }
  }
}

Charges:

  • This will accrue no charges since it is stored for less than 7 days from the end of the meeting.

What you’ll see on the storage usage dashboard.

  • For the first 5 days, usage (hour_hour) for this recording is 0.
  • For every day after, usage (hour_hour) for this recording is 0.
Example: recording (audio, video, and transcripts) is configured to expire after 20 days

Example: You capture audio, video, and transcripts for a one 1-hour meeting (so you have 1 recording-hour). You store it for 20 days with the following recording config:

{
  // other configs
  recording_config: {
    retention: {
      type: "timed",
      hours: 480 // 20 days
    }
  }
}

Charges:

  • The first 7 days will be free.
  • You are charged for the remainder 13 days.
  • Total charge = (13 days) * (24 hours / day) * ($0.000069 USD / hour) = $0.021528 for this recording over 20 days from the end of the meeting.

What you’ll see on the storage usage dashboard

  • For the first 7 days, usage (hour_hour) for this recording is 0.
  • For the next 13 days, usage (hour_hour) for this recording is 24 per day.
    • For every day after, usage (hour_hour) for this recording is 0.
Example: recording (transcript-only) is configured to expire after 30 days

Example: You capture the transcript for a one 1-hour meeting (so you have 1 recording-hour). You store it for 20 days with the following recording config:

{
  // other configs
  recording_config: {
    retention: {
      type: "timed",
      hours: 720 // 30 days
    }
  }
}

Charges:

  • The first 7 days will be free.
  • You are charged for the remainder 23 days.
  • Total charge = (23 days) * (24 hours / day) * ($0.000069 USD / hour) = $0.038088 for this recording over 30 days from the end of the meeting.

What you’ll see on the storage usage dashboard:

  • For the first 7 days, usage (hour_hour) for this recording is 0.
  • For the next 23 days, usage (hour_hour) for this recording is 24 per day.
  • For every day after, usage (hour_hour) for this recording is 0.

If you have any questions regarding pricing, please reach out to us via [email protected] or through Slack for more information.

Media Expiration

Recording data can be deleted at any point by calling Delete Bot Media or Delete Recording. After data has been deleted, it is permanently removed from Recall servers and cannot be recovered. No backups or archives of any media is retained after this point.

📘

Custom metadata and the meeting URL are not deleted upon media expiration/deletion for a bot. The meeting URL will be cleared 14 days after the bot's termination.

{
  // create bot configs
  recording_config: {
    retention: {
      type: "timed",
      "hours": <NUMBER_OF_HOURS_TO_RETAIN> // 168 hours are free
    }
  }
}

Recording Media

Media refers to:

  • Recording
  • Transcript
  • Speaker timeline
  • Meeting URL
  • Participant metadata (who joined, left, timestamps)
  • Meeting metadata (e.g. Meeting title)
  • Video files, audio files, and any other media
  • Debug data

Note: Deleting bot media through the API does not delete logs. Log files will be automatically deleted after the 7 day retention period.

The media expiration date for a given recording can be found in the expires_at field of the Recording:

{
  "id": "a5437136-4b69-429a-9e0c-cd388fd8fee6",
  "expires_at": "2024-12-27T00:07:47.409813Z",
  ...
}

The recording.deleted Webhook

When a recording reaches its expiration date and is deleted, you will receive a recording.deleted Status Change Webhook to notify you of this.

Security

Zero Data Retention

If you have strict data privacy concerns, you may want to ensure that no recording data is ever stored on Recall's servers at any point. You can accomplish this by setting the recording_config.retention field to be null in your Create Bot request. This will ensure that no data is retained at any point.

When zero data retention is configured, the only way to access meeting data will be to stream it in real time while the meeting is occurring. Refer to our guides on streaming audio, video, and transcripts for more information.

Note that retaining zero data will make debugging any issues or failures associated with the bot more difficult since no backup data is stored in Recall.

Encryption

Bot data is encrypted at rest in our database using AWS RDS encryption (AES-256), and data from our servers is encrypted in transit using TLS. All credentials, secrets and API keys are protected from attackers reading static data or intercepting traffic between our servers and you. For additional information on how data is secured, please visit our security portal

FAQ

How do I stop getting charged for recording media that never expires?

You can stop getting charged for old media by deleting the recording media.

For bots, you can:

  • Fetch all bots from the List Bots API, iterating over each bot per page
    • You can filter for specific bot properties like date ranges and metadata
  • Call the Delete Bot Media api for each bot

You can also configure retention periods by manually setting the storage duration as mentioned earlier in this guide. This will automatically expire recording media after a certain period

📘

You can use this sample app to see how to delete bot's recording media within a given time range and/or for a specific customer (using custom metadata)

Can I have Recall store recordings directly in my own bucket?

Recall currently does not support storing recordings directly in your own bucket. To move the bot's recording and other information to your own bucket, you'd need to download it from Recall and reupload it to your own storage.