Your CRM, connected

DoWEB · SuperOffice MCP

Connect your AI to SuperOffice. Search as yourself and request supported CRM changes with your installation’s policies and permissions.

Sign in with SuperOffice

Remote MCP endpoint:

https://so-mcp.demo.doweb.dk/mcp

Reads use your SuperOffice access. Supported writes use the system user after authorization checks. Marketing dispatch has an explicit policy exception; video reservation uses your connected account. Administrator onboarding is required for system writes.

Operation availability

Record, table and field permissions vary by record and are checked on every call. Listed operations and held licenses do not guarantee access to a particular record.

Administration 15
administration.custom_fields.read.v1

Read custom fields metadata or known records

Implemented
administration.custom_table_row.read.v1

Read custom table row metadata or known records

Implemented
administration.custom_table_schema.read.v1

Read custom table schema metadata or known records

Implemented
administration.email_flow.read.v1

Read email flow metadata or known records

Implemented
administration.form.read.v1

Read form metadata or known records

Implemented
administration.group.manage.v1

Create or update a user group, including retirement/restoration using deleted. Requires admin-users and application UserAgent access. First administration_read(kind=groups) for IDs. Membership and primary-group changes use administration.user.manage.v1. Physical group deletion is not supported by SuperOffice; retirement preserves references.

Implemented
administration.groups.read.v1

Read groups metadata or known records

Implemented
administration.list_items.read.v1

Read list items metadata or known records

Implemented
administration.lists.read.v1

Read lists metadata or known records

Implemented
administration.mailing.read.v1

Read mailing metadata or known records

Implemented
administration.manage.v1

Set an existing documented preference value without changing scope or deleting lower-level overrides. Requires admin-preferences. First administration_read(preference,id); only plain scalar/list values with published preference-description validation are accepted. Security, URL, script, authentication and unknown preference types require dedicated adapters.

Implemented
administration.preference.read.v1

Read preference metadata or known records

Implemented
administration.roles.read.v1

Read roles metadata or known records

Implemented
administration.user.manage.v1

Update an existing internal user: names, signature, retirement, primary/secondary groups and role. Requires admin-users; changing role also requires admin-role. Application UserAgent access must be activated by SuperOffice. First administration_read(user), groups and roles. Login credentials and license allocation are not accepted.

Implemented
administration.user.read.v1

Read user metadata or known records

Implemented
Appointments & tasks 16
appointment.create.v1

Create a timed appointment using an Appointment or Phone task from appointment_options. title is the heading; description is stored independently in native Agenda and returned as agenda by get_appointment. Optional alarm.enabled activates or disables the native reminder; alarm.leadTimeMinutes sets its lead time, or the diary default is used. Omitted alarm keeps the existing disabled behavior. Explicit alarm settings and supplied text are verified after saving; inspect the retained ID on an unknown outcome instead of recreating. Omit associateId for your own diary, or supply an active colleague for secretary booking after appointment_defaults(taskId, associateId). Your access to that diary is rechecked before saving. ToDo/checklist types cannot represent calendar intervals. No invitations, recurrence, publication or video meetings during creation. Use the recurrence tools on the saved appointment for an authorized colleague diary. Standalone update/delete use your current record and field permissions in the target diary. Video and invitation tools currently require your own diary.

Implemented
appointment.defaults.v1

Read appointment defaults under the initiating user

Implemented
appointment.delete.v1

Delete a standalone appointment or task in any diary after verifying your current SuperOffice read and delete rights. Create or update permission alone never authorizes deletion. Recurrence, invitations, guides, links, publication and video meetings are excluded because their related effects need separate authorization.

Implemented
appointment.get.v1

Read Appointments & tasks by ID

Implemented
appointment.invitation.prepare.v1

Review meeting recipients and occurrences before invitation sending

Implemented
appointment.invitation.send.v1

Add participants and SEND meeting invitations through SuperOffice. This is the separately policy-controlled invitation tool; configure confirm to require browser approval. FIRST appointment_invitation_prepare with exact participants and bind reviewHash. Supports internal associates, existing CRM persons with verified email, and external email addresses without a CRM person. Starts from an owned meeting/finite series with no other participants; use the first series occurrence. Creates internal diary invitations without email and sends email to the explicit person/external recipients where supported; native acceptance is not delivery confirmation. No automatic resend.

