Organizations
An organization is a company or other body that your contacts work for. Carom creates organizations from the email domains it sees in correspondence and links each contact to one through an employment. Use this resource to read an organization with its people and recent activity, correct its name or description, and create organizations Carom hasn’t found yet.
Organizations belong to the whole account. Every user can see every organization, and anyone who can see one can edit it; only account admins can delete one. Thread and file counts, and the people listed at an organization, are the exception: they cover only correspondence and contacts visible to your key.
#The organization object
Returned by every organization endpoint. Retrieving a single organization adds its upcoming events, activity counts, and timeline.
Attributes
-
idstring · uuidUnique identifier for the organization.
-
namestring · nullableDisplay name. For an organization Carom created from a domain, this starts as the domain and is replaced when Carom learns the real name.
-
name_sourcestring · nullableWho set
name.auto: Carom used the domain when it created the organization.enrichment: Carom filled it in from the organization’s website.user: a person set it, in the app or through the API. Null for a name set before Carom recorded its source. Carom replaces only a name that is empty,auto, orenrichment.autoenrichmentuser -
descriptionstring · nullableA short account of what the organization does, written by your team or filled in by Carom from the organization’s website.
-
description_sourcestring · nullableWho set
description.enrichment: Carom filled it in from the organization’s website.user: a person set it. Null when there is no description, or for one set before Carom recorded its source. Carom replaces only a description that is empty orenrichment.enrichmentuser -
domainstring · nullableThe organization’s email and web domain, such as
wildgrove.example, in lowercase. Unique within the account. -
contact_countinteger · nullableNumber of contacts employed at the organization.
-
thread_countinteger · nullableNumber of threads with people at the organization, counted across the mailboxes whose statistics are visible to your key (see statistics visible to your key).
-
file_countinteger · nullableNumber of files exchanged with people at the organization, counted the same way.
-
pinnedboolean · nullableWhether your key’s user has pinned this organization.
-
logoobject · nullableThe organization’s logo, with a
source_urlyou can display directly and the originalfile_name. -
tasksarray of tasks · nullableOpen tasks attached to the organization. Retrieve an organization includes up to five.
-
commentsarray of comments · nullableComments your team has left on the organization. For comments on its people and deals as well, use Retrieve an organization’s discussion.
-
contactsarray of contacts · nullablePeople employed at the organization who are visible to your key, not counting mailing lists and notification senders. Present on Retrieve and Update responses; null elsewhere.
-
tagsarray of tags · nullableTags applied to this organization.
{
"id": "6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3",
"name": "Wildgrove Property Management",
"name_source": "enrichment",
"description": "Manages residential and mixed-use buildings in the East Bay.",
"description_source": "user",
"domain": "wildgrove.example",
"contact_count": 6,
"thread_count": 58,
"file_count": 12,
"pinned": true,
"logo": null,
"tasks": [],
"comments": [],
"contacts": null,
"tags": [
{
"id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"name": "Customer",
"color": "#66b185",
…
}
]
}
#List organizations
Returns the account’s organizations, 50 per page, alphabetically by name unless you choose another sort. Filter by a search query, by tags, or to the ones you’ve pinned, and page through the result with a cursor.
Query parameters
-
querystringMatch against names, domains, and descriptions. Up to 500 characters.
-
slicestringpinnedreturns only organizations your key’s user has pinned. Any other value is ignored.pinned -
sortstringdefaultnameField to sort by. An unrecognized value falls back to
name.namecontact_countthread_countfile_count -
orderstringDefaults to
ascfornameanddescfor the counts. Any other value uses the default.ascdesc -
tagsstringComma-separated tag ids, at most 50.
-
tag_operatorstringdefaultanyWhether an organization must carry any of the given tags, or all of them.
anyall -
next_cursorstringOpaque token from the previous page’s
page_info.next_cursor. Omit to start from the beginning. Send the samesortandorderas on the first page. See Cursor pagination.
Returns
-
collectionobjectA page of organizations and the cursor to the next one.
Show 3 child attributesHide child attributes
-
recordsarray of organizationsUp to 50 organizations in the requested order.
-
page_infopage infoWhere this page sits in the full list. Pass
next_cursorback to fetch the next page whilehas_more_afteris true. -
sort,order,slice_key,filtersnullableThe
sort,order, andsliceyou sent, and yourquery,tags, andtag_operatorasfilters, echoed back. Null when you sent none. See the cursor collection.
-
Errors
- 400
invalid_requestA parameter is malformed, for example aqueryover 500 characters or a tag id that isn’t a UUID. - 400
invalid_cursorThe cursor is unreadable, or came from another list or sort. - 400
unsupported_cursor_directionThis list pages forward only.
curl "https://api.carom.io/organizations?sort=thread_count&tags=0f1e2d3c-4b5a-4968-8776-655443322110" \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"collection": {
"records": [
{
"id": "6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3",
"name": "Wildgrove Property Management",
"domain": "wildgrove.example",
"contact_count": 6,
"thread_count": 58,
…
},
{
"id": "2d7f4b1e-8c3a-4e5d-9b6f-1a0c3e7d5b92",
"name": "Halvorsen Freight",
"domain": "halvorsenfreight.example",
"contact_count": 3,
"thread_count": 21,
…
}
],
"page_info": {
"limit": 50,
"next_cursor": "Pz5Nc8Rt1Wq7Lk3Vb9Hx2Gm6Jd4Sy0Fa8Tu1Ke",
"prev_cursor": null,
"has_more_after": true,
"has_more_before": false
},
"sort": "thread_count",
"filters": {
"tags": "0f1e2d3c-4b5a-4968-8776-655443322110"
}
}
}
#Create an organization
Creates an organization. If you give a domain and the account already has an organization with that domain, Carom returns the existing organization unchanged, with the same status, instead of creating a second one. Compare the returned name and description with what you sent, and update it if you meant to change it.
Request body application/json
-
organizationobjectrequiredShow 4 child attributesHide child attributes
-
namestringrequired -
descriptionstring -
domainstringSuch as
wildgrove.example, without a scheme or path. Carom trims it and stores it in lowercase, so matching an existing domain ignores case. A blank domain is stored as null. -
logo_upload_idstring · uuidId of an image you uploaded to use as the logo.
-
Returns
The new or existing organization object, wrapped in organization.
Errors
- 400
invalid_requestA field failed validation, for example a missingnameor alogo_upload_idthat isn’t your image upload.error.fieldssays which.
curl https://api.carom.io/organizations \
-H "Authorization: Bearer $CAROM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organization": {
"name": "Halvorsen Freight",
"domain": "halvorsenfreight.example",
"description": "Regional trucking and warehousing in the Pacific Northwest."
}
}'
{
"organization": {
"id": "2d7f4b1e-8c3a-4e5d-9b6f-1a0c3e7d5b92",
"name": "Halvorsen Freight",
"description": "Regional trucking and warehousing in the Pacific Northwest.",
"domain": "halvorsenfreight.example",
"contact_count": 0,
"thread_count": 0,
"file_count": 0,
"pinned": false,
"logo": null,
…
}
}
#Retrieve an organization
Returns a single organization with the people who work there, up to five open tasks, up to three upcoming events, and its timeline of recent activity.
Path parameters
-
idstring · uuidrequiredThe organization’s id.
Returns
The organization object, wrapped in organization, with contacts filled in and these additional attributes.
-
countsobjectFull-set totals behind the
tasksandeventspreviews.Show 2 child attributesHide child attributes
open_tasksintegerOpen tasks attached to the organization that are visible to your key.
upcoming_eventsintegerEvents with the organization’s people that start today or later in the time zone of your key’s user.
-
eventsarray of calendar eventsUp to three upcoming events, soonest first.
-
timelineobject · nullableThe organization’s recent activity, as an object with an
itemsarray of timeline items.
Errors
- 404
record_not_foundNo organization with that id is visible to your key, or the id isn’t a UUID.
curl https://api.carom.io/organizations/6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3 \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"organization": {
"id": "6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3",
"name": "Wildgrove Property Management",
…
"contacts": [
{
"id": "1f3c9a52-7b0e-4d4a-9c1e-2a6f0d8b3e41",
"name": "Priya Natarajan",
…
}
],
"counts": {
"open_tasks": 2,
"upcoming_events": 1
},
"events": [
{
"id": "b8c9d0e1-f2a3-4b4c-9d5e-6f7a8b9c0d12",
"name": "Wildgrove renewal review",
…
}
],
"timeline": {
"items": [
…
]
}
}
}
#Update an organization
Changes the fields you send and leaves the rest alone. Every field is optional. A name or description you change is marked user in name_source or description_source, so Carom doesn’t replace it with details it later finds on the organization’s website.
Path parameters
-
idstring · uuidrequired
Request body application/json
-
organizationobjectrequiredAny of the attributes accepted by Create an organization.
namecan’t be empty. Send"description": nullto clear the description, and"logo_upload_id": nullto remove the logo; omit a field to leave it as it is.
Returns
The updated organization object, wrapped in organization, with contacts filled in.
Errors
- 400
invalid_requestA field failed validation, for example an emptyname.error.fieldssays which. - 404
record_not_foundNo organization with that id is visible to your key.
curl -X PATCH https://api.carom.io/organizations/6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3 \
-H "Authorization: Bearer $CAROM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organization": {
"description": "Manages residential and mixed-use buildings in the East Bay and Sacramento."
}
}'
{
"organization": {
"id": "6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3",
"name": "Wildgrove Property Management",
"description": "Manages residential and mixed-use buildings in the East Bay and Sacramento.",
"description_source": "user",
"domain": "wildgrove.example",
…
}
}
#Delete an organization
Permanently deletes an organization. Only an account admin can delete one.
The people who worked there stay, but their employments at the organization are deleted. The organization’s logo, the tasks attached to it, the comments on it, and its pins and shares are deleted with it, and it is removed from its tags and spaces. Pending proposals about the organization or its tasks expire.
An organization that is the counterparty of a deal can’t be deleted, including deals in pipelines your key can’t see. Delete the deal or change its counterparty first.
Path parameters
-
idstring · uuidrequired
Returns
An empty response with status 204.
Errors
- 403
permission_deniedYour key’s user isn’t an account admin. - 404
record_not_foundNo organization with that id is visible to your key. - 409
organization_has_dealsThe organization is the counterparty of at least one deal. Nothing was deleted.
curl -X DELETE https://api.carom.io/organizations/2d7f4b1e-8c3a-4e5d-9b6f-1a0c3e7d5b92 \
-H "Authorization: Bearer $CAROM_API_KEY"
No content
#Count organizations
Counts the organizations that List organizations would return for the same filters, without fetching them. Counting stops at cap when you give one, which keeps the call fast on large accounts.
Query parameters
-
query,slice,tags,tag_operatorAs on List organizations.
-
capintegerStop counting at this many. When more organizations match,
totalequalscapandexactis false. A value of 0 or less is ignored.
Returns
-
countcountShow 4 child attributesHide child attributes
totalintegerexactbooleanFalse when counting stopped at
cap.cappedbooleancapinteger · nullableThe cap that applied. Null when you sent none, or sent zero or a negative number.
Errors
- 400
invalid_requestA parameter is malformed, for example a tag id that isn’t a UUID.
curl "https://api.carom.io/organizations/count?query=freight&cap=1000" \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"count": {
"total": 14,
"exact": true,
"capped": false,
"cap": 1000
}
}
#Retrieve an organization’s discussion
Returns the comments your team has left on this organization, on the people who work there, and on the organization’s deals, grouped into scopes. Comments are internal; the organization never sees them.
The first scope is the organization itself and is always present. The people and deals scopes appear only when at least one record in them has a comment, and include only records visible to your key.
Path parameters
-
idstring · uuidrequired
Returns
-
discussionobjectShow 1 child attributeHide child attributes
-
scopesarray of objectsOne entry per group of records, in display order.
Show 6 child attributesHide child attributes
keystringorganizationpeopledealslabelstringA heading for the scope, such as
This organization.unitstringWhat the scope’s records are:
organizations,people, ordeals.primarybooleanTrue for the organization’s own scope.
total_commentsinteger-
recordsarray of objectsThe commented records in the scope, most recently discussed first.
Show 6 child attributesHide child attributes
keystringThe record type and id, joined by a hyphen.
record_typestringorganizationcontactdealrecord_idstring · uuidnamestring · nullabletotal_commentsintegercommentsarray of commentsOldest first.
-
Errors
- 404
record_not_foundNo organization with that id is visible to your key.
curl https://api.carom.io/organizations/6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3/discussion \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"discussion": {
"scopes": [
{
"key": "organization",
"label": "This organization",
"unit": "organizations",
"primary": true,
"total_comments": 0,
"records": [
{
"key": "organization-6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3",
"record_type": "organization",
"record_id": "6b0e2d9a-4c31-4f8e-a7d2-90c4e1b7f5a3",
"name": "Wildgrove Property Management",
"total_comments": 0,
"comments": []
}
]
},
{
"key": "people",
"label": "People",
"unit": "people",
"primary": false,
"total_comments": 1,
"records": [
{
"key": "contact-1f3c9a52-7b0e-4d4a-9c1e-2a6f0d8b3e41",
"record_type": "contact",
"record_id": "1f3c9a52-7b0e-4d4a-9c1e-2a6f0d8b3e41",
"name": "Priya Natarajan",
"total_comments": 1,
"comments": [
{
"id": "a9b8c7d6-e5f4-4a3b-9c2d-1e0f9a8b7c6d",
"html_content": "<p>Priya needs the renewal numbers before the 15th. She's out the week after.</p>",
"user_id": "9c41d2e8-3f6a-4b7c-8d1e-5a2f7b9c0d3e",
"created_at": "2026-09-03T18:44:12.618Z",
…
}
]
}
]
}
]
}
}