curl --request POST \
--url https://api.attio.com/v2/meetings/{meeting_id}/call_recordings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"video_url": "https://example.com/recording.mp4",
"transcript": [
{
"speech": "Hello everyone, welcome to the meeting.",
"start_time": 0.5123,
"end_time": 3.2123,
"speaker": {
"name": "Simon Mitchell",
"email_address": "person@company.com"
}
}
]
}
}
'import requests
url = "https://api.attio.com/v2/meetings/{meeting_id}/call_recordings"
payload = { "data": {
"video_url": "https://example.com/recording.mp4",
"transcript": [
{
"speech": "Hello everyone, welcome to the meeting.",
"start_time": 0.5123,
"end_time": 3.2123,
"speaker": {
"name": "Simon Mitchell",
"email_address": "person@company.com"
}
}
]
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
video_url: 'https://example.com/recording.mp4',
transcript: [
{
speech: 'Hello everyone, welcome to the meeting.',
start_time: 0.5123,
end_time: 3.2123,
speaker: {name: 'Simon Mitchell', email_address: 'person@company.com'}
}
]
}
})
};
fetch('https://api.attio.com/v2/meetings/{meeting_id}/call_recordings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.attio.com/v2/meetings/{meeting_id}/call_recordings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'video_url' => 'https://example.com/recording.mp4',
'transcript' => [
[
'speech' => 'Hello everyone, welcome to the meeting.',
'start_time' => 0.5123,
'end_time' => 3.2123,
'speaker' => [
'name' => 'Simon Mitchell',
'email_address' => 'person@company.com'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.attio.com/v2/meetings/{meeting_id}/call_recordings"
payload := strings.NewReader("{\n \"data\": {\n \"video_url\": \"https://example.com/recording.mp4\",\n \"transcript\": [\n {\n \"speech\": \"Hello everyone, welcome to the meeting.\",\n \"start_time\": 0.5123,\n \"end_time\": 3.2123,\n \"speaker\": {\n \"name\": \"Simon Mitchell\",\n \"email_address\": \"person@company.com\"\n }\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.attio.com/v2/meetings/{meeting_id}/call_recordings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"video_url\": \"https://example.com/recording.mp4\",\n \"transcript\": [\n {\n \"speech\": \"Hello everyone, welcome to the meeting.\",\n \"start_time\": 0.5123,\n \"end_time\": 3.2123,\n \"speaker\": {\n \"name\": \"Simon Mitchell\",\n \"email_address\": \"person@company.com\"\n }\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.attio.com/v2/meetings/{meeting_id}/call_recordings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"video_url\": \"https://example.com/recording.mp4\",\n \"transcript\": [\n {\n \"speech\": \"Hello everyone, welcome to the meeting.\",\n \"start_time\": 0.5123,\n \"end_time\": 3.2123,\n \"speaker\": {\n \"name\": \"Simon Mitchell\",\n \"email_address\": \"person@company.com\"\n }\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": {
"workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c",
"meeting_id": "cb59ab17-ad15-460c-a126-0715617c0853",
"call_recording_id": "e8f2a3b7-9b4d-4c5e-8a1f-3d7b2c5e8f9a"
},
"status": "completed",
"web_url": "https://app.attio.com/salarya/calls/cb59ab17-ad15-460c-a126-0715617c0853/e8f2a3b7-9b4d-4c5e-8a1f-3d7b2c5e8f9a",
"created_by_actor": {
"type": "workspace-member",
"id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b"
},
"created_at": "2023-01-01T15:00:00.000000000Z"
}
}{
"status_code": 400,
"type": "invalid_request_error",
"code": "validation_type",
"message": "Invalid video URL protocol. Only https is supported"
}{
"status_code": 403,
"type": "auth_error",
"code": "billing_error",
"message": "<string>"
}{
"status_code": 404,
"type": "invalid_request_error",
"code": "not_found",
"message": "The referenced meeting was not found."
}Create call recording
Create a call recording for a meeting. This endpoint is rate limited to 1 request per second.
A transcript should always be provided — it is technically optional for backwards compatibility, but a call recording created without one will be missing summaries and other transcript-derived features. video_url is optional, and a transcript-only call recording (with no video) is fully supported.
This endpoint is in beta. We will aim to avoid breaking changes, but small updates may be made as we roll out to more users.
Required scopes: meeting:read, call_recording:read-write.
curl --request POST \
--url https://api.attio.com/v2/meetings/{meeting_id}/call_recordings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"video_url": "https://example.com/recording.mp4",
"transcript": [
{
"speech": "Hello everyone, welcome to the meeting.",
"start_time": 0.5123,
"end_time": 3.2123,
"speaker": {
"name": "Simon Mitchell",
"email_address": "person@company.com"
}
}
]
}
}
'import requests
url = "https://api.attio.com/v2/meetings/{meeting_id}/call_recordings"
payload = { "data": {
"video_url": "https://example.com/recording.mp4",
"transcript": [
{
"speech": "Hello everyone, welcome to the meeting.",
"start_time": 0.5123,
"end_time": 3.2123,
"speaker": {
"name": "Simon Mitchell",
"email_address": "person@company.com"
}
}
]
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
video_url: 'https://example.com/recording.mp4',
transcript: [
{
speech: 'Hello everyone, welcome to the meeting.',
start_time: 0.5123,
end_time: 3.2123,
speaker: {name: 'Simon Mitchell', email_address: 'person@company.com'}
}
]
}
})
};
fetch('https://api.attio.com/v2/meetings/{meeting_id}/call_recordings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.attio.com/v2/meetings/{meeting_id}/call_recordings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'video_url' => 'https://example.com/recording.mp4',
'transcript' => [
[
'speech' => 'Hello everyone, welcome to the meeting.',
'start_time' => 0.5123,
'end_time' => 3.2123,
'speaker' => [
'name' => 'Simon Mitchell',
'email_address' => 'person@company.com'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.attio.com/v2/meetings/{meeting_id}/call_recordings"
payload := strings.NewReader("{\n \"data\": {\n \"video_url\": \"https://example.com/recording.mp4\",\n \"transcript\": [\n {\n \"speech\": \"Hello everyone, welcome to the meeting.\",\n \"start_time\": 0.5123,\n \"end_time\": 3.2123,\n \"speaker\": {\n \"name\": \"Simon Mitchell\",\n \"email_address\": \"person@company.com\"\n }\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.attio.com/v2/meetings/{meeting_id}/call_recordings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"video_url\": \"https://example.com/recording.mp4\",\n \"transcript\": [\n {\n \"speech\": \"Hello everyone, welcome to the meeting.\",\n \"start_time\": 0.5123,\n \"end_time\": 3.2123,\n \"speaker\": {\n \"name\": \"Simon Mitchell\",\n \"email_address\": \"person@company.com\"\n }\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.attio.com/v2/meetings/{meeting_id}/call_recordings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"video_url\": \"https://example.com/recording.mp4\",\n \"transcript\": [\n {\n \"speech\": \"Hello everyone, welcome to the meeting.\",\n \"start_time\": 0.5123,\n \"end_time\": 3.2123,\n \"speaker\": {\n \"name\": \"Simon Mitchell\",\n \"email_address\": \"person@company.com\"\n }\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": {
"workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c",
"meeting_id": "cb59ab17-ad15-460c-a126-0715617c0853",
"call_recording_id": "e8f2a3b7-9b4d-4c5e-8a1f-3d7b2c5e8f9a"
},
"status": "completed",
"web_url": "https://app.attio.com/salarya/calls/cb59ab17-ad15-460c-a126-0715617c0853/e8f2a3b7-9b4d-4c5e-8a1f-3d7b2c5e8f9a",
"created_by_actor": {
"type": "workspace-member",
"id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b"
},
"created_at": "2023-01-01T15:00:00.000000000Z"
}
}{
"status_code": 400,
"type": "invalid_request_error",
"code": "validation_type",
"message": "Invalid video URL protocol. Only https is supported"
}{
"status_code": 403,
"type": "auth_error",
"code": "billing_error",
"message": "<string>"
}{
"status_code": 404,
"type": "invalid_request_error",
"code": "not_found",
"message": "The referenced meeting was not found."
}Authorizations
This API uses OAuth 2.0 with the authorization code grant flow.
Path Parameters
The ID of the meeting this recording belongs to.
"cb59ab17-ad15-460c-a126-0715617c0853"
Body
Show child attributes
Show child attributes
Response
Success
Success
Show child attributes
Show child attributes
Was this page helpful?