Implemented
appointment.meeting.update.v1

Correct title, description, agenda, internal notes, location, time, task, completion, company/person links and custom fields on a non-recurring SuperOffice meeting you organize, preserving existing participants and video. FIRST appointment_meeting_prepare with identical changes and explicit sendEmailToParticipants, then bind reviewHash. Completion and company/person corrections require sendEmailToParticipants=false. Checks every affected internal diary. Native Save updates the booking; optional email only to existing email-enabled participants. No automatic retry after uncertain results.

Implemented
appointment.occurrence.prepare.v1

Review one recurring occurrence and identify diary/participant effects

Implemented
appointment.occurrence.update.v1

Update the time, title, description or completion of exactly one recurring occurrence in your own diary. FIRST appointment_occurrence_prepare with scope=this_occurrence and identical changes; bind reviewHash. Uses native OnlyThis, preserves remaining series, sends no invitations. Other participants, assignments, publication, guides and video effects are excluded and identified by preparation. Never use this to change the recurrence pattern.

Implemented
appointment.options.v1

Read appointment options under the initiating user

Implemented
appointment.recurrence.prepare.v1

Preview finite recurrence dates and conflicts

Implemented
appointment.recurrence.set.v1

Make an existing meeting recurring in your own or an authorized colleague diary, with 2–52 occurrences. Supply associateId for the colleague in both preparation and write. FIRST appointment_recurrence_prepare with identical pattern inputs; review targetDiary, dates, conflicts and affectedRecords, then bind datesHash and returned timeZone. Native recurrence uses that zone; UTC is fixed UTC. Requires diary-insert permission and writable Recurrence. Start before inviting participants; existing video link is preserved. No invitation emails are sent.

Implemented
appointment.search.v1

Authoritative diary/calendar/schedule search via the appointment archive. My diary uses whoami.associate_id as our_contact_id; appointments linked to my company use company_id. start_date/end_date filter native activity dates (ActiveDate), inclusive YYYY-MM-DD; these can differ from planned dates for checklist or completed activities. Returned startDate/endDate are authoritative planned values; date/time are derived from them. Pagination retains native archive order. Returned diary clocks already use your SuperOffice timezone; follow timeZone.notice and do not apply another UTC conversion. Use get_appointment for full timestamps/details. Do not substitute list_user_activities for diary queries. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
appointment.update.v1

Update a standalone appointment or task in any diary where your current SuperOffice record and changed-field permissions allow it. Preserves the existing diary owner; associateId reassignment is not supported. Outlook-owned appointments allow only completed when that field is writable; relation and meeting fields require a separate external-ownership workflow. Read with entity_get first. For one recurring occurrence use appointment_occurrence_prepare then appointment_occurrence_update_v1. Dates must retain end after start. For existing owned meetings with participants/video use appointment_meeting_prepare then appointment_meeting_update_v1. Guides require separate authorization.

Implemented
appointment.video.create.v1

Create a video-meeting reservation for a standalone appointment in your own diary. FIRST appointment_video_status to check your connected provider. Add video before participants/recurrence. Explicit identity exception: SuperOffice forbids system-user reservation creation, so this step uses your OAuth session; the appointment saves as system user. Both identities are audited. Does not send invitations. Partial reservations are recorded and never automatically repeated.

Implemented
appointment.video.status.v1

Check the user video-provider connection

Implemented
Archive search 3
archive.providers.v1

Archive providers

Implemented
archive.schema.v1

Archive schema

Implemented
archive.search.v1

Archive search

Implemented
Automation 1
automation.execute.v1

Pause or stop a reviewed email flow; start only a flow whose execution effects have been verified. Requires admin-email-flow and flow status rights. First administration_read(email_flow,id) for definitionHash. Starting nonempty flows is rejected until every step, enrolled participant and external effect has a verified adapter. Arbitrary scripts and event execution are not accepted.

Implemented
Companies 9
company.activities.v1

