Explore the Customermates REST API

Browse API endpoints, inspect request and response formats, and use the OpenAPI reference as the starting point for integrations and custom workflows.

Get own user profile

GET

Retrieves the authenticated user's profile information.

Get users

POST

Retrieves a list of users with optional filtering, sorting and pagination.

Update own user profile

PATCH

Partially updates the authenticated user's own profile, the same fields as the account settings page: firstName, lastName, country, avatarUrl (an http or https URL, or '' or null to clear), theme, displayLanguage and formattingLocale. Omitted fields keep their values. Returns the saved profile. Requires: an active workspace membership; no further permission.

Accept a relation request

POST

Accepts a received relation request by invitationId on a connected LinkedIn or Instagram account. Requires a connected LinkedIn or Instagram account.

Apply a configuration change

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: data-model management; role management suffices when every operation is setTypeGrants or putAccessPreset.

Browse a Sales Navigator list

POST

Returns the leads (kind leads, default) or accounts (kind accounts) saved in a Sales Navigator list of a connected LinkedIn account, page by page (offset pagination).

Cancel an operation before publication

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: the user who started the operation, or an administrator.

Cancel a relation request

POST

Withdraws or refuses a relation request by invitationId on a connected LinkedIn or Instagram account. Requires a connected LinkedIn or Instagram account.

Create a link to connect a messaging channel

POST

Creates a secure link that connects a messaging channel to the inbox of the key's owner, as Connect on the Channels settings page and the MCP connect_messaging_account tool do. The connection cannot be completed over the API: open the url in a browser and finish there, by scanning the QR code for WhatsApp or signing in for email and LinkedIn; the new account then appears in GET /v1/messaging/connected-accounts. The link works once and expires after 30 minutes. Each member gets a number of connected accounts from the plan: Pro 1, Business 3, Enterprise unlimited, Starter none. Without a free slot or without a plan that includes messaging the request answers 400. Requires: Inbox messages Create and a plan that includes messaging.

Create a saved view

POST

Creates a named view with its initial state and selects it. The state is validated against the surface's configuration: fields, operators, sort and grouping keys and columns must come from /v1/data-views/config. Dashboard views hold no list state; create them with an empty state and place widgets on them with viewId. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Send a relation request

POST

Sends a real connection / relation request from a connected LinkedIn or Instagram account to identifier, with an optional short message. Requires a connected LinkedIn or Instagram account.

Create a routine

POST

Creates a routine owned by the caller. The example fires on new records of one type whose field matches recordTrigger.query.filters; filters on record.created and record.updated match the resulting record and are rechecked at admission, and the owner's current access is always rechecked. Creation may be refused when the owner has used the plan's per-user routine allowance (409). Requires: create permission on routines.

Create or update a webhook subscription

POST

Subscribes an endpoint to the given events (url and events are required). The endpoint must use HTTP or HTTPS, have a valid host, and contain no username or password. Deliveries are signed with HMAC-SHA-256 in the X-Webhook-Signature header when a secret is set. The signing secret is never returned. Optional headers are sent with every delivery for endpoints that require their own authentication; their values are never returned, the response reports headerNames instead, Content-Type, Host and X-Webhook-Signature cannot be overridden, and an endpoint carrying headers must use HTTPS. An optional bodyTemplate replaces the standard envelope for endpoints that expect a fixed shape, and the signature is computed over the rendered body. Providing an existing id updates that subscription instead; omitted fields keep their stored values. Both creating and updating answer 201 with the saved subscription.

Create Knowledge Base pages

POST

Creates one to five pages atomically and appends them to the saved order. kind defaults to knowledge; a procedure needs whenToUse and numbered steps; the workspace has at most one guide. With requireEmpty, the call fails with 409 unless the Knowledge Base is empty. Requires: Knowledge Base Create.

Delete a saved view

POST

Moves a named view to Trash; when it was the active view, the surface falls back to All. Deleting a dashboard view moves its widgets to Trash with it, and restoring the view brings them back. The view is deleted permanently after 30 days unless /v1/trash/restore restores it with the returned trashBatchId. Records are never deleted, and the All view cannot be deleted. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Delete a widget

POST

