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:
Start with a small test batch (for example 5 to 10 recordings).
Verify in Demodesk:
Correct hosts
Correct guests
Correct timestamps
Recording plays as expected
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.
