EN
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.
Performing operations in the API playground will affect your live data.
Get own user profile
GETRetrieves the authenticated user's profile information.
Get users
POSTRetrieves a list of users with optional filtering, sorting and pagination.
Update own user profile
PATCHPartially 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
POSTAccepts a received relation request by invitationId on a connected LinkedIn or Instagram account. Requires a connected LinkedIn or Instagram account.
Apply a configuration change
POSTConfigurable 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
POSTReturns 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
POSTConfigurable 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
POSTWithdraws 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
POSTCreates 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
POSTCreates 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
POSTSends 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
POSTCreates 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
POSTSubscribes 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
POSTCreates 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
POSTMoves 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
POSTMoves 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
POSTConfigurable 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
POSTMoves 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
POSTConfigurable 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
DELETERemoves a webhook subscription so it stops receiving deliveries.
Delete a Knowledge Base page
POSTMoves 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
DELETEDeletes 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
DELETEDisconnects 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
POSTPages 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)
POSTConfigurable 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
POSTExports 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
GETFetches 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
GETFetches 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
POSTRetrieves 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
POSTRetrieves 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
GETLists the messaging accounts connected to the workspace and visible to the authenticated user.
Get the workspace invitation link
POSTReturns 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
GETFetches 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
POSTRetrieves 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
POSTReads 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
POSTReads 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
POSTReads 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
GETReturns 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
POSTCreates 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
POSTSends 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
POSTReturns 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
POSTReturns 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
POSTReturns 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
POSTLists the connection / relation requests received by the owner of a connected LinkedIn or Instagram account. Requires a connected LinkedIn or Instagram account.
List roles
POSTLists 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
POSTReturns 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
POSTLists 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
POSTLists 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
POSTResolves 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
GETLists 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
GETLists 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
POSTLists 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
GETLists 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
POSTMoves 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
POSTPlaces 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
POSTConfigurable 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
POSTConfigurable 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
POSTDisables 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
POSTConfigurable 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
POSTConfigurable 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
POSTConfigurable 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
POSTConfigurable 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
POSTConfigurable 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
POSTConfigurable 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)
POSTConfigurable 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
POSTConfigurable 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
POSTReturns 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
POSTReturns 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
POSTConfigurable 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
POSTConfigurable 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
POSTReturns 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
POSTConfigurable 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
POSTConfigurable 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
POSTConfigurable 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
POSTReturns 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
POSTReads 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
POSTReads 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
WEBHOOKSent when a record that matches the webhook's record source is created, with its values after the change.
Record Moved to Trash
WEBHOOKSent 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
WEBHOOKSent 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
WEBHOOKSent when a matching record comes back from Trash, with its restored values.
Record Updated
WEBHOOKSent when a field, assignment, identity or link of a matching record changes, with the values before and after the change.
Resend a webhook delivery
POSTQueues 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
POSTRemoves 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
POSTConfigurable 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.
POSTConfigurable 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
POSTConfigurable 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
POSTRe-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
POSTFetches 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
POSTStarts 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
POSTSaves 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
POSTSaves 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
POSTConfigurable 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
POSTConfigurable 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
POSTConfigurable 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
POSTSaves 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
POSTConfigurable 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)
POSTRuns 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
POSTExecutes 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)
POSTRuns 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
POSTSearches 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
POSTRemembers 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
POSTSends 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
POSTSends 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
POSTReplaces 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
POSTshared 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
POSTSaves 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
POSTStarts 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
POSTPatches 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
POSTSaves 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
POSTSets 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
POSTSaves 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
POSTChanges 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
PATCHChanges 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
POSTChanges 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
WEBHOOKSent when a calendar on a connected account is created, updated, or deleted.
Calendar Event Changed
WEBHOOKSent when a calendar event on a connected account is created, updated, or deleted.
Chat Deleted
WEBHOOKSent when the provider reports a chat thread deletion.
Chat Updated
WEBHOOKSent when a chat thread's provider attributes change (name, mute state, read state).
Email Deleted
WEBHOOKSent when the provider reports an email deletion.
Email Received
WEBHOOKSent when a new email is ingested on a connected email account.
Message Deleted
WEBHOOKSent when the provider reports a message deletion.
Message Reaction
WEBHOOKSent when a reaction is added to or removed from a message.
Message Received
WEBHOOKSent when a new chat message or email is ingested on a connected account.
Message Updated
WEBHOOKSent when the provider reports an edit or status change for an ingested message.
Relation Created
WEBHOOKSent when the provider reports a new connection (e.g. an accepted LinkedIn invitation).