Mailboxes
A mailbox is an email account, on Google or Microsoft, that a user has connected to Carom. Carom imports its mail into threads, its correspondents into contacts, and its calendars into calendar events. Use this resource to see which mailboxes are connected, whether they are healthy, and how far their imports have got.
Each mailbox has one owner. Its view policy and send policy decide who else can read its mail and send from it: nobody, everyone in the account, or selected users and groups named in its grants. Your key sees the mailboxes your key’s user can view. Connecting a mailbox, changing its policies, and granting access happen in the Carom app.
#The mailbox object
Returned by every mailbox endpoint. List mailboxes adds two fields about your key’s user’s sending rights; retrieving a single mailbox adds its reconnect URL and import history.
A mailbox is working when connection_status is connected and sync_state is neither attention_needed nor deactivated. Otherwise, missing_required_capabilities lists any permissions the owner didn’t grant, and configuration.error_detail describes the last connection error: its category says whether the owner must reconnect, and retriable says whether the error is temporary.
Attributes
-
idstring · uuidUnique identifier for the mailbox.
-
namestring · nullableDisplay name for the mailbox.
-
email_addressstring · nullable -
user_idstring · uuid · nullableThe user who owns the mailbox.
-
primaryboolean · nullableTrue for the mailbox the owner signed up to Carom with.
-
connection_statusstringThe state of Carom’s connection to the provider.
incompletemeans the owner connected without granting every required permission;errormeans the provider rejected Carom, andconfiguration.error_detailsays why. The owner fixes either by reconnecting in the Carom app.connectedincompleteerrordisconnected -
authorizedboolean · nullableWhether Carom holds working credentials for the mailbox.
-
capabilitiesobjectWhich permissions the owner granted at the provider, each
trueorfalse.Show 5 child attributesHide child attributes
mail_readbooleanRead mail. Required.
mail_sendbooleanSend mail as the mailbox.
mail_modifybooleanChange read state and flags at the provider. Needed for
label_sync.calendar_readbooleancontacts_readbooleanRead the provider’s address book. Needed for
contacts_sync.
-
missing_required_capabilitiesarray of stringsRequired permissions the owner hasn’t granted:
identity(permission to confirm the account’s email address, requested at every sign-in),mail_read, or both. Empty when the connection is complete. -
sync_statestring · nullableNull until the first import starts.
importingmeans Carom has started importing the mailbox and adds new mail as it arrives.deactivatedmeans the owner’s account was deactivated and the mailbox disconnected.attention_neededmeans Carom may not be receiving new mail for this mailbox; the owner should reconnect it in the Carom app.importingdeactivatedattention_needed -
configurationobject · nullableProvider details and the last connection error.
Show 3 child attributesHide child attributes
providerstring · nullablegooglemicrosoftgranted_scopesarray of strings · nullableThe OAuth scopes the provider granted, as the provider names them.
-
error_detailobject · nullableThe error from the last connection attempt. Null when the mailbox is healthy.
Show 4 child attributesHide child attributes
codestringmessagestringcategorystringautherrors, such as a revoked token, need the owner to reconnect.authscopepermissionproviderrate_limitunknownretriablebooleanTrue for temporary provider errors and rate limits.
-
view_policystringWho besides the owner can read the mailbox’s mail: nobody, everyone in the account, or the users and groups in its grants.
noneeveryoneselected -
send_policystringWho besides the owner can send from the mailbox, with the same three values.
noneeveryoneselected -
contact_policystringWhich correspondents from this mailbox can become contacts the whole team sees.
alladmits every address;businessadmits addresses at non-personal domains;existing_orgsadmits only people at an organization the account already has; withnone, contacts from this mailbox stay private to the owner. Addresses at your own company’s domain never count.allbusinessexisting_orgsnone -
interaction_sharingstringHow much of the owner’s correspondence with those team-visible contacts teammates can see: only the contact, or also the fact that the owner knows them. Reading the mailbox’s mail is controlled by
view_policy.noneknowledge -
label_syncbooleanWhether read state and flags the owner sets in Carom are copied to the provider. Takes effect only when
capabilities.mail_modifyis true. -
contacts_syncbooleanWhether Carom imports the provider’s address book. Takes effect only when
capabilities.contacts_readis true. -
contacts_synced_atstring · date-time · nullable -
user_sendablebooleanOnly on List mailboxes. Whether your key’s user can send from this mailbox now: it is connected with send permission, and that user owns it or is allowed by its send policy.
-
user_sendability_reasonstring · nullableOnly on List mailboxes. Why
user_sendableis false; null when it is true.connection_not_authorizeduser_permission_deniedcapability_not_granted -
subscription_count,thread_count,contact_count,calendar_event_count,file_countinteger · nullableHow many users follow this mailbox through a mailbox subscription, and how many threads, contacts, calendar events, and files came from it. Computed by Retrieve a mailbox, and by List mailboxes when you pass
expanded=true. Null otherwise.
{
"id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70",
"name": "Dana Whitfield",
"email_address": "dana@harborline.example",
"user_id": "9c41d2e8-3f6a-4b7c-8d1e-5a2f7b9c0d3e",
"primary": true,
"connection_status": "connected",
"authorized": true,
"capabilities": {
"mail_read": true,
"mail_send": true,
"mail_modify": true,
"calendar_read": true,
"contacts_read": false
},
"missing_required_capabilities": [],
"sync_state": "importing",
"configuration": {
"provider": "google",
"granted_scopes": [
"openid",
"https://www.googleapis.com/auth/gmail.modify",
…
],
"error_detail": null
},
"view_policy": "selected",
"send_policy": "none",
"contact_policy": "business",
"interaction_sharing": "knowledge",
"label_sync": true,
"contacts_sync": false,
"contacts_synced_at": null,
"user_sendable": true,
"user_sendability_reason": null,
"subscription_count": 2,
"thread_count": 18422,
"contact_count": 1307,
"calendar_event_count": 2140,
"file_count": 3916
}
#List mailboxes
Returns every mailbox visible to your key: the ones your key’s user owns, the ones open to everyone in the account, and the ones that user has been granted. Returns every mailbox in one response; the list isn’t paginated.
Query parameters
-
expandedbooleanCompute
thread_count,contact_count,calendar_event_count,file_count, andsubscription_countfor each mailbox. Makes the request slower.
Returns
-
collectionobjectEvery mailbox visible to your key.
Show 2 child attributesHide child attributes
-
recordsarray of mailboxesEach with
user_sendableanduser_sendability_reasonfor your key’s user. -
total_resultsintegerThe number of mailboxes in
records.
-
Errors
- 400
invalid_requestexpandedisn’t a boolean.
curl "https://api.carom.io/mailboxes?expanded=true" \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"collection": {
"records": [
{
"id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70",
"email_address": "dana@harborline.example",
"connection_status": "connected",
"user_sendable": true,
"user_sendability_reason": null,
"thread_count": 18422,
…
},
{
"id": "6f1a9c3e-8b2d-4a7f-9e5c-1d3b7a9f2c86",
"email_address": "sales@harborline.example",
"connection_status": "connected",
"view_policy": "everyone",
"send_policy": "selected",
"user_sendable": false,
"user_sendability_reason": "user_permission_denied",
"thread_count": 6051,
…
}
],
"total_results": 2
}
}
#Retrieve a mailbox
Returns a single mailbox with its counts and its mail and calendar imports, newest first. Use it to follow an import started with Start an import.
Path parameters
-
idstring · uuidrequiredThe mailbox’s id.
Returns
The mailbox object, wrapped in mailbox, with these additional attributes.
-
connect_urlstring · nullableThe provider sign-in URL the Carom app uses to reconnect the mailbox, created fresh on each request. Null when the mailbox’s provider has no sign-in to reconnect through.
-
importsarray of objects · nullableEvery mail import for this mailbox, newest first.
Show 10 child attributesHide child attributes
idstring · uuidstatusstring · nullableprocessingcompletefailedresultstring · nullableThe outcome in one field. Matches
statusuntil the import completes, then says whether every thread was imported, some failed, all failed, or there was nothing to import.processingimportedpartialfailednothing_to_importtotal_thread_countinteger · nullableimported_thread_countinteger · nullableskipped_thread_countinteger · nullablefailed_thread_countinteger · nullablestarted_at,last_progress_at,completed_atstring · date-time · nullable-
errorobject · nullableWhy a failed import stopped, with a
code,message,category, andretriable, which is true when starting another import may succeed.categoryis one of these:timeoutproviderrate_limitauthparseunknown
-
calendar_importsarray of objects · nullableEvery import of one of this mailbox’s calendars, newest first.
Show 9 child attributesHide child attributes
idstring · uuidcalendar_idstring · uuidstatusstring · nullablepartialmeans the import stopped before every event was imported.processingcompletepartialfailedtotal_event_countinteger · nullableimported_event_countinteger · nullableskipped_event_countinteger · nullablefailed_event_countinteger · nullablestarted_atstring · date-time · nullablecompleted_atstring · date-time · nullable
Errors
- 404
record_not_foundNo mailbox with that id is visible to your key.
curl https://api.carom.io/mailboxes/d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70 \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"mailbox": {
"id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70",
"email_address": "dana@harborline.example",
"connection_status": "connected",
…
"connect_url": "https://accounts.google.com/o/oauth2/v2/auth?…",
"imports": [
{
"id": "f3b8d1a6-9e2c-4d7f-a4b1-6c0e5d9f2a73",
"status": "complete",
"result": "partial",
"total_thread_count": 18440,
"imported_thread_count": 18422,
"skipped_thread_count": 15,
"failed_thread_count": 3,
"started_at": "2026-09-02T08:14:05.566Z",
"last_progress_at": "2026-09-02T09:47:31.317Z",
"completed_at": "2026-09-02T09:47:33.090Z",
"error": null
}
],
"calendar_imports": [
{
"id": "1e5a9d3c-7b2f-4a8e-b6d4-3c9f1a7e5b28",
"calendar_id": "7b3d9f1e-5c8a-4e2b-9d6f-0a4c8e2b6d91",
"status": "complete",
"imported_event_count": 2140,
…
}
]
}
}
#Start an import
Queues a full import of the mailbox: Carom reads its mail from the provider again, imports each of its calendars that syncs, and, when contacts_sync is on, refreshes its address book. New mail arrives on its own once a mailbox is connected, so you need this only to catch up after a problem or to pick up address-book changes sooner. Only the mailbox’s owner can start an import.
The import runs in the background. Follow it in imports on Retrieve a mailbox.
Path parameters
-
mailbox_idstring · uuidrequired
Returns
The ok object, {"ok": "ok"}, once the import is queued.
Errors
- 403
permission_deniedYour key’s user can see the mailbox but doesn’t own it. - 404
record_not_foundNo mailbox with that id is visible to your key. - 422
mailbox_not_connectedThe mailbox has no working connection with permission to read mail. The owner must reconnect it in the Carom app. - 422
outbound_disabledYour account’s subscription doesn’t currently allow imports.
curl -X POST https://api.carom.io/mailboxes/d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70/imports \
-H "Authorization: Bearer $CAROM_API_KEY"
{ "ok": "ok" }
#List mailbox grants
Returns the users and groups that have been given access to a mailbox. A grant matters when the mailbox’s view_policy or send_policy is selected. Only the mailbox’s owner can list its grants.
Path parameters
-
mailbox_idstring · uuidrequired
Returns
-
mailbox_grantsarray of objectsShow 7 child attributesHide child attributes
idstring · uuidmailbox_idstring · uuiduser_idstring · uuid · nullableThe user granted access. Exactly one of
user_idandgroup_idis set.group_idstring · uuid · nullableThe group granted access. Every member of the group has it.
levelstringviewlets the grantee read the mailbox’s mail.sendalso lets them send from it.viewsendgranted_by_user_idstring · uuid · nullablecreated_atstring · date-time
Errors
- 403
permission_deniedYour key’s user can see the mailbox but doesn’t own it. - 404
record_not_foundNo mailbox with that id is visible to your key.
curl https://api.carom.io/mailboxes/d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70/grants \
-H "Authorization: Bearer $CAROM_API_KEY"
{
"mailbox_grants": [
{
"id": "4d9b1e7c-3a6f-4e2d-8c5b-1f7a9d3e6b82",
"mailbox_id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70",
"user_id": "3b7e1f9a-2c5d-4e8b-a6f0-8d2c4b9e1a75",
"group_id": null,
"level": "send",
"granted_by_user_id": "9c41d2e8-3f6a-4b7c-8d1e-5a2f7b9c0d3e",
"created_at": "2026-09-03T17:22:48.880Z"
},
{
"id": "a2c6e8f0-5b1d-4a7e-9c3f-8d4b2e6a0c57",
"mailbox_id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f70",
"user_id": null,
"group_id": "5c8a2e4f-1b7d-4c9e-b3a6-0f9d2e8c7b14",
"level": "view",
"granted_by_user_id": "9c41d2e8-3f6a-4b7c-8d1e-5a2f7b9c0d3e",
"created_at": "2026-09-03T17:23:10.286Z"
}
]
}