Moves one widget to Trash, as deleting it on the dashboard does. It is deleted permanently after 30 days unless /v1/trash/restore restores it with the returned trashBatchId. Its source records are never changed. Requires: ownership of the widgets; the list holds only the caller's own widgets and their results stay filtered by read access to the widgets' lists.

Delete an unused custom role

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: role management: delete access to users.

Delete a routine

POST

Moves a routine to Trash, where it stops running. Restore it through the trash API with the returned trashBatchId; only permanent deletion removes its history. A routine with a running run answers 409. Only an active system administrator may delete. Requires: delete permission on routines and the system administrator role.

Delete Trash items permanently and erase their values from history

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: delete access to each item: to its list for records, data-model management for lists, fields and relationships, Knowledge Base delete access for pages, an administrator role for routines, and ownership for personal views and widgets.

Delete a webhook subscription

DELETE

Removes a webhook subscription so it stops receiving deliveries.

Delete a Knowledge Base page

POST

Moves one page to Trash, where it is deleted permanently after 30 days unless POST /v1/trash/restore restores it with the returned trashBatchId. Send updatedAt from your latest read as expectedUpdatedAt. Requires: Knowledge Base Delete.

Discard a message draft

DELETE

Deletes exactly the saved draft revision identified by id and draftRevision. A newer edit is never discarded; sent messages are unaffected. An id that holds no draft visible to the key (already discarded or sent, or not a draft) is a safe no-op that returns threadId: null. A draftRevision that no longer matches the saved draft answers 404 and deletes nothing.

Disconnect a connected account

DELETE

Disconnects one of your connected accounts: it is removed from the workspace and from the messaging provider, and its synced conversations disappear. If the provider cannot be reached, the workspace removal still completes and a daily cleanup removes the provider account later. This cannot be undone; connecting the account again starts a new sync. Only the account owner can change it; another member's account answers 404. Requires: Inbox messages Delete.

Discover record types by name

POST

Pages through the record types the caller can access, with each type's id, labels, description, icon, field count, readable record count (null when the caller cannot read the type) and the record actions the caller may take. search matches labels and descriptions, typeIds restricts the result, and includeEmbedded adds line-item types. Continue with page until total is covered, then read the relevant schemas with /v1/model/read. Names and descriptions are customer data; use ids, never labels, as references. Requires: read access to the list; data-model and role managers see every list.

Empty Trash (administrators)

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: an administrator.

Export accessible records as a JSON document or an Excel workbook

POST

Exports the selected type's filtered and sorted records with their readable embedded descendants from one consistent workspace snapshot. Maximum 5,000 records and 50,000 candidate links. format json (default) returns a document with stable type, field, relationship and record IDs, readable outbound links and the current schema revision; restricted values remain marked restricted, and import accepts it. format xlsx returns an Excel workbook with one sheet per exported list: readable fields in field order headed by their labels, then relationship columns with linked record names, assignees, timestamps and a hidden record ID. Dates are spreadsheet dates, numbers and money are numbers with the currency in the header, multiple choice and links are comma-separated names, and formatted text is plain text. A field the caller cannot read on any exported record is left out. Incoming links from records outside the selection are not included. Requires: read access to the list.

Get a calendar by ID

GET

Fetches one calendar of a connected account visible to the caller. An id that is unknown, belongs to another workspace or to a calendar the caller cannot see answers 404 not_found with customCode calendarNotFound. The id matches the entityId of the messaging.calendar.changed webhook event.

Get a calendar event by ID

GET

Fetches one calendar event visible to the caller, including organizer and attendees. An id that is unknown, belongs to another workspace or to an event the caller cannot see answers 404 not_found with customCode calendarEventNotFound. The id matches the entityId of the messaging.calendar.event.changed webhook event.

Get calendar events

POST

Retrieves calendar events visible to the caller, ordered by start time, with optional filtering (calendarId, connectedAccountId, startsAt date range), sorting, and pagination. Event ids match the entityId of the messaging.calendar.event.changed webhook event.

Get calendars

POST

Retrieves the calendars of connected accounts visible to the caller (own accounts plus shared ones), with optional filtering (connectedAccountId), search, sorting, and pagination. Calendar ids match the entityId of the messaging.calendar.changed webhook event.

List own connected accounts

GET