List activities linked to a known contact, newest first. Resolve contact_id through its get/search tool first. Includes activity types offered by its native archive (appointments/documents and, where applicable, chats/mailings/forms).

Implemented
company.create.v1

Create a company as the system user after caller permission checks. First call entity_prepare(entity=company); use its required fields, defaults and selectable list IDs. Pass values plus an idempotency key.

Implemented
company.delete_prepare.v1

Read and review the person manifest for known-company deletion

Implemented
company.delete.v1

Soft-delete a known company and its reviewed people as the system user. REQUIRED: company_delete_prepare(id), review and supply its complete personIds array (max 200). Checks independent human delete rights for every person and compares full company membership against the executing identity before submission. Both company and person delete policies apply. ERP-connected companies/people are excluded; no permanent purge or separate activity deletion is called.

Implemented
company.external_search.v1

Search external company sources through SuperOffice enrichment; does NOT search CRM companies. Use search_companies for CRM records. Country is ISO-2 or defaults to the user home country. Returns external suggestions without creating or enriching CRM records.

Implemented
company.get.v1

Read Companies by ID

Implemented
company.prepare.v1

Get obligatory fields, defaults and list choices for company

Implemented
company.search.v1

Search CRM companies by name, ID, owner or list values. For my company use whoami.company_id; for companies I manage use whoami.associate_id as our_contact_id. Use get_company for full known-ID details. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
company.update.v1

Update a company as the system user after caller permission checks. First call entity_prepare(entity=company, id); use its required fields, defaults and selectable list IDs. Pass changes and id plus an idempotency key.

Implemented
CRMScript 5
crmscript.create.v1

Creation blocked until all default relationships and functional effects have verified user permission adapters.

Disabled by ENABLE_CRMSCRIPT=false. Enable only after SuperOffice activates the API access.

Unavailable
crmscript.delete.v1

Deletion blocked: cascading effects require explicit permission evidence for related records.

Disabled by ENABLE_CRMSCRIPT=false. Enable only after SuperOffice activates the API access.

Unavailable
crmscript.execute.v1

Script execution requires verified authorization of its record changes and external effects.

Disabled by ENABLE_CRMSCRIPT=false. Enable only after SuperOffice activates the API access.

Unavailable
crmscript.get.v1

Read CRMScript by ID

Disabled by ENABLE_CRMSCRIPT=false. Enable only after SuperOffice activates the API access.

Unavailable
crmscript.save.v1

Saving script source can change scheduled, included, and public execution paths; their effects require verified authorization.

Disabled by ENABLE_CRMSCRIPT=false. Enable only after SuperOffice activates the API access.

Unavailable
Custom fields 1
custom_field.manage.v1

Create, edit or delete a user-defined field definition, or publish a reviewed entity layout. First administration_read(kind=custom_fields,owner) for definitions and layoutHash. Create requires fieldType and values.fieldLabel. Changes are drafts until publish. Publishing applies ALL pending fields for owner and requires the exact reviewed layoutHash; field IDs change after publication. Value writes belong to entity create/update customFields.

Implemented
Custom tables 1
custom_table.write.v1

Create/update/delete one row in a tenant extra table (y_* only). First administration_read(custom_table_schema,table), then known row/default metadata. Values use exact x_* field names and invariant encodings from schema, including real list/reference IDs. Requires explicit row/table/field rights or the documented Edit tables functional right, with writable schema fields. Explicit denials always win; schemas without verifiable authority are rejected. No core tables, SQL or bulk operations.

Implemented
Document templates 2
document_template.prepare.v1

Read document template defaults, required inputs, metadata and optional file content

Implemented
document_template.save.v1

Create or edit a document template including its file content. FIRST template_prepare(kind=document,id optional) for current metadata, default storage plugin and languages. Creation requires values.name, filename, content and pluginId; update requires id and metadata values or complete replacement content. Preserve template variables. UTF-8 text/HTML or base64 binary, maximum 128 KiB. Requires human admin-lists/admin-all authority; explicit denials win. Writes as system user; shared-template changes affect future uses. Does not send email. Durable phases report a saved template whose file upload failed.

