curl --request POST \
--url https://api.cloudtalk.io/v1/calls/{callId}/tags \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"tagIds": [
"311",
"415"
]
}
'import requests
url = "https://api.cloudtalk.io/v1/calls/{callId}/tags"
payload = { "tagIds": ["311", "415"] }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({tagIds: ['311', '415']})
};
fetch('https://api.cloudtalk.io/v1/calls/{callId}/tags', 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.cloudtalk.io/v1/calls/{callId}/tags",
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([
'tagIds' => [
'311',
'415'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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.cloudtalk.io/v1/calls/{callId}/tags"
payload := strings.NewReader("{\n \"tagIds\": [\n \"311\",\n \"415\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.cloudtalk.io/v1/calls/{callId}/tags")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"tagIds\": [\n \"311\",\n \"415\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudtalk.io/v1/calls/{callId}/tags")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tagIds\": [\n \"311\",\n \"415\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "311",
"name": "Billing",
"color": "#4CAF50",
"type": "tag",
"taggedAt": "2026-11-02T09:43:10Z",
"taggedByUserId": null
},
{
"id": "415",
"name": "Follow-up",
"color": "#FF9800",
"type": "tag",
"taggedAt": "2026-11-02T09:43:10Z",
"taggedByUserId": null
}
],
"requestId": "c9856b94-db55-402b-a6ba-adb130351158"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"code": "UNAUTHORIZED",
"message": "You are not authorized to access this resource."
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "CALL_TAGS.TAG_NOT_ASSIGNABLE",
"message": "Some tags cannot be added to this call. GET /v1/call-tags lists the tags you can add.",
"target": "tagIds",
"details": [
{
"code": "CALL_TAGS.TAG_NOT_ASSIGNABLE",
"message": "Not an active plain call tag of this company.",
"target": "999"
},
{
"code": "CALL_TAGS.TAG_NOT_ASSIGNABLE",
"message": "Not an active plain call tag of this company.",
"target": "902"
}
]
},
"requestId": "c9856b94-db55-402b-a6ba-adb130351158"
}<string>{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}Add tags to a call
Adds 1 to 100 plain tags from List call tags to a call and returns all tags on the call after the change. Tags already on the call are skipped, so a repeated request is safe. If any id cannot be added, nothing is added and the error lists each refused id in details.
Dispositions and system tags cannot be added: a Dialer disposition is recorded by the Dialer, not by a label. Tags you add show taggedByUserId: null.
Which calls. callId is the numeric call id from call history or the call uuid that call webhooks carry as call_uuid, in any letter case. Only ended calls are served: a call still in progress returns 409 CALL_TAGS.CALL_NOT_ENDED, and a transferred call counts as ended only when no leg is live. A call that is ringing, or that ended in the last 30 seconds or so, can return 404 CALL_TAGS.CALL_NOT_FOUND because its record is not stored yet: retry, or act on the call.ended webhook.
Tags belong to the whole call. A transferred call has one record per leg, and its tags are shared by every leg. Reading or removing by one leg’s numeric id also covers tags added on the other legs, and a tag added by call uuid is stored on the first leg.
When at least one tag was added, the call.tags_modified webhook is sent with tag_action: added, except for an older call record that has no call uuid.
An agent who edits the call’s tags in the Phone’s dialer view saves the whole tag set, so they can remove a tag you added.
curl --request POST \
--url https://api.cloudtalk.io/v1/calls/{callId}/tags \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"tagIds": [
"311",
"415"
]
}
'import requests
url = "https://api.cloudtalk.io/v1/calls/{callId}/tags"
payload = { "tagIds": ["311", "415"] }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({tagIds: ['311', '415']})
};
fetch('https://api.cloudtalk.io/v1/calls/{callId}/tags', 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.cloudtalk.io/v1/calls/{callId}/tags",
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([
'tagIds' => [
'311',
'415'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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.cloudtalk.io/v1/calls/{callId}/tags"
payload := strings.NewReader("{\n \"tagIds\": [\n \"311\",\n \"415\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.cloudtalk.io/v1/calls/{callId}/tags")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"tagIds\": [\n \"311\",\n \"415\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudtalk.io/v1/calls/{callId}/tags")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tagIds\": [\n \"311\",\n \"415\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "311",
"name": "Billing",
"color": "#4CAF50",
"type": "tag",
"taggedAt": "2026-11-02T09:43:10Z",
"taggedByUserId": null
},
{
"id": "415",
"name": "Follow-up",
"color": "#FF9800",
"type": "tag",
"taggedAt": "2026-11-02T09:43:10Z",
"taggedByUserId": null
}
],
"requestId": "c9856b94-db55-402b-a6ba-adb130351158"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"code": "UNAUTHORIZED",
"message": "You are not authorized to access this resource."
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "CALL_TAGS.TAG_NOT_ASSIGNABLE",
"message": "Some tags cannot be added to this call. GET /v1/call-tags lists the tags you can add.",
"target": "tagIds",
"details": [
{
"code": "CALL_TAGS.TAG_NOT_ASSIGNABLE",
"message": "Not an active plain call tag of this company.",
"target": "999"
},
{
"code": "CALL_TAGS.TAG_NOT_ASSIGNABLE",
"message": "Not an active plain call tag of this company.",
"target": "902"
}
]
},
"requestId": "c9856b94-db55-402b-a6ba-adb130351158"
}<string>{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}Authorizations
HTTP Basic Authentication. Use your API Access Key ID as the username and your API Access Key Secret as the password. Generate keys in the CloudTalk Dashboard under Account -> Settings -> API Keys (https://dashboard.cloudtalk.io/menu/account/settings/API-keys).
Path Parameters
The numeric call id or the call uuid.
"143223459"
Body
1 to 100 call tag ids from List call tags. Duplicates are ignored.
1 - 100 elements