Lists the messaging accounts connected to the workspace and visible to the authenticated user.

Get the workspace invitation link

POST

Returns the workspace invitation link and when it expires, as the Share link tab of the Invite dialog shows it. The link is reused until it expires after 7 days; the first call after that creates a new one. Anyone who opens it can register and joins with status Waiting for approval and no role. Requires: Users & Roles Create.

Get a messaging thread by ID

GET

Fetches one message thread with its full message list. Returns the thread plus each message's direction, sender, subject, text body, and attachment metadata (HTML bodies and raw attachment urls are omitted).

Get messaging threads

POST

Retrieves inbox threads with search, sorting, pagination and shared filter syntax. Filters include connectedAccountId, emailFolder (in/notIn), lastMessageDirection (inbound/outbound), lastMessageSentAt (last actual message date) and lastMessageAt (activity including drafts). Use caller-scoped filterableFields.options; folder values encode [account UUID, provider folder ID] as a JSON string and groupKey identifies the account heading. Folder membership matches visible placements. Last direction/date exclude drafts, hidden/deleted messages and system events. Filters combine with AND; lastMessageSentAt inLastDays 7 plus notInLastDays 3 finds messages from three to seven days ago, using the standard start-of-day cutoff.

List post comments or reactions

POST

Reads engagement on a social post: kind=comments (default) lists the post's comments, kind=reactions lists who reacted to the post, or set commentId to list reactions on that specific comment (kind is ignored). Requires a connected LinkedIn or Instagram account.

List or fetch social posts

POST

Reads LinkedIn or Instagram posts through a connected account. Use [].id from GET /v1/messaging/connected-accounts as connectedAccountId. Use authorIdentifier='me' for the account owner, id from POST /v1/messaging/social-profiles/search, data[].author.id from a post-list response, or author.id from a single-post response. A messaging participant can first be resolved from items[].participants[].identifier returned by POST /v1/messaging/threads/search. For the first page, omit cursor and offset. For a cursor continuation, repeat connectedAccountId, authorIdentifier and limit, copy next_cursor from the previous response into cursor, and omit offset. Stop when next_cursor is null. An offset continuation requires a positive cumulative offset. Set postId instead to data[].id from a previous post-list response to fetch that post.

Get a social profile

POST

Reads a person or company profile through a connected account. Use [].id from GET /v1/messaging/connected-accounts as connectedAccountId. For a person, use profileType=person with 'me', items[].participants[].identifier from POST /v1/messaging/threads/search, id returned by this endpoint, data[].author.id from a social-post or comment list, author.id from a single-post response, data[].sender.id from a reaction list, a LinkedIn Classic public profile slug, or an Instagram username. Reuse this endpoint's id with profileType=person or as a social-post authorIdentifier. For a LinkedIn company, use profileType=company with data[].id from POST /v1/messaging/sales-navigator/search/companies or data[].current_positions[].company_id from POST /v1/messaging/sales-navigator/search/people. Company lookup is LinkedIn-only.

Get a webhook subscription

GET

Returns one webhook subscription by ID. An id that does not exist or belongs to another workspace answers 404 not_found. The signing secret itself is never returned.

Import a same-workspace record document

POST

Creates records with their exported IDs or updates matching IDs in one transaction. Embedded descendants are created after their parents, saved-price snapshots are preserved, and readable outbound links are merged. The document must match the current workspace's type IDs and schema revision. Maximum 100 records and 500 links per request. Create rejects existing IDs; update checks each exported record version. Retries of the identical request use its idempotency key. Requires: create access to the list in create mode, edit access in update mode.

Invite members by email

POST

Sends a workspace invitation email with the workspace's invitation link to each address, 1 to 20 per call; duplicate addresses receive one email. An invited person joins with no role until an administrator assigns one through POST /v1/members/update. Returns how many emails were sent. Requires: Users & Roles Create.

List the pages that support saved views

POST

Returns every surface the caller may manage views on, with its label and app path. Surfaces are the record lists (records:<typeId>), the Members, Roles, Webhooks, Webhook deliveries, Inbox, Activity and Routines lists, record activity timelines and the dashboard (dashboard); operator-console surfaces are not available. Timeline views accept only filters and sortDescriptor. Send an empty object. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

