curl --request POST \
--url https://api.dock.us/{version}/meetings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "RiHO4e0Ju3DS",
"title": "Kickoff call",
"time": "2026-08-20T15:00:00Z",
"transcript": "Alice: Hi everyone, thanks for joining...",
"accountDomain": "acme.com",
"hubspotCompanyId": "8662045446",
"salesforceAccountId": "0015f00000Bg59dAAB",
"fileId": "RiHO4e0Ju3DS",
"participants": [
{
"email": "alice@acme.com",
"name": "Alice Doe",
"domain": "acme.com"
}
]
}
'import requests
url = "https://api.dock.us/{version}/meetings"
payload = {
"accountId": "RiHO4e0Ju3DS",
"title": "Kickoff call",
"time": "2026-08-20T15:00:00Z",
"transcript": "Alice: Hi everyone, thanks for joining...",
"accountDomain": "acme.com",
"hubspotCompanyId": "8662045446",
"salesforceAccountId": "0015f00000Bg59dAAB",
"fileId": "RiHO4e0Ju3DS",
"participants": [
{
"email": "alice@acme.com",
"name": "Alice Doe",
"domain": "acme.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({
accountId: 'RiHO4e0Ju3DS',
title: 'Kickoff call',
time: '2026-08-20T15:00:00Z',
transcript: 'Alice: Hi everyone, thanks for joining...',
accountDomain: 'acme.com',
hubspotCompanyId: '8662045446',
salesforceAccountId: '0015f00000Bg59dAAB',
fileId: 'RiHO4e0Ju3DS',
participants: [{email: 'alice@acme.com', name: 'Alice Doe', domain: 'acme.com'}]
})
};
fetch('https://api.dock.us/{version}/meetings', 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.dock.us/{version}/meetings",
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([
'accountId' => 'RiHO4e0Ju3DS',
'title' => 'Kickoff call',
'time' => '2026-08-20T15:00:00Z',
'transcript' => 'Alice: Hi everyone, thanks for joining...',
'accountDomain' => 'acme.com',
'hubspotCompanyId' => '8662045446',
'salesforceAccountId' => '0015f00000Bg59dAAB',
'fileId' => 'RiHO4e0Ju3DS',
'participants' => [
[
'email' => 'alice@acme.com',
'name' => 'Alice Doe',
'domain' => 'acme.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.dock.us/{version}/meetings"
payload := strings.NewReader("{\n \"accountId\": \"RiHO4e0Ju3DS\",\n \"title\": \"Kickoff call\",\n \"time\": \"2026-08-20T15:00:00Z\",\n \"transcript\": \"Alice: Hi everyone, thanks for joining...\",\n \"accountDomain\": \"acme.com\",\n \"hubspotCompanyId\": \"8662045446\",\n \"salesforceAccountId\": \"0015f00000Bg59dAAB\",\n \"fileId\": \"RiHO4e0Ju3DS\",\n \"participants\": [\n {\n \"email\": \"alice@acme.com\",\n \"name\": \"Alice Doe\",\n \"domain\": \"acme.com\"\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.dock.us/{version}/meetings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"RiHO4e0Ju3DS\",\n \"title\": \"Kickoff call\",\n \"time\": \"2026-08-20T15:00:00Z\",\n \"transcript\": \"Alice: Hi everyone, thanks for joining...\",\n \"accountDomain\": \"acme.com\",\n \"hubspotCompanyId\": \"8662045446\",\n \"salesforceAccountId\": \"0015f00000Bg59dAAB\",\n \"fileId\": \"RiHO4e0Ju3DS\",\n \"participants\": [\n {\n \"email\": \"alice@acme.com\",\n \"name\": \"Alice Doe\",\n \"domain\": \"acme.com\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dock.us/{version}/meetings")
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 \"accountId\": \"RiHO4e0Ju3DS\",\n \"title\": \"Kickoff call\",\n \"time\": \"2026-08-20T15:00:00Z\",\n \"transcript\": \"Alice: Hi everyone, thanks for joining...\",\n \"accountDomain\": \"acme.com\",\n \"hubspotCompanyId\": \"8662045446\",\n \"salesforceAccountId\": \"0015f00000Bg59dAAB\",\n \"fileId\": \"RiHO4e0Ju3DS\",\n \"participants\": [\n {\n \"email\": \"alice@acme.com\",\n \"name\": \"Alice Doe\",\n \"domain\": \"acme.com\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"meeting": {
"id": "RiHO4e0Ju3DS",
"updatedAt": "2021-01-01T00:00:00.000Z",
"createdAt": "2021-01-01T00:00:00.000Z",
"object": "meeting",
"url": "https://api.dock.us/v1/meetings/RiHO4e0Ju3DS",
"title": "Kickoff call",
"time": "2026-08-20T15:00:00.000Z",
"status": "completed",
"processingError": "Could not extract transcript text from the file.",
"provider": "direct_upload",
"accountId": "RiHO4e0Ju3DS",
"transcript": "Alice: Hi everyone, thanks for joining...",
"participants": [
{
"user": {
"id": "RiHO4e0Ju3DS",
"updatedAt": "2021-01-01T00:00:00.000Z",
"createdAt": "2021-01-01T00:00:00.000Z",
"object": "user",
"url": "https://api.dock.us/v1/users/RiHO4e0Ju3DS",
"firstName": "John",
"lastName": "Doe",
"avatar": "https://dock.us/avatar.png",
"email": "john.doe@example.com",
"name": "John Doe"
}
}
]
}
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "The request could not be understood or was missing required parameters"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Access denied. You are not authorized to access this resource"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Access to this resource is restricted"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested resource could not be found"
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please try again later"
}
}{
"error": {
"code": "INTERNAL_SERVER_ERROR",
"message": "The server has encountered a situation it does not know how to handle"
}
}Create a meeting
Create a meeting with a call transcript on an account. Identify the account with exactly one of accountId, accountDomain, hubspotCompanyId or salesforceAccountId — the account must already exist (create one with POST /accounts). Provide the transcript as raw text (the meeting is created completed), or as a fileId referencing an uploaded pdf/docx file (max 25MB) from POST /files — the transcript text is then extracted asynchronously: the meeting is created with status processing and transitions to completed once extraction finishes, or to failed with the reason in processingError. Poll GET /meetings/?properties=status&properties=processingError to track it. Dock asynchronously generates an AI summary and search embeddings for the meeting once the transcript is available.
curl --request POST \
--url https://api.dock.us/{version}/meetings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "RiHO4e0Ju3DS",
"title": "Kickoff call",
"time": "2026-08-20T15:00:00Z",
"transcript": "Alice: Hi everyone, thanks for joining...",
"accountDomain": "acme.com",
"hubspotCompanyId": "8662045446",
"salesforceAccountId": "0015f00000Bg59dAAB",
"fileId": "RiHO4e0Ju3DS",
"participants": [
{
"email": "alice@acme.com",
"name": "Alice Doe",
"domain": "acme.com"
}
]
}
'import requests
url = "https://api.dock.us/{version}/meetings"
payload = {
"accountId": "RiHO4e0Ju3DS",
"title": "Kickoff call",
"time": "2026-08-20T15:00:00Z",
"transcript": "Alice: Hi everyone, thanks for joining...",
"accountDomain": "acme.com",
"hubspotCompanyId": "8662045446",
"salesforceAccountId": "0015f00000Bg59dAAB",
"fileId": "RiHO4e0Ju3DS",
"participants": [
{
"email": "alice@acme.com",
"name": "Alice Doe",
"domain": "acme.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({
accountId: 'RiHO4e0Ju3DS',
title: 'Kickoff call',
time: '2026-08-20T15:00:00Z',
transcript: 'Alice: Hi everyone, thanks for joining...',
accountDomain: 'acme.com',
hubspotCompanyId: '8662045446',
salesforceAccountId: '0015f00000Bg59dAAB',
fileId: 'RiHO4e0Ju3DS',
participants: [{email: 'alice@acme.com', name: 'Alice Doe', domain: 'acme.com'}]
})
};
fetch('https://api.dock.us/{version}/meetings', 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.dock.us/{version}/meetings",
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([
'accountId' => 'RiHO4e0Ju3DS',
'title' => 'Kickoff call',
'time' => '2026-08-20T15:00:00Z',
'transcript' => 'Alice: Hi everyone, thanks for joining...',
'accountDomain' => 'acme.com',
'hubspotCompanyId' => '8662045446',
'salesforceAccountId' => '0015f00000Bg59dAAB',
'fileId' => 'RiHO4e0Ju3DS',
'participants' => [
[
'email' => 'alice@acme.com',
'name' => 'Alice Doe',
'domain' => 'acme.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.dock.us/{version}/meetings"
payload := strings.NewReader("{\n \"accountId\": \"RiHO4e0Ju3DS\",\n \"title\": \"Kickoff call\",\n \"time\": \"2026-08-20T15:00:00Z\",\n \"transcript\": \"Alice: Hi everyone, thanks for joining...\",\n \"accountDomain\": \"acme.com\",\n \"hubspotCompanyId\": \"8662045446\",\n \"salesforceAccountId\": \"0015f00000Bg59dAAB\",\n \"fileId\": \"RiHO4e0Ju3DS\",\n \"participants\": [\n {\n \"email\": \"alice@acme.com\",\n \"name\": \"Alice Doe\",\n \"domain\": \"acme.com\"\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.dock.us/{version}/meetings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"RiHO4e0Ju3DS\",\n \"title\": \"Kickoff call\",\n \"time\": \"2026-08-20T15:00:00Z\",\n \"transcript\": \"Alice: Hi everyone, thanks for joining...\",\n \"accountDomain\": \"acme.com\",\n \"hubspotCompanyId\": \"8662045446\",\n \"salesforceAccountId\": \"0015f00000Bg59dAAB\",\n \"fileId\": \"RiHO4e0Ju3DS\",\n \"participants\": [\n {\n \"email\": \"alice@acme.com\",\n \"name\": \"Alice Doe\",\n \"domain\": \"acme.com\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dock.us/{version}/meetings")
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 \"accountId\": \"RiHO4e0Ju3DS\",\n \"title\": \"Kickoff call\",\n \"time\": \"2026-08-20T15:00:00Z\",\n \"transcript\": \"Alice: Hi everyone, thanks for joining...\",\n \"accountDomain\": \"acme.com\",\n \"hubspotCompanyId\": \"8662045446\",\n \"salesforceAccountId\": \"0015f00000Bg59dAAB\",\n \"fileId\": \"RiHO4e0Ju3DS\",\n \"participants\": [\n {\n \"email\": \"alice@acme.com\",\n \"name\": \"Alice Doe\",\n \"domain\": \"acme.com\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"meeting": {
"id": "RiHO4e0Ju3DS",
"updatedAt": "2021-01-01T00:00:00.000Z",
"createdAt": "2021-01-01T00:00:00.000Z",
"object": "meeting",
"url": "https://api.dock.us/v1/meetings/RiHO4e0Ju3DS",
"title": "Kickoff call",
"time": "2026-08-20T15:00:00.000Z",
"status": "completed",
"processingError": "Could not extract transcript text from the file.",
"provider": "direct_upload",
"accountId": "RiHO4e0Ju3DS",
"transcript": "Alice: Hi everyone, thanks for joining...",
"participants": [
{
"user": {
"id": "RiHO4e0Ju3DS",
"updatedAt": "2021-01-01T00:00:00.000Z",
"createdAt": "2021-01-01T00:00:00.000Z",
"object": "user",
"url": "https://api.dock.us/v1/users/RiHO4e0Ju3DS",
"firstName": "John",
"lastName": "Doe",
"avatar": "https://dock.us/avatar.png",
"email": "john.doe@example.com",
"name": "John Doe"
}
}
]
}
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "The request could not be understood or was missing required parameters"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Access denied. You are not authorized to access this resource"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Access to this resource is restricted"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested resource could not be found"
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please try again later"
}
}{
"error": {
"code": "INTERNAL_SERVER_ERROR",
"message": "The server has encountered a situation it does not know how to handle"
}
}Identifying the account
Identify the account with exactly one ofaccountId, accountDomain,
hubspotCompanyId or salesforceAccountId. The account must already exist —
this endpoint never creates accounts. Use
Create an account first,
or find one with the filters on
Retrieve a list of accounts.
accountDomain is matched against the account’s website after normalization
(protocol, www. prefix and paths are stripped) — subdomains and apex domains
are distinct.
Providing the transcript
Provide the transcript as raw text (transcript), or as a fileId
referencing an uploaded .pdf or .docx document (max 25MB) — see
Uploading files. The transcript text is
extracted from the document when the meeting is created, so the file upload
must be completed first.
After creation, Dock asynchronously generates an AI summary and search
embeddings for the meeting. Email participants that don’t exist yet are
created as contacts on the account.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Select the meeting properties that should be returned
title, time, status, processingError, provider, accountId, participants, transcript, createdAt, updatedAt Body
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
ID of the account to attach the meeting to. Provide exactly one of accountId, accountDomain, hubspotCompanyId or salesforceAccountId.
"RiHO4e0Ju3DS"
Title of the meeting
1 - 500"Kickoff call"
Date and time of the meeting (ISO 8601)
"2026-08-20T15:00:00Z"
Plain-text transcript of the call. Provide exactly one of transcript or fileId.
"Alice: Hi everyone, thanks for joining..."
Look up the account by its website domain (normalized exact match, e.g. acme.com).
"acme.com"
Look up the account by its linked HubSpot company ID.
"8662045446"
Look up the account by its linked Salesforce account ID.
"0015f00000Bg59dAAB"
ID of an uploaded pdf or docx file (from POST /files, max 25MB) to extract the transcript from. Provide exactly one of transcript or fileId.
"RiHO4e0Ju3DS"
Participants of the meeting. Each entry must include an email or a domain. Email participants are created as account contacts if they don't exist; a domain entry (e.g. acme.com) adds all known contacts with that email domain.
200- Option 1
- Option 2
Show child attributes
Show child attributes
Response
Meeting created
Show child attributes
Show child attributes