Implemented
Documents 11
document.content.v1

Read physical document bytes as the initiating human

Implemented
document.create.v1

Create a document as the system user after caller permission checks. First call entity_prepare(entity=document); use its required fields, defaults and selectable list IDs. Pass values plus an idempotency key. Creates the document card only. Selected template content is checked under human OAuth before creation. Physical content still requires document_generate_prepare then document.generate.v1, or document.upload.v1; do not report a usable file until that succeeds.

Implemented
document.delete.v1

Delete a known document: FIRST remove its physical file, then delete the CRM entity only after confirmed file-deletion success. First entity_get(document,id) to review the target. Requires the human’s entity-delete permission; this is the agreed authority for physical deletion too. Executes both steps as system user. File failure preserves the entity. execution_status/audit retain each phase; partial or unknown outcomes require reconciliation before a new request. Does not follow plugin URLs or run plugin UI actions.

Implemented
document.generate_prepare.v1

Preview native document generation using the human identity and selected template

Implemented
document.generate.v1

Generate and store a document from its selected SuperOffice template. FIRST choose a template using entity_prepare/list_values, create the document entity with a matching filename extension, then document_generate_prepare to review original generated bytes and obtain reviewHash. Supports text/HTML and Office Open XML (DOCX/XLSX/PPTX) using native substitution under human OAuth; file storage executes as system user. Creates physical content only when absent, maximum 2 MiB. Does not send email. Download with document_content, edit and replace using document.upload.v1 and the download hash.

Implemented
document.get.v1

Read Documents by ID

Implemented
document.markdown.v1

Read document content converted to Markdown as the initiating human

Implemented
document.prepare.v1

Get obligatory fields, defaults and list choices for document

Implemented
document.search.v1

Search CRM files, including email. is_email=true matches every email template; document_template means one specific tenant-defined template and must not be used to find all email. Resolve template names/IDs using list_values(list=doctmpl). Linked company/person filters do not mean sender/author. Use document_id for known metadata and get_document_markdown to read content; get_document_contents for the original file. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
document.update.v1

Update a document as the system user after caller permission checks. First call entity_prepare(entity=document, id); use its required fields, defaults and selectable list IDs. Pass changes and id plus an idempotency key.

Implemented
document.upload.v1

Upload original file bytes to a known document. FIRST entity_get to review the document. New physical files use overwrite=false; for replacement FIRST document_content and pass its expectedSha256 with overwrite=true. Original filename and format are preserved. UTF-8 for text, base64 for DOCX/PDF/binary, maximum 2 MiB. Requires human document/Name write rights; writes as system user. Does not convert Office files or send mail. Repository locking/versioning needs a checkout workflow. Hash checks detect edits but are not atomic with upload.

Implemented
Domain guidance 1
domain.map.v1

Read the static domain map or live core-entity preparation

Implemented
Email templates 2
email_template.prepare.v1

Read email template defaults, required inputs, metadata and optional file content

Implemented
email_template.save.v1

Create or edit a email template including its file content. FIRST template_prepare(kind=email,id optional) for current metadata, default storage plugin and languages. Creation requires values.name, filename, content and pluginId; update requires id and metadata values or complete replacement content. Preserve template variables. UTF-8 text/HTML or base64 binary, maximum 128 KiB. Requires human admin-lists/admin-all authority; explicit denials win. Writes as system user; shared-template changes affect future uses. Does not send email. Durable phases report a saved template whose file upload failed.

Implemented
Lists 10
list.business.save.v1

Create or edit the business standard list. FIRST standard_list_prepare(kind=business,id optional). Creation needs values.name. Updates use a known id. Supports name, tooltip, ordering and retirement; task/category inputs also expose typed options. Requires human list administration; writes as system user. Shared defaults affect future CRM use. No CRM deletion or invitation sending.

Implemented
list.category.save.v1

Create or edit the category standard list. FIRST standard_list_prepare(kind=category,id optional). Creation needs values.name and values.categoryGroup. Updates use a known id. Supports name, tooltip, ordering and retirement; task/category inputs also expose typed options. Requires human list administration; writes as system user. Shared defaults affect future CRM use. No CRM deletion or invitation sending.

