Skip to content

Release Notes

Version 1.11

Released: September 3, 2026

This release adds a meeting search endpoint to the Partner User API with the same full-text behavior as in-product search, and tightens webhook auto-disable so a misconfigured endpoint is disabled promptly.

Behavior change — Webhook auto-disable thresholds

Contio now disables webhook delivery for your app (webhook_enabled: false) when either of the following is true:

  • 10 consecutive failed delivery attempts. Every failed HTTP attempt counts, including retries of the same event. Previously only deliveries that had exhausted all retries counted, and 50 of them were required.
  • 72 hours without a successful delivery while failures are being recorded. This now also applies to endpoints that have never delivered successfully — the window is measured from the first failure of the current streak.

A single successful delivery resets the streak. Auto-disable is no longer feature-flagged and applies to every partner app; the previous webhook_auto_disable rollout flag has been removed.

Fix the endpoint, then re-enable with PUT /v1/partner/admin/webhook-status (choose pending_disposition: deliver to replay events recorded while disabled). See Webhook Management.

What's New — Meeting search

GET /v1/partner/user/meetings/search (meetings:read) searches the authenticated user's meetings. The free-text q parameter matches meeting titles and the summary and notes content, so a query like draft email or external send surfaces meetings where those terms were only discussed in the notes — previously unreachable through GET /v1/partner/user/meetings, which lists by date range only.

Parameter Description
q Free-text query (max 255). Supports quoted phrases and -term exclusions.
start_time_from / start_time_to Inclusive start-time bounds (ISO 8601 with timezone).
status scheduled or completed.
title_contains Case-insensitive title substring filter.
participant_emails Comma-separated participant emails.
has_action_items true / false.
limit / offset Pagination (default 25, max 100).
  • Results are scoped to the user's workspace and de-duplicated per calendar occurrence, matching the User API GET /v1/meetings/search — both surfaces use the same search index.
  • The response shape is the same paginated list returned by GET /v1/partner/user/meetings, which is unchanged.

Enhancement — Applied meeting templates in meeting responses

Meeting responses now include applied_template_ids, the IDs of the templates that have been applied to the meeting. The field is returned by every endpoint that returns a meeting — GET /v1/partner/user/meetings, the new GET /v1/partner/user/meetings/search, GET /v1/partner/user/meetings/{id}, POST /v1/partner/user/meetings, PATCH /v1/partner/user/meetings/{id}, and POST /v1/partner/user/calendar/events/{calendar_event_id}/meeting — and is omitted when no templates have been applied. Use it to tell which of your toolkit templates a meeting is running on without a separate lookup.

Version 1.10

Released: August 5, 2026

This release adds a Backlog Items API, corrects the advertised item_type values for agenda items, makes updating an agenda item's type actually work, lets you control where an agenda item sits in the agenda, adds presenter names and emails to agenda items, and withdraws the restricted_to_leads agenda-item flag.

What's New — Backlog Items

A new Backlog Items API exposes agenda items that live on a user's backlog rather than on a meeting agenda — items created directly on the backlog or deferred out of a meeting. Seven new endpoints under /v1/partner/user/backlog-items cover the full lifecycle: list, create, read, update, delete, assign to a meeting, and read backlog history. They reuse the existing meetings:read / meetings:write scopes — no new scopes are required.

Method Endpoint Scope Description
GET /v1/partner/user/backlog-items meetings:read List the user's active backlog items (paginated).
POST /v1/partner/user/backlog-items meetings:write Create a backlog item (no meeting attachment).
GET /v1/partner/user/backlog-items/{id} meetings:read Get a single backlog item.
PUT /v1/partner/user/backlog-items/{id} meetings:write Update a backlog item's fields.
DELETE /v1/partner/user/backlog-items/{id} meetings:write Remove a backlog item (remains in history).
POST /v1/partner/user/backlog-items/{id}/assign meetings:write Assign a backlog item onto a meeting agenda.
GET /v1/partner/user/backlog-items/history meetings:read List backlog items that have left the backlog (assigned or removed).
  • talking_points carries the authenticated user's private notes on the item, mirroring the agenda-item convention. presenters is a list of user IDs.
  • Assignment creates a new agenda item on the destination meeting and closes the backlog item, so it subsequently reads as 404 and appears in backlog history.

What's New — Attachments

A new Attachments API lets you upload, list, download, and delete raw file attachments on a meeting. Attachments are stored exactly as uploaded and are not normalized or PII-scrubbed; use the Context endpoints for material the Contio AI agent should read.

Method Endpoint Scope Description
GET /v1/partner/user/meetings/{id}/attachments meetings:read List the meeting's attachments (paginated).
POST /v1/partner/user/meetings/{id}/attachments meetings:write Upload a new attachment to the meeting.
GET /v1/partner/user/meetings/{id}/attachments/{attachment_id} meetings:read Get attachment metadata.
DELETE /v1/partner/user/meetings/{id}/attachments/{attachment_id} meetings:write Delete an attachment.
GET /v1/partner/user/meetings/{id}/attachments/{attachment_id}/download meetings:read Download the attachment file.
  • The POST response returns the attachment ID and a pre-signed download URL.
  • Attachments are shared with the meeting or workspace according to the meeting's sharing settings.

What's New — Agenda item ordering

sequence — the decimal fractional index the agenda is ordered by, already returned when reading an agenda item — can now be sent when creating or updating one.

  • Position on create — send a value between the sequences of the two items the new item should sit between ("150" between "100" and "200"). Omit sequence and the item is appended after the meeting's last item.
  • Reposition on update — send a new sequence to move the item; omit it and the item stays where it is. The move is applied to the collaborative document as well, so it is reflected live in the Contio app.
  • Values must be decimal numbers sent as strings; anything else returns 400 invalid_request.

