cURL
curl -X PUT "https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: audio/mpeg" \
--data-binary @recording.mp3import requests
with open("recording.mp3", "rb") as f:
response = requests.put(
"https://api.timeless.day/v1/meetings/upload",
headers={
"Authorization": "Bearer YOUR_API_TOKEN",
"Content-Type": "audio/mpeg",
},
params={"title": "Team sync", "language": "en"},
data=f,
)
upload = response.json()const fs = require("fs");
const body = fs.readFileSync("recording.mp3");
const response = await fetch(
"https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en",
{
method: "PUT",
headers: {
Authorization: "Bearer YOUR_API_TOKEN",
"Content-Type": "audio/mpeg",
},
body,
}
);
const upload = await response.json();<?php
$file = fopen("recording.mp3", "r");
$body = fread($file, filesize("recording.mp3"));
fclose($file);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en",
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => $body,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_TOKEN",
"Content-Type: audio/mpeg",
],
]);
$response = curl_exec($ch);
curl_close($ch);
$upload = json_decode($response, true);package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
file, _ := os.Open("recording.mp3")
defer file.Close()
req, _ := http.NewRequest(
"PUT",
"https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en",
file,
)
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
req.Header.Set("Content-Type", "audio/mpeg")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en"))
.header("Authorization", "Bearer YOUR_API_TOKEN")
.header("Content-Type", "audio/mpeg")
.PUT(HttpRequest.BodyPublishers.ofFile(Path.of("recording.mp3")))
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());require "uri"
require "net/http"
url = URI("https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = "Bearer YOUR_API_TOKEN"
request["Content-Type"] = "audio/mpeg"
request.body = File.binread("recording.mp3")
response = http.request(request)
puts response.read_body{
"id": "mtg_abc123",
"status": "processing"
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Upload
Upload media
Upload an audio or video file for processing. The request body should be the raw binary file content — not multipart form data. Metadata is passed as query parameters.
After uploading, the file is queued for transcription and analysis. Use the returned meeting ID to check the status via List meetings.
PUT
/
meetings
/
upload
cURL
curl -X PUT "https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: audio/mpeg" \
--data-binary @recording.mp3import requests
with open("recording.mp3", "rb") as f:
response = requests.put(
"https://api.timeless.day/v1/meetings/upload",
headers={
"Authorization": "Bearer YOUR_API_TOKEN",
"Content-Type": "audio/mpeg",
},
params={"title": "Team sync", "language": "en"},
data=f,
)
upload = response.json()const fs = require("fs");
const body = fs.readFileSync("recording.mp3");
const response = await fetch(
"https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en",
{
method: "PUT",
headers: {
Authorization: "Bearer YOUR_API_TOKEN",
"Content-Type": "audio/mpeg",
},
body,
}
);
const upload = await response.json();<?php
$file = fopen("recording.mp3", "r");
$body = fread($file, filesize("recording.mp3"));
fclose($file);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en",
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => $body,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_TOKEN",
"Content-Type: audio/mpeg",
],
]);
$response = curl_exec($ch);
curl_close($ch);
$upload = json_decode($response, true);package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
file, _ := os.Open("recording.mp3")
defer file.Close()
req, _ := http.NewRequest(
"PUT",
"https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en",
file,
)
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
req.Header.Set("Content-Type", "audio/mpeg")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en"))
.header("Authorization", "Bearer YOUR_API_TOKEN")
.header("Content-Type", "audio/mpeg")
.PUT(HttpRequest.BodyPublishers.ofFile(Path.of("recording.mp3")))
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());require "uri"
require "net/http"
url = URI("https://api.timeless.day/v1/meetings/upload?title=Team%20sync&language=en")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = "Bearer YOUR_API_TOKEN"
request["Content-Type"] = "audio/mpeg"
request.body = File.binread("recording.mp3")
response = http.request(request)
puts response.read_body{
"id": "mtg_abc123",
"status": "processing"
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}The upload endpoint has a stricter rate limit of 10 requests per minute.
Authorizations
API token from your Timeless dashboard.
Headers
The MIME type of the uploaded file.
Supported audio types: audio/mpeg, audio/mp4, audio/wav, audio/webm, audio/ogg, audio/aac, audio/flac
Supported video types: video/mp4, video/webm, video/ogg, video/quicktime
Query Parameters
Optional title for the recording (max 500 characters).
Maximum string length:
500Language code for transcription (e.g., en, es).
Maximum string length:
10