Implemented
list.company_interest.save.v1

Create or edit the company interest standard list. FIRST standard_list_prepare(kind=company_interest,id optional). Creation needs values.name. Updates use a known id. Supports name, tooltip, ordering and retirement; task/category inputs also expose typed options. Requires human list administration; writes as system user. Shared defaults affect future CRM use. No CRM deletion or invitation sending.

Implemented
list.manage.v1

Create custom lists or create/update list items; rename, rank and retire/restore custom lists and items. First administration_read(kind=lists), then list_items for IDs. Requires admin-lists or documented admin-all. Use deleted=true to retire without deleting CRM references. Standard-list items with extra typed properties require their specific adapter.

Implemented
list.person_interest.save.v1

Create or edit the person interest standard list. FIRST standard_list_prepare(kind=person_interest,id optional). Creation needs values.name. Updates use a known id. Supports name, tooltip, ordering and retirement; task/category inputs also expose typed options. Requires human list administration; writes as system user. Shared defaults affect future CRM use. No CRM deletion or invitation sending.

Implemented
list.standard_prepare.v1

Read standard list items, required inputs and defaults

Implemented
list.task.save.v1

Create or edit the task standard list. FIRST standard_list_prepare(kind=task,id optional). Creation needs values.name and values.type. Updates use a known id. Supports name, tooltip, ordering and retirement; task/category inputs also expose typed options. Requires human list administration; writes as system user. Shared defaults affect future CRM use. No CRM deletion or invitation sending.

Implemented
list.values.v1

Get selectable metadata list values

Implemented
list.visibility.prepare.v1

Read current list/template group visibility for editing

Implemented
list.visibility.set.v1

Set user-group visibility for task types, categories, business, company/person interests and document/email templates. FIRST list_visibility_prepare(kind,id), review existing groups and bind reviewHash. Pass the COMPLETE selectedGroupIds; [] hides the item. New items often need this before users can select them. Requires human list administration. Writes as system user; does not modify CRM record access.

Implemented
Marketing 4
marketing.form.manage.v1

Create an inactive form shell or update name, description, expiry and submission limit, or deactivate a form. Requires forms-cal. First administration_read(form,id) for current configuration. Create requires name. Activation requires a dedicated submission-effects adapter and is not accepted by this operation.

Implemented
marketing.mailing.save.v1

Create or update a draft mailing without sending it. Requires a mailing user license. First administration_read(mailing) for defaults, then archive_search for existing message IDs. Create requires values.description; optional messageId/fromAddr/replyAddr. Scheduled, sending or completed mailings cannot be edited through this adapter.

Implemented
marketing.mailing.send.v1

Reload and send a known marketing mailing as the installation system user. REQUIRED: id and reloadRecipients=true; optionally bind expectedMessageId. Explicit policy-authorized exception: the initiating user needs a valid CRM grant but no personal mailing license or recipient-level send permission. Allow sends, confirm requires browser approval, deny blocks. Review the mailing using administration_read where readable. Native reload may change recipients; approval authorizes the mailing action, not a frozen audience. Never resubmit an unknown outcome. Success means dispatch accepted, NOT confirmed delivery.

Implemented
marketing.message.get.v1

Read a known mailing message without access-verification keys

Implemented
People 8
person.activities.v1

List activities linked to a known person, newest first. Resolve person_id through its get/search tool first. Includes activity types offered by its native archive (appointments/documents and, where applicable, chats/mailings/forms).

Implemented
person.create.v1

Create a person as the system user after caller permission checks. First call entity_prepare(entity=person); use its required fields, defaults and selectable list IDs. Pass values plus an idempotency key.

Implemented
person.delete.v1

Soft-delete a known person using SuperOffice’s native recycle-bin behavior. First entity_get(person,id). Requires record delete permission, including SuperOffice’s employee protection. Does not call permanent purge or delete related activities. SuperOffice retention controls subsequent removal.

Implemented
person.get.v1

Read People by ID

Implemented
person.prepare.v1

Get obligatory fields, defaults and list choices for person

Implemented
person.projects.v1

