Skip to main content
API
Business hours schedules
  • Added businessHoursSchedule and businessHoursSchedules, which read the named schedules in your workspace. Both need the businessHours:read permission.
  • Added createBusinessHoursSchedule, updateBusinessHoursSchedule, and deleteBusinessHoursSchedule. Overlapping and adjacent slots are merged when you write them.
  • SLA types expose businessHoursSchedules, so you can read which schedules an SLA is tracked against. An empty list means it is tracked 24/7.
  • businessHoursScheduleIds on ServiceLevelAgreementInput and UpdateServiceLevelAgreementInput now takes IDs you can create, so you can point an SLA at a specific schedule.
Workflows
  • Added lastTriggeredAt on Workflow, and LAST_TRIGGERED_AT on WorkflowsSortField.
  • Workflow.order is the 1-based dispatch priority among published event workflows with a start step. moveWorkflow updates it.
Broadcasts
  • Added imageUrl on BroadcastReactionCount, so you can render a custom emoji.
Discussions
  • DiscussionsFilter.isWorkflowTask separates the Sidekick tasks generated from ask_sidekick workflow steps from the discussions that people join. Pass false for a human-facing list.
Changed and removedUpdate your integration if it uses any of these fields or operations:
  • Replace businessHoursSlots with businessHoursSchedules.
  • Replace syncBusinessHoursSlots with createBusinessHoursSchedule or updateBusinessHoursSchedule. It errors when the workspace has more than one schedule.
  • Replace useBusinessHoursOnly with businessHoursSchedules when you read an SLA, and with businessHoursScheduleIds when you write one.
API
Slack
  • Added createThreadFromSlackMessage, so you can create a thread from a top-level message in a connected customer Slack channel. It is the trigger for API-only ingestion, and it works in every other ingestion mode too.
  • Added API_ONLY to SlackIngestionMode.
AI feedback
  • Added aiFeedback, so you can list the feedback your team has left on Ari replies and other Plain AI features. Filter by features, sentiments, and createdAt. Requires aiFeatureFeedback:read.
Other
  • MachineUser.isAssignableToThreads reports whether custom-agent pricing allows assigning that machine user to a thread.
Create a thread from a Slack message · Ingestion modes · AI feedback
API
Broadcasts
  • Added broadcastAudience, broadcastAudiences, createBroadcastAudience, updateBroadcastAudience, and deleteBroadcastAudience, so you can save and reuse broadcast audiences.
  • Added broadcastSendTargetRecipients, so you can see who a send target’s scope, filters, recipients, and excludeRecipients resolve to before you save or send.
  • Added sendTestBroadcast, so you can post a draft to up to 10 named Slack channels without changing the broadcast’s status.
Broadcasts · Broadcast audiences
APIWebhooks
2026-09-14
Reply as a user
  • replyToThread accepts impersonation.asUser, so an API key can reply as a team member. impersonation takes exactly one of asCustomer or asUser.
  • createApiKey and updateApiKey accept impersonationAllowList, and ApiKey.impersonationAllowList returns it. It names the users, roles and custom roles a key may reply as.
  • TimelineEntry.createdBy returns whose credentials wrote an entry, which is the machine user for a reply sent as a team member, while actor stays the team member. It is null on entries created before this was recorded.
Other
  • Workspace.isSSOEnabled and Workspace.isDirectoryEnabled report an active SSO connection and a configured directory, and User.isManagedByDirectory marks the users the directory manages.
  • WorkflowsFilter.createdByUserIds filters workflows by creator, and sortBy accepts NAME, CREATED_AT and PUBLISHED_AT.
Webhooks
  • Added discussion.turn_stop_requested, sent when someone requests that an agent stop its current turn. The payload contains discussion, requestedBy, and requestedAt.
Reply to threads · Machine users · Webhook versions · JSON schema
API
Broadcasts
  • Broadcasts expose sends, deliveries, reactions, reply threads, SLACK_BLOCK_KIT content, and link unfurling.
  • scheduleBroadcast.scheduledAt is optional, so you can return a scheduled broadcast to draft.
Other
  • Task.sourceLinks lists linked knowledge gaps. knowledgeGaps accepts filters, including status.
  • moveWorkflow places a workflow after another, or first when afterWorkflowId is null. Read where it sits from lexicographic position, and sort workflows with sortBy.
  • EmailEntry.inlineAttachments and ImportThreadMessageInput.emailMessageId are available.
  • Thread.broadcast and ThreadsFilter.broadcastIds relate reply threads to a broadcast.
  • changeThreadDiscussionStatus resolves and reopens a discussion.
Changed and removedUpdate your integration if it uses any of these fields or operations:
  • Replace BroadcastSendTarget.channels and BroadcastSendTargetInput.channels with scope, filters, recipients, and excludeRecipients.
  • Replace ThreadDiscussionAgentStatus.NEEDS_INPUT with TOOL_CALL_APPROVAL_PENDING.
  • Replace isSuccess on ThreadDiscussionToolCallEntryPayload with status (DiscussionToolCallStatus). service and op are optional.
  • Remove DiscussionsFilter.hasAgentSession. Filter with agentTypes and agentMachineUserIds.
  • Replace order on workflow inputs with moveWorkflow. Setting order no longer affects ordering, and Workflow.order is deprecated in favor of position.
  • Replace markThreadDiscussionAsResolved with changeThreadDiscussionStatus, which moves a discussion between OPEN and RESOLVED.
Broadcasts · Discussions · Tasks
Webhooks
2026-09-11
  • Added task.task_created, task.task_updated, task.task_status_transitioned, and task.task_deleted. A status change fires both task.task_updated and task.task_status_transitioned.
  • A task raised by Plain’s AI agent for a knowledge gap has a sourceLinks entry with sourceType: "knowledge_gap".