Breaking — Agenda item item_type values

The agenda item endpoints previously advertised DECISION, ACTION_ITEM and INFORMATION. Those are not real Contio agenda item types: requests using them were accepted by validation and then failed with an invalid type error, so no integration could have been successfully using them.

The accepted and advertised set is now exactly the four types Contio implements end to end:

item_type Meaning
DISCUSSION Open discussion item (default)
QUESTIONS_TO_ANSWER Questions to work through
BREAK Scheduled break
ADJOURN End-of-meeting item

QUESTIONS_TO_ANSWER, BREAK and ADJOURN were rejected before this release and are now accepted. Any other value — including internal types that appear in webhook payloads — is rejected with 400 invalid_item_type.

Migration: replace DECISION, ACTION_ITEM and INFORMATION with DISCUSSION (or the type that matches your intent).

Removed — restricted_to_leads agenda-item field

The restricted_to_leads property is no longer returned on any agenda item in Partner API responses (user meeting agenda items, admin toolkit responses, and meeting templates). The server no longer applies any lead-based visibility filtering to agenda items. The lead-restriction feature was never an effective confidentiality boundary and has been removed from the product.

New — presenter_details on agenda items

Agenda items now include a presenter_details array alongside the existing presenters array, so you no longer need a second call to turn presenter IDs into people:

{
  "presenters": ["123e4567-e89b-12d3-a456-426614174003"],
  "presenter_details": [
    {
      "user_id": "123e4567-e89b-12d3-a456-426614174003",
      "name": "John Doe",
      "email": "john.doe@example.com"
    }
  ]
}

presenters still returns the same IDs in the same order as presenter_details, so no migration is required, but it is now deprecated in favour of presenter_details. A presenter whose user record is no longer visible (for example a deleted account) still appears, carrying only user_id.

name and email are only returned for presenters in the authenticated user's workspace. A presenter from any other workspace still appears in both arrays, carrying only user_id.

Fixed — presenters missing from the agenda item update response

Updating an agenda item returned "presenters": [] even when the item had presenters; the presenters had to be read back with a separate GET. The update response now returns the item's real presenters in both presenters and presenter_details. If your integration relied on the update response reporting no presenters, that assumption no longer holds.

Contract Changes

  • New endpoints: seven /v1/partner/user/backlog-items operations (listBacklogItems, createBacklogItem, getBacklogItem, updateBacklogItem, deleteBacklogItem, assignBacklogItem, listBacklogItemHistory) and five /v1/partner/user/meetings/{id}/attachments operations (listMeetingAttachments, createMeetingAttachment, getMeetingAttachment, deleteMeetingAttachment, downloadMeetingAttachment). Additive — existing integrations are unaffected.
  • Response: presenter_details added to the agenda item schema returned by GET, POST and PUT /v1/partner/user/meetings/{id}/agenda-items. presenters is retained and marked deprecated. name and email are populated only for presenters in the authenticated user's workspace; every presenter ID is reported either way.
  • Response (behaviour change): PUT /v1/partner/user/meetings/{id}/agenda-items/{item_id} now returns the item's presenters in presenters instead of an empty array.
  • POST /v1/partner/user/meetings/{id}/agenda-items and PUT /v1/partner/user/meetings/{id}/agenda-items/{item_id}item_type now accepts DISCUSSION, QUESTIONS_TO_ANSWER, BREAK, ADJOURN; anything else returns 400 invalid_item_type.
  • PUT /v1/partner/user/meetings/{id}/agenda-items/{item_id}item_type sent in the body is now applied. It was previously accepted and silently ignored.
  • POST /v1/partner/user/meetings/{id}/agenda-items and PUT /v1/partner/user/meetings/{id}/agenda-items/{item_id} — new optional sequence request field. An omitted sequence on create now appends the item after the meeting's last item instead of leaving it unordered.
  • Response: restricted_to_leads has been removed from all agenda-item response schemas.
  • Toolkit input (backward compatible): Existing toolkit manifests that still set restricted_to_leads on an agenda item remain schema-valid and accepted. The property is now marked deprecated in the toolkit manifest schema, is ignored, and has no effect. No manifest changes are required, but new manifests should omit it.
  • OpenAPI, Postman collection, and agent-bundle artifacts regenerated.

Migration

  • Replace DECISION, ACTION_ITEM and INFORMATION with DISCUSSION (or the type that matches your intent).
  • If your integration read restricted_to_leads from agenda-item responses, remove that dependency — the field is gone and the underlying restriction no longer exists.
  • No action is required for toolkit authoring; the input is silently ignored.

Version 1.9.1

Released: July 27, 2026

This patch extends the DNS/TXT domain ownership verification feature from 1.9.0 with outbound webhook events for Partner SSO IdP domain verification state changes, so your app can react to domain lifecycle transitions without polling.

What's New — IdP Domain Verification Webhooks

Contio now delivers a webhook whenever one of your IdP email domains changes verification state. These events are partner-app-scoped — they are addressed to your app and are delivered even when no user is connected.

Event When it fires
partner.idp.domain_verified A pending domain's DNS TXT challenge matched and the domain became verified.
partner.idp.domain_verification_failed A definitive failure: the published TXT record did not match (token_mismatch), or the pending challenge expired before it was claimed (token_expired).
partner.idp.domain_revoked A previously verified domain lost its DNS proof across the authoritative re-validation window and was revoked.
  • Minimal, safe payloads — events carry the domain, its new status, and a timestamp only. The DNS challenge token is never included.
  • No noise on transient failures — temporary DNS resolution errors (timeouts, SERVFAIL) do not emit a failure event; only definitive outcomes are reported.
  • Filterable — like other lifecycle events, these can be included/excluded via your webhook filter. See the Webhook Management Guide.