Find explicit current project memberships for a person, one project per page row with roles, raw tenant status, end_date and href. Excludes card-owner/root-only links and former members. There is no universal active/ended status; interpret returned status/end_date. Resolve person_id first (whoami for me).

Implemented
person.search.v1

Search CRM people by name, company or exact email. For colleagues use whoami.company_id. Use get_person for full details. Retired people are excluded unless include_retired=true. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
person.update.v1

Update a person as the system user after caller permission checks. First call entity_prepare(entity=person, id); use its required fields, defaults and selectable list IDs. Pass changes and id plus an idempotency key.

Implemented
Project members 6
project_member.create.v1

Add a project member. First call membership_prepare for the parent and valid PMembType roles; use membership_search to find existing membership IDs. Requires projectId, personId and projectMemberTypeId. Checks parent, component and person/company permissions; membership changes do not send invitations.

Implemented
project_member.delete.v1

Remove a project member. First call membership_prepare for the parent and valid PMembType roles; use membership_search to find existing membership IDs. Checks parent, component and person/company permissions; membership changes do not send invitations.

Implemented
project_member.get.v1

Read Project members by ID

Implemented
project_member.prepare.v1

Get required membership fields and selectable roles

Implemented
project_member.search.v1

Search parent membership through archives

Implemented
project_member.update.v1

Update the role or comment of a project member. First call membership_prepare for the parent and valid PMembType roles; use membership_search to find existing membership IDs. Checks parent, component and person/company permissions; membership changes do not send invitations.

Implemented
Projects 8
project.activities.v1

List activities linked to a known project, newest first. Resolve project_id through its get/search tool first. Includes activity types offered by its native archive (appointments/documents and, where applicable, chats/mailings/forms).

Implemented
project.create.v1

Create a project as the system user after caller permission checks. First call entity_prepare(entity=project); use its required fields, defaults and selectable list IDs. Pass values plus an idempotency key.

Implemented
project.delete.v1

Delete a known project using native SuperOffice deletion, which removes or detaches owned components. Project membership rows may survive with projectId=0. First entity_get(project,id). Requires current delete authority and writable membership collection metadata; explicit component denials win. Published records, guides, ERP links, general links and events need separate effect adapters. Does not call related activity/person/company deletion methods.

Implemented
project.get.v1

Read Projects by ID

Implemented
project.members.v1

List current explicit project members plus the card owner as is_root=true on page 0. Root is a forward-only annotation, with no membership row; it is not automatically included by reverse membership tools. Former links are not retained. Includes roles and href.

Implemented
project.prepare.v1

Get obligatory fields, defaults and list choices for project

Implemented
project.search.v1

Search projects by name, ID, owner or is_guided; at least one is required. Sorted by name. Use get_project for details and list_project_activities for linked activity. Status names are tenant-defined. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
project.update.v1

Update a project as the system user after caller permission checks. First call entity_prepare(entity=project, id); use its required fields, defaults and selectable list IDs. Pass changes and id plus an idempotency key.

Implemented
Sale stakeholders 6
sale_stakeholder.create.v1

Add a sale stakeholder. First call membership_prepare for the parent and valid stakeholderrole roles; use membership_search to find existing membership IDs. Requires saleId, personId or companyId and stakeholderRoleId. Checks parent, component and person/company permissions; membership changes do not send invitations.

Implemented
sale_stakeholder.delete.v1

Remove a sale stakeholder. First call membership_prepare for the parent and valid stakeholderrole roles; use membership_search to find existing membership IDs. Checks parent, component and person/company permissions; membership changes do not send invitations.

Implemented
sale_stakeholder.get.v1

Read Sale stakeholders by ID

Implemented
sale_stakeholder.prepare.v1

Get required membership fields and selectable roles

Implemented
sale_stakeholder.search.v1

Search parent membership through archives

Implemented
sale_stakeholder.update.v1

Update the role or comment of a sale stakeholder. First call membership_prepare for the parent and valid stakeholderrole roles; use membership_search to find existing membership IDs. Checks parent, component and person/company permissions; membership changes do not send invitations.

Implemented
Sales 10
sale.activities.v1