List saved views of a surface

POST

Returns the caller's saved views of one surface as paged summaries (id, name, position) with the active view key. The All view (__all__) is the surface's own personalization and is not listed; read it with viewKey __all__. Narrow with query by view id or name. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

List all dashboard widgets

POST

Returns every widget the caller owns across the main dashboard and every dashboard view, oldest first, with current authorized results. viewId names the dashboard view a widget belongs to (null for the main dashboard) and layout holds its stored position per breakpoint (xs, sm, md, lg) in grid units: x and w count columns (12 on lg, 8 on md, 4 on sm, 2 on xs) and y and h count rows of 54 px with 12 px gaps. A breakpoint without a stored position is placed automatically when the dashboard renders. Send an empty object. Requires: ownership of the widgets; the list holds only the caller's own widgets and their results stay filtered by read access to the widgets' lists.

List received relation requests

POST

Lists the connection / relation requests received by the owner of a connected LinkedIn or Instagram account. Requires a connected LinkedIn or Instagram account.

List roles

POST

Lists the workspace's roles with their system permissions, record type grants and whether any member holds them, as the Roles settings page and the roles of the MCP get_workspace_context tool show them. Supports searchTerm on the name, sortDescriptor with field type (system roles first, then by name) and pagination. Read one role with its record type catalog through /v1/roles/read, and assign a role to a member through /v1/members/update. Requires: read access to users; without role management (edit access to users) only the caller's own role is listed.

List a routine's runs

POST

Returns one routine's run history newest first, each with its status, trigger, summary and charged credits. Pass nextCursor from the previous page as cursor to continue; a null nextCursor ends the history. An id outside the workspace or the caller's access answers 404. Requires: read permission on routines.

List routines

POST

Lists the workspace's routines newest first, each with its prompt, trigger and last run. Supports searchTerm against the name, filters on ownerUserId, createdAt and updatedAt, sortDescriptor and pagination. Send an empty object for the first page. Requires: read permission on routines.

List Sales Navigator lists

POST

Lists the Sales Navigator lead lists (kind leads, default) or account lists (kind accounts) of a connected LinkedIn account. Lists can only be created in the Sales Navigator UI; the API reads and fills existing lists.

List Sales Navigator search parameters

POST

Resolves the parameter ids used by the Sales Navigator people and company search filters. Pass a type (LOCATION, INDUSTRY, JOB_TITLE, COMPANY, LEAD_LIST, ACCOUNT_LIST and more) and optional keywords to look up matching ids with display names. LEAD_LIST and ACCOUNT_LIST also resolve existing list ids by name.

List a webhook's deliveries

GET

Lists the deliveries of one webhook newest first, with status, response code and the delivered body. searchTerm matches url and event name. A webhook outside the workspace answers 404. Requires: read all permission on the API.

List webhook subscriptions

GET

Lists the workspace's webhook subscriptions. searchTerm matches url and description; sortField takes name, createdAt or updatedAt. Secrets and header values are never returned. Requires: read all permission on the API.

List Knowledge Base pages

POST

Lists Knowledge Base pages without their Markdown: the Operating Guide first, then the other pages in the workspace's saved order. Filter by kind (guide, procedure or knowledge). Requires: Knowledge Base read access.

List deliveries across all webhooks

GET

Lists the deliveries of every webhook in the workspace newest first, as the Deliveries page shows them, with status, response code and the delivered body. searchTerm matches url and event name. The deliveries of a single webhook come from GET /v1/webhooks/{id}/deliveries. Requires: read all permission on the API.

Move an email conversation to a folder

POST

Moves the eligible emails of one email conversation to a folder of its mailbox at the provider, as the Inbox and the MCP move_email_thread tool do. Take folderId from folderContext.folders of GET /v1/messaging/threads/{id}, which can move when folderContext.canMove is true; Sent and Drafts are never targets and their emails stay in place. Pass messageId to move a single email of the conversation. Emails moved outside the synced folders leave the inbox (hiddenFromInbox). movedCount, skippedCount and failedCount report each email; when the provider rate-limits a move part way, rateLimited and retryAfter say when to move the rest. A conversation you cannot see answers 404, an unknown folder or message 404, and a conversation that is not email 400. Requires: Inbox messages Edit and a plan that includes messaging.

