Queue Call
curl --request POST \
--url https://api.objectionly.com/api/call-processing/queue \
--header 'Content-Type: application/json' \
--header 'X-Workspace-API-Key: <x-workspace-api-key>' \
--data '
{
"title": "<string>",
"repEmail": "<string>",
"callDate": "<string>",
"transcriptText": "<string>",
"mediaUrl": "<string>",
"file": "<string>",
"repName": "<string>",
"callDuration": 123,
"description": "<string>",
"externalMeetingId": "<string>",
"source": "<string>",
"forceImport": true,
"attendees": [
{}
]
}
'import requests
url = "https://api.objectionly.com/api/call-processing/queue"
payload = {
"title": "<string>",
"repEmail": "<string>",
"callDate": "<string>",
"transcriptText": "<string>",
"mediaUrl": "<string>",
"file": "<string>",
"repName": "<string>",
"callDuration": 123,
"description": "<string>",
"externalMeetingId": "<string>",
"source": "<string>",
"forceImport": True,
"attendees": [{}]
}
headers = {
"X-Workspace-API-Key": "<x-workspace-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Workspace-API-Key': '<x-workspace-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: '<string>',
repEmail: '<string>',
callDate: '<string>',
transcriptText: '<string>',
mediaUrl: '<string>',
file: '<string>',
repName: '<string>',
callDuration: 123,
description: '<string>',
externalMeetingId: '<string>',
source: '<string>',
forceImport: true,
attendees: [{}]
})
};
fetch('https://api.objectionly.com/api/call-processing/queue', 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.objectionly.com/api/call-processing/queue",
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([
'title' => '<string>',
'repEmail' => '<string>',
'callDate' => '<string>',
'transcriptText' => '<string>',
'mediaUrl' => '<string>',
'file' => '<string>',
'repName' => '<string>',
'callDuration' => 123,
'description' => '<string>',
'externalMeetingId' => '<string>',
'source' => '<string>',
'forceImport' => true,
'attendees' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Workspace-API-Key: <x-workspace-api-key>"
],
]);
$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.objectionly.com/api/call-processing/queue"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"repEmail\": \"<string>\",\n \"callDate\": \"<string>\",\n \"transcriptText\": \"<string>\",\n \"mediaUrl\": \"<string>\",\n \"file\": \"<string>\",\n \"repName\": \"<string>\",\n \"callDuration\": 123,\n \"description\": \"<string>\",\n \"externalMeetingId\": \"<string>\",\n \"source\": \"<string>\",\n \"forceImport\": true,\n \"attendees\": [\n {}\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Workspace-API-Key", "<x-workspace-api-key>")
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.objectionly.com/api/call-processing/queue")
.header("X-Workspace-API-Key", "<x-workspace-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"repEmail\": \"<string>\",\n \"callDate\": \"<string>\",\n \"transcriptText\": \"<string>\",\n \"mediaUrl\": \"<string>\",\n \"file\": \"<string>\",\n \"repName\": \"<string>\",\n \"callDuration\": 123,\n \"description\": \"<string>\",\n \"externalMeetingId\": \"<string>\",\n \"source\": \"<string>\",\n \"forceImport\": true,\n \"attendees\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.objectionly.com/api/call-processing/queue")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Workspace-API-Key"] = '<x-workspace-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"repEmail\": \"<string>\",\n \"callDate\": \"<string>\",\n \"transcriptText\": \"<string>\",\n \"mediaUrl\": \"<string>\",\n \"file\": \"<string>\",\n \"repName\": \"<string>\",\n \"callDuration\": 123,\n \"description\": \"<string>\",\n \"externalMeetingId\": \"<string>\",\n \"source\": \"<string>\",\n \"forceImport\": true,\n \"attendees\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_bodyQueue Call
Queue transcript text, uploaded media, or remote audio/video URLs for processing.
POST
/
api
/
call-processing
/
queue
Queue Call
curl --request POST \
--url https://api.objectionly.com/api/call-processing/queue \
--header 'Content-Type: application/json' \
--header 'X-Workspace-API-Key: <x-workspace-api-key>' \
--data '
{
"title": "<string>",
"repEmail": "<string>",
"callDate": "<string>",
"transcriptText": "<string>",
"mediaUrl": "<string>",
"file": "<string>",
"repName": "<string>",
"callDuration": 123,
"description": "<string>",
"externalMeetingId": "<string>",
"source": "<string>",
"forceImport": true,
"attendees": [
{}
]
}
'import requests
url = "https://api.objectionly.com/api/call-processing/queue"
payload = {
"title": "<string>",
"repEmail": "<string>",
"callDate": "<string>",
"transcriptText": "<string>",
"mediaUrl": "<string>",
"file": "<string>",
"repName": "<string>",
"callDuration": 123,
"description": "<string>",
"externalMeetingId": "<string>",
"source": "<string>",
"forceImport": True,
"attendees": [{}]
}
headers = {
"X-Workspace-API-Key": "<x-workspace-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Workspace-API-Key': '<x-workspace-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: '<string>',
repEmail: '<string>',
callDate: '<string>',
transcriptText: '<string>',
mediaUrl: '<string>',
file: '<string>',
repName: '<string>',
callDuration: 123,
description: '<string>',
externalMeetingId: '<string>',
source: '<string>',
forceImport: true,
attendees: [{}]
})
};
fetch('https://api.objectionly.com/api/call-processing/queue', 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.objectionly.com/api/call-processing/queue",
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([
'title' => '<string>',
'repEmail' => '<string>',
'callDate' => '<string>',
'transcriptText' => '<string>',
'mediaUrl' => '<string>',
'file' => '<string>',
'repName' => '<string>',
'callDuration' => 123,
'description' => '<string>',
'externalMeetingId' => '<string>',
'source' => '<string>',
'forceImport' => true,
'attendees' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Workspace-API-Key: <x-workspace-api-key>"
],
]);
$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.objectionly.com/api/call-processing/queue"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"repEmail\": \"<string>\",\n \"callDate\": \"<string>\",\n \"transcriptText\": \"<string>\",\n \"mediaUrl\": \"<string>\",\n \"file\": \"<string>\",\n \"repName\": \"<string>\",\n \"callDuration\": 123,\n \"description\": \"<string>\",\n \"externalMeetingId\": \"<string>\",\n \"source\": \"<string>\",\n \"forceImport\": true,\n \"attendees\": [\n {}\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Workspace-API-Key", "<x-workspace-api-key>")
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.objectionly.com/api/call-processing/queue")
.header("X-Workspace-API-Key", "<x-workspace-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"repEmail\": \"<string>\",\n \"callDate\": \"<string>\",\n \"transcriptText\": \"<string>\",\n \"mediaUrl\": \"<string>\",\n \"file\": \"<string>\",\n \"repName\": \"<string>\",\n \"callDuration\": 123,\n \"description\": \"<string>\",\n \"externalMeetingId\": \"<string>\",\n \"source\": \"<string>\",\n \"forceImport\": true,\n \"attendees\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.objectionly.com/api/call-processing/queue")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Workspace-API-Key"] = '<x-workspace-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"repEmail\": \"<string>\",\n \"callDate\": \"<string>\",\n \"transcriptText\": \"<string>\",\n \"mediaUrl\": \"<string>\",\n \"file\": \"<string>\",\n \"repName\": \"<string>\",\n \"callDuration\": 123,\n \"description\": \"<string>\",\n \"externalMeetingId\": \"<string>\",\n \"source\": \"<string>\",\n \"forceImport\": true,\n \"attendees\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_bodyBase URL
https://api.objectionly.comEndpoint
POST /api/call-processing/queue
Authentication
Get your API key here:
https://app.objectionly.com/dashboard/integrations
string
required
Your workspace API key.
string
Required only when your workspace is configured to require a proxy token.
string
Optional source header. Supported values match the
source body field. If
both are sent, the body source value takes precedence.Request Body
string
default:"Discovery call - Acme"
required
Call title.
string
default:"rep@acme.com"
required
Rep or host identity. This is usually an email address, but it can also be a
unique rep identifier configured in Objectionly.
string
default:"2026-01-31T18:30:00Z"
required
ISO-8601 timestamp.
string
Plain transcript text. This is the preferred text field for new integrations.
string
Absolute
http(s) URL for a remote audio or video file. Can be used by
itself or together with transcriptText.string
Multipart file upload for direct media ingestion.
file and mediaUrl
cannot be sent together.string
Rep or host display name.
number
Duration in minutes. Must be a positive integer. Defaults to
30 if omitted.string
Additional context to store with the call.
string
Used for de-duplication/idempotency across calls.
string
Optional source value. Supported values:
manually, firefliesai,
fathom, zoom, gohighlevel, zapier, custom_api.boolean
Bypasses early short-call filtering when set to
true. For manual imports,
this defaults to true if omitted.array
Optional list of call attendees. Send up to
10 attendee objects.Provide at least one ingest input:
transcriptText, mediaUrl, or file.name, phone,
email, and uniqueId.
{
"attendees": [
]
}
{
"attendees": [
{
"name": "Alex Buyer",
"phone": "+15551234567",
"email": "alex@example.com",
"uniqueId": "crm-contact-id"
}
]
}
Attendee fields are optional. Objectionly trims attendee values, stores blank
values as
null, and skips attendee objects where every field is blank.Media-only requests are accepted. When you upload a
file or provide a
mediaUrl without transcript text, Objectionly stores the media and
transcribes it later during processing.Supported media types are
.mp3, .wav, .m4a, and .mp4, mapped to
audio/mpeg, audio/wav, audio/m4a, and video/mp4.Examples
- Transcript text (JSON)
- Remote media URL (JSON)
- Transcript + media URL (JSON)
- File upload (multipart)
{
"title": "Discovery call - Acme",
"transcriptText": "Full transcript text...",
"repEmail": "rep@acme.com",
"repName": "Alex Rep",
"callDate": "2026-01-31T18:30:00Z",
"callDuration": 42,
"description": "Optional summary or metadata...",
"externalMeetingId": "optional-idempotency-key",
"source": "custom_api",
"attendees": [
{
"name": "Alex Buyer",
"phone": "+15551234567",
"email": "alex@example.com",
"uniqueId": "crm-contact-id"
}
]
}
{
"title": "Remote recording",
"mediaUrl": "https://cdn.example.com/calls/discovery-call.mp4",
"repEmail": "rep@acme.com",
"repName": "Alex Rep",
"callDate": "2026-01-31T18:30:00Z",
"callDuration": 42,
"source": "custom_api"
}
{
"title": "Remote recording with transcript",
"transcriptText": "Transcript already captured by the upstream system.",
"mediaUrl": "https://cdn.example.com/calls/discovery-call.mp3",
"repEmail": "rep@acme.com",
"repName": "Alex Rep",
"callDate": "2026-01-31T18:30:00Z",
"source": "firefliesai"
}
Send a
multipart/form-data request with form fields like title,
repEmail, callDate, optional transcriptText, and a file part.
To include attendees in a multipart request, send an attendees form field
containing a JSON-encoded array, such as
[{"name":"Alex Buyer","phone":"+15551234567"}].Do not manually set the multipart Content-Type header; your HTTP client
should generate it with the boundary.Responses
- Queued (200)
- Filtered Out (200)
- Duplicate (200)
string
required
Unique identifier for the queued call.
string
required
Queue status for the call.
boolean
required
Indicates the call was queued successfully.
{
"callId": "uuid",
"status": "queued",
"queued": true
}
string
required
Unique identifier for the call record.
string
required
filtered_out when the call is stopped during ingest, such as for a
short call.boolean
required
false when the call was stored but not queued for worker processing.{
"callId": "uuid",
"status": "filtered_out",
"queued": false
}
Remote Media URL Rules
mediaUrlmust be an absolutehttp(s)URL.- In production,
mediaUrlmust usehttps. - The URL must resolve to a public internet address.
- Redirects are allowed, but only up to the configured limit.
- Maximum media size is 500 MB.
- Unsupported media types return
415 Unsupported Media Type.
Errors
| Status | Description |
|---|---|
| 400 | Missing or invalid fields such as title, repEmail, callDate, callDuration, forceImport, source, malformed mediaUrl, malformed multipart attendees, more than 10 attendees, or sending file and mediaUrl together |
| 401 | Missing or invalid authentication |
| 413 | Uploaded or remote media exceeds the 500 MB limit |
| 415 | Unsupported media type |
| 422 | mediaUrl could not be fetched or failed remote URL safety checks |
| 500 | Failed to store media or queue the call |
