Tags
A tag is a label your team applies to records: contacts, organizations, deals, threads, files, and calendar events. Use tags to group records, then filter lists by them, for example with the tags parameter of List contacts.
Tags belong to the account. Everyone in it sees every tag, can apply it, and can edit it; only account admins can delete one. Applying a tag to a record creates a tagging. Carom can also tag threads on its own, using the tags you mark with applicable_to_interactions.
#The tag object
Returned by every tag endpoint, and embedded in records that carry tags. The per-type counts are filled in by List tags and Retrieve a tag; elsewhere they are null.
Attributes
-
idstring · uuidUnique identifier for the tag.
-
namestringThe label. Unique within the account.
-
colorstring · nullableDisplay color, such as
#66b185. -
descriptionstring · nullableWhat the tag is for.
-
applicable_to_contactsboolean · nullableMarks the tag as one for contacts and organizations. It doesn’t restrict where the tag can be applied. False unless set.
-
applicable_to_interactionsboolean · nullableWhen true, Carom can apply the tag to threads automatically, based on their content. False unless set.
-
contact_count,organization_count,deal_count,thread_count,file_count,calendar_event_countinteger · nullableNumber of records of each type that carry the tag, across the whole account.
{
"id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"name": "Customer",
"color": "#66b185",
"description": "Accounts with a signed contract.",
"applicable_to_contacts": true,
"applicable_to_interactions": false,
"contact_count": 38,
"organization_count": 12,
"deal_count": 9,
"thread_count": 0,
"file_count": 3,
"calendar_event_count": 0
}
#List tags
Returns every tag in the account, with counts, in one response; the list isn’t paginated. It takes no parameters.
Returns
-
collectionobjectShow 2 child attributesHide child attributes
-
recordsarray of tagsEvery tag in the account.
-
total_resultsintegerNumber of tags.
-
curl https://api.carom.io/tags \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"collection": {
"records": [
{
"id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"name": "Customer",
"color": "#66b185",
"contact_count": 38,
…
},
{
"id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Renewal Q4",
"color": "#e0a43b",
"contact_count": 14,
…
}
],
"total_results": 2
}
}
#Create a tag
Creates a tag in the account without applying it to anything. Tag names are unique within an account. To use a tag by name whether or not it exists, apply it to a record with tag.name.
Request body application/json
-
tagobjectrequiredShow 5 child attributesHide child attributes
-
namestringrequired -
colorstring · nullable -
descriptionstring · nullable -
applicable_to_contactsboolean · nullabledefaultfalse -
applicable_to_interactionsboolean · nullabledefaultfalse
-
Returns
The new tag object, wrapped in tag, with status 201. Its counts are null.
Errors
- 400
invalid_requesttag.nameis missing or empty, or a field has the wrong type. - 409
tag_name_takenAnother tag in the account has that name.fields.name.codeistaken.
curl https://api.carom.io/tags \
-H "Authorization: Bearer $CAROM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tag": {
"name": "Renewal Q4",
"color": "#e0a43b",
"description": "Contracts that renew between October and December."
}
}'
{
"tag": {
"id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Renewal Q4",
"color": "#e0a43b",
"description": "Contracts that renew between October and December.",
"applicable_to_contacts": false,
"applicable_to_interactions": false,
"contact_count": null,
…
}
}
#Retrieve a tag
Returns a single tag with its counts.
Path parameters
-
idstring · uuidrequiredThe tag’s id.
Returns
The tag object, wrapped in tag.
Errors
- 404
record_not_foundNo tag with that id in your account.
curl https://api.carom.io/tags/0f1e2d3c-4b5a-4968-8776-655443322110 \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"tag": {
"id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"name": "Customer",
"color": "#66b185",
"contact_count": 38,
"organization_count": 12,
"deal_count": 9,
…
}
}
#Update a tag
Changes a tag. Any user in the account can edit any tag, and the change shows on every record that carries it. Send only the fields you want to change; the rest are left as they are.
Path parameters
-
idstring · uuidrequiredThe tag’s id.
Request body application/json
-
tagobjectrequiredAny of the attributes accepted by Create a tag, all optional.
namecan’t be empty.
Returns
The updated tag object, wrapped in tag. Its counts are null.
Errors
- 400
invalid_requesttag.nameis empty, or a field has the wrong type. - 404
record_not_foundNo tag with that id in your account. - 409
tag_name_takenAnother tag in the account has that name.fields.name.codeistaken.
curl -X PATCH https://api.carom.io/tags/7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d \
-H "Authorization: Bearer $CAROM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tag": {
"name": "Renewal 2026 Q4",
"applicable_to_contacts": true
}
}'
{
"tag": {
"id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Renewal 2026 Q4",
"color": "#e0a43b",
"applicable_to_contacts": true,
…
}
}
#Delete a tag
Permanently deletes a tag and removes it from every record in the account. Requires an account admin; other keys get 403 permission_denied.
To merge one tag into another, pass replacement_tag_id. Every record that carries the deleted tag gets the replacement instead; records that already carry both just lose the deleted one.
Path parameters
-
idstring · uuidrequiredThe tag to delete.
Request body application/json
-
replacement_tag_idstring · uuid · nullableA tag to apply to every record that carries the deleted one.
Returns
An empty response with status 204.
Errors
- 403
permission_deniedYour key’s user isn’t an account admin. - 404
record_not_foundNo tag with that id, or withreplacement_tag_id, in your account.
curl -X DELETE https://api.carom.io/tags/7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d \
-H "Authorization: Bearer $CAROM_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "replacement_tag_id": "0f1e2d3c-4b5a-4968-8776-655443322110" }'
No content
#Apply a tag
Applies a tag to a record. Send exactly one of tag_id, to apply an existing tag, or tag, to apply a tag by name. When no tag has that name, Carom creates it; when one does, Carom uses it as it is and ignores the color you sent.
Applying a tag the record already carries succeeds and returns the existing tagging.
Path parameters
-
record_typestringrequiredThe plural resource name, one of:
contactsorganizationsdealsthreadsfilescalendar_events -
record_idstring · uuidrequiredThe id of that record. In the OpenAPI spec each route names it after its type, for example
contact_id.Show 6 pathsHide paths
/contacts/{contact_id}/taggings/organizations/{organization_id}/taggings/deals/{deal_id}/taggings/threads/{thread_id}/taggings/files/{file_id}/taggings/calendar_events/{calendar_event_id}/taggings
Request body application/json
-
tag_idstring · uuidAn existing tag. Required unless you send
tag. -
tagobjectA tag by name. Required unless you send
tag_id.Show 2 child attributesHide child attributes
-
namestringrequired -
colorstringUsed only when Carom creates the tag.
-
Returns
-
taggingobjectThe link between the tag and the record.
Show 7 child attributesHide child attributes
idstring · uuidtag_idstring · uuidtaggable_typestringThe record type, singular.
contactorganizationdealthreadfilecalendar_eventtaggable_idstring · uuidThe record’s id.
user_idstring · uuid · nullableThe user who applied the tag.
created_atstring · date-time · nullabletagtag · nullableThe tag, without counts.
Errors
- 400
invalid_requestYou sent bothtag_idandtag, or neither. - 404
record_not_foundNo record of that type with that id is visible to your key, or no tag with thattag_idin your account.
curl https://api.carom.io/contacts/1f3c9a52-7b0e-4d4a-9c1e-2a6f0d8b3e41/taggings \
-H "Authorization: Bearer $CAROM_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "tag": { "name": "Renewal Q4", "color": "#e0a43b" } }'
{
"tagging": {
"id": "3b4c5d6e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
"tag_id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"taggable_type": "contact",
"taggable_id": "1f3c9a52-7b0e-4d4a-9c1e-2a6f0d8b3e41",
"user_id": "9c41d2e8-3f6a-4b7c-8d1e-5a2f7b9c0d3e",
"created_at": "2026-09-10T16:31:08.415Z",
"tag": {
"id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Renewal Q4",
"color": "#e0a43b",
…
}
}
}
#Remove a tag
Removes a tag from a record, named by the tag’s id rather than the tagging’s. The tag itself stays in the account; to delete it everywhere, use Delete a tag.
Removing a tag the record doesn’t carry succeeds and changes nothing.
Path parameters
-
record_type,record_idrequiredAs on Apply a tag.
-
tag_idstring · uuidrequiredThe id of the tag to remove.
Returns
An empty response with status 204.
Errors
- 404
record_not_foundNo record of that type with that id is visible to your key.
curl -X DELETE https://api.carom.io/contacts/1f3c9a52-7b0e-4d4a-9c1e-2a6f0d8b3e41/taggings/7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d \
-H "Authorization: Bearer $CAROM_API_KEY"
No content