List activities linked to a known sale, newest first. Resolve sale_id through its get/search tool first. Includes activity types offered by its native archive (appointments/documents and, where applicable, chats/mailings/forms).

Implemented
sale.create.v1

Create a sale as the system user after caller permission checks. First call entity_prepare(entity=sale); use its required fields, defaults and selectable list IDs. Pass values plus an idempotency key.

Implemented
sale.delete.v1

Delete a known sale using native SuperOffice deletion, which removes or detaches owned components. Project membership rows may survive with projectId=0. First entity_get(sale,id). Requires current delete authority and writable membership collection metadata; explicit component denials win. Published records, guides, ERP links, general links and quotes need separate effect adapters. Does not call related activity/person/company deletion methods.

Implemented
sale.get.v1

Read Sales by ID

Implemented
sale.guide.v1

Read ordered pipeline stages/probabilities, current and next stage plus href. Call only after get_sale returned has_guide=true; an absent guide returns an explicit error.

Implemented
sale.prepare.v1

Get obligatory fields, defaults and list choices for sale

Implemented
sale.search.v1

Search sales with at least one filter. Heading is a prefix match. Resolve company/person IDs first; my sales uses whoami.associate_id as our_contact_id. Open includes stalled; closed includes won/lost. Use get_sale for full details, guide status and href. Broaden restrictive filters when nothing matches. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
sale.stakeholder_sales.v1

Find current explicit stakeholder sales for exactly one person_id or company_id; company scope includes its people. Distinct from the sale primary-person filter. status=all/open/closed filters the sale, not membership history. No former links. Returns sale href and matching roles; resolve IDs first.

Implemented
sale.stakeholders.v1

List current explicit sale stakeholders plus the card main contact as is_root=true on page 0. Root is a forward-only annotation, with no membership row; it is not automatically included by reverse membership tools. Former links are not retained. Includes roles and href.

Implemented
sale.update.v1

Update a sale as the system user after caller permission checks. First call entity_prepare(entity=sale, id); use its required fields, defaults and selectable list IDs. Pass changes and id plus an idempotency key.

Implemented
Selections 5
selection.create.v1

Create an empty static company/person selection. Pass values.name, optionally description, postit, completed and categoryId from list_values(list=searchCat). Uses human defaults for visibility and type; SuperOffice assigns the system user as owner because the default owner field is read-only.

Implemented
selection.delete.v1

Delete a selection and its own membership links, preserving the referenced CRM records. Requires selection delete permission. First entity_get(selection,id); a selection used in a combined selection must be detached from that definition before deletion. Does not execute DeleteEntities or DeleteContacts.

Implemented
selection.get.v1

Read Selections by ID

Implemented
selection.membership.v1

Add or remove explicit company/person members of a static selection. First entity_get(selection,id) to check its type; resolve contactId and optional personId using archive_search. Every person must belong to its contact. Does not delete the CRM records. Maximum 100 members per request.

Implemented
selection.update.v1

Update selection name, description, notes, category or completion without changing membership or search criteria. Read selection with entity_get and obtain category IDs using list_values(list=searchCat).

Implemented
Service messages 7
message.send.v1

Email an existing EXTERNAL plain-text ticket message to explicitly listed CRM persons. Requires an active Service user license plus ticket/message rights. First entity_get the message and each recipient; email must match a readable person email. Prepare/create messages with notification-aware ticket_message tools; notifyOwner controls those saves separately. For every attachment FIRST service_attachment_content, then supply the complete attachments manifest with attachmentId and sha256. No reply template or automatic consent override. Sending is irreversible; inspect all To/Cc/Bcc and body before submitting.

Implemented
ticket_message.attachment.add.v1

Upload a NEW file and attach it to a known Service ticket message. Requires id, filename, MIME contentType and original file content (UTF-8 or base64, maximum 2 MiB). Read the message first. Verifies message Body/parent write rights and explicit attachment denials. Existing arbitrary attachment IDs are not accepted. Set notifyOwner to control the owner notification. External messages expose the attachment in Customer Centre; this does not send a customer reply. Durable phases retain attachment ID on partial failure.