Webhook versions · JSON schema
Webhooks
2026-09-06
  • Added discussion.tool_call_approval_requested and discussion.tool_call_approval_resolved for agent tool-call approval changes.
  • Added agentStatus to discussions in discussion.message_created.
Webhook versions · JSON schema
API
GraphQL schema
  • Added createBroadcast, updateBroadcast, deleteBroadcast, and scheduleBroadcast mutations, plus broadcast, broadcasts, and searchBroadcasts queries, so you can manage broadcasts programmatically.
Guides
  • The Broadcasts guide now documents using the API, including the permissions your API key needs to create, update, and send broadcasts.
Broadcasts · Authentication
Webhooks
2026-09-02
Added workspaceFiles to messages in discussion.message_created.Webhook versions · JSON schema
Webhooks
2026-08-31
Added discussion.discussion_created, sent when a discussion is started on a thread. Existing event payloads did not change.Webhook versions · JSON schema
Webhooks
2026-08-25
Added thread.thread_locked, sent when a thread is locked. Existing event payloads did not change.Webhook versions · JSON schema
APIWebhooks
2026-08-19
Discussion status is now OPEN or RESOLVED. Agent activity moved to agentStatus (UNKNOWN, IDLE, and related values). If you filter or switch on the old discussion status values (IDLE, IN_PROGRESS, APPROVAL_REQUESTED), update those clients.Added the discussion.message_created webhook event, sent when a message is posted in a discussion. Existing event payloads did not change.Discussions · Webhook versions · JSON schema
API
Added isCustomAgent on MachineUser. true when the machine user is an agent the workspace built itself, rather than an ordinary API integration.Machine users
Webhooks
2026-07-14
  • Added thread.note_mention_created when a note mentions a machine user (for example an agent). Payload includes thread, note, and mentions (an array of machineUser).
  • Added attio and email_domain to tenant.source on thread.tenant_updated.
Webhook versions · JSON schema
API
Added createTenant. It fails if a tenant already exists with the given externalId. Use upsertTenant when you want create-or-update. Requires tenant:create.
Webhooks
2026-07-07
Added attio and email_domain to tenant.source on thread.tenant_updated.Webhook versions · JSON schema
API
  • Added threadsByExternalId to list every thread with a given externalId, across customers. threadByExternalId still returns a single thread for one customer.
  • Added knowledgeSourceCitationsByThread for the knowledge sources cited by AI replies on a thread.
Fetch threads · Searching knowledge
API
Added updateThreadExternalId. Pass externalId: null to clear it. Requires thread:edit.Updating threads
Webhooks
2026-06-15
  • Added WAITING_INDEFINITELY to statusDetail.type on thread (snoozed with no duration). The same value is available on the thread type in the API.
  • componentUser.user may be a machineUser as well as a user when a UI component references a machine user.
Webhook versions · JSON schema
API
Added importThread and importThreadMessages for backfilling historical threads without firing SLAs or autoresponders. Each externalId is idempotent (NOOP on replay). Requires thread:import.Importing threads
Webhooks
2026-05-06
Added dateTime and user UI component types to custom timeline entries.Webhook versions · JSON schema
API
Added a paginated discussions query with filters for user and discussion type.Fetch discussions
Webhooks
2026-04-21
  • Added thread.thread_tenant_updated, sent when a thread’s tenant changes.
  • Added reactionChange on thread.slack_message_updated.
Webhook versions · JSON schema
API
Added webhookDeliveryAttempts so you can inspect delivery attempts, including response status and body, without leaving the API.Delivery attempts
API
Added createDiscussion, sendDiscussionMessage, and the single discussion query, so you can open a side-conversation on a thread and post into it programmatically.Create a discussion · Send a message
API
Added importCustomers, importTenants, and importTenantFieldSchemas for bulk backfills from another system. Each is idempotent on externalId and returns added, updated, and skipped counts.
Webhooks
2026-03-13
Added the workflowButton UI component type to custom timeline entries.Webhook versions · JSON schema
Webhooks
2026-02-27
Added changeType on thread.slack_message_updated.Webhook versions · JSON schema
Webhooks
2026-02-13
  • Added dateValue on threadField.
  • Added DATE and CURRENCY to threadField.type.
Webhook versions · JSON schema
APIWebhooks
2026-02-11
Added updateNote for editing an existing note on a thread.Added numberValue on threadField and NUMBER to threadField.type.Notes · Webhook versions · JSON schema
API
Added lockThread to freeze a thread so non-admin users cannot reply or make changes.
API
Added updateThreadAgentStatus to set a thread’s AI agent status to IN_PROGRESS, HANDED_OFF, or HANDLED.Building agents
API
Tasks are now available over the API: createTask, updateTask, deleteTask, plus task, taskByRef, and a filterable tasks query.Tasks
API
Added labelTypeByExternalId, so you can look up a label type by the ID it has in your own system.Label types
API
Added deleteThread for permanently deleting a thread.Deleting threads
API
Added searchKnowledgeSources to search the knowledge your agents draw on.Searching knowledge
API
Added upsertTenantField, deleteTenantField, and deleteTenantFieldSchema, completing tenant field management over the API.Tenant fields
API
Added the tenantFieldSchemas query and upsertTenantFieldSchema mutation, including field visibility.Tenant fields
API
Added deleteTenant. Deleting a tenant unlinks it from all customers and removes its fields.Deleting tenants
API
Added the knowledgeSources query and deleteKnowledgeSource mutation.Searching knowledge
Webhooks
2025-08-06
  • Added additionalAssignees on thread.
  • Added externalId and isExcludedFromAi on labelType.
Webhook versions · JSON schema