Move a Knowledge Base page

POST

Places a page before or after another page in the order the whole workspace shares. Content and edit timestamps are unchanged. The Operating Guide stays pinned first: it can be neither moved nor used as the target. Requires: Knowledge Base Edit.

Link or unlink one conversation record

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: read and edit access to inbox messages, and edit access to the record's list.

Create, update, delete or link records

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: create access to the list for create; edit access for update, updateMany, link and unlink (on the source record's list); delete access for delete and deleteMany. Every referenced record must be readable.

Pause a routine

POST

Disables a routine and settles its queued runs as skipped. Resuming restores the schedule but never those runs. Only an active system administrator may pause. Requires: delete permission on routines and the system administrator role.

Preview a configuration change

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: data-model management; role management suffices when every operation is setTypeGrants or putAccessPreset.

Preview record deletion and cascading effects

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: delete access to the list.

Preview exactly what deleting Trash items permanently removes

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: delete access to each item: to its list for records, data-model management for lists, fields and relationships, Knowledge Base delete access for pages, an administrator role for routines, and ownership for personal views and widgets.

Read the activity timeline through declared record paths

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the record's list; change history also requires read access to the audit log.

Aggregate record values at an explicit grain

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the source list; restricted inputs are hidden.

Query records

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the list; only readable records and values are returned.

List items in Trash (deleted records, lists, fields, relationships, views, widgets, routines, Knowledge Base pages)

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: delete access to each item: to its list for records, data-model management for lists, fields and relationships, Knowledge Base delete access for pages, an administrator role for routines, and ownership for personal views and widgets. Items without access are not listed.

Read accessible conversation records

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to inbox messages; only records of readable lists are returned.

Read one saved view's state

POST

Returns one view with its complete state: filters, search term, sort, page size, view mode (table or card), grouping with its group summaries, column order, column widths and hidden columns. viewKey __all__ reads the All view. Read immediately before an update. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Read what a surface's views can filter, sort, group and show

POST

Returns one section of a surface's view capabilities. overview (the default) reports totals, whether search is supported, the view modes and the writable state keys. filters lists filterable fields with their operators and valid values (select filters use stable option IDs), sorting the sortable fields, grouping the groupable fields, and appearance the columns available for columnOrder, columnWidths and hiddenColumns. Sections are paged with page and pageSize (1 to 25, default 10) and can be narrowed with query. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Read one record

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the list and to the record. A missing or foreign record answers 404; a record of the workspace you cannot read answers 403.

Read personal record detail layout

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the list.

Read record types and their configuration

POST

Returns the configuration revision with the fields, stable select option ids, relationships, relationship paths and capabilities of the requested types, or of every accessible type when typeIds is omitted. Access presets are included only for schema and role managers. Pass the smallest set of typeIds you need, and send revision as expectedRevision on record and configuration writes. Requires: read access to the list; data-model and role managers see every list and its access presets.

Read the status of a staged operation and its recommended retryAfterMs polling interval

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: the user who started the operation, or an administrator.

Read a widget with current authorized results

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the widget's lists; restricted values stay hidden.

Read role permissions and the record type catalog

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: role management (edit access to users), or read or create access to users. Without role management only the caller's own role is readable, and record types and grants are limited to the types the caller can read.

Read a routine

POST

Returns one routine with its full configuration. An id outside the workspace or the caller's access answers 404. Requires: read permission on routines.

Read a record in Trash

POST

Reads one deleted record read only, as the Trash preview in the app shows it: its field values and related records as they were when it was deleted, the configuration of its type, and its Trash item with deletion and expiry dates, who deleted it and whether the caller can restore it. Find records with /v1/trash/query, where an item of kind record carries the typeId and its targetId is the recordId, and restore them with /v1/trash/restore. A record that is not in the caller's Trash answers 404. Requires: delete access to the record's list and read access to the record (read all, or read own when it is assigned to the caller), the rule that shows it in Trash; field values stay filtered by field access.

Read a Knowledge Base page

POST

Reads one page with its full Markdown. Keep updatedAt: update and delete require it as expectedUpdatedAt. Link pages as /wiki?page=<id>; ids survive renames. A missing page answers 404. Requires: Knowledge Base read access.

Record Created

WEBHOOK

Sent when a record that matches the webhook's record source is created, with its values after the change.

Record Moved to Trash

WEBHOOK

Sent when a matching record moves to Trash, with its values before the delete; record-query filters match the record just before the move.

Record Deleted Permanently

WEBHOOK

Sent when a record is deleted permanently, by hand or 30 days after it moved to Trash; it carries only the record reference because the values are erased.

Record Restored

WEBHOOK

Sent when a matching record comes back from Trash, with its restored values.

Record Updated

WEBHOOK

Sent when a field, assignment, identity or link of a matching record changes, with the values before and after the change.

Resend a webhook delivery

POST

Queues a new delivery of a finished delivery's event to the webhook's current url. The webhook must still be enabled and subscribed to the event; otherwise, or when its record trigger changed since, the request answers 409. A delivery that does not belong to the webhook answers 404. Requires: create permission on the API.

Reset saved view settings

POST

Removes the caller's overrides for the given state keys so the list falls back to every field in its configured order, ungrouped and unsorted. Only records:<typeId> surfaces support reset. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Resolve exact channel identifiers to every accessible linked record

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the lists; records the caller cannot read are omitted.

Restore Trash items, or every item of one delete by batchId. Restoring a field or saved view reports filters, columns, sort and grouping removed when the field was deleted in droppedViewReferences; restoring the field does not recreate those settings.

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: delete access to each item: to its list for records, data-model management for lists, fields and relationships, Knowledge Base delete access for pages, an administrator role for routines, and ownership for personal views and widgets.

Resume an interrupted operation

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: the user who started the operation.

Resume a routine

POST

Re-enables a paused or draft routine the caller owns, which is the same change as update with enabled true. A routine whose owner is deactivated cannot be resumed. Requires: update permission on routines.

Resync a connected account

POST

Fetches the account's history again in the background. Send an empty JSON object. Only the account owner can change it; another member's account answers 404. Requires: Inbox messages Edit.

Run a routine now

POST

Starts an enabled schedule routine the caller owns immediately and returns the id of the queued run. Manual test runs use triggerKind schedule. Event routines, disabled routines and inactive owners answer 409; another owner's routine answers 403. Paused AI work answers 422 and exhausted credits answer 429 before a run is queued. Run history includes the error block reason when a queued run cannot start. Requires: update permission on routines.

Save a message draft

POST

Saves or updates the draft reply on a thread for the current user to review and send from the inbox. Local only; nothing is delivered. subject, cc, and bcc apply to email threads. An explicit recipients array overrides To; use [] for Cc-only or Bcc-only email. Omit recipients to retain the thread-derived primary recipients. There is one draft per thread; saving again replaces it.

Save a draft for a new conversation

POST

Saves a draft for a conversation that does not exist yet, so it can be reviewed and sent from the inbox. Provide connectedAccountId and recipients; a local draft thread is created and appears in the inbox with the draft filter. Local only; nothing is delivered, and the provider conversation is created when the draft is sent. subject, cc, and bcc apply to email accounts. Email needs at least one recipient across recipients, cc and bcc; use recipients: [] for Cc-only or Bcc-only email. Hidden Bcc recipients are never public thread participants. Reusing the same account and primary recipient set updates the existing draft; drafts without primary recipients also distinguish Cc and Bcc recipient groups.

Save or reset personal record detail layout

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: read access to the list; the layout applies only to the caller.

Save a schema-aware widget

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: an active workspace member; widgets are personal and show only readable values.

Save system and record type permissions atomically

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Writes require their documented revision and idempotency preconditions; pending results refer to a durable operation. Requires: role management: create access to users for a new role, edit access for an existing one.

Save a lead or account to a Sales Navigator list

POST

Saves a person (kind leads, providerId is the LinkedIn user id) or a company (kind accounts, providerId is the LinkedIn company id) to an existing Sales Navigator list on a connected LinkedIn account. New lists must be created in the Sales Navigator UI first.

Search accessible record types

POST

Configurable CRM record contract. Record references contain both typeId and recordId. Workspace scope comes from authentication. Decimal values are strings. Reads change nothing and return only what the caller may read. Requires: read access to the list; only readable records are returned.

Search Sales Navigator companies (accounts)

POST

Runs a structured LinkedIn Sales Navigator company search through a connected LinkedIn account. Filters take parameter ids resolved via the search-parameters endpoint (location, industry, account lists) plus native ranges like headcount, annual revenue and spotlights. Returns company rows page by page (offset pagination, LinkedIn caps a single company search at 1000 results). Requires the connected account to have a Sales Navigator subscription.

Run a Sales Navigator search from a URL

POST

Executes a LinkedIn Sales Navigator search from a pasted search URL through a connected LinkedIn account and returns the result rows page by page (offset pagination). Requires the connected account to have a Sales Navigator subscription.

Search Sales Navigator people (leads)

POST

Runs a structured LinkedIn Sales Navigator people search through a connected LinkedIn account. Filters take parameter ids resolved via the search-parameters endpoint (location, industry, company, job title, and more) plus native enums like seniority and company headcount. Returns lead rows page by page (offset pagination, LinkedIn caps a single search at 2500 results). Requires the connected account to have a Sales Navigator subscription.

Search Knowledge Base pages

POST

Searches titles, headings and text, ranked by relevance. Each hit carries a snippet, its section and the character offset of that section. total is a lower bound unless totalIsExact; continue with the next page while hasMore. didYouMean reports a corrected spelling. Later pages reuse the first page's order for five minutes. Requires: Knowledge Base read access.

Select a saved view

POST

Remembers the view as the caller's active view of the surface, as choosing it in the app does. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Send a chat message

POST

Sends a real message into an existing chat thread (LinkedIn, WhatsApp, etc.). This delivers a real message as a side effect. When delivering a saved draft, pass both draftMessageId and its opaque draftRevision so a newer edit cannot be consumed.

Send an email

POST

Sends a real email (or reply) from a connected email account. Provide either threadId (reply; takes precedence if both are given) or connectedAccountId (new email). At least one recipient is required across to, cc and bcc; use to: [] for Cc-only or Bcc-only email. cc and bcc are plain email strings, unlike to which uses the { identifier } object form. Never promote hidden Bcc recipients into To or Cc. The connected account's enabled signature is appended automatically, and its email appearance is applied to plain-text and Markdown bodies. Explicit HTML remains caller-controlled. Set bodyFormat when the body is explicitly plain text, Markdown, or HTML. When delivering a saved draft, pass both draftMessageId and its opaque draftRevision so a newer edit cannot be consumed.

Choose the synced email folders

POST

Replaces the set of email folders that sync, as the account's Folders tab does. Pass folder ids from GET /v1/messaging/connected-accounts; unknown ids are ignored, and newly enabled folders sync in the background. Only the account owner can change it; another member's account answers 404. Returns the saved account. Requires: Inbox messages Edit.

Share or unshare a connected account

POST

shared true shows every conversation of the account to all members who can read the Inbox; false makes it private again. Needs a plan with shared accounts (Business or Enterprise). Only the account owner can change it; another member's account answers 404. Returns the saved account. Requires: Inbox messages Edit.

Set the email signature and appearance

POST

Saves the signature text (Markdown, up to 2,000 characters, empty to clear), the complete email settings (appearance and signature layout), or both, as the account's Email tab does. An omitted field keeps its stored value; send at least one. Only the account owner can change it; another member's account answers 404. Returns the saved account. Requires: Inbox messages Edit.

Start a chat

POST

Starts a new chat thread (LinkedIn, WhatsApp, etc.) with one or more attendees from a connected account and sends the first message. This delivers a real message as a side effect. When delivering a saved draft, pass both draftMessageId and its opaque draftRevision so a newer edit cannot be consumed.

Update a saved view

POST

Patches a view: send only the keys to change. Omitted state keys keep their value, arrays replace the previous value, an empty filters array clears filters, an empty searchTerm clears search, and null clears sortDescriptor or grouping. name renames a named view; the All view cannot be renamed. A request that changes nothing returns the current view unchanged. Requires: read access to the surface's page: read access to the record type for a records:<typeId> surface, read on users for Members and Roles, read all on api for Webhooks, read all on auditLog for Activity, read on routines for Routines, and read on inboxMessages plus the messaging entitlement for Inbox. Dashboard and record timeline views need no extra permission. Saved views are personal: only the caller's own views are listed or changed.

Change a member's role or status

POST

Saves another member's profile, role and status in one call, as the members settings page and the MCP update_member action do. Name the member by userId or email (both must match when you send both) and send the fields to change; omitted fields keep their current values. status inactive deactivates the member and frees their seat, active reactivates them; a member waiting for approval needs a status, and a member without a role needs a roleId. An unknown member or roleId answers 404. You cannot update your own membership, a platform operator cannot be deactivated, and the workspace always keeps an active member with a system role (roleSystemRequired). Requires: Users & Roles Edit.

Set a conversation's state

POST

Sets the state of one conversation in the Customermates inbox, as the Inbox and the MCP update_messaging_thread tool do: unread, open (read), closed or spam. The state shows as a badge and is filterable in the inbox; it never hides or deletes anything, and the provider mailbox, the messages and linked records stay untouched. Setting the state a conversation already has changes nothing. Only state can be set here; any other field answers 400. A conversation you cannot see answers 404. Requires: Inbox messages Edit and a plan that includes messaging.

Move and resize widgets in one batch

POST

Saves the position and size of several widgets at once, as dragging and resizing on the dashboard does. Each breakpoint (xs, sm, md, lg) lists placements in grid units: i is the widget id, x and w count columns (12 on lg, 8 on md, 4 on sm, 2 on xs, and x + w must fit), and y and h count rows of 54 px with 12 px gaps. A widget named in any breakpoint has its whole stored layout replaced by the placements sent for it, so send all four breakpoints for every widget you move; a breakpoint it is missing from loses its stored position and is placed automatically. Layouts are per dashboard view because a widget belongs to one view. expectedVersions must name the version you last read for every widget in layouts; when a widget changed, was deleted or is not yours, nothing is saved and the request fails with 409 widgetLayoutChanged, so read again and retry. A large-breakpoint (lg) placement that overlaps another widget of the same dashboard view fails with 400 widgetLayoutOverlap; empty rows between widgets are allowed, and the dashboard moves widgets up into them, and one smaller than its widget minimum (2 rows for charts and numbers, 2 columns and 6 rows for activity timelines) fails with 400 widgetLayoutTooSmall. Unchanged placements are omitted from the result. Read positions and versions with /v1/widgets/list first. Requires: ownership of the widgets; the list holds only the caller's own widgets and their results stay filtered by read access to the widgets' lists.

Update a routine

POST

Changes the supplied fields of a routine the caller owns and leaves the rest unchanged. The example moves a routine to a weekday schedule. Requires: update permission on routines.

Update a webhook subscription

PATCH

Changes the supplied fields of one webhook subscription and leaves the rest unchanged. The endpoint must use HTTP or HTTPS, have a valid host, and contain no username or password. The example disables a webhook and replaces its events. An id outside the workspace answers 404. Requires: update permission on the API.

Update a Knowledge Base page

POST

Changes the title, Markdown, kind or whenToUse of one page; omitted fields keep their values. Send updatedAt from your latest read as expectedUpdatedAt: a page changed since answers 409, so read it again and retry. Requires: Knowledge Base Edit.

Calendar Changed

WEBHOOK

Sent when a calendar on a connected account is created, updated, or deleted.

Calendar Event Changed

WEBHOOK

Sent when a calendar event on a connected account is created, updated, or deleted.

Chat Deleted

WEBHOOK

Sent when the provider reports a chat thread deletion.

Chat Updated

WEBHOOK

Sent when a chat thread's provider attributes change (name, mute state, read state).

Email Deleted

WEBHOOK

Sent when the provider reports an email deletion.

Email Received

WEBHOOK

Sent when a new email is ingested on a connected email account.

Message Deleted

WEBHOOK

Sent when the provider reports a message deletion.

Message Reaction

WEBHOOK

Sent when a reaction is added to or removed from a message.

Message Received

WEBHOOK

Sent when a new chat message or email is ingested on a connected account.

Message Updated

WEBHOOK

Sent when the provider reports an edit or status change for an ingested message.

Relation Created

WEBHOOK

Sent when the provider reports a new connection (e.g. an accepted LinkedIn invitation).