Implemented
ticket_message.attachment.read.v1

Download an attachment of a readable Service message

Implemented
ticket_message.create.v1

Add an internal plain-text message to a known ticket. Requires ticketId and body; read the ticket first with entity_get. Checks current parent-ticket and message-field rights. Set notifyOwner to control owner notifications. Does not send customer email; use message.send.v1 for an explicitly addressed external message.

Implemented
ticket_message.delete.v1

Delete a plain-text service message after checking message and parent-ticket authority. Messages with attachments or recorded time require additional effect authorization. Removing a sent message does not recall delivered email.

Implemented
ticket_message.get.v1

Read Service messages by ID

Implemented
ticket_message.update.v1

Update the body, language or customer visibility of a plain-text service message. Read the current message first. External visibility makes the message visible in the Customer Centre; it does not send customer email. Set notifyOwner to control owner notifications. Notification-aware saves preserve current hidden fields but have a non-atomic final read/save.

Implemented
Service reply templates 2
service_reply_template.get.v1

Read unparsed Service reply-template content by ID and language; writes are not yet supported

Implemented
service_reply_template.save.v1

Service reply template creation/editing is unavailable: the current supported SDK and Service APIs expose retrieval but no save method. A supported write API and template access-control evidence are required; CRMScript is disabled.

Service reply template creation/editing is unavailable: the current supported SDK and Service APIs expose retrieval but no save method. A supported write API and template access-control evidence are required; CRMScript is disabled.

Unavailable
Service tickets 8
ticket.create.v1

Create a ticket as the system user after caller permission checks. First call entity_prepare(entity=ticket); use its required fields, defaults and selectable list IDs. Pass values plus an idempotency key. Set notifyOwner explicitly to send or suppress owner notifications. Saves preserve current hidden fields, but notification-aware updates cannot be made atomic by this API.

Implemented
ticket.delete.v1

Delete an empty ticket after verifying delete rights and confirming it has no messages or attachments. Delete or explicitly reconcile related messages first; deletion of populated tickets requires authorization of all component effects.

Implemented
ticket.get.v1

Read Service tickets by ID

Implemented
ticket.messages.v1

Read ticket conversation summaries newest first: author/date/security/sentiment/attachment count/badge. Message text is NOT included; use get_ticket_message with returned IDs. Default limit 25, max 100. has_more=true means older messages (often the original problem) are omitted; do not describe the capped list as complete. get_ticket_metadata.num_messages is the recorded total.

Implemented
ticket.prepare.v1

Get obligatory fields, defaults and list choices for ticket

Implemented
ticket.search_freetext.v1

Native ranked free-text ticket METADATA search, not message bodies. All query words must match the same ticket. Query is passed unchanged and native ranking retained; use short specific names/company/subject words in the tenant language. Prefer search_tickets for known structured criteria, then get_ticket to inspect a conversation. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
ticket.search.v1

Search ticket bookkeeping, not conversation bodies. Closed tickets are excluded by default; use status=closed or all explicitly. unassigned cannot be combined with our_contact_id. Category name/ID includes its visible subtree. My tickets uses whoami.associate_id as our_contact_id. Call get_ticket for conversation summaries or get_ticket_metadata for full bookkeeping. All CRM matching uses archive providers; results preserve native cells, missing/restricted values and live pagination.

Implemented
ticket.update.v1

Update a ticket as the system user after caller permission checks. First call entity_prepare(entity=ticket, id); use its required fields, defaults and selectable list IDs. Pass changes and id plus an idempotency key. Set notifyOwner explicitly to send or suppress owner notifications. Saves preserve current hidden fields, but notification-aware updates cannot be made atomic by this API.

Implemented
User identity 2
identity.activities.v1

List activities linked to a known user, newest first. Resolve associate_id with whoami first. This is NOT diary/calendar/schedule data; use search_appointments instead.

Implemented
identity.get.v1

Call FIRST for every my/our query. Returns your associate, person and company IDs, name/email, role, primary group, Service user ID and tenant context. Company ID identifies your company; associate ID identifies ownership; person ID identifies memberships/stakeholders.

Implemented