See the Webhook Events Guide and the AsyncAPI reference.

Contract Changes

  • New webhook events: partner.idp.domain_verified, partner.idp.domain_verification_failed, partner.idp.domain_revoked.
  • AsyncAPI spec, webhook documentation, OpenAPI, Postman collection, and agent-bundle artifacts regenerated.

Action Item Webhook Delivery

  • A user-originated completion of an assigned action item now delivers both the general action_item.updated event and the transition-specific action_item.completed event. Consumers subscribed to both should treat action_item.updated as the current-state notification and action_item.completed as the completion transition, rather than as two separate completions.
  • A completion reconciled from an external TODO provider delivers action_item.updated only. Contio does not emit action_item.completed for that path because the provider response does not identify a Contio user for the required completed_by_user_id field.

Version 1.9.0

Released: July 20, 2026

This release adds DNS/TXT domain ownership verification for Partner SSO. Partners must now prove control of every email domain before claiming it in a strict-mode IdP configuration.

What's New — Domain Ownership Verification

Before a domain can appear in allowed_email_domains for a strict-mode IdP configuration, you must prove ownership of it by publishing a unique DNS TXT record. This prevents a partner-controlled IdP from claiming email domains it does not control.

The flow is: initiate a challenge, publish the returned TXT record in your domain's DNS, then check verification.

Name:  _contio-challenge.<domain>
Value: contio-domain-verify=<token>
  • Exact domains only — each domain is verified independently; subdomains require their own verification and must exactly match the claimed domain.
  • Per-partner scope — a verification belongs to the partner app that completed it.
  • 7-day pending TTL — an unclaimed challenge expires after seven days; re-initiate for a fresh token.
  • Durable — a verified domain stays verified with no periodic re-validation.

Login-time domain matching is unchanged: this gate applies only when configuring strict-mode domains. See the SSO Integration Guide.

Contract Changes

  • POST /v1/partner/admin/idp/domains/{domain}/verify — Initiate (or rotate) a DNS/TXT domain ownership challenge.
  • GET /v1/partner/admin/idp/domains/{domain} — Get the current verification status for a domain.
  • POST /v1/partner/admin/idp/domains/{domain}/check — Perform the DNS TXT lookup and mark the domain verified on success.
  • POST /v1/partner/admin/idp and PUT /v1/partner/admin/idp — Claiming an unverified domain in strict mode now returns 400 domain_not_verified.
  • OpenAPI, Postman collection, and agent-bundle artifacts regenerated.

Version 1.8.1

Released: July 2, 2026

New Documentation

  • Feature Gating Guide - Explains the Partner API 402 response and proper handling for plan-gated features by workspace.
  • User Preferences Guide — Users may tailor their Contio experience via preferences which also affect the Partner API.

Contract Changes

  • GET /v1/partner/user/meetings/{id}/transcript/export - Download a meeting transcript in SRT format (Elite plan)
  • POST /v1/partner/user/meetings - Updated description in the OpenAPI specification to note that meeting access is resolved from the creating user's Sharing Defaults preference.
  • OpenAPI, Postman collection, and agent-bundle artifacts regenerated.

Version 1.8.0

Released: June 11, 2026

This release introduces opt-in idempotency across most Partner API mutation endpoints, plus agent-native resources to enhance agentic Partner app development.

What's New — Idempotency Support and Agent Resources

