Skip to main content

Migrating Historical Recordings into Demodesk from Other Platforms

Best practices and recommended approach for migrating historical recordings from other platforms (e.g., Fireflies) into Demodesk

Raj Kumar Lohana avatar
Written by Raj Kumar Lohana
Updated this week

Teams switching to Demodesk often want to bring their existing meeting recordings with them, for example from tools like Meetgeek, Fireflies, or Gong. Demodesk supports this through the Externally Recorded Meetings API, which lets you import past calls in a controlled and automated way.

This guide outlines recommended best practices so that you can run the migration entirely on your side.

You can find the API documentation here: https://demodesk.com/api/docs/index.html


1. Export data from your previous provider

Most recording tools offer one or more of the following:

  • Bulk export

  • API endpoint for fetching recordings

  • Download URLs for each video or audio file

  • Metadata such as meeting title, timestamp, host, and participant emails

Try to include at least:

  • Recording file URLs (video preferred, audio as fallback)

  • Meeting timestamp

  • Meeting title or topic

  • Host email

  • Guest names and/or emails

These fields map cleanly to Demodesk’s API structure.


2. Host the recordings where Demodesk can reach them

The Demodesk API needs a temporary URL that Demodesk can download the file from. It does not need to be permanent.

Common options:

  • Signed URLs from cloud storage (S3, GCS, Azure Blob)

  • Temporary export links from the previous provider

The URL only needs to remain valid until Demodesk finishes fetching and processing the file. After import, the recording is stored in Demodesk and the original URL is no longer needed.


3. Map your fields to Demodesk

Prepare a small piece of logic that transforms your exported metadata into the structure required by the Demodesk API.

A typical payload will contain:

{
"demo": {
"start_date": "<ISO8601 timestamp>",
"account": "<meeting title or customer name>"
},
"host": {
"email": "<Demodesk user who owned the call>"
},
"guests": [
{
"name": "<guest name>",
"email": "<guest email>"
}
],
"recording": {
"url": "<downloadable recording URL>",
"content_type": "<mime type, for example video/mp4>"
}
}

Use this as a conceptual example and follow the exact field names from the API reference.


4. Import in batches, not all at once

Recommended approach:

  1. Start with a small test batch (for example 5 to 10 recordings).

  2. Verify in Demodesk:

    • Correct hosts

    • Correct guests

    • Correct timestamps

    • Recording plays as expected

  3. Then run your full import (for example 6–12 months of historical calls).

For large volumes, run in batches (for example 200 per run) so monitoring and retries are easier.


5. Track what you have imported

As part of your script, keep track of:

  • Recording IDs that were imported

  • Timestamp or index of the last processed item

  • Any skipped items and the reason (for example missing host email or missing recording file)

This helps if an import run fails or you need to resume or repeat it later. A simple JSON or CSV file is usually enough.


6. Automate and retry carefully

Network calls and downloads can fail occasionally. Good practice is to:

  • Add a retry mechanism (for example, 2–3 attempts) for failed downloads or API calls

  • Log meaningful errors, not just status codes

  • Skip items with clearly incomplete metadata

  • Make the script idempotent so you can safely re-run it


7. Provide a host or meeting filter

If your export contains a lot of internal or irrelevant calls, filter before importing:

  • By host email

  • By meeting type

  • By date range

Most teams only import customer-facing calls from the last 6–12 months.


8. Example import script structure (pseudo Ruby)

The following example shows a simple pattern for calling the API. Adapt it to your language and your export format.

require "net/http"
require "json"

DEMODESK_API_KEY = ENV["DEMODESK_API_KEY"]

def upload_recording(recording)
uri = URI("https://demodesk.com/api/v1/externally_recorded_demos")
req = Net::HTTP::Post.new(uri)
req["api-key"] = DEMODESK_API_KEY
req["Content-Type"] = "application/json"
req.body = JSON.generate(recording)

Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(req)
end
end

recordings.each do |item|
payload = {
demo: {
start_date: item[:start_time],
account: item[:title]
},
host: {
email: item[:host_email]
},
guests: item[:guests],
recording: {
url: item[:file_url],
content_type: "video/mp4"
}
}

response = upload_recording(payload)
puts "Imported #{item[:id]} -> #{response.code}"
end

9. Summary

With the Externally Recorded Meetings API and the practices above, you can:

  • Decide which recordings to migrate

  • Map and normalize metadata to match Demodesk

  • Control batching and retries

  • Keep a clear log of what was imported

Demodesk only requires API requests with the correct payload. The migration logic and infrastructure remain fully in your control.

Did this answer your question?