Mutation endpoints on the Partner Admin API (/v1/partner/admin/*) and Partner User API (/v1/partner/user/*) now accept an optional Idempotency-Key header. When present, the API deduplicates retried requests: the first execution's successful response is stored and replayed verbatim on subsequent retries with the same key. Requests without the header continue to behave exactly as before.

  • Replay detection — Replayed responses include an Idempotent-Replayed: true header so clients can distinguish fresh executions from deduplicated replays.
  • Key-reuse protection — Reusing a key with a different request payload returns 422 idempotency_key_reuse.
  • In-flight conflict handling — Concurrent requests with the same key return 409 with a Retry-After header.
  • 24-hour retention — Completed idempotency records are retained for 24 hours; pending records expire after 5 minutes.

The Partner API now publishes machine-readable artifacts so that coding agents and LLM toolchains can discover and call the API without manual setup:

Artifact URL Purpose
llms.txt /partner-api/llms.txt Human- and LLM-readable index of every Partner API operation
operations.json /partner-api/agent/operations.json Structured per-operation metadata with request/response schemas
mcp.json /partner-api/agent/mcp.json Model Context Protocol tool manifest

Drop the llms.txt URL into any coding agent's context window to give it full awareness of available endpoints. MCP-compatible agents can register mcp.json as a tool manifest to call Partner API operations directly.

New Documentation

  • Idempotency Guide — Explains the mechanism, headers, error codes, retention policy, exclusions (multipart), and best practices.
  • Agent Integration Guide — How to point coding agents and LLM toolchains at the Partner API using llms.txt, operations.json, or the MCP manifest.

Contract Changes

  • Idempotency-Key header documented on applicable mutation operations in the OpenAPI specification.
  • Three new error codes: idempotency_key_reuse (422), idempotency_conflict (409), idempotency_key_invalid (400).
  • OpenAPI, Postman collection, and agent-bundle artifacts regenerated.

Version 1.7.1

Released: May 22, 2026

Housekeeping: Update SDK to incorporate latest webhook specs; tidy sample toolkits to remove extraneous/unsupported attributes.

Version 1.7.0

Released: May 16, 2026

This release adds Toolkit Distribution for automated version propagation across workspaces, Workflow Dry-Run Mode for pre-execution simulation, and several enhancements to the Workflow and Agenda Item APIs.

What's New — Toolkit Distribution

Partners can now automatically propagate published toolkit versions to all connected workspaces, monitor installation status across their workspace fleet, and control auto-install behavior for newly connected workspaces.

  • Auto-propagation — When enabled, publishing a new toolkit version automatically upgrades all connected workspaces (respecting opt-outs).
  • Force upgrade — Override opt-outs for critical updates using the propagation: "force" publish parameter.
  • Installation visibility — Monitor which workspaces have installed, opted out, or never installed a toolkit.
  • Auto-install for new workspaces — Automatically install the latest published version when a new workspace connects.

New Admin Endpoints

Method Endpoint Description
GET /v1/partner/admin/toolkits/{id}/installations List all installations of a toolkit with status summary
GET /v1/partner/admin/workspaces List all workspaces connected to the partner

Modified Admin Endpoints

PATCH /v1/partner/admin/toolkits/{id} — Two new optional fields:

Field Type Description
auto_propagate boolean Automatically propagate new versions to connected workspaces on publish
auto_install_on_new_workspaces boolean Automatically install the latest published version when a new workspace connects

POST /v1/partner/admin/toolkits/{id}/versions/{vid}/publish — New optional propagation field:

Value Behavior
(omitted) Use the toolkit's auto_propagate setting
"none" Skip propagation regardless of setting
"normal" Propagate to active workspaces, respect opt-outs
"force" Propagate to all workspaces including opt-outs

The publish response now includes a propagation object with mode, workspaces_queued, and workspaces_skipped_opted_out counts.


What's New — Workflow Enhancements

  • Dry-run mode — Simulate a workflow run without executing side effects. Pass dry_run: true when creating a run to validate the template configuration, role mappings, and readiness checks without actually starting the workflow.
  • Pre-flight readiness validation — The POST /v1/partner/user/workflow-runs endpoint now performs configuration validation before starting a run. Issues such as missing Slack configuration, unmapped roles, or invalid input references are returned as structured readiness_issues in the response.
  • Rejected run status — Workflow runs rejected during human review now surface as status: "rejected" instead of "failed", giving partners clearer signal about why a run ended.
  • Action labels — Workflow actions now include an optional label field for display purposes.
  • Role mappings — Workflow runs now persist role_mappings so partners can see which users were assigned to each workflow role.

What's New — Agenda Items

  • Talking points — The POST and PUT agenda item endpoints now accept an optional talking_points array, allowing partners to attach structured discussion points to agenda items.

Additional Improvements

  • Action button invocation trackingPOST /v1/partner/user/meetings/{id}/action-buttons/{button_id}/trigger now returns an invocation_id for correlating trigger events with downstream processing.
  • Toolkit provenance — Template responses now include provenance metadata (toolkit origin, slug, and version) when the template was created via a toolkit manifest.
  • Toolkit import conflict detection — Creating a toolkit version now validates the manifest against existing entities. Name/slug conflicts are returned as structured conflicts in the response, with a force: true option to override.

Version 1.6.0

Released: April 17, 2026

This release adds Workflow APIs and Workflow lifecycle webhooks so partners can discover workflow templates, trigger runs programmatically, and receive notifications as runs and tasks progress. It also streamlines the Partner Admin API surface by making Next Steps, Action Buttons, and Shortcuts toolkit-only entities. These "leaf" entities are now created, updated, and deleted exclusively through the Toolkit Manifest — their standalone Admin CRUD endpoints have been removed.

What's New — Workflow APIs

  • Admin: List workflow templatesGET /v1/partner/admin/workflow-templates returns all templates scoped to your partner app.
  • Admin: Get workflow templateGET /v1/partner/admin/workflow-templates/{id} returns a single template with full definition.
  • User: Trigger manual workflow runPOST /v1/partner/user/workflow-runs starts a manual run for a template in the caller's workspace.
  • User: List workflow runsGET /v1/partner/user/workflow-runs lists runs in the caller's workspace.
  • User: Get workflow runGET /v1/partner/user/workflow-runs/{id} returns a single run with current step state.

Workflow run triggers are restricted to trigger_type=manual; autopilot triggers remain reserved for internal use. The User endpoints require new OAuth scopes: partner-api/workflows:read for read operations and partner-api/workflows:write for creating runs. POST /workflow-runs is additionally gated by the Workflow Templates feature entitlement.

New Webhook Events — Workflow Lifecycle

Partners can now receive webhook notifications for workflow runs and tasks:

Event Delivered to
workflow.run.started Run owner (or manual trigger)
workflow.run.completed Run owner
workflow.run.failed Run owner
workflow.step.completed Run owner
workflow.task.created Task assignee
workflow.task.resolved Reviewer who recorded the decision

See the AsyncAPI webhook reference for full payload schemas.

Templates remain available as standalone entities because they have independent value outside the toolkit lifecycle (e.g., browsing, assigning to meetings).

Breaking Change — Removed Admin Endpoints

The following Admin API endpoints have been removed. All leaf entity management now happens through the Toolkit Manifest:

Next Steps (removed):

  • GET/POST /v1/partner/admin/next-steps
  • GET/PUT/DELETE /v1/partner/admin/next-steps/{id}

Action Buttons (removed):

  • GET/POST /v1/partner/admin/action-buttons
  • GET/PUT/DELETE /v1/partner/admin/action-buttons/{id}

Next Step ↔ Action Button associations (removed):

  • GET/POST /v1/partner/admin/next-steps/{id}/action-buttons
  • PUT/DELETE /v1/partner/admin/next-steps/{id}/action-buttons/{ab_id}
  • PUT/DELETE /v1/partner/admin/next-steps/{id}/default-action-button

Migration Path

If you were using standalone endpoints to manage next steps or action buttons:

  1. Define them in a Toolkit Manifest using the next_steps and action_buttons arrays
  2. Use $id / $ref cross-references to wire entities together
  3. Create or update the toolkit via POST /v1/partner/admin/toolkits or PUT /v1/partner/admin/toolkits/{id}

User API endpoints are unchangedGET /meetings/{id}/next-steps, /action-buttons, execute, and trigger endpoints continue to work as before.


Version 1.5.0

Released: April 3, 2026

This major release introduces Toolkits — a declarative system for defining and deploying complete meeting experiences. Partners can now bundle templates, AI-powered next steps, and action buttons into versioned manifests that install atomically across workspaces.

What's New

  • Toolkit Manifests — Declarative JSON format for meeting workflow configuration
  • Templates — Meeting structures with customizable next steps
  • AI Next Steps — Post-meeting prompts for summaries, follow-ups, and more
  • Action Buttons — Delivery mechanisms (email, clipboard, webhook, download)
  • SDK 1.5.0 — Full TypeScript support for all new Toolkit APIs

Toolkit Manifest System

Define complete meeting experiences in a single JSON document:

{
  "templates": [
    {
      "$id": "sales-call",
      "name": "Sales Discovery Call",
      "next_steps": [
        { "next_step": { "$ref": "meeting-summary" }, "order": 1 }
      ]
    }
  ],
  "next_steps": [
    {
      "$id": "meeting-summary",
      "name": "Generate Summary",
      "type": "ai",
      "prompt": "Summarize this sales call including key discussion points.",
      "action_buttons": [
        { "action_button": { "$ref": "email-btn" }, "order": 1 }
      ]
    }
  ],
  "action_buttons": [
    {
      "$id": "email-btn",
      "name": "Send via Email",
      "delivery_type": "email"
    }
  ]
}

Key Features

  • Atomic Installation — All entities install together or not at all
  • Reference System — Use $id and $ref to link entities within the manifest
  • Version Control — Store manifests in your repository and deploy programmatically
  • Multi-Workspace — Install the same toolkit across multiple workspaces

See the Toolkit Manifests Guide for complete documentation and examples.


Admin API Endpoints

Toolkit Management

Method Endpoint Description
POST /v1/partner/admin/toolkits Create a toolkit from manifest
GET /v1/partner/admin/toolkits List all toolkits
GET /v1/partner/admin/toolkits/{toolkitId} Get toolkit details
PUT /v1/partner/admin/toolkits/{toolkitId} Update toolkit manifest
DELETE /v1/partner/admin/toolkits/{toolkitId} Delete toolkit
GET /v1/partner/admin/toolkits/{toolkitId}/export Export single toolkit manifest
POST /v1/partner/admin/toolkits/export Bulk export toolkit manifests

Toolkit Versioning

Method Endpoint Description
GET /v1/partner/admin/toolkits/{toolkitId}/versions List toolkit versions
POST /v1/partner/admin/toolkits/{toolkitId}/versions Create a new version
GET /v1/partner/admin/toolkits/{toolkitId}/versions/{versionId} Get version details
PATCH /v1/partner/admin/toolkits/{toolkitId}/versions/{versionId} Update version metadata
DELETE /v1/partner/admin/toolkits/{toolkitId}/versions/{versionId} Delete a version
POST /v1/partner/admin/toolkits/{toolkitId}/versions/{versionId}/publish Publish a version
POST /v1/partner/admin/toolkits/{toolkitId}/versions/{versionId}/republish Republish a version

Template Management

Method Endpoint Description
GET /v1/partner/admin/templates List templates
POST /v1/partner/admin/templates Create a template
GET /v1/partner/admin/templates/{templateId} Get template details
PUT /v1/partner/admin/templates/{templateId} Update a template
DELETE /v1/partner/admin/templates/{templateId} Delete a template
GET /v1/partner/admin/templates/{templateId}/next-steps List template's next steps
POST /v1/partner/admin/templates/{templateId}/next-steps Associate next step to template
PUT /v1/partner/admin/templates/{templateId}/next-steps/{nextStepId} Update association
DELETE /v1/partner/admin/templates/{templateId}/next-steps/{nextStepId} Remove association

Next Steps & Action Buttons

As of v1.6.0, standalone Admin CRUD for next steps and action buttons has been removed. Use the Toolkit Manifest to manage these entities. Template↔Next Step association endpoints remain available.


User API Endpoints

Toolkits

Method Endpoint Description
GET /v1/partner/user/toolkits List available toolkits
POST /v1/partner/user/toolkits/{toolkitId}/install Install toolkit to workspace
GET /v1/partner/user/workspaces/{workspace_id}/toolkits List toolkits installed in workspace
DELETE /v1/partner/user/workspaces/{workspace_id}/toolkits/{toolkit_id} Uninstall toolkit from workspace

Templates

Method Endpoint Description
GET /v1/partner/user/meeting-templates List available templates
GET /v1/partner/user/meeting-templates/{id} Get template details
POST /v1/partner/user/meeting-templates/{id}/apply Apply template to a meeting
GET /v1/partner/user/meeting-templates/{id}/next-steps List template's next steps

Meeting Next Steps & Action Buttons

Method Endpoint Description
GET /v1/partner/user/meetings/{id}/next-steps Get meeting next steps
POST /v1/partner/user/meetings/{id}/next-steps/{next_step_id}/execute Execute a next step
GET /v1/partner/user/next-step-results/{result_id} Get next step execution result
GET /v1/partner/user/meetings/{id}/action-buttons Get meeting action buttons
POST /v1/partner/user/meetings/{id}/action-buttons/{button_id}/trigger Trigger action button

SDK Examples

Create and Install a Toolkit

import { ContioPartnerSDK } from '@contio/partner-sdk';

const sdk = ContioPartnerSDK.forAdmin({ apiKey: process.env.API_KEY });

// Create toolkit from manifest
const toolkit = await sdk.admin.createToolkit({
  name: 'Sales Workflow',
  description: 'Post-meeting follow-up automation',
  manifest: salesManifest
});

// Install on a workspace
await sdk.admin.installToolkit(toolkit.id, {
  workspace_id: 'ws_abc123'
});

Execute Meeting Next Steps

const userSdk = ContioPartnerSDK.forUser({
  clientId: process.env.CLIENT_ID,
  clientSecret: process.env.CLIENT_SECRET,
  redirectUri: 'https://your-app.com/callback'
});

// Get next steps for a meeting
const nextSteps = await userSdk.user.getMeetingNextSteps(meetingId);

// Execute AI-powered next step
const execution = await userSdk.user.executeNextStep(meetingId, nextStepId);

// Poll for result
const result = await userSdk.user.getNextStepResult(meetingId, nextStepId);
console.log(result.output); // AI-generated content

OAuth Scopes

New scopes for Toolkit access:

Scope Description
toolkits:read Read toolkit and template information
toolkits:write Install/uninstall toolkits
next_steps:execute Execute meeting next steps
action_buttons:trigger Trigger action buttons

New Webhook Events

Three new webhook events support the Toolkit system:

Event Description
meeting_template.applied Sent when a meeting template is applied to a meeting
next_step.completed Sent when a Next Step execution completes (AI or redirect)
action_button.triggered Sent when a partner's action button is triggered

Example: next_step.completed Payload

{
  "event_type": "next_step.completed",
  "event_id": "evt-550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2026-04-01T10:30:00Z",
  "partner_app_id": "app-550e8400-e29b-41d4-a716-446655440000",
  "for_user": {
    "id": "user-550e8400-e29b-41d4-a716-446655440000",
    "email": "user@example.com"
  },
  "data": {
    "next_step_id": "ns-550e8400-e29b-41d4-a716-446655440000",
    "next_step_name": "Generate Meeting Summary",
    "meeting_id": "mtg-550e8400-e29b-41d4-a716-446655440001",
    "result_id": "nsr-550e8400-e29b-41d4-a716-446655440003",
    "executed_by": "user-550e8400-e29b-41d4-a716-446655440004",
    "executed_at": "2026-04-01T10:30:00Z",
    "execution_mode": "manual"
  }
}

See the Webhook Events Reference for complete payload schemas.


Version 1.4.7

Released: March 20, 2026

This release introduces the Chat Session API, enabling partners to programmatically interact with the Contio AI agent through asynchronous, turn-based conversations. Sessions can optionally be scoped to meetings and primed with context documents for targeted AI assistance.

Chat Session Endpoints

Method Endpoint Description
POST /v1/partner/user/sessions Create a new chat session with an initial message
GET /v1/partner/user/sessions List chat sessions (filterable by meeting)
GET /v1/partner/user/sessions/{id} Get session details with paginated turns
PUT /v1/partner/user/sessions/{id} Send a follow-up message to an existing session

Key Features

  • Turn-based conversations — Each session tracks user and agent messages as ordered turns with 0-based sequence numbering
  • Meeting-scoped sessions — Optionally associate a session with a meeting so the AI agent has full meeting context
  • Context document priming — Attach context documents (uploaded via the Meeting Context API) to give the agent additional reference material
  • Partner metadata — Attach up to 10 key-value pairs to sessions for your own tracking purposes
  • Idempotent creation — Use the Idempotency-Key header to safely retry session creation without duplicates
  • Turn pagination — Retrieve session turns with configurable turn_limit and turn_offset parameters
  • Agent metadata — Agent turns include tool call details, referenced documents, and token usage statistics

OAuth Scopes

  • New chat:read scope grants read access to sessions and turns (list, get)
  • New chat:write scope grants write access (create sessions, send messages) and implicitly includes chat:read capability

Limits

Limit Value
Message length 10,000 characters
Metadata keys per session 10
Metadata key length 256 characters
Metadata value length 1,024 characters
Turns per session 100
Default turn page size 50 (max 200)

Version 1.4.6

Released: March 13, 2026

This release introduces the Meeting Context API, enabling partners to upload, retrieve, and manage supplemental context documents for meetings. Context documents are preprocessed for use during AI-powered meeting summarization and action item extraction.

Meeting Context Endpoints

  • POST /v1/partner/user/meetings/{id}/context — Upload a context document for a meeting
  • GET /v1/partner/user/meetings/{id}/context — List all context documents for a meeting
  • GET /v1/partner/user/meetings/{id}/context/{context_id} — Get a specific context document
  • GET /v1/partner/user/meetings/{id}/context/{context_id}/content — Download context document content
  • DELETE /v1/partner/user/meetings/{id}/context/{context_id} — Delete a context document

OAuth Scopes

  • New context:read and context:write scopes control access to Meeting Context endpoints
  • These scopes are independent of the existing meetings:read and meetings:write scopes

Version 1.4.5

Released: March 06, 2026

This release adds webhook management capabilities: automatic webhook disabling on repeated delivery failures, manual webhook status control, and event filtering with include/exclude modes.

Webhook Auto-Disable

  • Webhooks are automatically disabled after 50 consecutive abandoned deliveries or 72 hours without a successful delivery
  • Partners are notified via email when auto-disable triggers
  • New deliveries are recorded as pending while disabled, preserving events for later delivery
  • Feature-flagged via webhook_auto_disable

Webhook Status Management

  • PUT /v1/partner/admin/webhook-status — Enable or disable webhooks manually
  • pending_disposition option: choose deliver (retry pending events) or abandon (discard pending events) when re-enabling
  • SDK: admin.updateWebhookStatus({ enabled: true/false })

Webhook Event Filtering

  • PUT /v1/partner/admin/webhook-filter — Set include or exclude filter for event types
  • DELETE /v1/partner/admin/webhook-filter — Remove filter (receive all events)
  • 15 filterable event types; user.connection.revoked always bypasses filters
  • SDK: admin.setWebhookFilter({ ... }) and admin.removeWebhookFilter()

Version 1.4.3

Released: February 27, 2026

This backward-compatible release adds shared workspace support to the Partner OAuth connect flow, allowing partners to provision multiple users into the same workspace.

Shared Workspace Provisioning

  • The POST /auth/initiate endpoint now accepts optional workspace_id and is_admin fields. When workspace_id is provided, the new user is added to the specified existing workspace instead of creating a personal workspace.
  • is_admin: true assigns the WORKSPACE_ADMIN role; is_admin: false (default) assigns WORKSPACE_MEMBER.
  • New validation error codes: workspace_not_found (404), workspace_not_authorized (403), workspace_conflict (409).
  • The 409 conflict response includes the user's current workspace_id as a dedicated field for programmatic reconciliation.

Profile Enhancement

  • The GET /v1/partner/user/profile endpoint now returns workspace_id, workspace_name, and workspace_role fields.

Version 1.4.2

Released: February 17, 2026

This backward-compatible release standardizes the date search query parameters and error responses across all Partner API endpoints.

  • The "start_date" and "end_date" query parameters are now fully supported for meetings and action items search endpoints.
  • The calendar search endpoint now also expects "start_date" and "end_date" query parameters for consistency. The "start" and "end" query parameters have been deprecated and will be removed in a future version.
  • Error responses have been standardized for all endpoints. The "error" and "request_id" fields are now utilized consistently, and the "message" field has been deprecated.
  • API documentation has been updated to reflect these improvements and deprecations.

Version 1.4.0

Released: January 31, 2026

This release adds calendar event details retrieval and comprehensive webhook events for meeting updates, calendar sync, and agenda item lifecycle tracking.

What's New

  • 1 new API endpoint for retrieving calendar event details
  • 7 new webhook events for meeting updates, calendar events, and agenda items

Calendar Event Details

Retrieve full details of a specific calendar event by ID.

New Endpoint

Method Endpoint Description
GET /v1/partner/user/calendar/events/{calendar_event_id} Get calendar event details

Key Features

  • Retrieve complete calendar event information including title, times, and attendees
  • Access organizer details and attendee list with response status
  • Supports both timed and all-day events

Example Usage

// Get calendar event details
const event = await sdk.user.getCalendarEvent(calendarEventId);

console.log(event.title);           // "Product Planning Meeting"
console.log(event.start_time);      // "2026-01-31T10:00:00Z"
console.log(event.attendee_count);  // 5

New Webhook Events

Seven new webhook events provide real-time notifications for meeting updates, calendar sync, and agenda item lifecycle.

Meeting Events

Event Description
meeting.updated Meeting title, scheduled time, or other properties changed

Calendar Events

Event Description
calendar_event.created Calendar event synced from external calendar (Google, Outlook)
calendar_event.updated Calendar event updated in external calendar
calendar_event.deleted Calendar event cancelled/deleted in external calendar

Agenda Item Events

Event Description
agenda_item.created Agenda item created in a meeting or backlog
agenda_item.updated Agenda item title, status, or properties changed
agenda_item.deleted Agenda item removed from meeting or backlog

Event Delivery

  • Calendar events are delivered to the user whose calendar was synced
  • Agenda item events for meeting items are delivered to all meeting participants; for backlog items, only to the creator/updater

See the Webhook Events Guide for complete event schemas and examples.


Version 1.3.0

Released: January 21, 2026

This release significantly expands the Partner User API with comprehensive meeting collaboration capabilities. Partners can now manage meeting participants, agenda items, and calendar integrations, enabling deeper integration with MeetingOS workflows.

What's New

  • 11 new API endpoints for participants, agenda items, and calendar integration
  • 6 new webhook events for real-time meeting and action item notifications
  • Consolidated API documentation with improved organization

Meeting Participant Management

Programmatically manage meeting participants through the Partner User API.

New Endpoints

Method Endpoint Description
GET /v1/partner/user/meetings/{id}/participants List meeting participants
POST /v1/partner/user/meetings/{id}/participants Add a participant
DELETE /v1/partner/user/meetings/{id}/participants/{participant_id} Remove a participant

Key Features

  • Add participants by email (supports both registered users and guests)
  • Assign participant roles: EDITOR or VIEWER
  • Automatic guest provisioning when adding new participants
  • View all participants with roles and metadata

Example Usage

// List participants
const participants = await sdk.user.getMeetingParticipants(meetingId);

// Add a participant
await sdk.user.addMeetingParticipant(meetingId, {
  email: 'john.doe@example.com',
  name: 'John Doe',
  role: 'EDITOR'
});

// Remove a participant
await sdk.user.removeMeetingParticipant(meetingId, participantId);

Agenda Item Management

Create, update, and delete agenda items within meetings.

New Endpoints

Method Endpoint Description
GET /v1/partner/user/meetings/{id}/agenda-items List agenda items
POST /v1/partner/user/meetings/{id}/agenda-items Create an agenda item
PUT /v1/partner/user/meetings/{id}/agenda-items/{item_id} Update an agenda item
DELETE /v1/partner/user/meetings/{id}/agenda-items/{item_id} Delete an agenda item

Key Features

  • Create structured agenda items with titles, descriptions, and time allocations
  • Support for multiple item types: DISCUSSION, DECISION, UPDATE, etc.
  • Automatic synchronization with Tiptap collaborative editor
  • Update or delete agenda items as needed

Example Usage

// Create an agenda item
const newItem = await sdk.user.createAgendaItem(meetingId, {
  item_type: 'DISCUSSION',
  title: 'Q4 Budget Review',
  description: 'Review and approve Q4 budget allocation',
  time_allocation_minutes: 15
});

// Update an agenda item
await sdk.user.updateAgendaItem(meetingId, itemId, {
  title: 'Updated Title',
  time_allocation_minutes: 20
});

Calendar Integration

Access user calendar events and link them to meetings.

New Endpoints

Method Endpoint Description
GET /v1/partner/user/calendar/events List calendar events
POST /v1/partner/user/meetings/{id}/calendar/link Link a calendar event
DELETE /v1/partner/user/meetings/{id}/calendar/unlink Unlink a calendar event
POST /v1/partner/user/calendar/events/{id}/meeting Create meeting from event

Key Features

  • Query calendar events with date range filtering
  • Link existing calendar events to MeetingOS meetings
  • Create meetings automatically from calendar events
  • Access calendar event metadata (attendees, location, times)

Example Usage

// Get calendar events
const events = await sdk.user.getCalendarEvents({
  start: '2026-01-01T00:00:00Z',
  end: '2026-01-31T23:59:59Z',
  limit: 50
});

// Create meeting from calendar event
const result = await sdk.user.createMeetingFromCalendarEvent({
  calendar_event_id: calendarEventId
});

Enhanced Webhook Events

Six new webhook events provide real-time notifications for meeting and action item lifecycle.

New Events

Event Description
meeting.created New meeting created
meeting.completed Meeting processing complete
action_item.created New action item created
action_item.completed Action item marked complete
participant.added Participant(s) added to meeting
participant.removed Participant removed from meeting

Multi-User Delivery

Participant events (participant.added, participant.removed) are delivered to all partner apps connected to users who are participants in the meeting, enabling collaborative workflows.

See the Webhook Events Guide for complete event schemas and examples.


Version 1.2.1

Released: January 17, 2026

Minor improvements to OAuth and webhook handling.

Changes

  • Added login_hint parameter support in getAuthorizationUrl()
  • Added support for id_token introspection and verification
  • New Express middleware for webhook signature verification

Version 1.2.0

Released: January 8, 2026

This release introduces a new opaque token format for improved security and privacy.

Opaque Token Format

Access and refresh tokens now use a consistent, versioned format that abstracts internal implementation details.

What's New

  • New Token Format - Access tokens: cto_at_v1_..., Refresh tokens: cto_rt_v1_...
  • Improved Security - Tokens no longer expose internal claims or metadata
  • Version Routing - Token version prefix enables seamless future upgrades

Backward Compatibility

  • Existing JWT-format tokens continue to work during the transition period
  • Legacy tokens show a deprecation warning header (X-Contio-Token-Deprecated)
  • No code changes required - the SDK handles both token formats automatically

Migration Notes

If you're storing or parsing tokens directly (not recommended):

  1. Do not parse token contents - Opaque tokens contain no readable claims
  2. Use introspection - Call oauth.introspectToken() to get token metadata
  3. Update token validation - If you validate tokens locally, switch to introspection

See the Token Migration Guide for details.


Version 1.1.0

Released: January 2, 2026

This release introduces Partner IdP SSO, enabling your users to sign in to Contio using your corporate identity provider.

Single Sign-On (SSO) Integration

New Features

  • SSO Integration Guide - Step-by-step guide for configuring your OIDC-compliant identity provider
  • User Provisioning Guide - Documentation explaining automatic user provisioning during OAuth
  • SDK SSO Methods - New getIdpLoginUrl() and getSsoStatusUrl() methods

How It Works

  1. Users connect to Contio via OAuth (establishing consent and provisioning)
  2. Configure your identity provider in the Partner Dashboard
  3. Users can then sign in using your corporate credentials via SSO

Info

SSO provides authentication convenience for returning users who have already connected via OAuth. See the SSO Integration Guide for complete setup instructions.


Version 1.0.1

Released: December 16, 2025

Documentation improvements and new documentation site launch.

Changes

  • 🚀 Launched official documentation site at docs.contio.ai/partner-api
  • Slimmed down SDK README to essentials with links to full documentation
  • Removed bundled docs/ folder from SDK distribution (now served from docs site)
  • Added comprehensive guides: OAuth Flow, Credential Management, Troubleshooting
  • Added detailed API reference with code examples

Version 1.0.0

Released: November 15, 2025

Initial release of the Contio Partner SDK.

Features

  • 🔒 OAuth 2.0 authentication with PKCE support
  • 📆 Meeting data access (summaries, notes, transcripts)
  • ✅ Action item management
  • 🔔 Webhook event handling with signature verification
  • 📘 TypeScript support with full type definitions