# Set up an agent Source: https://www.plain.com/docs/agents Create a machine user for your agent, give it an API key, and start receiving events from Plain. To build an agent in Plain, at a high level you have to: Go to **Settings → Machine users & API Keys** and click **Add machine user**. Set the type to "Custom agent" for any agent you build. Leave the default type for integrations that only call the API. * Name is only visible to your team, for example "Billing agent" * Public name is what customers see when the agent replies, for example "Acme Support" * The avatar is shown to you internally and, if your agent interacts with customers, publicly as well. Create one machine user per agent. Click **Add API key** and grant the permissions the agent needs. Each page in this section lists the permissions for its calls. A mutation without the right permission returns an error that names the missing one. Plain shows the key once, so you should copy it when it is created. A machine user can hold more than one key, so you can rotate without downtime. [Read more on GraphQL authentication](/docs/graphql/authentication) Go to **Settings → Webhooks** and click **Add webhook target**. Point it at an HTTPS endpoint you control and subscribe to the events you need. You can update these later as you build your agent. [Read more on working with webhooks](/docs/webhooks). ## Building your agent With the above basic steps, you can now build your agent. Agents can do anything in Plain. You should pick where you want to start based on the use case for your agent. Make your agent available to your team directly within Plain to chat and assist them. Let your agent handle threads autonomously end to end. # Interacting in discussions Source: https://www.plain.com/docs/agents/discussions Let users talk to your agent in Ask Sidekick, receive their messages as webhooks, and reply through the API. Triage agent A discussion is where users talk to your agent inside Plain. Any user can click **Ask Sidekick** from any page, pick your agent, and send a message. Plain sends you a webhook, and your agent replies through the API. Discussions are completely internal and not visible to your customers. A discussion can be attached to a thread or be standalone. When a user starts a discussion from a thread, the webhook payload will include `discussion.threadId` to tell you which thread the discussion is linked to. Discussions can also be started from a [workflow](/docs/product/agents/sidekick/in-workflows). In the workflow builder you can pick your agent as well. ## High-level flow 1. A user starts a discussion with your agent. 2. Plain sends [`discussion.message_created`](/docs/webhooks/discussion-message-created) to your webhook target. 3. Your agent sets the discussion status to `IN_PROGRESS`, does its work, posts a reply, and sets `IDLE`. 4. Your agent can then log its tool calls as well as ask for a user's approval. See [tool calls](/docs/agents/tool-calls) for more info. ## Permissions For working with discussions, your machine user's API key must have the following permissions: * `threadDiscussion:read` and `threadDiscussion:edit` to read discussions, report status, request approvals, resolve or reopen discussions * `threadDiscussionMessage:create` and `threadDiscussionMessage:edit` to post messages to the discussion * `thread:read` and `customer:read` if the agent needs to read the linked thread ## Webhooks Subscribe your [webhook target](/docs/webhooks) to these events: | Event | When | Needed | | --------------------------------------------------------------------------------------------------- | -------------------------------------- | ---------------------------------------------- | | [`discussion.message_created`](/docs/webhooks/discussion-message-created) | A message was posted in any discussion | Always | | [`discussion.tool_call_approval_resolved`](/docs/webhooks/discussion-tool-call-approval-resolved) | A user approved or denied a tool call | If you ask for approvals | | [`discussion.turn_stop_requested`](/docs/webhooks/discussion-turn-stop-requested) | A user asked your agent to stop | If you can stop mid-turn | | [`discussion.discussion_created`](/docs/webhooks/discussion-created) | A discussion was started | Optional. The first message is enough to start | | [`discussion.tool_call_approval_requested`](/docs/webhooks/discussion-tool-call-approval-requested) | Echo of an approval you requested | Optional | ## Decide whether to answer `discussion.message_created` fires for every discussion in the workspace, including your own replies. Answer only when all of these are true: | Condition | Why | | ------------------------------------------ | -------------------------------------------------------------------- | | `discussion.type` is `AGENT_SESSION` | Other types are Slack and email discussions between people. | | `discussion.agent.id` is your machine user | Otherwise it is Sidekick or another agent. | | `message.type` is `OUTBOUND` | A user's message is `OUTBOUND`. Your replies come back as `INBOUND`. | | `discussion.status` is not `RESOLVED` | Otherwise the discussion is over. | Load your machine user once at startup and deduplicate on `message.id`: ```ts theme={null} import { PlainClient } from "@team-plain/graphql"; const plain = new PlainClient({ apiKey: process.env.PLAIN_API_KEY! }); const me = await plain.query.myMachineUser(); function shouldAnswer(payload: DiscussionMessageCreatedPublicEventPayload) { return ( payload.discussion.type === "AGENT_SESSION" && payload.discussion.agent?.id === me.id && payload.message.type === "OUTBOUND" && payload.discussion.status !== "RESOLVED" ); } ``` In the webhook payload, `message.markdown` is what the user wrote. `message.workspaceFiles` lists any files they attached. You must respond with a status code of `200` before your agent starts work so that Plain doesn't retry the webhook delivery. ## Replying You can use the `sendDiscussionMessage` mutation to reply to the discussion using markdown. This also marks the discussion as having unread messages within the Plain app. ## Updating the discussion status Set the discussion's agent status to `IN_PROGRESS` when a turn starts and `IDLE` when it ends. If the turn fails, post the error as a message first, then set `IDLE`. Asking for a tool call approval will automatically update the discussion status to `TOOL_CALL_APPROVAL_PENDING`. When a discussion is pending a tool call approval, you cannot change its status manually. ## Stop when asked A user can stop your agent mid-turn. Plain sends [`discussion.turn_stop_requested`](/docs/webhooks/discussion-turn-stop-requested) with the `discussion` to stop. Cancel the model call, post what you have if useful, and set the discussion status to `IDLE`. The discussion stays open for the next message. ## Resolve the discussion You can use `changeThreadDiscussionStatus` to resolve a discussion when the user needs nothing further, or set the status to `OPEN` to reopen it. ## Replying to customers on behalf of the user A user in a discussion can ask your agent to message the customer. The agent can do this by calling the [`replyToThread`](/docs/graphql/messaging/reply-to-thread) mutation. By default the reply is from the machine user. To send it as the user who asked, add them to the API key's **impersonation allow list** and pass `impersonation.asUser`. See [reply as a user](/docs/graphql/messaging/reply-to-thread#reply-as-a-user). The allow list belongs to the API key, not the machine user. Open the API key from the machine user's page and, under **Impersonation**, add who it may reply as: * individual team members * everyone holding a built-in role: Owner, Admin, or Support * everyone holding a custom role # Example agents Source: https://www.plain.com/docs/agents/examples Working agents built on the Plain API that you can run locally and copy from. Two working agents, one repository each. Both answer users in [discussions](/docs/agents/discussions), receive webhooks on a local endpoint, and gate the one action a customer would see behind an [approval](/docs/agents/tool-calls#ask-for-approval). They differ in how much of the agent loop they hand to a framework. | Agent | Built with | What it shows | | ---------------------------------------------------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------- | | [`example-eve-assistant-agent`](https://github.com/team-plain/example-eve-assistant-agent) | [Vercel eve](https://github.com/vercel/eve) | Durable sessions, one per discussion, with a ready-made harness | | [`example-aisdk-assistant-agent`](https://github.com/team-plain/example-aisdk-assistant-agent) | [Vercel AI SDK](https://ai-sdk.dev) | Owning the model loop yourself, with no framework in between | ## The tools Both agents give the model the same 5 tools, each a call on Plain's API: * **`list_thread_queue`** and **`search_threads`**: find a thread when the discussion wasn't opened on one * **`read_customer_thread`**: paginates `timelineEntries` and concatenates `llmText`, as in [read the thread](/docs/agents/threads#read-the-thread) * **`search_knowledge`**: calls `searchKnowledgeSources`, as in [using knowledge](/docs/agents/searching-knowledge) * **`reply_to_customer`**: reports the tool call, asks for approval, waits for the decision, then calls `replyToThread` ## Running one Each repository stands alone, with its own lockfile, its own CI, and a README that walks through the setup: a machine user with the Custom agent type, the permissions to grant, a public URL for the webhook target, and the events to subscribe to. From there, open a thread in Plain, click **Ask Sidekick**, pick your agent, and ask it to help. # Working with notes Source: https://www.plain.com/docs/agents/notes Get a webhook when a user mentions your agent in a note on a thread, and reply with a note of your own. Triage agent Notes are internal comments on a thread. A user can mention your agent in a note to hand it a question about that thread, and your agent can answer with a note. Notes are never shown to the customer. To work with notes, your machine user's API key needs `note:create` permissions as well as `thread:read` and `customer:read` to read the thread. ## Get notified when you're mentioned Subscribe your [webhook target](/docs/webhooks) to [`thread.note_mention_created`](/docs/webhooks/thread-note-mention-created). It fires when a note mentions a machine user, including when a user edits a note to add the mention. The payload has the `thread`, the `note`, and `mentions`, the list of machine users mentioned. Check that your agent is among them: ```ts theme={null} if (event.payload.eventType === "thread.note_mention_created") { const mentioned = event.payload.mentions.some( (machineUser) => machineUser.id === process.env.AGENT_MACHINE_USER_ID, ); if (!mentioned) return; await runAgent(event.payload.thread, event.payload.note); } ``` `note.markdown` holds what the user wrote. Mentions appear in it as tokens: `<@mu_…>` for a machine user and `<@u_…>` for a user. Only machine users are listed in `mentions`; strip or resolve the tokens before you pass the text to a model. To see every note on a thread, not only the ones that mention you, subscribe to [`thread.note_created`](/docs/webhooks/thread-note-created) as well. It fires for your own notes too, so skip notes where `note.createdBy.actorType` is `machineUser` and `machineUserId` is yours. ## Reply with a note The `createNote` mutation adds a note to the thread under the machine user's name. Send `text` as the plain version and `markdown` for formatting. To mention the user who asked, put their `<@u_…>` token in `markdown`; Plain renders it as a mention and notifies them. ```ts theme={null} const author = event.payload.note.createdBy; const mention = author.actorType === "user" ? `<@${author.userId}> ` : ""; const result = await plain.mutation.createNote({ input: { customerId: event.payload.thread.customer.id, threadId: event.payload.thread.id, text: "The invoice failed because the card was declined on 3 September.", markdown: `${mention}The invoice failed because the card was **declined** on 3 September.`, }, }); if (result.error) throw new Error(result.error.message); ``` Notes have a maximum length of 10k characters. See [notes](/docs/graphql/notes) for updating and deleting. Notes also work without a mention. An agent that triages threads can leave what it found as a note, and an agent that [hands off](/docs/agents/threads#hand-off) can use notes to say why it's handing off. # Using knowledge Source: https://www.plain.com/docs/agents/searching-knowledge Search Help Center articles and indexed documents from your agent and put the results in its prompt. Within Plain, you can add [knowledge sources](/docs/product/agents/knowledge-sources) such as your documentation or marketing website. Your agent can then search through your knowledge sources by using the `searchKnowledgeSources` query. There are 2 kinds of knowledge sources in Plain: * Help Center articles published in [Plain's Help Center](/docs/product/help-center) * Indexed documents you have added as knowledge sources, such as your docs site or your marketing website. The API needs the `knowledgeSource:read` permission to be able to do this. ## Example query ```ts theme={null} const results = await plain.query.searchKnowledgeSources({ searchQuery: "how do I reset my password?", pageSize: 5, }); for (const result of results) { console.log(result.content); if (result.__typename === "HelpCenterArticleSearchResult") { const article = await result.helpCenterArticle; console.log(article.title); } else if (result.__typename === "IndexedDocumentSearchResult") { const doc = await result.indexedDocument; console.log(doc.url); } } ``` The return type is a union. Narrow it with `__typename`. See [union types](/docs/graphql/sdk#union-types). The page size (`pageSize`) defaults to 10 and accepts 1–50. `searchQuery` is 1–1000 characters. Keep the article title or document URL if you want the agent to cite its sources. ## Options Include "`INDEXED_DOCUMENT`" if you want to include external knowledge sources added to Plain. Include "`HELP_CENTER_ARTICLE`" if you want to include Plain-hosted Help Center articles. A list of label type IDs. When provided, knowledge sources will be filtered to only include knowledge sources with these labels. `labelTypeIds` without `types` searches indexed documents only. Labels don't apply to Help Center articles. Whether to include Help Centers that are not public. # Suggesting replies Source: https://www.plain.com/docs/agents/suggested-replies Draft a reply on a thread for a user to review, edit, and send, instead of replying to the customer directly. You can suggest a reply for a user to review on a thread. The user sees it in the composer, edits it if needed, and sends it. The customer sees nothing until then. Use suggested replies when a human needs to check a message before it goes out, or while you build trust in a new agent before letting it [reply on its own](/docs/agents/threads#reply). The API key needs `generatedReply:create`, plus `thread:read` if the agent reads the thread first. See [suggested replies](/docs/graphql/messaging/suggested-replies) for the full API reference. ## Multiple suggestions A thread can have multiple suggested messages. Your suggestions will take precedence over suggestions from Plain. # Working on threads Source: https://www.plain.com/docs/agents/threads Listen for thread events, check whether your agent is assigned, and read, reply to, and hand off threads through the API. Triage agent An agent working on threads subscribes to the events it cares about, decides whether to act, and uses the thread APIs to reply, update the thread, or hand it to a user. The customer sees the agent's public name and avatar. ## Permissions Depending on what your agent does, you will need different permissions. Basic permissions most agents need are: * `thread:read` and `customer:read` * `thread:reply` to reply to threads * `thread:edit` to update the thread's status * `thread:assign` and `thread:unassign` for handoffs * `note:create` if it leaves [notes](/docs/agents/notes) ## Choose your events Subscribe your [webhook target](/docs/webhooks) to the events that should wake the agent: | Event | When | | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | | [`thread.thread_assignment_transitioned`](/docs/webhooks/thread-assignment-transitioned) | The thread was assigned or unassigned | | [`thread.email_received`](/docs/webhooks/thread-email-received) | An email was sent by the customer | | [`thread.chat_received`](/docs/webhooks/thread-chat-received) | A chat message was sent by the customer | | [`thread.slack_message_received`](/docs/webhooks/thread-slack-message-received) | A Slack message was sent by the customer | | [`thread.thread_created`](/docs/webhooks/thread-created) | A new thread, before anyone is assigned | | [`thread.thread_status_transitioned`](/docs/webhooks/thread-status-transitioned) | The thread moved between todo, snoozed, and done | | [`thread.thread_labels_changed`](/docs/webhooks/thread-labels-changed) | Labels were changed | | [`thread.thread_priority_changed`](/docs/webhooks/thread-priority-changed) | Priority was changed | | [`thread.note_mention_created`](/docs/webhooks/thread-note-mention-created) | A user mentioned the agent in a note. See [notes](/docs/agents/notes) | Two things to handle in every listener: * Your own actions come back as events. Skip messages whose author is your machine user. * The first email on a thread fires both `thread.thread_created` and `thread.email_received`. Check `isStartOfThread` on the email if you want to handle it once. ## Assignment Most agents act only on threads assigned to them. That keeps the decision of which threads the agent handles in Plain, where the team can see and change it. Assign in the UI, or with a [workflow](/docs/product/workflows) based on the thread's channel, labels, tier, or support hours. You can also assign threads programmatically: ```ts theme={null} await plain.mutation.assignThread({ input: { threadId: thread.id, machineUserId: process.env.AGENT_MACHINE_USER_ID, }, }); ``` Assignment arrives as `thread.thread_assignment_transitioned`, with `previousThread` alongside `thread`. Every thread event also carries `thread.assignee`, so check it on message events too: ```ts theme={null} function isAssignedToMe(thread: { assignee?: { id: string } | null }): boolean { return thread.assignee?.id === process.env.AGENT_MACHINE_USER_ID; // Find your machine user id on its settings page } switch (event.payload.eventType) { case "thread.thread_assignment_transitioned": case "thread.email_received": if (!isAssignedToMe(event.payload.thread)) return; await runAgent(event.payload.thread); break; } ``` To hand off a thread, unassign the machine user or assign a different user. For an agent that never replies, such as a classifier or a note-writer, you can skip assignment and filter in the handler instead. For example, act on `thread.thread_created` only when `thread.tier?.name` is `Premium`. ## Reading the thread ```ts theme={null} const thread = await plain.query.thread({ threadId: "th_01H8H46YPB2S4MAJM382FG9423", }); ``` As with all of our GraphQL queries, you can selectively expand your query to include details you need such as `customer`, `assignee`, and `labels`. See the [GraphQL SDK](/docs/graphql/sdk). Every timeline entry has `llmText`, Plain's rendering of that entry for a language model. Concatenate them for a prompt-ready thread: ```ts theme={null} async function getThreadAsLlmText(threadId: string): Promise { const thread = await plain.query.thread({ threadId }); const parts: string[] = []; let page = await thread.timelineEntries({ first: 50 }); while (true) { for (const entry of page.nodes) { if (entry.llmText) parts.push(entry.llmText); } const next = await page.fetchNext(); if (!next) break; page = next; } return parts.join("\n\n"); } ``` The `llmText` field is `null` for entries with no user or customer messages and can be skipped. You can also read `thread.customer`, [thread fields](/docs/graphql/threads/thread-fields), and the message directly from the webhook payload. ## Replying The `replyToThread` mutation automatically replies on the right channel (Chat, Email, Slack, MS Teams, etc.) based on the messages in the thread. ```ts theme={null} const result = await plain.mutation.replyToThread({ input: { threadId: thread.id, textContent: "Thanks for reaching out, let me look into this.", markdownContent: "Thanks for reaching out, let me look into this.", }, }); if (result.error) { console.error(result.error.message); } ``` `markdownContent` is rendered in Plain, chat, and modern email. See [reply to thread](/docs/graphql/messaging/reply-to-thread). `textContent` is the fallback for channels that don't support markdown and multi-part emails. If you'd rather suggest a message for a user, you can use the [suggest a reply mutation](/docs/agents/suggested-replies) instead. ## Updating the agent status A thread's agent status tells the team what the agent is doing with a thread, and tells Plain which threads to count in response time metrics. | Status | When | | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `IN_PROGRESS` | The agent is working the thread. | | `HANDLED` | The agent resolved it. Also [mark it as done](/docs/graphql/threads/status-changes#mark-thread-as-done). | | `HANDED_OFF` | A user is needed. Also [unassign](/docs/graphql/threads/assignment#unassigning-threads), and optionally [mark as todo](/docs/graphql/threads/status-changes#mark-thread-as-todo). | ```ts theme={null} await plain.mutation.updateThreadAgentStatus({ input: { threadId: thread.id, agentStatus: "IN_PROGRESS", }, }); ``` If a user replies on a thread marked `HANDLED` or `IN_PROGRESS`, Plain sets `HANDED_OFF` itself. First Response, Next Response, and Investigating metrics only count `HANDED_OFF` threads. ## Hand off When the agent can't help, hand the thread to a person in this order: 1. Leave a [note](/docs/agents/notes) saying what it tried and why it stopped. 2. Set agent status to `HANDED_OFF`. 3. Unassign the thread, or assign it to a user with `assignThread` and a `userId`. 4. Mark the thread as todo so it shows up in the queue. ```ts theme={null} await plain.mutation.unassignThread({ input: { threadId: thread.id }, }); await plain.mutation.markThreadAsTodo({ input: { threadId: thread.id }, }); ``` ## Other mutations | Action | Mutation | Permission | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | | Done or todo | [`markThreadAsDone`](/docs/graphql/threads/status-changes), [`markThreadAsTodo`](/docs/graphql/threads/status-changes) | `thread:edit` | | Labels | [`addLabels`](/docs/graphql/labels/add), `removeLabels` (takes label IDs, not label type IDs) | `label:create`, `label:delete` | | Thread field | [`upsertThreadField`](/docs/graphql/threads/thread-fields) | `threadField:create`, `threadField:update` | | New outbound email | [`sendNewEmail`](/docs/graphql/messaging/send-email) | `email:create` | | Reply to a specific email | [`replyToEmail`](/docs/graphql/messaging/reply-email) | `email:create` | | Customer event | [`createCustomerEvent`](/docs/graphql/events/create-customer-event) | `customerEvent:create` | | Thread event | [`createThreadEvent`](/docs/graphql/events/create-thread-event) | `threadEvent:create` | Try any of them in the [API explorer](https://app.plain.com/developer/api-explorer/). # Tool calls Source: https://www.plain.com/docs/agents/tool-calls Show users which tools your agent ran, and in discussions, wait for approval before running one. Plain shows your agent's tool calls differently depending on where it is working. In a discussion, tool calls are interactive: you report each call, the user watches it run, and you can pause a call until the user approves it. On a thread, you record tool calls as [thread events](/docs/graphql/events/create-thread-event) on the timeline. Those are a log for the team, not something a user can act on. ## In discussions Your machine user's API key needs to have the `threadDiscussion:read` and `threadDiscussion:edit` permissions. ### Report a tool call Call `upsertDiscussionToolCall` with a `toolCallId` you define. The initial tool call should be in a status of `PENDING`. When your tool call completes, update the status to `SUCCESS` or `ERROR` depending on the outcome. Plain shows the call in the discussion with its duration. * `toolCallId`: yours, unique within the discussion, 1–256 characters of `[A-Za-z0-9_-]` * `text`: required on every write, max 2000 characters. This is what the user reads. * `error`: required on `ERROR`, max 4000 characters * `SUCCESS` and `ERROR` are final. A later write returns `result: NOOP`. ### Asking for approval For a call that needs a user's decision, you can call the `requestDiscussionToolCallApproval` mutation. Plain shows a card with `text` as the heading, `justification` underneath, and **Approve** and **Deny** buttons. The discussion's `agentStatus` will automatically be set to `TOOL_CALL_APPROVAL_PENDING`. When requesting approval, the tool call must be in a status of `PENDING`. Asking again for the same id returns the same approval. Several approvals can be open on one discussion at once. Plain sends [`discussion.tool_call_approval_requested`](/docs/webhooks/discussion-tool-call-approval-requested) as an echo, then [`discussion.tool_call_approval_resolved`](/docs/webhooks/discussion-tool-call-approval-resolved) when the user makes a decision: * **`APPROVED`**: means your tool call was approved and you can run the tool. * **`DENIED`**: means the user rejected your tool call. Your tool will have already been updated to a status of `FAILED` and will include the user's `reviewerNote` if provided. This is a human-provided message as to why the tool call was rejected. * If your agent stops waiting, report `ERROR` so the call doesn't stay open. ## On threads On a thread there is no approval flow. You can record what the agent did by using [thread events](/docs/graphql/events/create-thread-event) so you can see it on a thread's timeline. The API key needs `threadEvent:create`. ```ts theme={null} const result = await plain.mutation.createThreadEvent({ input: { threadId: thread.id, title: "Searched knowledge", components: [ { componentText: { text: "Query: `refund policy`. 3 results, top match: **Refunds and cancellations**.", }, }, ], isCollapsed: true, }, }); if (result.error) throw new Error(result.error.message); ``` `title` is the line users see on the timeline. `components` hold the detail, built from [UI components](/docs/ui-components). Set `isCollapsed` to `true` so a run with many calls doesn't crowd out the conversation. Pass an `externalId` if you want Plain to reject a duplicate tool call thread event. If a tool on a thread needs a user's decision, ask for it somewhere a user can answer: post a [note](/docs/agents/notes) that mentions them, or [hand the thread off](/docs/agents/threads#hand-off). # API and webhook updates Source: https://www.plain.com/docs/changelog Updates to Plain's API, and new webhook schema versions. **SLA policies** * Added `serviceLevelAgreementPolicies` and `serviceLevelAgreementPolicy` to list the SLA policies in a workspace or fetch one by ID. Both need the `serviceLevelAgreement:read` permission. * Added `createServiceLevelAgreementPolicy`, `updateServiceLevelAgreementPolicy`, and `deleteServiceLevelAgreementPolicy`. A policy holds at most one target per `ServiceLevelAgreementType`, and each target sets `minutes`, `warnBefore`, and optional `businessHoursScheduleIds`. * Added `updateThreadServiceLevelAgreementPolicy` to apply a policy to a thread. Pass `serviceLevelAgreementPolicyId: null` to remove it. Needs the `thread:edit` permission. * `Thread` exposes `serviceLevelAgreementPolicy`. `ThreadsFilter` and saved view filters accept `serviceLevelAgreementPolicyIds`. **SLAs** * Added `FirstResolutionTimeServiceLevelAgreement` and `TotalResolutionTimeServiceLevelAgreement`. First resolution time is met when the thread is first marked Done. Total resolution time keeps counting after the thread is reopened. * `createServiceLevelAgreement` accepts exactly one of `firstResponseTimeMinutes`, `nextResponseTimeMinutes`, `firstResolutionTimeMinutes`, or `totalResolutionTimeMinutes`. `pauseOnStatusDetailTypes` sets which thread status details pause a resolution-time clock. It defaults to waiting for the customer. Pass an empty list to keep the clock running. * `updateServiceLevelAgreement` accepts the matching minute inputs and `pauseOnStatusDetailTypes`. * `ServiceLevelAgreementType` includes `FIRST_RESOLUTION_TIME` and `TOTAL_RESOLUTION_TIME`. * `ServiceLevelAgreementStatusSummary` exposes `firstResolutionTime` and `totalResolutionTime`. * `ServiceLevelAgreementStatusDetailPending` and `ServiceLevelAgreementStatusDetailImminentBreach` expose `pausedAt` and `remainingMinutesAtPause` when a resolution-time clock is paused. **Slack** * `createThreadFromSlackMessage` accepts `title`, `description`, `labelTypeIds`, `tenantIdentifier`, `priority`, `externalId`, and `threadFields`. They apply only when a new thread is created. An already-ingested message ignores them. * `changeThreadPriority` accepts `onlyIfDefault`. When true, the mutation changes priority only if it is still Normal and has not been set since thread creation. Otherwise it returns the unchanged thread. **Workflows** * WAIT steps accept `businessHoursScheduleIds`. When set, `duration` counts only while one of the selected schedules is open. **Webhook targets** * `createWebhookTarget` and `updateWebhookTarget` accept `headers`. `WebhookTarget.headers` returns the configured names. Values are never returned. **Broadcasts** * `broadcasts` and related connections expose `totalCount`. **Billing** * `sidekickCreditUsageByDay` and `sessionCount` include work done by the workspace's agents, not only Sidekick sessions. Requires `billing:read`. * `BillingTopupCreditBalance` exposes `lifetimeGranted` and `lifetimeUsed` for top-up credits. **Email** * Added `isPlainManagedDomain` on `WorkspaceEmailDomainSettings`, so you can tell whether Plain manages the domain. * Added `isFromPlainManagedDomain` on `Thread`, which is true when any of the thread's support email addresses is on a Plain-managed domain. [SLA policies](/docs/product/platform/slas) · [SLA policies API](/docs/graphql/sla-policies) · [Tier SLAs](/docs/product/platform/slas/tier-slas) · [Service level agreements](/docs/graphql/tiers/service-level-agreements) · [Create a thread from a Slack message](/docs/product/channels/create-from-slack) **Business hours schedules** * Added `businessHoursSchedule` and `businessHoursSchedules`, which read the [named schedules](/docs/product/platform/business-hours) 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](/docs/product/platform/slas) 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 removed** Update 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. **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](/docs/product/channels/slack-ingestion-modes#api-only), 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](/docs/product/channels/create-from-slack) · [Ingestion modes](/docs/product/channels/slack-ingestion-modes) · [AI feedback](/docs/graphql/ai-feedback) **Broadcasts** * Added `broadcastAudience`, `broadcastAudiences`, `createBroadcastAudience`, `updateBroadcastAudience`, and `deleteBroadcastAudience`, so you can save and reuse [broadcast audiences](/docs/product/broadcasts/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](/docs/product/broadcasts#using-the-api) · [Broadcast audiences](/docs/product/broadcasts/audiences) **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`](/docs/webhooks/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](/docs/graphql/messaging/reply-to-thread#reply-as-a-user) · [Machine users](/docs/agents/machine-users#reply-as-a-team-member) · [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-09-14.json) **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](/docs/graphql/discussions). **Changed and removed** Update 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](/docs/product/broadcasts#using-the-api) · [Discussions](/docs/graphql/discussions) · [Tasks](/docs/graphql/tasks) * 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](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-09-11.json) * 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](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-09-06.json) **GraphQL schema** * Added `createBroadcast`, `updateBroadcast`, `deleteBroadcast`, and `scheduleBroadcast` mutations, plus `broadcast`, `broadcasts`, and `searchBroadcasts` queries, so you can manage [broadcasts](/docs/product/broadcasts) programmatically. **Guides** * The Broadcasts guide now documents [using the API](/docs/product/broadcasts#using-the-api), including the permissions your [API key](/docs/graphql/authentication) needs to create, update, and send broadcasts. [Broadcasts](/docs/product/broadcasts#using-the-api) · [Authentication](/docs/graphql/authentication) Added `workspaceFiles` to messages in `discussion.message_created`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-09-02.json) Added `discussion.discussion_created`, sent when a [discussion](/docs/graphql/discussions) is started on a thread. Existing event payloads did not change. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-08-31.json) Added `thread.thread_locked`, sent when a thread is [locked](/docs/product/platform/threads/locking-threads). Existing event payloads did not change. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-08-25.json) 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](/docs/graphql/discussions) · [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-08-19.json) Added `isCustomAgent` on `MachineUser`. `true` when the machine user is an agent the workspace built itself, rather than an ordinary API integration. [Machine users](/docs/agents/machine-users) * Added `thread.note_mention_created` when a note mentions a machine user (for example an [agent](/docs/agents)). Payload includes `thread`, `note`, and `mentions` (an array of `machineUser`). * Added `attio` and `email_domain` to `tenant.source` on `thread.tenant_updated`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-07-14.json) Added `createTenant`. It fails if a tenant already exists with the given `externalId`. Use [`upsertTenant`](/docs/graphql/tenants/upsert) when you want create-or-update. Requires `tenant:create`. Added `attio` and `email_domain` to `tenant.source` on `thread.tenant_updated`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-07-07.json) * 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](/docs/graphql/threads/get) · [Searching knowledge](/docs/agents/searching-knowledge) Added `updateThreadExternalId`. Pass `externalId: null` to clear it. Requires `thread:edit`. [Updating threads](/docs/graphql/threads/update) * 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](/docs/ui-components) references a machine user. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-06-15.json) 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](/docs/graphql/threads/import) Added `dateTime` and `user` [UI component](/docs/ui-components) types to custom timeline entries. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-05-06.json) Added a paginated `discussions` query with filters for user and discussion type. [Fetch discussions](/docs/graphql/discussions/get) * Added `thread.thread_tenant_updated`, sent when a thread's tenant changes. * Added `reactionChange` on `thread.slack_message_updated`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-04-21.json) Added `webhookDeliveryAttempts` so you can inspect delivery attempts, including response status and body, without leaving the API. [Delivery attempts](/docs/graphql/webhook-targets/delivery-attempts) 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](/docs/graphql/discussions/create) · [Send a message](/docs/graphql/discussions/send-message) Added `importCustomers`, `importTenants`, and `importTenantFieldSchemas` for bulk backfills from another system. Each is idempotent on `externalId` and returns added, updated, and skipped counts. Added the `workflowButton` [UI component](/docs/ui-components) type to custom timeline entries. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-03-13.json) Added `changeType` on `thread.slack_message_updated`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-02-27.json) * Added `dateValue` on `threadField`. * Added `DATE` and `CURRENCY` to `threadField.type`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-02-13.json) Added `updateNote` for editing an existing note on a thread. Added `numberValue` on `threadField` and `NUMBER` to `threadField.type`. [Notes](/docs/graphql/notes) · [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2026-02-11.json) Added `lockThread` to freeze a thread so non-admin users cannot reply or make changes. Added `updateThreadAgentStatus` to set a thread's AI agent status to `IN_PROGRESS`, `HANDED_OFF`, or `HANDLED`. [Building agents](/docs/agents) Tasks are now available over the API: `createTask`, `updateTask`, `deleteTask`, plus `task`, `taskByRef`, and a filterable `tasks` query. [Tasks](/docs/graphql/tasks) Added `labelTypeByExternalId`, so you can look up a label type by the ID it has in your own system. [Label types](/docs/graphql/labels/label-types) Added `deleteThread` for permanently deleting a thread. [Deleting threads](/docs/graphql/threads/delete) Added `searchKnowledgeSources` to search the knowledge your agents draw on. [Searching knowledge](/docs/agents/searching-knowledge) Added `upsertTenantField`, `deleteTenantField`, and `deleteTenantFieldSchema`, completing tenant field management over the API. [Tenant fields](/docs/graphql/tenants/tenant-fields) Added the `tenantFieldSchemas` query and `upsertTenantFieldSchema` mutation, including field visibility. [Tenant fields](/docs/graphql/tenants/tenant-fields) Added `deleteTenant`. Deleting a tenant unlinks it from all customers and removes its fields. [Deleting tenants](/docs/graphql/tenants/delete) Added the `knowledgeSources` query and `deleteKnowledgeSource` mutation. [Searching knowledge](/docs/agents/searching-knowledge) * Added `additionalAssignees` on `thread`. * Added `externalId` and `isExcludedFromAi` on `labelType`. [Webhook versions](/docs/webhooks/versions) · [JSON schema](https://core-api.uk.plain.com/webhooks/schema/2025-08-06.json) # Custom channels Source: https://www.plain.com/docs/custom-channels Bring messages from any channel Plain does not support yet into Plain as threads. Plains API first infrastructure means that you never need to wait for an official integration to bring all of your customer channels and communications into your Support platform. Custom channels in Plain Until we launch an official integration for a channel that you need. You can start bringing your customer messages in using custom middleware that accepts webhooks and makes POST requests. ## Creating customers For every message to reach Plain, your middleware needs to create a customer when none exists, and match the existing one when it does. Plains customer object requires an email address. * Find out what identifiers are passed from your custom channel message received events * Map relevant identifiers to Plain * [Upserting Customers](/docs/graphql/customers/upsert) * Make sure that the middleware tries to match existing customers first, and creates them as a fallback instead of by default. ## Sending messages 1. Messages created in Plain trigger a webhook 2. Your middleware accepts that webhook 3. Parse the required information out of it (message body, customerId, etc.) 4. Then make a request to send that message into your new channel of choice ## Receiving messages Accepting messages from your custom channel and writing them into Plain works the exact same way, but in reverse. * You'll need to accept messages from your custom channel, which is also done via webhooks (for example, with Whatsapp) * Then your middleware will need to parse that message and use the Plain GraphQL API to create a new thread or create a new message in an existing thread. * [Creating a new Thread](/docs/graphql/threads/create#graphql) * [Reply to existing Thread](/docs/graphql/messaging/reply-to-thread#graphql) ## Matching Plain message authors to your custom channel * In order to match up the author / person info from Plain → your new channel, we recommend querying Plain on startup of your middleware for all of your Plain workspace users and save out their `userId` and `name` and along with else you might need. * GraphQL `query users` * This is necessary because once you receive our webhook when a message in Plain has been created, [threads.chat\_sent](/docs/webhooks/thread-chat-sent), there will be a field like `payload.chat.createdBy.userId` containing the userId of whoever authored the message in Plain. You will then be able to look up that userId in the list of users you grabbed earlier to get their name / email / whatever in order to use them in your next step, creating the message payload you'll send to your custom channel's API to create the message there. ## Matching messages from your custom channel to Plain threads If your customers start conversations from your custom channel, you'll need to make sure that you're passing the custom channels customer identifier as a [Customer externalID](/docs/graphql/customers/upsert) when upserting the customer. Which will need to be done before creating the thread. This is the customer's identifier in the channel, like their WhatsApp userId. For example, if you identify customers in a channel like Whatsapp by their phone number. You would upsert the Customer with their phone number as their ExternalID, then create the thread in Plain passing in that external ID. ## Considerations * Custom channels will not look like 1st party channels and do not come with all the native features of first party channels like Email or Slack. * If you don't have a way of pairing a customer with their real email address on creation, you need to add a temporary email address. Such as: [channelidentifier@temp-yourcompany.com](mailto:channelidentifier@temp-yourcompany.com). If this is the case, use sendChat for replies instead of replyToThread. * Custom channel threads appear under the "API" channel in the "channel" selector across the app, and in filters (Custom views, Insights.etc). * You can't set custom icons. So if you built a Whatsapp integration you wouldn't be able to set a logo, or have a Whatsapp entry listed in any channel filtering and dropdowns. * Use a label to always tag your custom channel's threads when they're created by your Middleware. That way you can filter / sort / report on your custom channel threads via that Label. ## Examples: ### Discourse With Plain you can connect your Discourse community and automatically keep track of threads via Plain. This works by deploying a small node service which uses Plain and Discourse's APIs. You can either self-host this little node service or we can deploy this for you. [**Check out the example on Github →**](https://github.com/team-plain/example-discourse-integration) This integration can be customized depending on the structure of your Discourse community and ideal support workflow. For example you could customize the priority, labels and assignee of threads from Discourse based on their category, author and content. ### Hubspot This is now handled by the first-party [HubSpot integration](/docs/product/integrations/hubspot). It's provided here only as an architecture example This integration automatically creates Hubspot tickets when threads are created in Plain. 1. Receives `thread.thread_created` webhook from Plain 2. Fetches thread details to get tenant ID 3. Fetches tenant details to get HubSpot company ID (`externalId`) 4. Creates HubSpot ticket associated with the company 5. Automatically refreshes HubSpot token if expired [**Check out the example on Github →**](https://github.com/team-plain/hubspot-push-example) # Customer cards Source: https://www.plain.com/docs/customer-cards Live context straight from your own systems when helping customers. Customer cards show information from your own systems next to a customer or thread in Plain, so your team has the context it needs without leaving the queue. Customer cards are configured on Plain (see [how to create one](/docs/customer-cards/create-a-customer-card)) and requested by Plain from your APIs. ## High-level flow For a more detailed description of the protocol, check out the [full spec](/docs/customer-cards/protocol). 1. A thread is viewed in Plain. 2. Plain fires a POST request to your API with: * The thread customer's `email`, `id` and, if set, `externalId` * The thread's `id` and, if set, `externalId`. * If the thread has a tenant, the tenant `id` and, if set, `externalId`. * The configured customer card `key`s 3. Your API responds with the JSON for each card 4. Cards are shown to the user in Plain. Based on your customer card settings, Plain sends a request to your API like the below example: Your API should then reply with a list of cards matching the requested keys where each card contains the components you want to display: ## UI components To define what each customer card should look like, you use the Plain UI components. All the components are documented in the [Plain UI Components](/docs/ui-components/) section. You can find example customer cards and an example API you can check out [team-plain/example-customer-cards](https://github.com/team-plain/example-customer-cards). You can try these in your own workspace. ## Example cards To demonstrate what you can build with customer cards we've built some examples you can view and which are open source. [**Customer cards Examples →**](https://github.com/team-plain/example-customer-cards) ## Playground The UI components playground lets you build and preview the component JSON needed to create a customer card. Use this to prototype a customer card before starting to build your integration. [**Playground →**](https://app.plain.com/developer/ui-components-playground/) # Create a customer card Source: https://www.plain.com/docs/customer-cards/create-a-customer-card Define the details of the customer card. To create a customer card go to **Settings** → **Customer cards** and enter the following details: * **Title**: this will be displayed as the title of the card so even if the card fails to load users know which card is errored. * **Key**: the link between this config and your API. A key can only contain alphanumeric, hyphen, and underscore characters (regex: `[a-zA-Z0-9_-]+`) * **Default time to live (seconds)**: by default how long Plain should cache customer cards. The minimum is 15 seconds, maximum is 1 year in seconds (31536000 seconds). * **URL**: the URL of your API endpoint that will be built to return customer cards. It must start with `https://`. * **Headers (optional)**: the headers Plain should pass along when making the request. While this is optional it is **highly recommended** to add authorization headers or other tokens that authenticate the request as your API may be returning customer data. There are a few example customer cards you can configure and see how they look in your application. All example cards live in the open-source repository: [team-plain/example-customer-cards](https://github.com/team-plain/example-customer-cards) Here is one you can try right now: * Title: e.g. "Usage" * Key: `usage` * Default time to live: `120` * URL: [https://example-customer-cards.plain.com/](https://example-customer-cards.plain.com/) # Examples Source: https://www.plain.com/docs/customer-cards/examples # Playground Source: https://www.plain.com/docs/customer-cards/playground # Protocol Source: https://www.plain.com/docs/customer-cards/protocol Learn how we request customer cards from your API and how to respond to these requests. Plain requests customer cards from an HTTP endpoint you host. This page specifies the request Plain sends, the response it expects, and how caching and errors are handled. This page is intended for a technical audience that will be implementing a customer card API. Check out the [customer cards](/docs/customer-cards) page for an overview of customer cards. Customer cards are not proactively loaded. Plain pulls them on demand, when a user opens the customer or thread. This means that if your APIs are slow then users of the Support App will see a loading spinner over the card. The protocol is as follows: 1. When a user in Plain opens up a customer's page the cards are loaded. 2. Plain's backend figures out which cards can be returned from the cache and which cards need to be loaded. On the first load of the customer this would be all cards. 3. It calculates how many requests it needs to make (see [request deduplication](#request-deduplication) for details). 4. Your APIs are then called with the customer's details, so you can look up the customer's data in your systems (see [request](#request) section for details). 5. Your APIs then return customer cards that consist of [Plain UI components](/docs/ui-components) (see [response](#response) section for details). 6. The cards are cached based on either an explicit TTL value in the response or the TTL in the card settings (see [caching](#caching)). 7. Cards are shown to the user in Plain. 8. Users can manually reload the card at any time in which case only that one card will be requested from your API. A **few limits** to be aware of: * Your API must **respond within 15 seconds**, or it will time out. See [retry strategy](#retry-strategy) for details on how timed-out requests are retried. * You can configure a **maximum of 25 customer cards per workspace**. * **Card keys must be unique within a workspace**. A key can only contain **alphanumeric**, **hyphen**, and **underscore** characters (regex: `[a-zA-Z0-9_-]+`). ## Request Plain makes the following request to your backend: * **Method**: `POST` * **URL:** the URL you configured on customer cards settings page. * **Headers:** * All the headers you provided on customer cards settings page. This should include authentication headers. * `Content-Type`: `application/json` * `Accept`: `application/json` * `Plain-Workspace-Id`: the ID of the workspace the customer is in. This is useful for logging or request routing. * `User-Agent`: `Plain/1.0 (plain.com; help@plain.com)` * `Plain-Request-Signature`: `XXX` (see [request signing](/docs/request-signing) for details) * **Body:** * `cardKeys`: an array of card keys being requested * `customer`: an object with the customer's core details * `id`: the id of the customer in Plain * `email`: the email of the customer * [`externalId`](/docs/graphql/customers/upsert) (optional): string if the customer has an `externalId`, otherwise it is `null`. * `thread` (optional): an object with the thread's details, if this customer card is being requested in the context of a thread * `id`: the id of the thread in Plain * `externalId` (optional): string if the thread has an `externalId`, otherwise it is `null`. Example request body: ### Request deduplication If you configure multiple customer cards that have the same API details then Plain batches them and makes only one request. The request deduplication logic for customer card configs is: * The following config properties are ignored: Title, Card key, Default TTL * **API URL:** Leading and trailing whitespaces are trimmed and then compared. **This is case sensitive**. * For example, these URLs would be considered **different**: * `https://api.example.com/cards` * `https://api.example.com/cards/` * `https://api.example.com/Cards` * **API Headers:** Order of headers does not matter * **Header name:** Leading and trailing whitespaces are trimmed and then compared. **This is case insensitive**. * For example, these header names be considered **the same**: * `Authorization` * `AUTHORIZATION` * `   authorization   ` * **Header value:** No processing done, compared as is (be careful with any extra whitespace characters) * For example, these header values would be considered **as different**: * `Bearer my-token` * `bearer my-token` * `   bearer my-token   ` ## Response For each key requested a corresponding card **MUST** be returned in the response, otherwise an integration error will be returned for that card. Any extra cards in the response will be ignored. Your API must respond with a **`200` status code** or the response body won't be processed and will be treated as an error. The response body must be a JSON object with: * `cards`: an array of cards. Every `cardKey` requested should have a corresponding `key` returned. Any extra returned cards will be ignored. * `key`: the requested key * `timeToLiveSeconds` (optional, nullable): can either be omitted or `null`. If provided it will override the default time to live value. This allows you to control caching on a case-by-case basis. * `components` (nullable): `null` to indicate that the card has no data or an array of [Plain UI Components](/docs/ui-components/). Example response body for a card cached for 1 hour: Example response body for a card that has no data and should not be displayed and TTL omitted: ## Caching We cache the responses we get from your APIs. This cache is controlled via two properties: 1. A time to live value (in seconds) in the customer card's settings. This can be changed under **Settings** → **Customer cards**. Any changes here will only apply to newly loaded customer cards. 2. An explicit time to live value (in seconds) in your API response with the key `timeToLiveSeconds`. This overrides the value from settings and allows your API to dynamically set the TTL using custom logic. Any card that is past its expiry time is deleted within a few minutes, and no later than 48 hours after expiry. ## Retry strategy Errors are classified into two categories: 1. **Retriable errors**: these are transient issues where retrying once is appropriate 2. **Integration errors**: these are programming or configuration errors. These errors won't be retried and cached for 5 minutes. ## Security Plain supports [request signing](/docs/request-signing) and [mTLS](/docs/mtls) to verify that the request was made by Plain and not a third party. ### Retriable errors The following errors are **retried once** after a **1-second delay**: * HTTP `5xx` response status code * HTTP `429` Too Many Requests response status code * The request times out after 15 seconds. * Plain fails to perform the request for some reason Retriable errors are not cached, therefore if the cards are requested again via the Support App they will be re-requested. ### Integration errors The following errors are **not retried**: * All HTTP 4xx response status codes except for HTTP `429` Too Many Requests response status code * A card key is missing in the response. For example, if `subscription-details` is requested but the `cards` array in the response doesn't have an element with the key `subscription-details`. * The response body does not match the expected schema documented in [response](#response). Integration errors are cached for 5 minutes and indicate a programming or configuration error. Users can manually refresh a card in the UI, in which case the card will be requested again. # acceptSuggestedLabelTypes Source: https://www.plain.com/docs/graphql-reference/mutations/acceptSuggestedLabelTypes Accepts one or more pending suggested label types, creating a real label type for each and marking the suggestions as ACCEPTED. All ids must currently be PENDING. Fails the whole batch with error code `label_type_name_already_exists` if a suggestion's name matches an existing label type or another suggestion in the same batch. Requires the `labelType:create` and `labelType:read` permissions. # acceptWorkspaceInvite Source: https://www.plain.com/docs/graphql-reference/mutations/acceptWorkspaceInvite Accept a workspace invitation using its ID. The authenticated user joins the workspace and is assigned the role specified in the invite. The invite is marked as accepted and can no longer be used. # addAdditionalAssignees Source: https://www.plain.com/docs/graphql-reference/mutations/addAdditionalAssignees Add one or more users or machine users as additional (secondary) assignees on a thread. Additional assignees are looped in but are not the primary person responsible. Requires the `thread:assign` and `thread:read` permissions. # addCustomerToCustomerGroups Source: https://www.plain.com/docs/graphql-reference/mutations/addCustomerToCustomerGroups Add a customer to one or more customer groups (up to 25 at once), identified by group ID, key, or external ID. Memberships that already exist are silently skipped, making this operation safe to call repeatedly. Returns only the newly created memberships. Requires `customerGroupMembership:create` permission. # addCustomerToTenants Source: https://www.plain.com/docs/graphql-reference/mutations/addCustomerToTenants Adds a customer to one or more tenants. The customer can be identified by their Plain ID, external ID, or email address. If the customer is already a member of a given tenant the operation is a no-op for that tenant. Requires the `customer:edit` and `customerTenantMembership:create` permissions. # addGeneratedReply Source: https://www.plain.com/docs/graphql-reference/mutations/addGeneratedReply Programmatically add a suggested reply to a thread. The reply is surfaced to teammates in Plain so they can review, edit, and send it — the customer sees nothing until a teammate explicitly sends it. The `timelineEntryId` must reference an inbound message on the thread, from the customer or from a machine user. A message the workspace sent, including one your own machine user sent, is not a valid target. The `markdown` field is capped at 5,000 characters. Requires the `generatedReply:create` permission. # addLabels Source: https://www.plain.com/docs/graphql-reference/mutations/addLabels Add one or more labels to a thread. Labels that are already present on the thread are silently skipped. Archived label types are rejected with error code `cannot_add_label_using_archived_label_type`. Requires the `label:create` permission. # addLabelsToUser Source: https://www.plain.com/docs/graphql-reference/mutations/addLabelsToUser Add one or more team labels to a Plain user (agent). Only label types with type `TEAM` may be applied to users. Label types already present on the user are silently skipped. Requires the `label:create` permission. # addMembersToTier Source: https://www.plain.com/docs/graphql-reference/mutations/addMembersToTier Adds one or more tenants or companies to a tier (up to 25 per call). Because each tenant or company can belong to only one tier at a time, adding a member that already belongs to another tier will move it to this tier. Requires the `tierMembership:read` and `tierMembership:create` permissions. # addUserToActiveBillingRota Source: https://www.plain.com/docs/graphql-reference/mutations/addUserToActiveBillingRota Moves a user onto the active billing rota, marking them as currently consuming an eng-rota seat. The user must already hold a billing rota seat. Requires the `billingSeat:edit` permission. # addWorkspaceAlternateSupportEmailAddress Source: https://www.plain.com/docs/graphql-reference/mutations/addWorkspaceAlternateSupportEmailAddress Adds an alternate support email address to the workspace's custom domain configuration, allowing emails to be sent from and received at that address. A workspace can have up to 5 alternate addresses. # archiveLabelType Source: https://www.plain.com/docs/graphql-reference/mutations/archiveLabelType Archives a label type so it can no longer be applied to threads, while preserving it on threads that already have it. To apply an archived label type again, unarchive it first. Requires the `labelType:edit` permission. # assignRolesToUser Source: https://www.plain.com/docs/graphql-reference/mutations/assignRolesToUser Assigns a role to a user in the workspace. Supply exactly one of `roleKey` (for built-in roles) or `customRoleId` (for custom roles) — not both. You can also set `usingBillingRotaSeat` to control whether the user occupies a billable seat on the billing rota. Requires the `roles:assign` permission. # assignThread Source: https://www.plain.com/docs/graphql-reference/mutations/assignThread Assign a thread to a specific user or machine user, replacing any existing primary assignee. Requires the `thread:assign` and `thread:read` permissions. # bulkJoinSlackChannels Source: https://www.plain.com/docs/graphql-reference/mutations/bulkJoinSlackChannels Instructs the Plain Slack bot to join all Slack channels it has access to for the given workspace Slack channel integration. Use this after first installing the integration to connect existing channels. # bulkUpdateConnectedSlackChannels Source: https://www.plain.com/docs/graphql-reference/mutations/bulkUpdateConnectedSlackChannels Applies many connected-slack-channel updates in a single request. Each update is applied independently with the same semantics as `updateConnectedSlackChannel`; partial failures are reported per-item. # bulkUpdateSlackChannelSettings Source: https://www.plain.com/docs/graphql-reference/mutations/bulkUpdateSlackChannelSettings Applies many Slack per-channel setting writes in a single request. Each update targets the `WORKSPACE_SLACK_CONNECTED_CHANNEL` scope and is written with the same semantics as `updateSetting`. The writes are attempted independently; partial failures are reported per-item. # bulkUpsertThreadFields Source: https://www.plain.com/docs/graphql-reference/mutations/bulkUpsertThreadFields Upserts up to 25 thread field values in a single call — useful when setting multiple fields on one or more threads at once. Each entry is independently created or updated; a validation error on the batch as a whole is returned if any entry is invalid. Requires the `threadField:create` and `threadField:update` permissions. # bulkUpsertWorkflowSteps Source: https://www.plain.com/docs/graphql-reference/mutations/bulkUpsertWorkflowSteps Atomically replace all steps in a workflow. Steps with a matching `stepId` are updated; steps without an ID (or with a new ID) are created; steps that existed before but are absent from the input are deleted. Optionally updates `startStepId` and the trigger configuration in the same call. Maximum 60 steps per workflow. # calculateRoleChangeCost Source: https://www.plain.com/docs/graphql-reference/mutations/calculateRoleChangeCost Calculates the billing cost delta of changing a user's role or seat type, including prorated and full-period amounts. Use this before making a role change to show the user an accurate cost preview. # changeBillingPlan Source: https://www.plain.com/docs/graphql-reference/mutations/changeBillingPlan Switches the workspace to a different billing plan. Use `previewBillingPlanChange` first to show the user the cost impact before applying the change. # changeThreadCustomer Source: https://www.plain.com/docs/graphql-reference/mutations/changeThreadCustomer Reassign a thread to a different customer. The original customer retains all their other threads. Requires the `thread:edit` permission. # changeThreadDiscussionStatus Source: https://www.plain.com/docs/graphql-reference/mutations/changeThreadDiscussionStatus Move a discussion between OPEN and RESOLVED. Resolving records the resolution timestamp and settles agentStatus; reopening clears the timestamp and leaves agentStatus alone, because reopening does not mean an agent has picked the work up again. Doing nothing when the discussion is already in that status. Callable by a person, or by the agent a custom-agent discussion is bound to, so an agent can mirror its own thread status back into Plain. # changeThreadPriority Source: https://www.plain.com/docs/graphql-reference/mutations/changeThreadPriority Set the priority of a thread. Priority is an integer from 0 (urgent) to 3 (low). Requires the `thread:edit` permission. # changeUserStatus Source: https://www.plain.com/docs/graphql-reference/mutations/changeUserStatus Manually set a workspace member's availability status (ONLINE, OFFLINE, or AWAY). This overrides any automatic status derived from working hours until the next scheduled working-hours transition. Requires the `userStatus:edit` permission. # completeServiceAuthorization Source: https://www.plain.com/docs/graphql-reference/mutations/completeServiceAuthorization Finalize a service authorization after the user has completed the OAuth flow in the third-party service. For most services, pass the serviceAuthorizationId returned by startServiceAuthorization. For Jira, also provide the jira field with the refreshToken and siteId obtained from Atlassian's OAuth callback. On success, the authorization transitions to CONNECTED status and is ready for use. # completeSidekickMcpServerConnection Source: https://www.plain.com/docs/graphql-reference/mutations/completeSidekickMcpServerConnection Complete a custom MCP server connection after the admin finishes the in-browser OAuth consent: stores the Nango connection, discovers the server's tools (tools/list), persists the snapshot, and marks the server connected. # createAiFeedback Source: https://www.plain.com/docs/graphql-reference/mutations/createAiFeedback Submit feedback on any Plain AI feature result. Pass a JSON-encoded object in the `feedback` field whose `type` discriminates the feature (`AI_AGENT`, `THREAD_CATCHUP`, `THREAD_CLUSTERS`, `TONE_RULE`, or `KNOWLEDGE_GAP`) and includes the relevant context fields and an optional `sentiment` (`POSITIVE`, `NEGATIVE`, or `NEUTRAL`). # createAiToneRule Source: https://www.plain.com/docs/graphql-reference/mutations/createAiToneRule Creates a single AI tone rule with the given category and description. Rules are enabled by default; pass `isEnabled: false` to create the rule in a disabled state. A workspace may have at most 7 simultaneously enabled rules across all categories. Requires the `aiToneRule:create` permission. # createApiKey Source: https://www.plain.com/docs/graphql-reference/mutations/createApiKey Create an API key for a machine user. The plaintext secret is returned only once in `apiKeySecret` and cannot be retrieved again — store it immediately. You can only grant permissions that you yourself hold; attempting to escalate privileges returns an error. Requires the `apiKey:create` permission. # createAttachmentDownloadUrl Source: https://www.plain.com/docs/graphql-reference/mutations/createAttachmentDownloadUrl Generate a short-lived download URL for an existing attachment. The returned URL expires after 3 minutes. If your workspace has virus scanning enabled, the response also includes an `attachmentVirusScanResult` indicating whether the file is safe to download. Requires the `attachment:download` permission. # createAttachmentUploadUrl Source: https://www.plain.com/docs/graphql-reference/mutations/createAttachmentUploadUrl Generate a presigned upload URL for an attachment. Use the returned `uploadFormUrl` and `uploadFormData` fields to POST the file as multipart/form-data directly to storage. The upload URL expires after 2 hours; the resulting `attachment.id` can then be referenced in mutations such as `createThread`, `replyToEmail`, or `createNote`. Requires the `attachment:create` permission. Attachments that are never referenced in a message are automatically deleted after 24 hours. # createAutoresponder Source: https://www.plain.com/docs/graphql-reference/mutations/createAutoresponder Create a new autoresponder that automatically sends a reply when a thread is created from a matching message source and satisfies all specified conditions. A workspace can have at most 25 autoresponders. Requires the `autoresponder:create` permission. # createBroadcast Source: https://www.plain.com/docs/graphql-reference/mutations/createBroadcast Creates a new broadcast in the workspace. The `content` is encoded as declared by `contentFormat` and authored against the rendering rules of the given `type`. Requires the `broadcast:create` permission. # createBroadcastAudience Source: https://www.plain.com/docs/graphql-reference/mutations/createBroadcastAudience Creates a reusable broadcast audience. `filters` is validated against `type`, so a filter naming a dimension that type cannot resolve is rejected here rather than resolving to nobody at send time. Requires the `broadcastAudience:create` permission. # createBusinessHoursSchedule Source: https://www.plain.com/docs/graphql-reference/mutations/createBusinessHoursSchedule Create a new named business hours schedule, optionally with its opening slots. Overlapping and adjacent slots are merged on write. Requires the `businessHours:create` permission. # createChatApp Source: https://www.plain.com/docs/graphql-reference/mutations/createChatApp Create a new chat app, which represents a source of chat messages (e.g. a specific in-product widget or integration). Optionally supply a `logo` using a previously uploaded workspace file ID. The logo must be a public, image-type workspace file. Requires the `chatApp:create` permission and the live-chat billing entitlement. # createChatAppSecret Source: https://www.plain.com/docs/graphql-reference/mutations/createChatAppSecret Generate a signing secret for a chat app used to authenticate incoming webhook requests. If a secret already exists for the given chat app it is deleted and replaced — the new secret is the only time the raw value is returned. Store it securely immediately after creation. Requires the `chatAppSecret:create` permission and the live-chat billing entitlement. # createCustomRole Source: https://www.plain.com/docs/graphql-reference/mutations/createCustomRole Creates a new custom role in the workspace. Custom roles are created with the Support permissions preset by default and can be further configured using `upsertRoleScopes`. Requires the `roles:create` permission and the `custom_roles` billing entitlement. # createCustomerCardConfig Source: https://www.plain.com/docs/graphql-reference/mutations/createCustomerCardConfig Creates a new customer card config. New configs are placed at the bottom of the list (order 100000) by default. A maximum of 25 card configs can be created per workspace. Returns a `too_many_customer_card_configs` error if the limit is reached. The `key` must be unique within the workspace and is used in the request payload sent to your API URL. # createCustomerEvent Source: https://www.plain.com/docs/graphql-reference/mutations/createCustomerEvent Creates a customer event that appears in the timeline of every thread belonging to the customer. Use this to surface important product activity (e.g. a failed payment, a deleted API key) so your team has full context when helping the customer. The event layout is defined using Plain UI components. Requires the `customerEvent:create` permission. # createCustomerGroup Source: https://www.plain.com/docs/graphql-reference/mutations/createCustomerGroup Create a new customer group with a unique key, display name, and color. Use `upsertCustomerGroup` instead if you need idempotent create-or-update behaviour. Requires `customerGroup:create` permission. # createCustomerSurvey Source: https://www.plain.com/docs/graphql-reference/mutations/createCustomerSurvey Creates a new customer survey (e.g. a CSAT survey) in the workspace. Requires the `customerSurvey:create` permission and a billing entitlement for customer surveys. You must supply a template (currently only `csatTemplate` is supported) and can optionally specify targeting conditions, an enabled state, a send delay, and a per-customer cooldown interval. # createDemoChannel Source: https://www.plain.com/docs/graphql-reference/mutations/createDemoChannel Creates (or reuses) a demo channel on the given integration's support channel (e.g. a demo Slack channel), invites the installing user, and seeds a demo customer thread so the integration can be tried out before going live. # createDiscussion Source: https://www.plain.com/docs/graphql-reference/mutations/createDiscussion Create a new discussion. Supersedes createThreadDiscussion and additionally supports Sidekick AGENT_SESSION discussions (which can be started without a thread). For Slack, Email, and Cursor discussion types, a threadId is required. For AGENT_SESSION discussions, threadId is optional and the discussion may be associated with a source entity (company, tenant, etc.) or page instead. # createEmailPreviewUrl Source: https://www.plain.com/docs/graphql-reference/mutations/createEmailPreviewUrl Generates a short-lived URL that can be used to preview the rendered HTML of an email. Useful for displaying email content in external tools or dashboards. # createEscalationPath Source: https://www.plain.com/docs/graphql-reference/mutations/createEscalationPath Creates a new escalation path with the given name, optional description, and an ordered list of steps (up to 20). Each step routes the thread to either a specific user or the owners of a label type. Steps must not contain duplicates. Requires the `escalationPath:create` permission and the escalation paths feature entitlement. # createGithubUserAuthIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createGithubUserAuthIntegration Connects the currently authenticated user's Plain account to their GitHub account using a Nango OAuth session. Requires the 'githubUserAuthIntegration:create' permission. # createHelpCenter Source: https://www.plain.com/docs/graphql-reference/mutations/createHelpCenter Create a new help center with a subdomain, branding, and access settings. Requires the helpCenter:edit permission. # createHelpCenterArticleGroup Source: https://www.plain.com/docs/graphql-reference/mutations/createHelpCenterArticleGroup Create a new article group (folder) within a help center. Pass parentHelpCenterArticleGroupId to nest the group inside an existing group. Requires the helpCenter:edit permission. # createHyperlineBillingPortalSession Source: https://www.plain.com/docs/graphql-reference/mutations/createHyperlineBillingPortalSession Creates a Hyperline billing portal session and returns a URL where the user can manage their subscription, invoices, and payment methods. Requires the `billing:edit` permission. # createHyperlineComponentsAuthToken Source: https://www.plain.com/docs/graphql-reference/mutations/createHyperlineComponentsAuthToken Creates a short-lived authentication token for embedding Hyperline billing UI components directly in your own interface. Requires the `billing:edit` permission. # createImportSync Source: https://www.plain.com/docs/graphql-reference/mutations/createImportSync Create an import job definition that continuously syncs tenant field schemas, tenants, and customers from a connected external service (Attio, HubSpot, or Salesforce). Only one enabled import job definition can exist per service authorization at a time; calling this when one is already enabled returns an error. Use updateImportJobDefinition to disable an existing definition before creating a new one. # createIndexedDocument Source: https://www.plain.com/docs/graphql-reference/mutations/createIndexedDocument Manually add a single URL as an indexed document within an existing knowledge source. The document is fetched and queued for indexing asynchronously. Requires Plain AI to be enabled on the workspace. # createIssueTrackerIssue Source: https://www.plain.com/docs/graphql-reference/mutations/createIssueTrackerIssue Create a new issue in a connected issue tracker (Shortcut, Rootly, incident.io, or GitHub) and return a `ThreadLinkCandidate` that can immediately be used with `createThreadLink` to link it to a thread. The `fields` array must include all required fields for the chosen tracker (use `issueTrackerFields` to discover which fields are required and their allowed values). For GitHub, the acting user must have a personal GitHub user auth integration set up via `createGithubUserAuthIntegration`; the issue is created on their behalf. Requires the `threadLink:create` permission. # createKnowledgeSource Source: https://www.plain.com/docs/graphql-reference/mutations/createKnowledgeSource Create a new knowledge source that Plain AI will index and use when generating replies. Use type `SITEMAP` to crawl all URLs listed in a sitemap XML file, or type `URL` to index a single page. Requires Plain AI to be enabled on the workspace. # createLabelType Source: https://www.plain.com/docs/graphql-reference/mutations/createLabelType Creates a new label type in the workspace. Label types define the labels available to apply to threads and users. Requires the `labelType:create` permission. # createLinearAppIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createLinearAppIntegration # createMachineUser Source: https://www.plain.com/docs/graphql-reference/mutations/createMachineUser Creates a new machine user in the workspace. Each machine user can hold multiple API keys and optionally has a public-facing name shown to customers. Only one machine user of type AI_AGENT is allowed per workspace. Requires the `machineUser:create` permission. # createMyFavoritePage Source: https://www.plain.com/docs/graphql-reference/mutations/createMyFavoritePage Saves a page as a favorite for the currently authenticated user. If the caller has already favorited a page with the same key, the existing record is returned unchanged (idempotent). Requires the `favoritePage:create` permission. # createMyLinearIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createMyLinearIntegration Connects the current user's Plain account to their Linear account by exchanging an OAuth authorization code. Obtain the authorization code by directing the user through the URL returned by myLinearInstallationInfo. The redirectUrl must match the one used when generating the installation URL. Each workspace can only be connected to one Linear organisation; attempting to connect a second organisation returns an error. # createMyMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createMyMSTeamsIntegration Connects the current user's personal Microsoft Teams account to Plain using the OAuth authorization code obtained after completing the installation flow from `myMSTeamsInstallationInfo`. # createMySlackIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createMySlackIntegration Connects the current user's personal Slack notifications integration using an OAuth auth code obtained from the Slack OAuth flow. Get the installation URL from mySlackInstallationInfo. # createNote Source: https://www.plain.com/docs/graphql-reference/mutations/createNote Creates an internal note visible only to your team. Notes appear in the thread timeline alongside customer messages and are useful for sharing context, reminders, or annotations. Provide `threadId` to pin the note to a specific thread; omit it to attach the note to the customer so it appears across all of their threads. Requires the `note:create` permission. # createSavedThreadsView Source: https://www.plain.com/docs/graphql-reference/mutations/createSavedThreadsView Creates a new saved threads view in the workspace. The view stores a named filter configuration (including sort order, grouping, layout, and display options) that can be applied when querying threads. Requires the savedThreadsView:create permission; depending on workspace settings, only admins or all members may be allowed to create views. # createServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/mutations/createServiceLevelAgreement Create a service level agreement (SLA) for a tier. Each SLA commits your team to a time target and can be scoped by thread priority and/or label type. Provide exactly one of `firstResponseTimeMinutes` (time from thread creation to first reply), `nextResponseTimeMinutes` (time from each customer message to the next reply), `firstResolutionTimeMinutes` (time from thread creation to first Done), or `totalResolutionTimeMinutes` (time from thread creation to Done, including after reopen). A `nextResponseTimeMinutes` SLA can only be created if a `firstResponseTimeMinutes` SLA already exists on the same tier. Requires the `serviceLevelAgreement:create` permission. # createServiceLevelAgreementPolicy Source: https://www.plain.com/docs/graphql-reference/mutations/createServiceLevelAgreementPolicy Create an SLA policy together with its targets. A policy holds at most one target per type, and any combination of types is valid. Business hours are configured on the policy and apply to every target in it. A policy only starts tracking once it is applied to a thread. Requires the `serviceLevelAgreement:create` permission. # createSidekickCustomSkill Source: https://www.plain.com/docs/graphql-reference/mutations/createSidekickCustomSkill Create a workspace custom skill. The name must be a unique URL-safe slug. # createSidekickMcpServer Source: https://www.plain.com/docs/graphql-reference/mutations/createSidekickMcpServer Register a custom (customer-owned) MCP server for Sidekick and mint a Nango Connect session for in-browser OAuth consent. The server is created in an unreachable state; call completeSidekickMcpServerConnection after consent to discover its tools and mark it connected. # createSnippet Source: https://www.plain.com/docs/graphql-reference/mutations/createSnippet Creates a new snippet in the workspace. The `name` is used to search for the snippet when composing a reply. Provide `markdown` in addition to `text` to supply a rich-text version used in channels that support markdown. The optional `path` (alphanumeric only) places the snippet in a folder in the Plain app. Requires the `snippet:create` permission. # createTask Source: https://www.plain.com/docs/graphql-reference/mutations/createTask Create a new task. Only `title` is required; `description`, `status`, `priority`, assignee, and a parent `companyId` or `tenantId` are all optional. A task may be linked to either a company or a tenant, but not both. Requires the `task:create` permission. # createTenant Source: https://www.plain.com/docs/graphql-reference/mutations/createTenant Creates a new tenant. Fails with a validation error if a tenant already exists with the provided `externalId`. Use `upsertTenant` instead if you want to create or update a tenant idempotently. Requires the `tenant:create` permission. # createThread Source: https://www.plain.com/docs/graphql-reference/mutations/createThread Create a new thread for a customer. Commonly used when a customer submits a contact form or when you want to start a proactive support interaction from your own product. The thread is created in `TODO` status. You can optionally set a title, priority, assignee, labels, thread fields, tenant, and an `externalId` for later lookup. Requires the `thread:create` and `thread:read` permissions. # createThreadDiscussion Source: https://www.plain.com/docs/graphql-reference/mutations/createThreadDiscussion Start a new discussion on a Plain thread. Supports Slack (posts a new thread in a connected Slack channel), Email (sends an outbound email chain), and Cursor workspace background agent discussions. The markdownContent field is sent as the opening message; for Slack discussions you may also supply slackBlocks (JSON-encoded Block Kit array) for rich Slack formatting while markdownContent serves as the Plain UI fallback. Prefer createDiscussion for new integrations. # createThreadEvent Source: https://www.plain.com/docs/graphql-reference/mutations/createThreadEvent Creates a thread event that appears only in the timeline of the specified thread. Use this when an activity is specific to a single conversation rather than the customer as a whole. The event layout is defined using Plain UI components. Thread events are visible only to your team and are never shown to the customer. Requires the `threadEvent:create` and `threadEvent:read` permissions. # createThreadFieldSchema Source: https://www.plain.com/docs/graphql-reference/mutations/createThreadFieldSchema Creates a new thread field schema, defining a custom field that can be attached to threads. The `key` must be unique within the workspace and cannot be changed after creation. Requires the `threadFieldSchema:create` permission. # createThreadFromSlackMessage Source: https://www.plain.com/docs/graphql-reference/mutations/createThreadFromSlackMessage Creates a thread from a top-level message in a connected customer Slack channel, along with the replies Plain has already received for it. This is the trigger for the `API_ONLY` ingestion mode, and works in every other mode too. Ingestion runs asynchronously, so `thread` is returned only when the message had already been ingested. Requires the `thread:create` permission. This is not a way to import historic conversations: only replies Plain saw over the Slack events API are included, so a message from before the Plain bot joined the channel becomes a thread missing everything that was said before then. # createThreadLink Source: https://www.plain.com/docs/graphql-reference/mutations/createThreadLink Links a thread to an external entity such as a Linear issue, Jira ticket, another Plain thread, or a Plain task. Provide exactly one of `linearIssue`, `jiraIssue`, `plainThread`, `plainTask`, or `sourceId`/`sourceType` for generic issue trackers. Returns an error with code `thread_link_already_exists` if the same link already exists for the thread. # createTier Source: https://www.plain.com/docs/graphql-reference/mutations/createTier Creates a new tier. You can optionally add tenant and company members at creation time. Requires the `tier:create` permission. # createUserAccount Source: https://www.plain.com/docs/graphql-reference/mutations/createUserAccount Creates or updates the user account for the currently authenticated user. Idempotent: calling this multiple times with the same identity will update the existing account rather than creating a duplicate. Used during the initial onboarding flow to set the user's display names. # createUserAuthDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createUserAuthDiscordChannelIntegration Links the current user's personal Discord account to a specific Discord guild. Users must complete this in addition to the workspace-level integration before they can send Discord messages. Obtain the `authCode` by directing the user through the URL returned by `userAuthDiscordChannelInstallationInfo`. # createUserAuthSlackIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createUserAuthSlackIntegration Connects the current user's user-auth Slack integration using an OAuth auth code. This integration allows Plain to send Slack messages as the authenticated user rather than as a bot. Get the installation URL from userAuthSlackInstallationInfo. # createWebhookTarget Source: https://www.plain.com/docs/graphql-reference/mutations/createWebhookTarget Register a new HTTP endpoint to receive Plain webhook events. You must specify the URL, a human-readable description, the webhook schema version to pin to, whether deliveries should start immediately, and the list of event types to subscribe to. You can optionally supply custom HTTP headers (e.g. an `Authorization` header) to send with every delivery. Use `subscriptionEventTypes` to discover valid event type identifiers. Requires the `webhookTarget:create` permission. # createWorkflow Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkflow Create a new workflow. The workflow starts unpublished with no steps; use `bulkUpsertWorkflowSteps` to add steps and `updateWorkflow` to publish it. The `trigger` field must be a valid JSON-encoded trigger configuration. # createWorkflowRule Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkflowRule Create a new workflow rule. The rule starts unpublished; use `toggleWorkflowRulePublished` to activate it. The `payload` field must be a valid JSON-encoded rule definition. # createWorkflowShareLink Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkflowShareLink Create a content-addressed share link for a workflow. Returns a short token that can be used to load the workflow in another workspace. # createWorkflowStep Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkflowStep Add a single step to a workflow. For bulk changes to a workflow's step graph, prefer `bulkUpsertWorkflowSteps`. # createWorkspaceCursorIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceCursorIntegration Creates a Cursor integration for the workspace using the provided API token. Only one integration can be active at a time; call `deleteWorkspaceCursorIntegration` before creating a new one. Requires the `workspaceCursorIntegration:create` permission. # createWorkspaceEmailDomainSettings Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceEmailDomainSettings Configures a custom email domain for the workspace using the provided support email address. After creation, complete setup by verifying email forwarding with verifyWorkspaceEmailForwardingSettings and DNS records with verifyWorkspaceEmailDnsSettings. # createWorkspaceFileDownloadUrl Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceFileDownloadUrl Generate a fresh download URL for a workspace file. For PRIVATE files, returns a short-lived pre-signed URL (valid for 3 minutes); for PUBLIC files, returns a permanent CDN URL with no expiry. Call this whenever you need to give a user access to a file rather than caching URLs, as private URLs expire quickly. # createWorkspaceFileUploadUrl Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceFileUploadUrl Begin a two-step file upload. Returns a pre-signed S3 form URL and form data fields that you POST the raw file bytes to directly from the client. The upload URL expires in 2 hours. Files must be 50 MB or smaller; certain executable file extensions (e.g. .exe, .bat) are rejected. Requires the `workspaceFile:create` permission. # createWorkspaceSlackChannelIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceSlackChannelIntegration Connects a workspace Slack channel integration using an OAuth auth code. This integration allows Plain to monitor Slack channels and create threads from messages. Get the installation URL from workspaceSlackChannelInstallationInfo. # createWorkspaceSlackIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceSlackIntegration Connects a workspace-level Slack notifications integration using an OAuth auth code. This integration enables Plain to post notifications to a Slack channel on behalf of the workspace. Get the installation URL from workspaceSlackInstallationInfo. # createWorkspaceSlackSidekickIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/createWorkspaceSlackSidekickIntegration Installs Plain's Sidekick AI agent into the workspace's Slack. Exchanges the OAuth authorization code (obtained by sending the user through the URL from workspaceSlackSidekickInstallationInfo) for a bot token, creates the Sidekick Slack channel, and persists the integration. The channel is normally #ask-plain; if that name is already taken in the Slack workspace the next free name is used instead, so read askSidekickSlackChannelName off the returned integration and show the user which channel was created rather than assuming #ask-plain. Fails only if every candidate name is taken. Only one Sidekick integration is allowed per workspace and per Slack team; calling this when one already exists returns an error. Requires the workspaceSlackSidekickIntegration:create permission and the ai_agent billing entitlement. # deleteAiToneRules Source: https://www.plain.com/docs/graphql-reference/mutations/deleteAiToneRules Permanently deletes one or more AI tone rules by ID. If any supplied ID does not exist the entire operation fails and no rules are deleted. Requires the `aiToneRule:delete` permission. # deleteApiKey Source: https://www.plain.com/docs/graphql-reference/mutations/deleteApiKey Permanently revoke an API key. The deleted key is returned for confirmation. System-managed keys cannot be deleted. Requires the `apiKey:delete` permission. # deleteAutoresponder Source: https://www.plain.com/docs/graphql-reference/mutations/deleteAutoresponder Permanently delete an autoresponder. The deleted autoresponder is returned in the response. Requires the `autoresponder:delete` permission. # deleteBroadcast Source: https://www.plain.com/docs/graphql-reference/mutations/deleteBroadcast Soft-deletes a broadcast. Deleted broadcasts are excluded from `broadcasts` and `searchBroadcasts` but remain fetchable by ID with `isDeleted: true`. Requires the `broadcast:delete` permission. # deleteBroadcastAudience Source: https://www.plain.com/docs/graphql-reference/mutations/deleteBroadcastAudience Soft-deletes a broadcast audience. Rejected with `cannot_delete_broadcast_audience` while a broadcast targeting it is scheduled or being sent, since past `SCHEDULED` its author can no longer edit the reference away. Requires the `broadcastAudience:delete` permission. # deleteBusinessHoursSchedule Source: https://www.plain.com/docs/graphql-reference/mutations/deleteBusinessHoursSchedule Delete a business hours schedule and the slots belonging to it. Requires the `businessHours:delete` permission. # deleteChatApp Source: https://www.plain.com/docs/graphql-reference/mutations/deleteChatApp Permanently delete a chat app. This action cannot be undone. Requires the `chatApp:delete` permission. # deleteChatAppSecret Source: https://www.plain.com/docs/graphql-reference/mutations/deleteChatAppSecret Delete the signing secret associated with a chat app. After deletion, webhook signature verification for that chat app will fail until a new secret is created. Requires the `chatAppSecret:delete` permission. # deleteCompany Source: https://www.plain.com/docs/graphql-reference/mutations/deleteCompany Deletes a company identified by `companyId` or `companyDomainName`. Deleting a company unlinks it from all of its customers — the customers themselves are not deleted. Requires the `company:delete` permission. # deleteCustomRole Source: https://www.plain.com/docs/graphql-reference/mutations/deleteCustomRole Permanently deletes a custom role by its ID. Returns the ID of the deleted role on success. Requires the `roles:edit` permission. # deleteCustomer Source: https://www.plain.com/docs/graphql-reference/mutations/deleteCustomer Permanently deletes a customer and all associated data (threads, timeline entries, etc.). Deletion is asynchronous and cannot be reversed. Requires the `customer:delete` permission. # deleteCustomerCardConfig Source: https://www.plain.com/docs/graphql-reference/mutations/deleteCustomerCardConfig Permanently deletes a customer card config and stops loading that card for all customers. # deleteCustomerGroup Source: https://www.plain.com/docs/graphql-reference/mutations/deleteCustomerGroup Permanently delete a customer group by ID. This will fail if the group still has members — remove all customers from the group first. Requires `customerGroup:delete` permission. # deleteCustomerSurvey Source: https://www.plain.com/docs/graphql-reference/mutations/deleteCustomerSurvey Permanently deletes a customer survey. Returns an error if the survey does not exist. Requires the `customerSurvey:delete` permission. # deleteEmailSuppression Source: https://www.plain.com/docs/graphql-reference/mutations/deleteEmailSuppression Removes a hard-bounce or manual suppression for one email address. Spam-complaint suppressions cannot be removed. # deleteEscalationPath Source: https://www.plain.com/docs/graphql-reference/mutations/deleteEscalationPath Permanently deletes an escalation path by ID. Returns an error if the escalation path does not exist. Threads that were attached to this escalation path will lose their escalation path association. Requires the `escalationPath:delete` permission. # deleteGithubUserAuthIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteGithubUserAuthIntegration Disconnects the currently authenticated user's GitHub integration, removing their stored credentials. Requires the 'githubUserAuthIntegration:delete' permission. # deleteHelpCenter Source: https://www.plain.com/docs/graphql-reference/mutations/deleteHelpCenter Permanently delete a help center and all its articles and article groups. This action cannot be undone. Requires the helpCenter:edit permission. # deleteHelpCenterArticle Source: https://www.plain.com/docs/graphql-reference/mutations/deleteHelpCenterArticle Permanently delete a help center article. Requires the helpCenter:edit permission. # deleteHelpCenterArticleGroup Source: https://www.plain.com/docs/graphql-reference/mutations/deleteHelpCenterArticleGroup Delete an article group. Articles that belonged to the group are not deleted — they become ungrouped. To remove articles entirely, use deleteHelpCenterArticle. Requires the helpCenter:edit permission. # deleteKnowledgeSource Source: https://www.plain.com/docs/graphql-reference/mutations/deleteKnowledgeSource Delete a knowledge source and remove it from Plain AI's index. This is idempotent — deleting a knowledge source that does not exist returns no error. # deleteLinearAppIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteLinearAppIntegration # deleteMachineUser Source: https://www.plain.com/docs/graphql-reference/mutations/deleteMachineUser Deletes a machine user and all of its API keys. The deleted machine user is returned in the response. Requires the `machineUser:delete` permission. # deleteMyFavoritePage Source: https://www.plain.com/docs/graphql-reference/mutations/deleteMyFavoritePage Removes a favorite page for the currently authenticated user. If the specified favorite page does not exist or belongs to a different user, the mutation succeeds silently with no error. Requires the `favoritePage:delete` permission. # deleteMyLinearIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteMyLinearIntegration Disconnects the current user's Linear integration. If no integration exists this is a no-op and succeeds. # deleteMyMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteMyMSTeamsIntegration Disconnects the current user's personal Microsoft Teams integration from Plain. # deleteMyServiceAuthorization Source: https://www.plain.com/docs/graphql-reference/mutations/deleteMyServiceAuthorization Delete the current user's personal service authorization credentials (currently supported for Jira only). This removes the user's personal OAuth token but leaves the workspace-level Jira authorization intact. The primary Jira token cannot be deleted; another user must first become the primary before this user's token can be removed. # deleteMySlackIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteMySlackIntegration Disconnects the current user's personal Slack notifications integration. # deleteNote Source: https://www.plain.com/docs/graphql-reference/mutations/deleteNote Soft-deletes a note. The note is marked as deleted but its record is retained. Requires the `note:delete` permission. # deleteQueuedAgentSessionMessage Source: https://www.plain.com/docs/graphql-reference/mutations/deleteQueuedAgentSessionMessage Removes a user message that is waiting in a Sidekick AGENT_SESSION queue. Rejects with `queued_agent_session_message_already_dispatched` if the agent has already picked the message up — the frontend should reload to reflect the new state. # deleteSavedThreadsView Source: https://www.plain.com/docs/graphql-reference/mutations/deleteSavedThreadsView Permanently deletes a saved threads view. Returns an error if the view does not exist. Depending on workspace settings, only the view's creator or workspace admins may be allowed to delete a view they did not create. # deleteServiceAuthorization Source: https://www.plain.com/docs/graphql-reference/mutations/deleteServiceAuthorization Delete a workspace-level service authorization and revoke the associated credentials. Any import job definitions linked to this authorization are also disabled. This operation is permanent; to reconnect the service, start a new authorization flow. # deleteServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/mutations/deleteServiceLevelAgreement Delete an SLA from a tier. A first-response-time SLA cannot be deleted while a next-response-time SLA still exists on the same tier — delete the next-response SLA first. Returns the deleted SLA on success. Requires the `serviceLevelAgreement:delete` permission. # deleteServiceLevelAgreementPolicy Source: https://www.plain.com/docs/graphql-reference/mutations/deleteServiceLevelAgreementPolicy Delete an SLA policy. Its targets and their SLA trackers are deleted with it, and any thread the policy was applied to falls back to its tier's SLAs. Requires the `serviceLevelAgreement:delete` permission. # deleteSetting Source: https://www.plain.com/docs/graphql-reference/mutations/deleteSetting Delete a stored setting value at the given scope, causing the effective value to revert to the next level in the scope hierarchy (for example, removing a per-channel override exposes the workspace-level default). Returns the value that was removed in `previousSetting`, or null if no explicit value was stored at that scope. This operation is idempotent — deleting a setting that does not exist returns null without an error. # deleteSidekickCustomSkill Source: https://www.plain.com/docs/graphql-reference/mutations/deleteSidekickCustomSkill Delete a workspace custom skill. # deleteSidekickMcpServer Source: https://www.plain.com/docs/graphql-reference/mutations/deleteSidekickMcpServer Delete a custom MCP server and best-effort revoke its Nango connection. Idempotent: deleting an unknown server is a no-op success. # deleteSnippet Source: https://www.plain.com/docs/graphql-reference/mutations/deleteSnippet Soft-deletes a snippet. Deleted snippets are hidden from the snippet picker but remain fetchable by ID with `isDeleted: true`, preserving the history of replies that referenced them. Requires the `snippet:delete` permission. # deleteTask Source: https://www.plain.com/docs/graphql-reference/mutations/deleteTask Soft-delete a task. The task is removed from the active task list but remains queryable by ID with `isDeleted: true`. All thread links attached to the task are also deleted. Requires the `task:delete` permission. # deleteTenant Source: https://www.plain.com/docs/graphql-reference/mutations/deleteTenant Permanently deletes a tenant, unlinking it from all customers and removing its fields. Threads that were associated with the tenant retain a tombstone reference but are no longer routed through it. The tenant can be identified by either its Plain `tenantId` or its `externalId`. Requires the `tenant:delete` permission. # deleteTenantField Source: https://www.plain.com/docs/graphql-reference/mutations/deleteTenantField Clears a tenant's value for a specific field without removing the field schema itself. Use this to unset a field value while keeping the schema available for other tenants. Requires `tenant:edit` permission. # deleteTenantFieldSchema Source: https://www.plain.com/docs/graphql-reference/mutations/deleteTenantFieldSchema Permanently deletes a tenant field schema and all field values stored against it across all tenants. This action cannot be undone. Requires `tenantFieldSchema:delete` permission. # deleteThread Source: https://www.plain.com/docs/graphql-reference/mutations/deleteThread Permanently delete a thread and all its associated data from Plain. This action is irreversible — use with caution. Requires the `thread:delete` permission. # deleteThreadChannelAssociation Source: https://www.plain.com/docs/graphql-reference/mutations/deleteThreadChannelAssociation Removes a thread channel association, unlinking the connected Slack channel from its associated company or tenant. Requires the `threadChannelAssociation:delete` permission. # deleteThreadDiscussion Source: https://www.plain.com/docs/graphql-reference/mutations/deleteThreadDiscussion Permanently delete a discussion from Plain. Only Slack-channel discussions are currently supported. This removes the discussion record from Plain but does not delete the underlying Slack thread. # deleteThreadField Source: https://www.plain.com/docs/graphql-reference/mutations/deleteThreadField Removes a stored thread field value from a thread, identified by thread ID and field key. Has no effect if the field has no value. Requires the `threadField:delete` permission. # deleteThreadFieldSchema Source: https://www.plain.com/docs/graphql-reference/mutations/deleteThreadFieldSchema Permanently deletes a thread field schema and removes all field values stored against it on every thread. This action cannot be undone. Requires the `threadFieldSchema:delete` permission. # deleteThreadLink Source: https://www.plain.com/docs/graphql-reference/mutations/deleteThreadLink Removes an existing thread link by its ID. If the link type was `MERGED_INTO`, the previously merged thread will be marked as done automatically. # deleteTier Source: https://www.plain.com/docs/graphql-reference/mutations/deleteTier Deletes a tier permanently. All tenant and company memberships in that tier are also removed. Requires the `tier:delete` permission. # deleteUser Source: https://www.plain.com/docs/graphql-reference/mutations/deleteUser Permanently remove a workspace member. The user's threads remain but are unassigned. Returns an error if the user is the only owner of the workspace — another owner must exist before deletion is allowed. Requires the `user:delete` permission. # deleteUserAuthDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteUserAuthDiscordChannelIntegration Removes the current user's personal Discord authentication for the specified integration, preventing them from sending Discord messages until they re-authenticate. # deleteUserAuthSlackIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteUserAuthSlackIntegration Disconnects the current user's user-auth Slack integration for the specified Slack workspace. # deleteWebhookTarget Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWebhookTarget Delete a webhook target, stopping all future deliveries to that endpoint and removing it from the workspace. Existing delivery attempt history is retained until normal retention expiry. Requires the `webhookTarget:delete` permission. # deleteWorkflow Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkflow Permanently delete a workflow and all its steps. Existing executions are retained for audit purposes. # deleteWorkflowRule Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkflowRule Permanently delete a workflow rule. This action cannot be undone. # deleteWorkflowStep Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkflowStep Delete a single step from a workflow. You are responsible for updating any steps that reference this step in their transitions. # deleteWorkspaceCursorIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceCursorIntegration Removes the workspace's Cursor integration. If no integration with the given ID exists, the operation succeeds and returns a null `id`. Requires the `workspaceCursorIntegration:delete` permission. # deleteWorkspaceDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceDiscordChannelIntegration Removes a workspace Discord channel integration, disconnecting the Discord guild from the workspace. Existing threads and messages are not deleted. # deleteWorkspaceDiscordIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceDiscordIntegration Removes a webhook-based workspace Discord integration by its ID. # deleteWorkspaceEmailDomainSettings Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceEmailDomainSettings Removes the workspace's custom email domain configuration. After deletion, email will no longer be routed through the custom domain. # deleteWorkspaceFile Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceFile Delete a workspace file by ID. Requires the `workspaceFile:create` permission. # deleteWorkspaceInvite Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceInvite Cancel and delete a pending workspace invite. The invited user will no longer be able to accept it. The deleted invite is returned. # deleteWorkspaceMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceMSTeamsIntegration Removes a workspace-level Microsoft Teams integration. Pass the integration's `id` as `integrationId`. Returns the deleted integration. # deleteWorkspaceSlackChannelIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceSlackChannelIntegration Disconnects and removes a workspace Slack channel integration. Connected channels for this integration will no longer be monitored. # deleteWorkspaceSlackIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceSlackIntegration Disconnects and removes a workspace-level Slack notifications integration. # deleteWorkspaceSlackSidekickIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/deleteWorkspaceSlackSidekickIntegration Removes Plain's Sidekick AI agent from the workspace's Slack. Returns the integration that was deleted. Returns an error if no Sidekick integration exists. Requires the workspaceSlackSidekickIntegration:delete permission. # dismissSuggestedLabelTypes Source: https://www.plain.com/docs/graphql-reference/mutations/dismissSuggestedLabelTypes Dismisses one or more pending suggested label types without creating label types. All ids must currently be PENDING. Requires the `labelType:create` permission. # editQueuedAgentSessionMessage Source: https://www.plain.com/docs/graphql-reference/mutations/editQueuedAgentSessionMessage Edits the text of a user message that is waiting in a Sidekick AGENT_SESSION queue. Attachments are not editable in this flow — delete and re-send to change them. Rejects with `queued_agent_session_message_already_dispatched` if the agent has already picked the message up. # escalateThread Source: https://www.plain.com/docs/graphql-reference/mutations/escalateThread Advance a thread to the next step in its escalation path. The thread must already have an escalation path attached (via `updateThreadEscalationPath`) — if not, this call returns an error. Requires the `thread:edit` permission. # exportWorkflowTemplate Source: https://www.plain.com/docs/graphql-reference/mutations/exportWorkflowTemplate Build the files for publishing a workflow as a template; writes nothing. Requires the `workflowRule:create` permission. # forkThread Source: https://www.plain.com/docs/graphql-reference/mutations/forkThread Create a new thread by forking from a specific timeline entry in an existing thread. The forked thread starts at the chosen message, allowing you to split a conversation into a separate support case. Requires the `thread:create` permission. # generateAiToneRulesFromDescription Source: https://www.plain.com/docs/graphql-reference/mutations/generateAiToneRulesFromDescription Uses AI to generate a set of tone rules from a free-text description of the desired communication style (up to 5000 characters). The generated rules are saved to the workspace in a disabled state so you can review and selectively enable them. Returns the newly created rules. Requires the `aiToneRule:create` permission. # generateHelpCenterArticle Source: https://www.plain.com/docs/graphql-reference/mutations/generateHelpCenterArticle Use AI to generate one or more draft help center articles from the content of a support thread. Returns the generated articles in DRAFT status for review before publishing. Requires the helpCenter:edit permission. # importCustomers Source: https://www.plain.com/docs/graphql-reference/mutations/importCustomers Upsert up to 25 customers from an external system using their externalId for idempotency. Each customer can include an optional list of tenants to associate with. Returns an ImportResult with added, updated, and skipped counts. # importTenantFieldSchemas Source: https://www.plain.com/docs/graphql-reference/mutations/importTenantFieldSchemas Upsert up to 50 tenant field schemas from an external system using their externalFieldId for idempotency. Set isDeleted: true on a schema to mark it as deleted in Plain. Returns an ImportResult with added, updated, and skipped counts. # importTenantFieldSchemasFromService Source: https://www.plain.com/docs/graphql-reference/mutations/importTenantFieldSchemasFromService Fetches tenant field schemas from a connected external service (identified by `serviceIntegrationKey`) and upserts them into Plain. The service must already be authorized and connected. Returns the full list of schemas that were imported. # importTenants Source: https://www.plain.com/docs/graphql-reference/mutations/importTenants Upsert up to 25 tenants from an external system using their externalId for idempotency. Optionally include tenant field values to sync custom fields alongside the tenant record. Returns an ImportResult with added, updated, and skipped counts. # importThread Source: https://www.plain.com/docs/graphql-reference/mutations/importThread Import a thread from an external system using its historical creation timestamp. Unlike createThread, this mutation does not trigger SLAs or autoresponders, making it suitable for backfilling historical support data. The externalId is used for idempotency — re-importing the same ID returns NOOP. Requires the thread:import permission. # importThreadDiscussion Source: https://www.plain.com/docs/graphql-reference/mutations/importThreadDiscussion Import an existing external conversation as a discussion on a Plain thread, backfilling all messages. Currently supports Slack threads via permalink — the entire thread (root message and all replies) is imported. If the Slack channel is not yet connected to Plain, the bot will automatically join and register it as a DISCUSSION channel (requires the connectedSlackChannel:edit permission). Private channels must have the Plain bot invited via /invite @Plain first. The call is idempotent: re-importing the same Slack thread onto the same Plain thread resumes from where the previous import left off; importing onto a different thread returns an error. Threads with more than 800 messages cannot be imported. # importThreadMessages Source: https://www.plain.com/docs/graphql-reference/mutations/importThreadMessages Backfill up to 25 historical messages onto an existing thread. Each message requires an externalId for idempotency — re-importing the same ID returns NOOP for that message. INBOUND messages must be authored by a customer; OUTBOUND and NOTE messages must be authored by a user. Requires the thread:import permission. # inviteUserToWorkspace Source: https://www.plain.com/docs/graphql-reference/mutations/inviteUserToWorkspace Send a workspace invitation to a user by email. Specify either a built-in roleKey (e.g. SUPPORT, ADMIN) or a customRoleId to control the permissions they receive on joining. Sends an invitation email to the provided address. # lockThread Source: https://www.plain.com/docs/graphql-reference/mutations/lockThread Lock a thread to prevent further replies or changes by non-admin users. Use this when a resolution is final and you want to freeze the conversation. Requires the `thread:edit` permission. # markCustomerAsSpam Source: https://www.plain.com/docs/graphql-reference/mutations/markCustomerAsSpam Flags a customer as spam, hiding their threads from the inbox and excluding them from metrics. The operation is idempotent — marking an already-spam customer leaves their `markedAsSpamAt` timestamp unchanged. Requires the `customer:edit` permission. # markThreadAsDone Source: https://www.plain.com/docs/graphql-reference/mutations/markThreadAsDone Mark a thread as Done, indicating there is nothing left for the support team to do right now. The thread will automatically revert to Todo when new activity arrives. Requires the `thread:edit` and `thread:read` permissions. # markThreadAsTodo Source: https://www.plain.com/docs/graphql-reference/mutations/markThreadAsTodo Explicitly move a thread back to Todo status. Use this to unsnooze a thread early or to reopen a thread that was incorrectly marked as Done. Requires the `thread:edit` and `thread:read` permissions. # markThreadDiscussionRead Source: https://www.plain.com/docs/graphql-reference/mutations/markThreadDiscussionRead Clear the unread flag on a discussion. Use this when the user has viewed a discussion so that the isUnread indicator is reset. Returns the updated discussion. # mintEmbedToken Source: https://www.plain.com/docs/graphql-reference/mutations/mintEmbedToken Issues a short-lived RS256-signed JWT (60-second TTL) that a Plain embed iframe passes to your backend so you can verify the calling user's identity and context. Verify the token by fetching the public keys from the JWKS endpoint returned in `EmbedToken.jwksUrl`. The token carries claims identifying the Plain user, the thread, and the customer, plus the `plain_embed_id` you supplied for audit logging. Each call produces a unique token; call this mutation immediately before your embed needs to make an authenticated request to your backend. # moveLabelType Source: https://www.plain.com/docs/graphql-reference/mutations/moveLabelType Changes the position of a label type in the ordered list, or moves it to a different parent. Supply `afterLabelTypeId` or `beforeLabelTypeId` to place the label type relative to a sibling, and optionally `parentLabelTypeId` to nest it under a parent. Requires the `labelType:edit` permission. # moveWorkflow Source: https://www.plain.com/docs/graphql-reference/mutations/moveWorkflow Move a workflow so it sits directly after another, or to the front of the list when `afterWorkflowId` is null. Only the moved workflow changes. # previewBillingPlanChange Source: https://www.plain.com/docs/graphql-reference/mutations/previewBillingPlanChange Returns a cost preview for switching to a different billing plan, including the immediate charge and the earliest date the change can take effect. No changes are made to the subscription. # purchaseCredits Source: https://www.plain.com/docs/graphql-reference/mutations/purchaseCredits Purchases a top-up credit bundle for AI features. The count must match the unit count of a configured top-up bundle. Returns the updated top-up credit balance after purchase. Requires the `billing:edit` permission. # refreshConnectedDiscordChannels Source: https://www.plain.com/docs/graphql-reference/mutations/refreshConnectedDiscordChannels Syncs the list of Discord channels for a guild from the Discord API into Plain. Call this after channels are added or renamed in Discord so that `connectedDiscordChannels` reflects the latest state. # refreshSidekickMcpServerTools Source: https://www.plain.com/docs/graphql-reference/mutations/refreshSidekickMcpServerTools Re-discover a custom MCP server's tools (tools/list) and reconcile the cached snapshot: newly-appeared tools start in the "ask" (approval-required) state. # refreshWorkspaceSlackChannelIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/refreshWorkspaceSlackChannelIntegration Re-authorizes an existing workspace Slack channel integration with a new OAuth auth code. Use this when isReinstallRequired is true on the integration to restore access. # refreshWorkspaceSlackSidekickIntegration Source: https://www.plain.com/docs/graphql-reference/mutations/refreshWorkspaceSlackSidekickIntegration Re-authorizes an existing workspace Slack Sidekick integration with a new OAuth auth code. Use this when isReinstallRequired is true on the integration to restore access. Requires the workspaceSlackSidekickIntegration:update permission. # regenerateWorkspaceHmac Source: https://www.plain.com/docs/graphql-reference/mutations/regenerateWorkspaceHmac Generates a new HMAC secret for the workspace, replacing any existing secret. Plain includes this secret as a signature header on outbound HTTP requests (e.g. workflow rule HTTP steps) so your server can verify the request originated from Plain. Requires the `workspaceHmac:edit` permission. # reindexKnowledgeSource Source: https://www.plain.com/docs/graphql-reference/mutations/reindexKnowledgeSource Trigger an immediate re-index of a knowledge source. Use this when the source content has changed and you do not want to wait for the automatic weekly re-index. The knowledge source status is reset to pending and indexing is queued asynchronously. Requires Plain AI to be enabled on the workspace. # reloadCustomerCardInstance Source: https://www.plain.com/docs/graphql-reference/mutations/reloadCustomerCardInstance Forces a fresh load of a customer card instance, bypassing the cache. Use this when you know your external data has changed and you want to immediately fetch updated card content from your API URL. The response will be a `CustomerCardInstanceLoading`; subscribe to `customerCardInstanceChanges` to receive the loaded or errored result. # removeAdditionalAssignees Source: https://www.plain.com/docs/graphql-reference/mutations/removeAdditionalAssignees Remove one or more additional assignees from a thread. Does not affect the primary assignee. Requires the `thread:unassign` and `thread:read` permissions. # removeCustomerFromCustomerGroups Source: https://www.plain.com/docs/graphql-reference/mutations/removeCustomerFromCustomerGroups Remove a customer from one or more customer groups (up to 25 at once), identified by group ID, key, or external ID. Returns an error if the customer is not currently a member of any of the specified groups. Requires `customerGroupMembership:delete` permission. # removeCustomerFromTenants Source: https://www.plain.com/docs/graphql-reference/mutations/removeCustomerFromTenants Removes a customer from one or more tenants. The customer can be identified by their Plain ID, external ID, or email address. If the customer is not currently a member of a specified tenant the operation is a no-op for that tenant. Requires the `customer:edit` and `customerTenantMembership:delete` permissions. # removeLabels Source: https://www.plain.com/docs/graphql-reference/mutations/removeLabels Remove one or more labels from a thread by label ID. All provided label IDs must belong to the same thread; mixing labels from different threads returns an error. Requires the `label:delete` permission. # removeLabelsFromUser Source: https://www.plain.com/docs/graphql-reference/mutations/removeLabelsFromUser Remove one or more labels from a Plain user (agent) by label ID. Returns the remaining labels still applied to the user after the removal. Requires the `label:delete` permission. # removeMembersFromTier Source: https://www.plain.com/docs/graphql-reference/mutations/removeMembersFromTier Removes one or more tenants or companies from their current tier (up to 25 per call). After removal the member has no tier. Requires the `tierMembership:read` and `tierMembership:delete` permissions. # removeTenantFieldSchemaMapping Source: https://www.plain.com/docs/graphql-reference/mutations/removeTenantFieldSchemaMapping Removes the mapping between a tenant field schema and a built-in Plain concept, disabling any automatic behaviour (such as tier assignment) driven by that field. # removeUserFromActiveBillingRota Source: https://www.plain.com/docs/graphql-reference/mutations/removeUserFromActiveBillingRota Moves a user off the active billing rota, freeing their eng-rota seat for another team member. The user must already hold a billing rota seat. Requires the `billingSeat:edit` permission. # removeWorkspaceAlternateSupportEmailAddress Source: https://www.plain.com/docs/graphql-reference/mutations/removeWorkspaceAlternateSupportEmailAddress Removes an alternate support email address from the workspace's custom domain configuration. # reorderAutoresponders Source: https://www.plain.com/docs/graphql-reference/mutations/reorderAutoresponders Set new order values for one or more autoresponders. You must pass a unique `order` integer and a unique autoresponder ID for each entry; duplicate IDs or duplicate order values are rejected. Only the autoresponders included in the input are repositioned — others are left unchanged. Requires the `autoresponder:edit` permission. # reorderCustomerCardConfigs Source: https://www.plain.com/docs/graphql-reference/mutations/reorderCustomerCardConfigs Updates the display order of one or more customer card configs. Only the configs listed in the input are updated; other configs keep their current order. This allows you to swap two configs or move a single card without specifying the full list. Duplicate order values are permitted and ties are broken by ID. # reorderCustomerSurveys Source: https://www.plain.com/docs/graphql-reference/mutations/reorderCustomerSurveys Updates the display order of one or more customer surveys in a single call. Pass an array of survey ID / order-index pairs; only surveys whose order actually changes are updated. Duplicate survey IDs in the input are rejected. Requires the `customerSurvey:edit` permission. # reorderThreadFieldSchemas Source: https://www.plain.com/docs/graphql-reference/mutations/reorderThreadFieldSchemas Updates the display order of thread field schemas. You only need to include schemas whose order is changing — omitted schemas are left unchanged. # replyToEmail Source: https://www.plain.com/docs/graphql-reference/mutations/replyToEmail Replies to an existing email in a thread, threading the response correctly in email clients. Use inReplyToEmailId to identify the email being replied to. Supports CC and BCC recipients (up to 49 combined) and file attachments. Requires the email:create and email:read permissions. # replyToThread Source: https://www.plain.com/docs/graphql-reference/mutations/replyToThread Send a reply to the customer on a thread using the most appropriate channel automatically. Supports threads where the last inbound message is an email, a Slack message, or a form submission. If the thread has no messages yet, an email is sent to the customer. Requires the `thread:reply` (or channel-specific send) permission. # resolveAgentApproval Source: https://www.plain.com/docs/graphql-reference/mutations/resolveAgentApproval Approves or denies a pending Sidekick tool-use approval request identified by its leaseId. When approved, the agent session automatically resumes and executes the approved tools. When denied, the agent is notified so it can explain the denial to the user. An optional reviewerNote is passed back to the agent in both cases. # resolveCustomerForMSTeamsChannel Source: https://www.plain.com/docs/graphql-reference/mutations/resolveCustomerForMSTeamsChannel Finds or creates a Plain customer associated with the Microsoft Teams users in the given channel, using the workspace's connected MS Teams integration. Useful for bootstrapping a support thread from a Teams channel conversation. # resolveCustomerForSlackChannel Source: https://www.plain.com/docs/graphql-reference/mutations/resolveCustomerForSlackChannel Finds or creates a Plain customer associated with a Slack channel, using the Slack users in that channel to identify the customer. Useful for bootstrapping threads from Slack channels. # scheduleBroadcast Source: https://www.plain.com/docs/graphql-reference/mutations/scheduleBroadcast Queues a broadcast to be sent, moving it from `DRAFT` to `SCHEDULED`. Calling this again on a broadcast that has not started sending changes when it will go out; once the send has started it is rejected. The broadcast must have a sender and at least one channel. A null `scheduledAt` clears the schedule instead, returning the broadcast to `DRAFT`. Requires the `broadcast:send` and `broadcast:read` permissions. # sendBulkEmail Source: https://www.plain.com/docs/graphql-reference/mutations/sendBulkEmail Sends the same email body to multiple threads at once (up to 100 thread IDs per call). Useful for broadcasting updates to a set of customers, for example notifying affected users of an incident. # sendChat Source: https://www.plain.com/docs/graphql-reference/mutations/sendChat Send a chat message from a support agent (or machine user) to a customer on a CHAT-channel thread. Either `text` or at least one `attachmentIds` entry must be provided. If `threadId` is omitted a new thread is created; if supplied the message is appended to the existing thread. An optional `timestamp` (ISO 8601, must be in the past) allows backdating messages when backfilling historical data. Requires the `chat:create` permission and the live-chat billing entitlement. # sendCustomerChat Source: https://www.plain.com/docs/graphql-reference/mutations/sendCustomerChat Send a chat message on behalf of a customer into an existing CHAT-channel thread. Use this in a headless portal integration to forward messages written by the customer in your own UI into Plain. Unlike `sendChat`, `threadId` is required and the caller must be authenticated as a machine user. An optional `timestamp` (ISO 8601, must be in the past) allows backdating messages when backfilling. Requires the `chat:create` permission and the headless-portal billing entitlement. # sendDiscordMessage Source: https://www.plain.com/docs/graphql-reference/mutations/sendDiscordMessage Sends an outbound Discord message on a thread. Requires both a workspace-level Discord channel integration and a personal user auth integration for the sending user. The message is posted into the Discord thread associated with the Plain thread. # sendDiscussionMessage Source: https://www.plain.com/docs/graphql-reference/mutations/sendDiscussionMessage Send a message in an existing discussion. Supersedes sendThreadDiscussionMessage and additionally supports Sidekick AGENT_SESSION discussions. For Slack and email discussions, use attachmentIds for customer-scoped file attachments. For AGENT_SESSION discussions, use workspaceFileIds instead. The message is delivered to the underlying channel (Slack thread reply, email reply, or agent session). # sendMSTeamsMessage Source: https://www.plain.com/docs/graphql-reference/mutations/sendMSTeamsMessage Sends a Microsoft Teams message on a thread. The thread must be associated with a connected MS Teams channel and the workspace must have an active MS Teams integration. # sendNewEmail Source: https://www.plain.com/docs/graphql-reference/mutations/sendNewEmail Sends a new outbound email to a customer, creating a new thread by default. Use threadId to attach the email to an existing thread instead. Supports CC and BCC recipients (up to 49 combined), file attachments, and an optional alternate from address. Requires the email:create and email:read permissions. # sendSlackMessage Source: https://www.plain.com/docs/graphql-reference/mutations/sendSlackMessage Sends a Slack message on a thread. The message appears in the thread's associated Slack channel as a reply or new message. # sendTestBroadcast Source: https://www.plain.com/docs/graphql-reference/mutations/sendTestBroadcast Sends the broadcast to the Slack channels you name, up to 10, so you can see what recipients will get before the real audience does. It goes out through the same pipeline as a real send, under the broadcast's own sender, so what arrives is what any channel would have received — with a notice at the top marking it as a test, since everyone in the channels you choose will see it. Every channel must already be connected to this workspace. They are independent of the broadcast's own audience, which is left untouched: the broadcast needs a sender and a notification title, but it does **not** need any channels of its own, because testing is what you do before choosing them. Only available while the broadcast can still be edited: once its send has started, it can no longer be tested. A test send never changes the broadcast's `status`, and never unlocks or locks editing. Requires the `broadcast:send` permission. # sendThreadDiscussionMessage Source: https://www.plain.com/docs/graphql-reference/mutations/sendThreadDiscussionMessage Send a reply to an existing Slack or email discussion. The message is posted in the original channel (as a Slack thread reply or email reply) and recorded in Plain. For Slack discussions you may optionally provide slackBlocks, set unfurlLinks, or broadcast the reply into the parent channel via replyBroadcast (replyBroadcast cannot be combined with attachmentIds). Prefer sendDiscussionMessage for new integrations. # setCustomerTenants Source: https://www.plain.com/docs/graphql-reference/mutations/setCustomerTenants Replaces the full set of tenant memberships for a customer in a single call. Any tenants not included in the input are removed; any new ones are added. Use this when syncing tenant membership from your own system rather than tracking individual add/remove changes. Requires the `customer:edit`, `customerTenantMembership:create`, and `customerTenantMembership:delete` permissions. # setSlackAutoJoinRules Source: https://www.plain.com/docs/graphql-reference/mutations/setSlackAutoJoinRules Replaces all auto-join rules for a workspace slack channel integration. The provided rules become the complete set of rules for the integration. # setupTenantFieldSchemaMapping Source: https://www.plain.com/docs/graphql-reference/mutations/setupTenantFieldSchemaMapping Maps a tenant field schema to a built-in Plain concept such as `TIER`, enabling automatic tier assignment based on the field's value. Only one schema can be mapped to a given concept at a time. # shareThreadToUserInSlack Source: https://www.plain.com/docs/graphql-reference/mutations/shareThreadToUserInSlack Sends a direct Slack message to a Plain user sharing a link to the given thread. Useful for notifying a teammate about a thread directly in Slack. # snoozeThread Source: https://www.plain.com/docs/graphql-reference/mutations/snoozeThread Snooze a thread for a number of seconds or until the customer replies (set `statusDetail` to `WAITING_FOR_CUSTOMER`). A snoozed thread is automatically unsnoozed when new activity arrives or when the timer expires. Requires the `thread:edit` and `thread:read` permissions. # startServiceAuthorization Source: https://www.plain.com/docs/graphql-reference/mutations/startServiceAuthorization Begin the OAuth authorization flow for a third-party service integration. Returns connection details including a serviceAuthorizationId and an HMAC digest that must be passed to the authorization URL to securely link the callback back to this workspace. After the user completes the OAuth flow in the third-party service, call completeServiceAuthorization to finalize the connection. # syncBusinessHoursSlots Source: https://www.plain.com/docs/graphql-reference/mutations/syncBusinessHoursSlots Replace the workspace's business hours with the provided set of slots. Deprecated — use createBusinessHoursSchedule or updateBusinessHoursSchedule instead, which support multiple named schedules. Only works while the workspace has exactly one business hours schedule; otherwise it returns an error. Requires the `businessHours:edit` permission. # syncUserWorkingHours Source: https://www.plain.com/docs/graphql-reference/mutations/syncUserWorkingHours Replace a user's working hours schedule in full. When `isEnabled` is true, the user's status is automatically switched to ONLINE at the start of each slot and to OFFLINE or AWAY (depending on workspace settings) at the end. Omit `userId` to configure the currently authenticated user's own schedule. # toggleSlackMessageReaction Source: https://www.plain.com/docs/graphql-reference/mutations/toggleSlackMessageReaction Adds or removes a reaction from a slack message timeline entry. # toggleWorkflowRulePublished Source: https://www.plain.com/docs/graphql-reference/mutations/toggleWorkflowRulePublished Toggle the published state of a workflow rule. Published rules are active and will fire automatically; unpublished rules are drafts. # triggerWorkflow Source: https://www.plain.com/docs/graphql-reference/mutations/triggerWorkflow Manually trigger a workflow against a specific thread. Returns the resulting WorkflowExecution so you can track the run's status and step results. # triggerWorkflowRule Source: https://www.plain.com/docs/graphql-reference/mutations/triggerWorkflowRule Manually trigger a workflow rule against a specific thread, bypassing its automatic trigger conditions. Useful for testing rules or applying them on demand. # unarchiveLabelType Source: https://www.plain.com/docs/graphql-reference/mutations/unarchiveLabelType Restores an archived label type so it can be applied to threads again. Requires the `labelType:edit` permission. # unassignThread Source: https://www.plain.com/docs/graphql-reference/mutations/unassignThread Remove the primary assignee from a thread, leaving it unassigned. Requires the `thread:unassign` and `thread:read` permissions. # unmarkCustomerAsSpam Source: https://www.plain.com/docs/graphql-reference/mutations/unmarkCustomerAsSpam Clears the spam flag from a customer, restoring their threads to the inbox and metrics. The `markedAsSpamAt` timestamp is cleared. Requires the `customer:edit` permission. # updateActiveBillingRota Source: https://www.plain.com/docs/graphql-reference/mutations/updateActiveBillingRota Atomically adds and removes multiple users from the active billing rota in a single call. At least one user must be added or removed; the same user cannot appear in both lists. Requires the `billingSeat:edit` permission. # updateAgentSandboxToolPolicy Source: https://www.plain.com/docs/graphql-reference/mutations/updateAgentSandboxToolPolicy Set the approval mode for a single Sidekick tool in this workspace. Persisted as a sparse override; setting a tool to its factory default clears the override. # updateAiToneRules Source: https://www.plain.com/docs/graphql-reference/mutations/updateAiToneRules Updates up to 10 AI tone rules in a single call. Each update item must include the rule ID and at least one field to change (`description` or `isEnabled`). Enabling a rule that would push the total number of enabled rules above 7 returns an error. Returns the full updated rule objects. Requires the `aiToneRule:edit` permission. # updateApiKey Source: https://www.plain.com/docs/graphql-reference/mutations/updateApiKey Update the description and/or permissions of an existing API key. Permissions are replaced in full — pass the complete desired set. You cannot assign permissions you do not hold. Requires the `apiKey:edit` permission. # updateAutoresponder Source: https://www.plain.com/docs/graphql-reference/mutations/updateAutoresponder Update one or more fields on an existing autoresponder. Only fields provided in the input are changed; omitted fields retain their current values. Requires the `autoresponder:edit` permission. # updateBroadcast Source: https://www.plain.com/docs/graphql-reference/mutations/updateBroadcast Updates one or more fields of an existing broadcast. Each field uses a wrapper input — pass `{ value: ... }` to set it or omit it entirely to leave it unchanged. `type` is not updatable. Requires the `broadcast:edit` permission. # updateBroadcastAudience Source: https://www.plain.com/docs/graphql-reference/mutations/updateBroadcastAudience Updates a broadcast audience's name, filters, or both. Editing an audience changes who every broadcast using it will reach on its next send. Requires the `broadcastAudience:edit` permission. # updateBusinessHoursSchedule Source: https://www.plain.com/docs/graphql-reference/mutations/updateBusinessHoursSchedule Update a business hours schedule's name, its slots, or both. Omitted fields are left unchanged; passing an empty `slots` array clears the schedule's business hours. Overlapping and adjacent slots are merged on write. Requires the `businessHours:edit` permission. # updateChatApp Source: https://www.plain.com/docs/graphql-reference/mutations/updateChatApp Update the name or logo of an existing chat app. Only the fields provided in the input are changed. Requires the `chatApp:edit` permission. # updateCompanyTier Source: https://www.plain.com/docs/graphql-reference/mutations/updateCompanyTier Sets the tier for a single company, identified by its Plain ID or domain name. Pass a null `tierIdentifier` to remove the company from its current tier. Use `addMembersToTier` when you need to move multiple companies at once. Requires the `tierMembership:read` and `tierMembership:create` permissions. # updateConnectedDiscordChannel Source: https://www.plain.com/docs/graphql-reference/mutations/updateConnectedDiscordChannel Updates settings for a connected Discord channel, such as enabling or disabling it. Disabled channels will not receive new messages from Plain. # updateConnectedSlackChannel Source: https://www.plain.com/docs/graphql-reference/mutations/updateConnectedSlackChannel Updates the settings of a connected Slack channel, such as its channel type (customer or discussion) or whether it is enabled. # updateCustomRole Source: https://www.plain.com/docs/graphql-reference/mutations/updateCustomRole Updates the name and/or description of an existing custom role. Only the fields provided in the input are changed. Requires the `roles:edit` permission. # updateCustomerCardConfig Source: https://www.plain.com/docs/graphql-reference/mutations/updateCustomerCardConfig Partially updates a customer card config. Only fields that are provided in the input will be changed; omitted fields are left unchanged. Updating `apiUrl` or `apiHeaders` requires the `customerCardConfigApiDetails:edit` permission. Changing the `key` must still result in a unique key within the workspace. # updateCustomerCompany Source: https://www.plain.com/docs/graphql-reference/mutations/updateCustomerCompany Assigns a customer to a different company, or clears their company association. Requires the `customer:edit` permission. # updateCustomerGroup Source: https://www.plain.com/docs/graphql-reference/mutations/updateCustomerGroup Update the name, key, color, or external ID of an existing customer group. At least one field must be provided in the input. Requires `customerGroup:edit` permission. # updateCustomerSurvey Source: https://www.plain.com/docs/graphql-reference/mutations/updateCustomerSurvey Updates an existing customer survey. At least one field must be provided. Partial updates are supported — only the fields you include are changed. Requires the `customerSurvey:edit` permission. # updateEscalationPath Source: https://www.plain.com/docs/graphql-reference/mutations/updateEscalationPath Updates an existing escalation path. All fields are optional — only the fields provided will be changed. If `steps` is provided, it replaces the full list of steps; omit it to leave the current steps unchanged. Returns an error if the escalation path does not exist. Requires the `escalationPath:edit` permission. # updateGeneratedReply Source: https://www.plain.com/docs/graphql-reference/mutations/updateGeneratedReply Record teammate feedback (thumbs up / thumbs down and an optional comment) on a generated reply. Use this to signal whether a suggestion was helpful so Plain can improve future suggestions. Requires the `generatedReply:edit` permission. # updateHelpCenter Source: https://www.plain.com/docs/graphql-reference/mutations/updateHelpCenter Update the settings, branding, or access configuration of an existing help center. Only fields that are provided are updated. Requires the helpCenter:edit permission. # updateHelpCenterArticleGroup Source: https://www.plain.com/docs/graphql-reference/mutations/updateHelpCenterArticleGroup Update the name of an existing article group. Requires the helpCenter:edit permission. # updateHelpCenterCustomDomainName Source: https://www.plain.com/docs/graphql-reference/mutations/updateHelpCenterCustomDomainName Set or clear the custom domain name for a help center. After setting, use verifyHelpCenterCustomDomainName to confirm DNS propagation. Requires the helpCenter:edit permission. # updateHelpCenterIndex Source: https://www.plain.com/docs/graphql-reference/mutations/updateHelpCenterIndex Replace the navigation index (sidebar order and hierarchy) of a help center in a single call. You must supply the hash returned by the helpCenterIndex query — if the index has changed since you read it, the call will fail so you can re-fetch and re-apply your changes. Requires the helpCenter:edit permission. # updateImportJobDefinition Source: https://www.plain.com/docs/graphql-reference/mutations/updateImportJobDefinition Disable the active import job definition for a service integration. This is the only supported update — pass isEnabled: false to stop future sync runs. Returns an error if no enabled definition exists for the given service. # updateInternalNotifications Source: https://www.plain.com/docs/graphql-reference/mutations/updateInternalNotifications Marks one or more internal notifications as read, unread, or archived. Pass the notification IDs to update along with the desired `readAt` and/or `archivedAt` timestamps. Set `readAt` to null to mark a notification as unread; set `archivedAt` to a timestamp to archive it. Returns the updated notifications. Requires the `user:read` permission. # updateLabelType Source: https://www.plain.com/docs/graphql-reference/mutations/updateLabelType Updates properties of an existing label type. Uses field-level wrapper inputs: pass `{ value: ... }` to change a field, or omit the field entirely to leave it unchanged. At least one field besides `labelTypeId` must be provided. Requires the `labelType:edit` permission. # updateMachineUser Source: https://www.plain.com/docs/graphql-reference/mutations/updateMachineUser Updates the name, description, or avatar of an existing machine user. At least one of `fullName`, `publicName`, `description`, or `avatar` must be provided. Requires the `machineUser:edit` permission. # updateMyUser Source: https://www.plain.com/docs/graphql-reference/mutations/updateMyUser Updates profile fields (display name, short name, or avatar) for the currently authenticated human user. Only the fields provided are changed; omitted fields are left unchanged. Not available to machine users. # updateNote Source: https://www.plain.com/docs/graphql-reference/mutations/updateNote Updates the text, markdown, or attachments of an existing note. Requires the `note:edit` permission. # updateSavedThreadsView Source: https://www.plain.com/docs/graphql-reference/mutations/updateSavedThreadsView Updates an existing saved threads view. All fields in the input are optional; only the fields you provide will be changed. Depending on workspace settings, only the view's creator or workspace admins may be allowed to edit a view they did not create. # updateServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/mutations/updateServiceLevelAgreement Update an existing SLA's time target, priority or label filter, business-hours setting, or breach actions. You cannot change an SLA's type after creation. Use the field-level wrapper inputs (e.g. `{ "value": 60 }`) for the fields you want to change and omit the rest. Requires the `serviceLevelAgreement:edit` permission. # updateServiceLevelAgreementPolicy Source: https://www.plain.com/docs/graphql-reference/mutations/updateServiceLevelAgreementPolicy Update an SLA policy and its targets. Pass the full set of targets you want the policy to have: a target of an existing type is updated in place, so live SLA trackers are unaffected, a new type is added, and a type you leave out is removed along with its trackers. Requires the `serviceLevelAgreement:edit` permission. # updateSetting Source: https://www.plain.com/docs/graphql-reference/mutations/updateSetting Create or overwrite a named setting at the given scope. Provide exactly one value field in `SettingValueInput` (boolean, string, number, or stringArray) that matches the expected type for the setting code. Returns the stored setting on success. To clear a value and revert to the scope hierarchy default, use `deleteSetting` instead. # updateSidekickCustomSkill Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickCustomSkill Update a workspace custom skill. Only the provided fields are changed. # updateSidekickGithubConfig Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickGithubConfig Updates which GitHub repositories Sidekick has access to and the operating instructions (workspace-level and per-repo) that guide its behavior. Replaces the full repo selection — omitting a repo removes it. Requires the GitHub service authorization to exist first. # updateSidekickMcpServer Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickMcpServer Update a custom MCP server's name or operating instructions. The server URL and slug are immutable after creation. # updateSidekickPosthogConfig Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickPosthogConfig Updates the operating instructions and default project that guide how Sidekick uses the PostHog integration. Pass null or an empty string to clear either field. # updateSidekickServiceConfig Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickServiceConfig Updates the operating instructions that guide how Sidekick uses a connected service (Datadog, Sentry, Grafana, Linear, Notion, incident.io, Attio, HubSpot, Jira, Granola, LaunchDarkly or Grain), identified by its serviceAuthorizationId. Pass null or an empty string to clear the instructions. GitHub and PostHog have their own configuration shapes — use updateSidekickGithubConfig / updateSidekickPosthogConfig instead. # updateSidekickSettings Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickSettings Updates workspace-level Sidekick settings, such as the custom prompt appended to every session's system prompt. Pass null or an empty string for customPrompt to clear any existing value. # updateSidekickSlackConfig Source: https://www.plain.com/docs/graphql-reference/mutations/updateSidekickSlackConfig Updates configuration for the workspace's Slack Sidekick integration. Currently supports setting custom operating instructions that guide Sidekick's behavior. Omitting operatingInstructions is a no-op; passing null or an empty string clears any existing instructions. Requires the workspaceSlackSidekickIntegration:update permission. # updateSnippet Source: https://www.plain.com/docs/graphql-reference/mutations/updateSnippet Updates one or more fields of an existing snippet. Each field uses a wrapper input — pass `{ value: "..." }` to set it or omit it entirely to leave it unchanged. To remove the snippet's `path` (un-group it) pass `{ value: null }`. Requires the `snippet:edit` permission. # updateTask Source: https://www.plain.com/docs/graphql-reference/mutations/updateTask Update an existing task. Only the fields you include are changed — omitted fields are left as-is. Setting `companyId` clears any existing `tenantId` and vice versa, since a task may be linked to at most one. Requires the `task:edit` permission. # updateTenantTier Source: https://www.plain.com/docs/graphql-reference/mutations/updateTenantTier Sets the tier for a single tenant, identified by its Plain ID or external ID. Pass a null `tierIdentifier` to remove the tenant from its current tier. Use `addMembersToTier` when you need to move multiple tenants at once. Requires the `tierMembership:read` and `tierMembership:create` permissions. # updateThreadAgentStatus Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadAgentStatus Update the AI agent status of a thread (`IN_PROGRESS`, `HANDED_OFF`, or `HANDLED`). Use this to signal that an AI agent has taken over, handed off to a human, or fully resolved the thread. Requires the `thread:edit` permission. # updateThreadChannelAssociationTenantMembershipPolicy Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadChannelAssociationTenantMembershipPolicy Changes how tenants are assigned for an existing thread channel association. Requires the `threadChannelAssociation:edit` permission. # updateThreadEscalationPath Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadEscalationPath Attach a thread to a specific escalation path, or pass `escalationPathId: null` to detach it. An escalation path defines the sequence of users or teams the thread escalates through if nobody responds in time. Requires the `thread:edit` permission. # updateThreadExternalId Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadExternalId Update the external ID of a thread. Pass `externalId: null` to clear it. Requires the `thread:edit` permission. # updateThreadFieldSchema Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadFieldSchema Updates an existing thread field schema. All fields except `key` and `type` are mutable. String fields use wrapper inputs (e.g. `{ value: "..." }`) to distinguish a deliberate null from an omitted value. Requires the `threadFieldSchema:edit` permission. # updateThreadServiceLevelAgreementPolicy Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadServiceLevelAgreementPolicy Assign an SLA policy to a thread. A policy takes precedence over the thread's tier when selecting SLAs. Pass `serviceLevelAgreementPolicyId: null` to detach the policy and fall back to the tier's SLAs. Requires the `thread:edit` permission. # updateThreadSuggestedActionStatus Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadSuggestedActionStatus Accept or dismiss a specific AI-suggested action on a thread's catchup summary. Pass the `suggestedActionId` from the thread's `catchupDetail` and the new `status`. Requires the `thread:edit` permission. # updateThreadTenant Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadTenant Move a thread to a different tenant, or pass `tenantIdentifier: null` to detach it from its current tenant. Requires the `thread:edit` permission. # updateThreadTier Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadTier Assign a thread to a tier, which governs the SLAs applied to it. Pass `tierIdentifier: null` to detach the thread from its current tier. Requires the `thread:edit` permission. # updateThreadTitle Source: https://www.plain.com/docs/graphql-reference/mutations/updateThreadTitle Update the title of a thread. Requires the `thread:edit` permission. # updateTier Source: https://www.plain.com/docs/graphql-reference/mutations/updateTier Updates the name, color, external ID, default priority, or default flag of an existing tier. Only the fields you provide are changed. Requires the `tier:update` permission. # updateUserDefaultSavedThreadsView Source: https://www.plain.com/docs/graphql-reference/mutations/updateUserDefaultSavedThreadsView Sets or clears the default saved threads view for a specific user. Pass null for savedViewId to remove the default. This controls which thread view the user sees when they first open the inbox. # updateWebhookTarget Source: https://www.plain.com/docs/graphql-reference/mutations/updateWebhookTarget Update an existing webhook target. You can change the URL, pause or resume deliveries via `isEnabled`, switch to a newer schema version, change which event types are subscribed to, or replace the custom HTTP headers. Scalar fields use a `{ value: ... }` wrapper so you can omit fields you do not want to change; `eventSubscriptions` and `headers` are full replacements of the previous lists, so include every entry the target should keep. At least one field must be provided. Requires the `webhookTarget:edit` permission. # updateWorkflow Source: https://www.plain.com/docs/graphql-reference/mutations/updateWorkflow Update a workflow's name, trigger configuration, entry step, or published status. To change where a workflow sits in the list, use `moveWorkflow`. # updateWorkflowRule Source: https://www.plain.com/docs/graphql-reference/mutations/updateWorkflowRule Update the name, payload, or display order of an existing workflow rule. # updateWorkflowStep Source: https://www.plain.com/docs/graphql-reference/mutations/updateWorkflowStep Update a single workflow step's configuration, transitions, or canvas position. Replacing `transitions` is a full replacement of the array. # updateWorkspace Source: https://www.plain.com/docs/graphql-reference/mutations/updateWorkspace Update workspace settings such as the display name, logo, or allowed email domain names. At least one field must be provided. Domain names are stored in lowercase. # updateWorkspaceEmailSettings Source: https://www.plain.com/docs/graphql-reference/mutations/updateWorkspaceEmailSettings Updates workspace-level email settings such as whether email is enabled and the list of BCC addresses that are copied on all outbound emails. # upsertCompany Source: https://www.plain.com/docs/graphql-reference/mutations/upsertCompany Creates a new company or updates an existing one identified by `companyId` or `companyDomainName`. The output includes a `result` field of either `CREATED` or `UPDATED` so you can tell which happened. You can pass a bare domain (e.g. `plain.com`) or a full URL and Plain will extract the domain. Requires the `company:create` and `company:edit` permissions. # upsertCustomer Source: https://www.plain.com/docs/graphql-reference/mutations/upsertCustomer Creates or updates a customer identified by email address, external ID, or Plain customer ID. Supply `onCreate` fields for values to set when creating and `onUpdate` fields for values to apply when the customer already exists. The output's `result` field indicates whether the customer was `CREATED`, `UPDATED`, or `NOOP` (existed and no values changed). Requires the `customer:create` and `customer:edit` permissions. # upsertCustomerGroup Source: https://www.plain.com/docs/graphql-reference/mutations/upsertCustomerGroup Create or update a customer group identified by `customerGroupId`, `customerGroupKey`, or `externalId`. If a matching group is found it is updated and the result is `UPDATED`; if data is unchanged the result is `NOOP`; otherwise a new group is created and the result is `CREATED`. Note: using `customerGroupId` as the identifier returns an error if the group does not exist. Requires `customerGroup:create` and `customerGroup:edit` permissions. # upsertHelpCenterArticle Source: https://www.plain.com/docs/graphql-reference/mutations/upsertHelpCenterArticle Create or update a help center article. Omit helpCenterArticleId to create a new article; provide it to update an existing one. The slug is normalized to lowercase and must be unique within the help center. contentHtml is rendered directly in the help center. status defaults to DRAFT when not provided. Requires the helpCenter:edit permission. # upsertMyEmailSignature Source: https://www.plain.com/docs/graphql-reference/mutations/upsertMyEmailSignature Creates or updates the email signature for the currently authenticated user. The signature is appended automatically to outbound emails sent by that user. # upsertRoleScopes Source: https://www.plain.com/docs/graphql-reference/mutations/upsertRoleScopes Sets the thread-visibility scopes for a custom role, replacing any previously configured scopes for the given resource. Each scope condition limits which threads users with this role can see, based on a primitive type (label, tier, channel, tenant, or company) and an access mode. Requires the `roles:edit` permission and the `custom_roles` billing entitlement. # upsertTeamSettings Source: https://www.plain.com/docs/graphql-reference/mutations/upsertTeamSettings Create or update the settings for a team (label type of kind TEAM). If settings do not yet exist for the given team, they are created with defaults (round-robin disabled, max capacity 5); otherwise the existing settings are updated with the supplied values. The labelTypeId must refer to a label type of type TEAM — passing any other label type ID returns a validation error. Requires the `labelType:edit` permission. # upsertTenant Source: https://www.plain.com/docs/graphql-reference/mutations/upsertTenant Creates a new tenant or updates an existing one identified by `externalId` or `tenantId`. Use this to keep Plain's tenant records in sync with the groups or organisations in your own product. The `result` field on the output indicates whether a record was created or updated. Requires the `tenant:read` and `tenant:create` permissions. # upsertTenantField Source: https://www.plain.com/docs/graphql-reference/mutations/upsertTenantField Sets or updates a field value for a specific tenant. Identify the target field using `tenantFieldIdentifier` (tenant ID + external field ID) and pass exactly one value argument matching the schema's `type` (e.g. `stringValue`, `numberValue`, `booleanValue`, `arrayValue`, `dateValue`, or `userReferenceValues`). Requires `tenant:edit` permission. # upsertTenantFieldSchema Source: https://www.plain.com/docs/graphql-reference/mutations/upsertTenantFieldSchema Creates or updates one or more tenant field schemas in a single call. Each schema is identified by the combination of `source` and `externalFieldId` — if a schema with that pair already exists it is updated, otherwise a new one is created. Requires `tenantFieldSchema:create` or `tenantFieldSchema:edit` permission. # upsertThreadField Source: https://www.plain.com/docs/graphql-reference/mutations/upsertThreadField Sets (or updates) a single thread field value on a thread, identified by thread ID and field key. Creates the field if it does not exist, or overwrites the existing value if it does. Requires the `threadField:create` and `threadField:update` permissions. # verifyHelpCenterCustomDomainName Source: https://www.plain.com/docs/graphql-reference/mutations/verifyHelpCenterCustomDomainName Trigger a DNS verification check for the custom domain configured on the help center. Returns an error if the expected TXT record is not yet visible. Requires the helpCenter:edit permission. # verifyWorkspaceEmailDnsSettings Source: https://www.plain.com/docs/graphql-reference/mutations/verifyWorkspaceEmailDnsSettings Triggers Plain to re-check whether the DKIM and return-path DNS records are correctly configured for the workspace's custom email domain. Returns the updated domain settings with the latest verification status. # verifyWorkspaceEmailForwardingSettings Source: https://www.plain.com/docs/graphql-reference/mutations/verifyWorkspaceEmailForwardingSettings Marks whether email forwarding has been configured on the custom domain. Call this after setting up the forwarding rule in your DNS/email provider to update Plain's record of the forwarding status. # activeThreadCluster Source: https://www.plain.com/docs/graphql-reference/queries/activeThreadCluster Returns the cluster that the given thread currently belongs to, or null if the thread has not been assigned to any cluster. Use this to show a customer-support agent which broader topic group a specific thread falls into. This API is in beta and may change without notice. # agentSandboxToolPolicies Source: https://www.plain.com/docs/graphql-reference/queries/agentSandboxToolPolicies The Sidekick tool approval policies for the workspace: every catalog tool with its effective approval mode (per-workspace override merged over the factory default). Optionally filter to a single service (e.g. "plain"). # aiFeedback Source: https://www.plain.com/docs/graphql-reference/queries/aiFeedback Paginated list of the feedback your team has submitted on Plain's AI features, such as a thumbs up or down on an Ari reply, newest first. Use the optional `filters` argument to narrow results by feature, sentiment or submission time. Requires the `aiFeatureFeedback:read` permission. # aiToneRules Source: https://www.plain.com/docs/graphql-reference/queries/aiToneRules Returns the workspace's AI tone rules, which guide how Plain's AI features phrase replies. Use the optional `isEnabled` filter to retrieve only active rules. Pagination is supported via standard `first`/`after` and `last`/`before` cursor arguments, though in practice all rules are returned in a single page. Requires the `aiToneRule:read` permission. # autoresponder Source: https://www.plain.com/docs/graphql-reference/queries/autoresponder Fetch a single autoresponder by its ID. Returns null if no autoresponder with that ID exists. # autoresponders Source: https://www.plain.com/docs/graphql-reference/queries/autoresponders List all autoresponders in the workspace, ordered by their configured priority order. Supports cursor-based pagination. # billingPlans Source: https://www.plain.com/docs/graphql-reference/queries/billingPlans Returns the available billing plans that can be selected for self-serve checkout. Supports standard forward and backward pagination. # broadcast Source: https://www.plain.com/docs/graphql-reference/queries/broadcast Fetches a single broadcast by its ID, or null if no broadcast with that ID exists. Returns soft-deleted broadcasts (where `isDeleted` is true). Requires the `broadcast:read` permission. # broadcastAudience Source: https://www.plain.com/docs/graphql-reference/queries/broadcastAudience Fetches a single broadcast audience by its ID, or null if no audience with that ID exists. Requires the `broadcastAudience:read` permission. # broadcastAudiences Source: https://www.plain.com/docs/graphql-reference/queries/broadcastAudiences Returns a paginated list of the workspace's broadcast audiences, newest first. Soft-deleted audiences are excluded. Requires the `broadcastAudience:read` permission. # broadcastSendTargetRecipients Source: https://www.plain.com/docs/graphql-reference/queries/broadcastSendTargetRecipients Who a send target resolves to right now. Takes the target rather than an id, so it answers for a filter still being written — before an audience is saved, or before a broadcast's target is committed — as readily as for one about to be sent. Point-in-time: the number moves as tenants, tiers and tenant fields change, and as channels are connected or disabled. Resolved through the same path a send uses, so it is what would actually be delivered to rather than an estimate assembled another way. Resolves the target on every call. Requires the `broadcast:read` permission. # broadcasts Source: https://www.plain.com/docs/graphql-reference/queries/broadcasts Returns a paginated list of the workspace's broadcasts, newest first. Soft-deleted broadcasts are excluded. Optionally narrow the results with `filters` (status). Supports standard forward and backward cursor pagination. Requires the `broadcast:read` permission. # businessHoursSchedule Source: https://www.plain.com/docs/graphql-reference/queries/businessHoursSchedule Fetches a single business hours schedule by its ID, or null if no schedule with that ID exists. Requires the `businessHours:read` permission. # businessHoursSchedules Source: https://www.plain.com/docs/graphql-reference/queries/businessHoursSchedules Returns a paginated list of the workspace's business hours schedules, sorted by name. Requires the `businessHours:read` permission. # businessHoursSlots Source: https://www.plain.com/docs/graphql-reference/queries/businessHoursSlots Return all active business hours slots for the workspace, merged across every schedule. Deprecated — use businessHoursSchedules instead, which returns each schedule's slots separately. Requires the `businessHours:read` permission. # chatApp Source: https://www.plain.com/docs/graphql-reference/queries/chatApp Fetch a single chat app by its ID. Returns null if no chat app with that ID exists in the workspace. Requires the `chatApp:read` permission. # chatAppSecret Source: https://www.plain.com/docs/graphql-reference/queries/chatAppSecret Check whether a signing secret exists for a chat app. Returns metadata about the secret (creation time, actor) but never the secret value itself — the raw secret is only returned once, at creation time via `createChatAppSecret`. Returns null if no secret has been created for the given chat app. Requires the `chatAppSecret:read` permission. # chatApps Source: https://www.plain.com/docs/graphql-reference/queries/chatApps List all chat apps in the workspace. Supports cursor-based pagination. Requires the `chatApp:read` permission. # companies Source: https://www.plain.com/docs/graphql-reference/queries/companies Returns a paginated list of all companies in your workspace. Supports cursor-based pagination and optional filtering by ID or deletion status. Requires the `company:read` permission. # company Source: https://www.plain.com/docs/graphql-reference/queries/company Fetches a single company by its ID. Returns null if no company with that ID exists. Requires the `company:read` permission. # connectedDiscordChannels Source: https://www.plain.com/docs/graphql-reference/queries/connectedDiscordChannels Returns a paginated list of Discord channels synced from a specific guild. Use `refreshConnectedDiscordChannels` to pull the latest channel list from Discord before querying. # connectedMSTeamsChannels Source: https://www.plain.com/docs/graphql-reference/queries/connectedMSTeamsChannels Returns a paginated list of Microsoft Teams channels that are connected to this workspace. Supports forward and backward cursor pagination. # connectedSlackChannel Source: https://www.plain.com/docs/graphql-reference/queries/connectedSlackChannel Returns a single connected Slack channel by its Plain ID, or null if not found. # connectedSlackChannels Source: https://www.plain.com/docs/graphql-reference/queries/connectedSlackChannels Gets all slack channels for this workspace, which match the specified filters. # cursorRepositories Source: https://www.plain.com/docs/graphql-reference/queries/cursorRepositories Returns the list of GitHub repositories accessible via the given Cursor integration. Results are fetched live from the Cursor API and cached for up to 5 minutes. Requires the `workspaceCursorIntegration:read` permission. # customRole Source: https://www.plain.com/docs/graphql-reference/queries/customRole Returns a single custom role by its ID, or null if not found. Requires the `roles:read` permission. # customRoles Source: https://www.plain.com/docs/graphql-reference/queries/customRoles Returns all custom roles defined in the workspace. Use this to list the custom roles you have created and inspect their scope definitions. Supports cursor-based pagination. Requires the `roles:read` permission. # customer Source: https://www.plain.com/docs/graphql-reference/queries/customer Fetch a single customer by their Plain customer ID. Returns null if no customer with that ID exists. Requires the `customer:read` permission. # customerByEmail Source: https://www.plain.com/docs/graphql-reference/queries/customerByEmail Fetch a customer by their email address. Returns null if no customer with that email exists. Requires the `customer:read` permission. # customerByExternalId Source: https://www.plain.com/docs/graphql-reference/queries/customerByExternalId Get a customer by its external ID. A customer's external ID is unique within a workspace. # customerCardConfig Source: https://www.plain.com/docs/graphql-reference/queries/customerCardConfig Returns a single customer card config by ID. Returns null if no config with the given ID exists. # customerCardConfigs Source: https://www.plain.com/docs/graphql-reference/queries/customerCardConfigs Returns all customer card configs for the workspace, ordered by their `order` field. # customerCardInstances Source: https://www.plain.com/docs/graphql-reference/queries/customerCardInstances Returns the current customer card instances for a customer, triggering a fresh load for any cards that are expired or in an error state. Cards that are cached and within their TTL are returned immediately as `CustomerCardInstanceLoaded`. Cards that need to be fetched are returned as `CustomerCardInstanceLoading`; subscribe to `customerCardInstanceChanges` to receive the result when loading completes. Pass `threadId` to provide thread context to your card API endpoint. A maximum of 25 card instances will be returned, due to only allowing 25 customer card configs. # customerGroup Source: https://www.plain.com/docs/graphql-reference/queries/customerGroup Fetch a single customer group by its ID. Returns null if no group with the given ID exists in the workspace. # customerGroups Source: https://www.plain.com/docs/graphql-reference/queries/customerGroups Fetch a paginated list of all customer groups in the workspace. Optionally filter by external IDs using the `filters` argument. Uses cursor-based pagination. # customerSurvey Source: https://www.plain.com/docs/graphql-reference/queries/customerSurvey Fetches a single customer survey by its ID. Returns null if no survey with that ID exists. # customerSurveys Source: https://www.plain.com/docs/graphql-reference/queries/customerSurveys Returns a paginated list of all customer surveys configured in the workspace, ordered by their display order. Use this to build management UIs or sync survey configurations. # customers Source: https://www.plain.com/docs/graphql-reference/queries/customers Fetch a paginated list of all customers in the workspace. Supports filtering by group membership, company, spam status and more via `filters`, and ordering via `sortBy`. Use cursor-based pagination (`first`/`after` or `last`/`before`) to page through large result sets. Requires the `customer:read` permission. # deletedThreads Source: https://www.plain.com/docs/graphql-reference/queries/deletedThreads Paginated list of threads that have been deleted. Only threads deleted after the deletion audit log was enabled for your workspace are included. Useful for auditing or syncing deletions to an external system. Requires the `thread:read` permission. # discussion Source: https://www.plain.com/docs/graphql-reference/queries/discussion Fetch a single discussion by its ID. Preferred over threadDiscussion for new integrations. # discussions Source: https://www.plain.com/docs/graphql-reference/queries/discussions List discussions in the workspace, with optional filtering and sorting. Supports cursor-based pagination. Filter by thread, status, creator, last-activity timestamps, source entity, or discussion type. # emailSuppression Source: https://www.plain.com/docs/graphql-reference/queries/emailSuppression Returns the suppression for a specific email address, or null when the address is not suppressed. # enabledAiToneRulesText Source: https://www.plain.com/docs/graphql-reference/queries/enabledAiToneRulesText Returns all currently enabled AI tone rules serialised as a plain-text instruction string that is suitable for injecting into AI prompts. Returns `null` when no rules are enabled or the feature flag is off. Requires the `aiToneRule:read` permission. # escalationPath Source: https://www.plain.com/docs/graphql-reference/queries/escalationPath Fetches a single escalation path by its ID. Returns null if no escalation path with the given ID exists. Requires the `escalationPath:read` permission. # escalationPaths Source: https://www.plain.com/docs/graphql-reference/queries/escalationPaths Returns a paginated list of all escalation paths configured in the workspace. Requires the `escalationPath:read` permission. # generatedReplies Source: https://www.plain.com/docs/graphql-reference/queries/generatedReplies This API is in beta and may change without notice. Returns the current suggested reply candidates for a thread, scoped to the most recent inbound message from the customer or from a machine user. Suggestions submitted via `addGeneratedReply` are always included. Suggestions generated by Plain AI are excluded when suggested responses are disabled or not available for the workspace, or when an externally submitted suggestion exists for the same message. Returns an empty list if the thread has no such message or no suggestion is available. Requires the `generatedReply:read` permission. # getMSTeamsMembersForChannel Source: https://www.plain.com/docs/graphql-reference/queries/getMSTeamsMembersForChannel Fetches the current members of a Microsoft Teams channel directly from the Teams API. Requires a workspace MS Teams integration and calls Microsoft Graph; use this to populate member lists when resolving customers for a channel. # githubUserAuthIntegration Source: https://www.plain.com/docs/graphql-reference/queries/githubUserAuthIntegration Returns the GitHub user authentication integration for the currently authenticated user, or null if no integration exists. # helpCenter Source: https://www.plain.com/docs/graphql-reference/queries/helpCenter Fetch a single help center by ID. Returns null if not found. # helpCenterArticle Source: https://www.plain.com/docs/graphql-reference/queries/helpCenterArticle Fetch a single help center article by ID. Returns null if not found. # helpCenterArticleBySlug Source: https://www.plain.com/docs/graphql-reference/queries/helpCenterArticleBySlug Fetch an article by its URL slug within a specific help center. Slugs are unique per help center. Returns null if no article matches. # helpCenterArticleGroup Source: https://www.plain.com/docs/graphql-reference/queries/helpCenterArticleGroup Fetch a single article group by ID. Returns null if not found. # helpCenterArticleGroupBySlug Source: https://www.plain.com/docs/graphql-reference/queries/helpCenterArticleGroupBySlug Fetch an article group by its URL slug within a specific help center. Returns null if no group matches. # helpCenterIndex Source: https://www.plain.com/docs/graphql-reference/queries/helpCenterIndex Fetch the navigation index for a help center by its ID. Returns null if not found. Use the returned hash when calling updateHelpCenterIndex to avoid clobbering concurrent edits. # helpCenters Source: https://www.plain.com/docs/graphql-reference/queries/helpCenters List all help centers in the workspace. Supports cursor-based pagination and optional filtering. # importJobDefinition Source: https://www.plain.com/docs/graphql-reference/queries/importJobDefinition Fetch the import job definition for a connected service integration. Pass isEnabled: true to return only the currently active definition, or isEnabled: false to return any definition regardless of enabled state. Returns null if no matching definition exists. # importJobs Source: https://www.plain.com/docs/graphql-reference/queries/importJobs List import jobs, optionally filtered by service integration key or import job definition ID. Each job represents a single sync run triggered by an import job definition, and contains per-entity-type runs with their progress and status. # importerTenantLists Source: https://www.plain.com/docs/graphql-reference/queries/importerTenantLists Fetch the available tenant lists (e.g. company lists or account views) from a connected external service such as Attio, HubSpot, or Salesforce. Use this to let users choose which list to sync when setting up an import. Requires a completed service authorization ID. # indexedDocuments Source: https://www.plain.com/docs/graphql-reference/queries/indexedDocuments List indexed documents across your workspace, newest first. Use the `knowledgeSourceId` filter to retrieve only the documents belonging to a specific knowledge source, and the `statuses` filter to retrieve only documents with a given ingestion status. # issueTrackerFields Source: https://www.plain.com/docs/graphql-reference/queries/issueTrackerFields Fetch the configurable fields for a connected issue tracker (e.g. Shortcut, Rootly, incident.io, GitHub). Pass previously selected field values in `selectedFields` so that dependent fields (such as labels that depend on a chosen repository) are populated correctly. Returns the list of fields the caller must or may provide when calling `createIssueTrackerIssue`. Requires the `threadLinkCandidate:search` permission. # knowledgeGap Source: https://www.plain.com/docs/graphql-reference/queries/knowledgeGap Fetch a single knowledge gap by its ID. Returns null if no gap with that ID exists in the workspace. Requires the `knowledgeGap:read` permission. # knowledgeGaps Source: https://www.plain.com/docs/graphql-reference/queries/knowledgeGaps Paginated list of knowledge gaps detected in the workspace. Sort by signal count or recency. Defaults to descending signal count order. Requires the `knowledgeGap:read` permission. # knowledgeSource Source: https://www.plain.com/docs/graphql-reference/queries/knowledgeSource Fetch a single knowledge source by its ID. Returns null if no knowledge source with the given ID exists. # knowledgeSourceCitationsByThread Source: https://www.plain.com/docs/graphql-reference/queries/knowledgeSourceCitationsByThread Returns the knowledge sources cited by AI agent replies across a thread, each linked to the timeline entry it was cited in and carrying a snapshot title (and best-effort url) plus the live cited document when it still exists. Returns an empty list when the thread has no citations or is not visible to the caller. Requires the `thread:read` and `timeline:read` permissions. # knowledgeSources Source: https://www.plain.com/docs/graphql-reference/queries/knowledgeSources List all knowledge sources in the workspace. Use the `type` filter to retrieve only sitemap or single-URL sources. # labelType Source: https://www.plain.com/docs/graphql-reference/queries/labelType Returns a single label type by its ID. Returns null if no label type with that ID exists. Requires the `labelType:read` permission. # labelTypeByExternalId Source: https://www.plain.com/docs/graphql-reference/queries/labelTypeByExternalId Returns a label type by its external ID. Returns null if no match is found. External IDs are unique within a workspace and are set when creating or updating a label type. Requires the `labelType:read` permission. # labelTypes Source: https://www.plain.com/docs/graphql-reference/queries/labelTypes Returns a paginated list of label types in the workspace. By default includes both active and archived label types; pass `filters: { isArchived: false }` to exclude archived ones. Requires the `labelType:read` permission. # linearAppIntegration Source: https://www.plain.com/docs/graphql-reference/queries/linearAppIntegration The workspace-level Linear app integration, if one has been authorised. # machineUser Source: https://www.plain.com/docs/graphql-reference/queries/machineUser Fetches a single machine user by ID. Returns null if no machine user with the given ID exists in the workspace. # machineUsers Source: https://www.plain.com/docs/graphql-reference/queries/machineUsers Returns a paginated list of all machine users in the workspace. Use the optional `filters.type` argument to restrict results to a specific machine user type (e.g. API_USER or AI_AGENT). # myBillingRota Source: https://www.plain.com/docs/graphql-reference/queries/myBillingRota Returns the current billing rota for the workspace, listing which users are actively on-rota and which are off-rota. The rota is used to track which users currently consume an active eng-rota seat. # myBillingSubscription Source: https://www.plain.com/docs/graphql-reference/queries/myBillingSubscription Returns the current workspace billing subscription, including plan, status, trial info, feature entitlements, and credit balances. Returns null if the workspace has no billing account. # myEmailSignature Source: https://www.plain.com/docs/graphql-reference/queries/myEmailSignature Returns the email signature configured for the currently authenticated user, or null if none has been set. # myFavoritePages Source: https://www.plain.com/docs/graphql-reference/queries/myFavoritePages Returns the favorite pages saved by the currently authenticated user, ordered by most recently created first. Each user's favorites are independent — this query only returns pages belonging to the caller. # myInternalNotifications Source: https://www.plain.com/docs/graphql-reference/queries/myInternalNotifications Returns a paginated list of internal notifications for the currently authenticated user. Use the optional `filters` argument to narrow results by read status or creation time. Supports forward and backward cursor-based pagination via `first`/`after` and `last`/`before`. Only available to human users — machine users will receive a forbidden error. # myJiraIntegrationToken Source: https://www.plain.com/docs/graphql-reference/queries/myJiraIntegrationToken Returns the current user's Jira OAuth access token, automatically refreshing it if it is near expiry. Returns null if the user has not connected their Jira account. Requires the `userJiraIntegration:read` permission. # myLinearInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/myLinearInstallationInfo Returns the OAuth installation URL to initiate the Linear authorization flow for the current user. Pass the returned installationUrl to your UI so the user can grant Plain access to their Linear account. The redirectUrl must match the redirect URI registered for the Linear OAuth app; the authorization code delivered there is then passed to createMyLinearIntegration. # myLinearIntegration Source: https://www.plain.com/docs/graphql-reference/queries/myLinearIntegration Returns the current user's Linear integration, or null if no integration has been set up. # myLinearIntegrationToken Source: https://www.plain.com/docs/graphql-reference/queries/myLinearIntegrationToken Returns a short-lived Linear access token for the current user's integration, or null if no integration exists. The token is automatically refreshed when it is close to expiry, so callers always receive a usable credential. Use this token to make Linear API calls on behalf of the authenticated user. # myMSTeamsInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/myMSTeamsInstallationInfo Returns the OAuth installation URL for the current user to connect their personal Microsoft Teams account to Plain. Returns null in `installationUrl` if the workspace does not have an MS Teams workspace integration configured. # myMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/queries/myMSTeamsIntegration Returns the Microsoft Teams integration for the currently authenticated user, or null if the user has not connected their account. # myMachineUser Source: https://www.plain.com/docs/graphql-reference/queries/myMachineUser Returns the machine user that owns the current API key. Only callable with a machine user API key; returns a FORBIDDEN error when called with a human user session. # myPermissions Source: https://www.plain.com/docs/graphql-reference/queries/myPermissions Returns the full list of permission strings granted to the currently authenticated user or machine user in this workspace. Useful for inspecting what actions the caller is authorized to perform. # mySlackInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/mySlackInstallationInfo Returns a Slack OAuth installation URL for the current user to connect their personal Slack notifications integration. Pass this URL to Slack's OAuth flow and exchange the resulting code with createMySlackIntegration. # mySlackIntegration Source: https://www.plain.com/docs/graphql-reference/queries/mySlackIntegration Returns the current user's personal Slack notifications integration, or null if none is connected. # myUser Source: https://www.plain.com/docs/graphql-reference/queries/myUser Returns the full User record for the currently authenticated human user within the current workspace. Returns null if the caller is not a human user or is not a member of a workspace. Not available to machine users. # myUserAccount Source: https://www.plain.com/docs/graphql-reference/queries/myUserAccount Returns the UserAccount for the currently authenticated user, or null if no account has been created yet. Useful during onboarding to check whether account setup is complete. # myWorkspace Source: https://www.plain.com/docs/graphql-reference/queries/myWorkspace Returns the Workspace associated with the current API key or session. Useful for confirming which workspace a request is scoped to. Returns null if no workspace is in context. # myWorkspaceInvites Source: https://www.plain.com/docs/graphql-reference/queries/myWorkspaceInvites Returns all pending workspace invites sent to the currently authenticated user's email address. Use this to let a user see and act on workspaces they have been invited to join. # myWorkspaces Source: https://www.plain.com/docs/graphql-reference/queries/myWorkspaces Returns all workspaces the currently authenticated human user belongs to, paginated. Not available to machine users. Use this to let users switch between workspaces. # permissions Source: https://www.plain.com/docs/graphql-reference/queries/permissions Returns the complete list of all permission strings defined in Plain, sorted alphabetically. Use this to discover valid permission values when building role or API key management UIs. Requires the `permission:read` permission. # publicEventRequestBody Source: https://www.plain.com/docs/graphql-reference/queries/publicEventRequestBody Fetch the full JSON request body that Plain sent (or would send) for a given public event. Returns null if the event has expired — events are retained for 30 days. Use this alongside `webhookDeliveryAttempts` to inspect the exact payload for a failed delivery attempt and replay or debug it. Requires the `webhookTarget:read` permission. # relatedThreads Source: https://www.plain.com/docs/graphql-reference/queries/relatedThreads Find threads that are semantically similar to the given thread, ranked by relevance. Each result includes the thread and a distance score (lower means more similar). Useful for surfacing related support history or finding duplicate issues. Requires the `thread:read` permission. # roles Source: https://www.plain.com/docs/graphql-reference/queries/roles Returns all roles available in the workspace, including both built-in roles (Owner, Admin, Support, Viewer, None) and any custom roles. Supports cursor-based pagination. Requires the `roles:read` permission. # savedThreadsView Source: https://www.plain.com/docs/graphql-reference/queries/savedThreadsView Fetches a single saved threads view by its ID. Returns null if no view with the given ID exists in the workspace. # savedThreadsViews Source: https://www.plain.com/docs/graphql-reference/queries/savedThreadsViews Returns all saved threads views for the workspace, ordered by creation time. Use this to list the views available in your workspace. Supports forward and backward cursor pagination. # searchBroadcasts Source: https://www.plain.com/docs/graphql-reference/queries/searchBroadcasts Searches broadcasts by name (case-insensitive partial match). Soft-deleted broadcasts are excluded. Optionally narrow the results with `filters` (status), which applies on top of the name match. Requires the `broadcast:read` permission. # searchCompanies Source: https://www.plain.com/docs/graphql-reference/queries/searchCompanies Searches companies by name or domain using a case-insensitive partial match. The search term must be at least 2 characters long. Supports cursor-based pagination and optional filtering. Each match is returned as a `CompanySearchResult` that wraps the matched company. Requires the `company:read` permission. # searchCustomers Source: https://www.plain.com/docs/graphql-reference/queries/searchCustomers Search for customers using a case-insensitive partial match across name, short name, email, and external ID. Results are sorted by most recently active first. Best suited for human-driven lookups (e.g. a search box) rather than precise programmatic resolution — use `customerByEmail` or `customerByExternalId` for exact lookups. Optionally narrow the results with `filters` (group membership, company, tenant, Slack channel and more). Requires the `customer:read` permission. # searchKnowledgeSources Source: https://www.plain.com/docs/graphql-reference/queries/searchKnowledgeSources Perform a semantic (vector) search across your workspace's knowledge sources and help center articles. Returns up to `pageSize` results (default 10, max 50) ranked by relevance. Use `options` to restrict results by label type, content type (indexed documents vs help center articles), or to include help center articles that are not publicly accessible. # searchPlainHelpCenter Source: https://www.plain.com/docs/graphql-reference/queries/searchPlainHelpCenter Perform a semantic (vector) search across Plain's own public help center (help.plain.com). Available to every workspace's Sidekick so it can answer questions about how Plain itself works. Read-only and hard-restricted to Plain's public product documentation; it never returns the caller's own data or any other workspace's content. Returns up to `pageSize` results (default 10, max 50) ranked by relevance. # searchSlackUsers Source: https://www.plain.com/docs/graphql-reference/queries/searchSlackUsers Searches for slack users in a slack channel based on a search term. The search term can be part of either the slack's handle or full name. # searchTenants Source: https://www.plain.com/docs/graphql-reference/queries/searchTenants Searches tenants by name (case-insensitive partial match) or by external ID (exact match). The search term must be at least 2 characters long. Returns a paginated list of results. Requires the `tenant:read` permission. # searchThreadLinkCandidates Source: https://www.plain.com/docs/graphql-reference/queries/searchThreadLinkCandidates Searches for external entities (e.g. Jira issues) that can be linked to a thread. Filter by `sourceType` to scope the search to a specific issue tracker, and provide a free-text `searchQuery` to match against issue titles or identifiers. Returns candidates that can then be passed to `createThreadLink`. Requires a connected issue tracker integration for the specified source type. # searchThreadSlackUsers Source: https://www.plain.com/docs/graphql-reference/queries/searchThreadSlackUsers Searches for slack users in a thread based on a search term. The search term can be part of either the slack's handle or full name. # searchThreads Source: https://www.plain.com/docs/graphql-reference/queries/searchThreads Full-text search across thread titles, message contents, and customer names/emails. Accepts optional `ThreadsFilter` to narrow results further. For exact lookups by ID, ref, or external ID use the dedicated queries instead. Requires the `thread:read` permission. # serviceAuthorization Source: https://www.plain.com/docs/graphql-reference/queries/serviceAuthorization Fetch a single completed service authorization by its ID. Returns null if not found or if the authorization is still pending. # serviceAuthorizations Source: https://www.plain.com/docs/graphql-reference/queries/serviceAuthorizations List all completed service authorizations for the workspace. Only authorizations with status CONNECTED or REINSTALL_REQUIRED are returned; pending authorizations are excluded. Optionally filter by serviceIntegrationKey. Supports cursor-based pagination. Requires the `serviceAuthorization:read` permission. # serviceLevelAgreementPolicies Source: https://www.plain.com/docs/graphql-reference/queries/serviceLevelAgreementPolicies Returns the SLA policies in the workspace, sorted by name. Pass `filters` to narrow by name or by the target types a policy holds. Supports cursor-based pagination. Requires the `serviceLevelAgreement:read` permission. # serviceLevelAgreementPolicy Source: https://www.plain.com/docs/graphql-reference/queries/serviceLevelAgreementPolicy Returns a single SLA policy by its Plain ID. Returns null if no policy with that ID exists. Requires the `serviceLevelAgreement:read` permission. # setting Source: https://www.plain.com/docs/graphql-reference/queries/setting Fetch the effective value of a named setting at the given scope. Returns null when the setting has no stored value at that scope and no default applies. Use this to read notification preferences, workflow flags, chat-app configuration, and similar per-scope options. The `code` identifies which setting to read (e.g. `workflow/unassign_thread_after_mark_thread_as_done`) and `scope` pins the context (workspace, user, chat app, Slack channel, etc.). # sidekickCreditBalance Source: https://www.plain.com/docs/graphql-reference/queries/sidekickCreditBalance The workspace's current Sidekick (Plain) credit balance: the monthly allowance grant/used/remaining and when it resets, plus any purchased top-up remaining. Use it to answer how many credits are left. Requires the `billing:read` permission. # sidekickCreditUsageByDay Source: https://www.plain.com/docs/graphql-reference/queries/sidekickCreditUsageByDay Credit usage for the workspace, bucketed by the UTC day each billable item resolved, over the given date range. Covers Sidekick sessions and work done by the workspace's own agents. Use it to show a per-day breakdown of credit consumption. Requires the `billing:read` permission. # sidekickCustomSkill Source: https://www.plain.com/docs/graphql-reference/queries/sidekickCustomSkill A single workspace custom skill, including its instructions, for editing. # sidekickGithubAccessibleRepos Source: https://www.plain.com/docs/graphql-reference/queries/sidekickGithubAccessibleRepos Returns every GitHub repository the Sidekick integration (identified by serviceAuthorizationId) can currently see via its OAuth token. Use this list to let users pick which repos Sidekick should focus on before calling updateSidekickGithubConfig. # sidekickGithubServiceConfig Source: https://www.plain.com/docs/graphql-reference/queries/sidekickGithubServiceConfig Returns the Sidekick GitHub configuration for a workspace: which repositories are selected for Sidekick to use and any workspace-level or per-repo operating instructions. Returns null when no configuration has been saved yet. # sidekickMcpServer Source: https://www.plain.com/docs/graphql-reference/queries/sidekickMcpServer A single custom MCP server by id, or null if it does not exist in this workspace. # sidekickMcpServers Source: https://www.plain.com/docs/graphql-reference/queries/sidekickMcpServers The custom (customer-owned) MCP servers registered for Sidekick in this workspace. # sidekickPosthogServiceConfig Source: https://www.plain.com/docs/graphql-reference/queries/sidekickPosthogServiceConfig Returns the Sidekick PostHog configuration for a workspace, including any operating instructions and the default project the agent queries. Returns null when no configuration has been saved yet. # sidekickServiceConfig Source: https://www.plain.com/docs/graphql-reference/queries/sidekickServiceConfig Returns the Sidekick configuration for a connected service (Datadog, Sentry, Grafana, Linear, Notion, incident.io, Attio, HubSpot, Jira, Granola, LaunchDarkly or Grain), identified by its serviceAuthorizationId. Includes any operating instructions that guide how Sidekick uses the integration. Returns null when no configuration has been saved yet. GitHub and PostHog have their own configuration shapes — use sidekickGithubServiceConfig / sidekickPosthogServiceConfig instead. # sidekickSettings Source: https://www.plain.com/docs/graphql-reference/queries/sidekickSettings Returns workspace-level Sidekick settings, including the custom prompt that is appended to every Sidekick session's system prompt. Always returns an object; fields inside are null when not configured. # sidekickSkills Source: https://www.plain.com/docs/graphql-reference/queries/sidekickSkills Every skill available to Sidekick in this workspace: Plain's system skills plus the workspace's custom skills, each with its effective enabled state. # slackAutoJoinRules Source: https://www.plain.com/docs/graphql-reference/queries/slackAutoJoinRules Gets the auto-join rules for a workspace slack channel integration. Rules that have not yet been saved through `setSlackAutoJoinRules` are read from the legacy prefix/suffix settings and have a null id. # slackUser Source: https://www.plain.com/docs/graphql-reference/queries/slackUser Returns a Slack user within a specific channel, looked up by their Slack user ID. Returns null if the user is not found in that channel. # snippet Source: https://www.plain.com/docs/graphql-reference/queries/snippet Fetches a single snippet by its ID, or null if no snippet with that ID exists. Returns soft-deleted snippets (where `isDeleted` is true). Requires the `snippet:read` permission. # snippets Source: https://www.plain.com/docs/graphql-reference/queries/snippets Returns a paginated list of all snippets in the workspace. Use this to sync or display the full snippet library. Supports standard forward and backward cursor pagination. Requires the `snippet:read` permission. # subscriptionEventTypes Source: https://www.plain.com/docs/graphql-reference/queries/subscriptionEventTypes List every event type that can be subscribed to on a webhook target. Each entry includes the event type identifier and a human-readable description. Use this to discover valid values for `eventSubscriptions` when creating or updating a webhook target. Requires the `subscriptionEventTypes:read` permission. # suggestedLabelTypes Source: https://www.plain.com/docs/graphql-reference/queries/suggestedLabelTypes Returns the PENDING AI-suggested label types awaiting review, most recently created first. Requires the `suggestedLabelType:read` permission. # suggestedSlackTeammates Source: https://www.plain.com/docs/graphql-reference/queries/suggestedSlackTeammates Suggests teammates to invite to Plain, sourced from the members of the workspace's connected Slack discussion channels. Only members of the workspace's own Slack team are included (Slack Connect guests are excluded), and anyone (matched by email, case-insensitive) who is already a member of this workspace or has a pending invite to it is excluded. Returns an empty list when there are no connected, enabled discussion channels for the given slackTeamId (e.g. a Slack Connect channel integration). # task Source: https://www.plain.com/docs/graphql-reference/queries/task Fetch a single task by its ID. Returns null if no task with that ID exists. Requires the `task:read` permission. # taskByRef Source: https://www.plain.com/docs/graphql-reference/queries/taskByRef Fetch a single task by its short human-readable ref (e.g. `T-123`), as displayed in the Plain app. Returns null if no task matches. Requires the `task:read` permission. # tasks Source: https://www.plain.com/docs/graphql-reference/queries/tasks Fetch a paginated list of tasks in the workspace. Use `filters` to narrow results by status, assignee, company, or tenant. Use `sortBy` to order by priority, status, or creation/update time. Requires the `task:read` permission. # teamSettings Source: https://www.plain.com/docs/graphql-reference/queries/teamSettings Fetch the settings for a team (label type of kind TEAM) identified by its label type ID. Returns null if no settings have been configured yet for the team. # tenant Source: https://www.plain.com/docs/graphql-reference/queries/tenant Fetches a single tenant by its Plain-assigned ID. Returns null if no matching tenant is found. Requires the `tenant:read` permission. # tenantFieldSchemas Source: https://www.plain.com/docs/graphql-reference/queries/tenantFieldSchemas Returns the list of tenant field schemas defined in the workspace. Use the `source` and `isVisible` filters to narrow results. Supports cursor-based pagination. # tenants Source: https://www.plain.com/docs/graphql-reference/queries/tenants Returns a paginated list of tenants in the workspace. Use the `filters` argument to narrow by ID, deleted status, or last-updated time. Requires the `tenant:read` permission. # thread Source: https://www.plain.com/docs/graphql-reference/queries/thread Fetch a single thread by its Plain-assigned ID. Returns null if no thread with that ID exists. Requires the `thread:read` permission. # threadByExternalId Source: https://www.plain.com/docs/graphql-reference/queries/threadByExternalId Fetch a thread by the external ID you assigned it, scoped to a specific customer. Because `externalId` is only unique per-customer, both `customerId` and `externalId` are required. Returns null if no match. Requires the `thread:read` permission. # threadByRef Source: https://www.plain.com/docs/graphql-reference/queries/threadByRef Fetch a thread by its human-readable ref (e.g. `T-1234`). Useful when the ref is more convenient to store than the internal ID. Returns null if no match. Requires the `thread:read` permission. # threadBySlackPermalink Source: https://www.plain.com/docs/graphql-reference/queries/threadBySlackPermalink Resolves a Slack message permalink to the Plain thread it belongs to. Returns null if no thread is associated with the given Slack message. # threadCluster Source: https://www.plain.com/docs/graphql-reference/queries/threadCluster Fetches a single thread cluster by its ID. Returns null if no cluster with that ID exists in the current workspace. This API is in beta and may change without notice. # threadClusters Source: https://www.plain.com/docs/graphql-reference/queries/threadClusters Returns all AI-generated thread clusters for the current workspace, sorted by thread count descending. Clusters group semantically similar threads together so you can spot trends and recurring issues at a glance. The optional `variant` argument selects which clustering model run to return; omit it to receive the default variant. This API is in beta and may change without notice. # threadClustersPaginated Source: https://www.plain.com/docs/graphql-reference/queries/threadClustersPaginated Returns a paginated list of AI-generated thread clusters for the current workspace. Use `filters` to narrow results by company, tenant, or clustering variant. Supports standard cursor-based pagination via `first`/`after` and `last`/`before`. Requires the `thread:read` permission. This API is in beta and may change without notice. # threadDiscussion Source: https://www.plain.com/docs/graphql-reference/queries/threadDiscussion Fetch a single discussion by its ID. Returns null if no discussion with the given ID exists. # threadFieldSchema Source: https://www.plain.com/docs/graphql-reference/queries/threadFieldSchema Fetches a single thread field schema by its ID. Returns null if no schema with the given ID exists. Selecting the `createdBy`/`updatedBy` actor down to its `user` additionally requires the `user:read` permission. # threadFieldSchemas Source: https://www.plain.com/docs/graphql-reference/queries/threadFieldSchemas Returns all thread field schemas defined in the workspace, paginated. Use this to discover which custom fields exist and their configuration before reading or writing thread field values. Selecting the `createdBy`/`updatedBy` actor down to its `user` additionally requires the `user:read` permission; a token without it can query an empty workspace but starts failing once a schema exists and that selection is present. # threadHeatmapMetric Source: https://www.plain.com/docs/graphql-reference/queries/threadHeatmapMetric Fetch a heatmap metric for threads with filter support, distributing thread activity across a 7-day × 24-hour grid. Unlike the legacy `heatmapMetric`, this query uses the unified `ThreadMetricFilters` input for consistent filtering by label, tier, assignee, and more. Requires `metrics:read`; filtering `assignedToUser` to anyone other than the caller additionally requires `metricsAgent:read`. # threadLinkGroups Source: https://www.plain.com/docs/graphql-reference/queries/threadLinkGroups Returns a paginated list of thread link groups, each representing a distinct external entity (e.g. a Linear issue or Jira ticket) that is linked to one or more threads. Use this to build views that aggregate threads by a shared linked issue. Supports filtering by status, specific group IDs, company, or tier. # threadSingleValueMetric Source: https://www.plain.com/docs/graphql-reference/queries/threadSingleValueMetric Fetch an aggregate (single-value) metric for threads with rich filter and group-by support. Returns one value per group bucket for the specified date range and `SingleValueMetricName`, making it suitable for summary dashboards or leaderboard-style breakdowns by assignee, tier, or label type. Requires `metrics:read`; grouping by assignee or filtering `assignedToUser` to anyone other than the caller additionally requires `metricsAgent:read`. # threadSlackUser Source: https://www.plain.com/docs/graphql-reference/queries/threadSlackUser Returns a Slack user associated with the given thread, looked up by their Slack user ID. Returns null if the user is not found in that thread's Slack context. # threadTimeSeriesMetric Source: https://www.plain.com/docs/graphql-reference/queries/threadTimeSeriesMetric Fetch a time-series metric for threads with rich filter and group-by support. Choose a `TimeSeriesMetricName` (e.g. `threads_created_count`, `threads_first_response_time__p50`), specify a mandatory date range and bucketing interval, and optionally group results by assignee, company, tier, label type, and more. This is the preferred reporting query when you need server-side filtering across thread attributes. Requires `metrics:read`; grouping by assignee or filtering `assignedToUser` to anyone other than the caller additionally requires `metricsAgent:read`. # threads Source: https://www.plain.com/docs/graphql-reference/queries/threads List threads with optional filtering and sorting, returned as a paginated connection. Supports rich filters (status, assignee, customer, label, priority, date ranges, tenant, tier, thread fields, and more) and multiple sort orders. Use this query to build inbox-style views or to export threads in bulk. Requires the `thread:read` permission. # threadsByExternalId Source: https://www.plain.com/docs/graphql-reference/queries/threadsByExternalId Fetch all threads that share the given external ID, returned as a paginated connection. Unlike `threadByExternalId`, this is not scoped to a customer: because `externalId` is only unique per-customer, the same external ID can appear on threads belonging to different customers, and this query returns all of them. Returns an empty connection if there are no matches. Requires the `thread:read` permission. # tier Source: https://www.plain.com/docs/graphql-reference/queries/tier Returns a single tier by its Plain ID. Returns null if no tier with that ID exists. Requires the `tier:read` permission. # tiers Source: https://www.plain.com/docs/graphql-reference/queries/tiers Returns all tiers in the workspace, sorted by creation date. Supports cursor-based pagination. Requires the `tier:read` permission. # timelineEntries Source: https://www.plain.com/docs/graphql-reference/queries/timelineEntries Returns a paginated list of all timeline entries for a customer, ordered from oldest to newest. Timeline entries include every event, message, note, and automated activity that has occurred across all of the customer's threads. Supports cursor-based pagination via `first`/`after` and `last`/`before` arguments. # timelineEntry Source: https://www.plain.com/docs/graphql-reference/queries/timelineEntry Fetches a single timeline entry by its ID within a customer's timeline. Returns null if the entry does not exist. # user Source: https://www.plain.com/docs/graphql-reference/queries/user Fetch a single workspace member by their ID. Returns null if no user with that ID exists. Requires the `user:read` permission. # userAuthDiscordChannelInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/userAuthDiscordChannelInstallationInfo Returns the Discord OAuth URL for a user to personally authenticate with Discord. Individual users must complete this flow (in addition to the workspace-level integration) before they can send Discord messages on behalf of themselves. After authorization, Discord redirects back to `redirectUrl` with an `authCode` for `createUserAuthDiscordChannelIntegration`. # userAuthDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/queries/userAuthDiscordChannelIntegration Returns the current user's personal Discord authentication for a specific guild, or null if the user has not connected their Discord account to that guild. # userAuthDiscordChannelIntegrations Source: https://www.plain.com/docs/graphql-reference/queries/userAuthDiscordChannelIntegrations Returns a paginated list of all personal Discord authentication integrations for the current user across all guilds. # userAuthSlackInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/userAuthSlackInstallationInfo Returns a Slack OAuth installation URL for the current user to connect their user-auth Slack integration. Optionally scoped to a specific Slack workspace. Pass the resulting code to createUserAuthSlackIntegration. # userAuthSlackIntegration Source: https://www.plain.com/docs/graphql-reference/queries/userAuthSlackIntegration Returns the current user's user-auth Slack integration for the given Slack workspace, or null if not connected. Used for integrations that send messages as the user rather than as a bot. # userAuthSlackIntegrationByThreadId Source: https://www.plain.com/docs/graphql-reference/queries/userAuthSlackIntegrationByThreadId Returns the current user's user-auth Slack integration for the Slack workspace associated with the given thread, or null if not connected. # userByEmail Source: https://www.plain.com/docs/graphql-reference/queries/userByEmail Fetch a workspace member by their email address. Returns null if no match is found. Deleted users are also returned — check the `isDeleted`, `deletedAt`, and `deletedBy` fields to determine whether the user has been removed. Requires the `user:read` permission. # userSlackChannelMemberships Source: https://www.plain.com/docs/graphql-reference/queries/userSlackChannelMemberships Returns the Slack channels the current user belongs to within the given Slack workspace. Useful for populating channel pickers in UI integrations. # users Source: https://www.plain.com/docs/graphql-reference/queries/users List all human members of the workspace, with optional filters to narrow results by role assignability. Supports cursor-based pagination. Requires the `user:read` permission. # webhookDeliveryAttempts Source: https://www.plain.com/docs/graphql-reference/queries/webhookDeliveryAttempts List delivery attempts for a webhook target, newest first. Each attempt records the event that was delivered, when it was attempted, how long it took, and whether it succeeded or failed. Use the optional `filters` argument to narrow results by event type or result status — useful for surfacing recent failures in your own observability tooling. Requires the `webhookTarget:read` permission. # webhookTarget Source: https://www.plain.com/docs/graphql-reference/queries/webhookTarget Fetch a single webhook target by its ID. Returns null if no target with that ID exists in the workspace. Requires the `webhookTarget:read` permission. # webhookTargets Source: https://www.plain.com/docs/graphql-reference/queries/webhookTargets List all webhook targets registered in the workspace, paginated. Returns every endpoint Plain is configured to deliver events to. Requires the `webhookTarget:read` permission. # webhookVersions Source: https://www.plain.com/docs/graphql-reference/queries/webhookVersions List all available webhook schema versions. Use this to discover which versions you can pin a webhook target to, and to check whether a version you are already using has been deprecated. Requires the `webhookTarget:read` permission. # workOSConfiguration Source: https://www.plain.com/docs/graphql-reference/queries/workOSConfiguration Returns short-lived WorkOS admin portal URLs and an embeddable widget token so workspace admins can configure SSO, directory sync, and domain verification. Each URL is a single-use link generated on the fly by WorkOS; fetch this query immediately before redirecting the user. Requires the `workspace:edit` permission and an active SSO entitlement (Frontier plan or above). Returns null if the workspace has no WorkOS organization configured. # workflow Source: https://www.plain.com/docs/graphql-reference/queries/workflow Get a workflow by id. Returns null if no workflow with the given ID exists. Workflows are the step-based automation model that supports conditions, actions, and wait steps connected in a graph. # workflowCapabilities Source: https://www.plain.com/docs/graphql-reference/queries/workflowCapabilities Returns which blocks (condition/action/wait steps) are available for a workflow of the given trigger type. The builder UI sources its palette from this so the allow-list lives in the backend, not hardcoded in the UI. E.g. SCHEDULE workflows have no thread, so they allow no conditions/waits and only a restricted set of action types. # workflowExecution Source: https://www.plain.com/docs/graphql-reference/queries/workflowExecution Get a single workflow execution by id. Returns null if no execution with the given ID exists. Use this to inspect the status, timing, and per-step results of a specific run. # workflowExecutions Source: https://www.plain.com/docs/graphql-reference/queries/workflowExecutions List executions for a specific workflow, paginated. Use this to audit the run history of a workflow and check for failures. # workflowExecutionsByEntity Source: https://www.plain.com/docs/graphql-reference/queries/workflowExecutionsByEntity List workflow executions filtered by the entity they ran against (e.g. a specific thread), paginated. Useful for showing all automation that has fired on a given thread. Optionally narrow further by workflow ID or execution status. # workflowExecutionsForWorkspace Source: https://www.plain.com/docs/graphql-reference/queries/workflowExecutionsForWorkspace List executions across every workflow in the workspace, newest first, paginated. Use this for a workspace-wide view of what automation has been doing, or narrow it with `filters` — by workflow, by the entity a run fired against, or by state. Executions that have not started yet sort to the top. # workflowRule Source: https://www.plain.com/docs/graphql-reference/queries/workflowRule Get a workflow rule by id. Returns null if no rule with the given ID exists. Workflow rules are the older, condition-plus-action configuration model; see `workflow` for the newer step-based model. # workflowRules Source: https://www.plain.com/docs/graphql-reference/queries/workflowRules List all workflow rules in the workspace, paginated. Rules are returned in their configured display order. Use `workflowRule` to fetch a single rule by ID. # workflowShareLink Source: https://www.plain.com/docs/graphql-reference/queries/workflowShareLink Fetch a workflow share link by its token. Returns null if no share link with the given token exists. # workflowTemplate Source: https://www.plain.com/docs/graphql-reference/queries/workflowTemplate Null if no template with that ID is published. Deprecated templates still resolve here, which is what keeps existing install links working. Needs an authenticated caller and nothing more. # workflowTemplateGallery Source: https://www.plain.com/docs/graphql-reference/queries/workflowTemplateGallery Published templates for the gallery, metadata only — deprecated ones are already absent because the templates repo omits them. Use `workflowTemplate` for one with its workflows. Needs an authenticated caller and nothing more: templates are one published document, identical for every workspace, so there is nothing to scope by permission. # workflows Source: https://www.plain.com/docs/graphql-reference/queries/workflows List workflows in the workspace, paginated. Use `filters` to narrow results by trigger type (MANUAL, EVENTS or SCHEDULE), published status, or the events an `events` trigger listens for. Ordered by `position` ascending unless `sortBy` says otherwise. # workspace Source: https://www.plain.com/docs/graphql-reference/queries/workspace Fetch a workspace by its ID. Returns null if the workspace does not exist or the caller does not have access to it. # workspaceChatSettings Source: https://www.plain.com/docs/graphql-reference/queries/workspaceChatSettings Returns the workspace-level chat settings, including whether the live-chat channel is enabled for this workspace. # workspaceCursorIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceCursorIntegration Returns the workspace's Cursor integration, or null if none has been configured. # workspaceDiscordChannelInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/workspaceDiscordChannelInstallationInfo Returns the Discord OAuth installation URL needed to connect a Discord server (guild) to this workspace. Redirect the user to the returned URL to begin the OAuth flow; after authorization Discord will redirect back to the provided `redirectUrl` with an `authCode` you can pass to `createWorkspaceDiscordChannelIntegration`. # workspaceDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceDiscordChannelIntegration Fetches a single workspace Discord channel integration by its ID. Returns null if no integration with that ID exists. # workspaceDiscordChannelIntegrations Source: https://www.plain.com/docs/graphql-reference/queries/workspaceDiscordChannelIntegrations Returns a paginated list of all Discord server (guild) channel integrations connected to this workspace. # workspaceDiscordIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceDiscordIntegration Fetches a single webhook-based workspace Discord integration by its ID. Returns null if not found. # workspaceDiscordIntegrations Source: https://www.plain.com/docs/graphql-reference/queries/workspaceDiscordIntegrations Returns a paginated list of all webhook-based Discord integrations configured for this workspace. # workspaceEmailSettings Source: https://www.plain.com/docs/graphql-reference/queries/workspaceEmailSettings Returns the workspace's email settings, including whether email is enabled, any custom domain configuration, and BCC addresses. # workspaceHmac Source: https://www.plain.com/docs/graphql-reference/queries/workspaceHmac Returns the workspace's HMAC configuration, including the secret used to sign outbound webhook and HTTP-request payloads. Returns null if no secret has been generated yet. Requires the `workspaceHmac:read` permission. # workspaceInvites Source: https://www.plain.com/docs/graphql-reference/queries/workspaceInvites Returns all pending invites for the current workspace. Use this to view outstanding invitations and their status from an admin perspective. # workspaceLinearInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/workspaceLinearInstallationInfo Builds the Linear OAuth installation URL for the app actor flow (actor=app). # workspaceMSTeamsInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/workspaceMSTeamsInstallationInfo Returns the Microsoft Teams admin-consent URL that a workspace administrator must visit to authorize Plain's bot for the workspace's Azure AD tenant. Pass the URL the user should be redirected to after consent as `redirectUrl`. If the workspace already has an integration, the URL is scoped to that tenant to prevent accidentally consenting in the wrong one. # workspaceMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceMSTeamsIntegration Returns the workspace-level Microsoft Teams integration, or null if none has been created yet. # workspaceSlackChannelInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackChannelInstallationInfo Returns a Slack OAuth installation URL for connecting a workspace Slack channel integration. Pass this URL to Slack's OAuth flow and exchange the resulting code with createWorkspaceSlackChannelIntegration. # workspaceSlackChannelIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackChannelIntegration Returns a single workspace Slack channel integration by ID, or null if not found. # workspaceSlackChannelIntegrations Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackChannelIntegrations Returns a paginated list of all workspace Slack channel integrations for this workspace. # workspaceSlackInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackInstallationInfo Returns a Slack OAuth installation URL for connecting a workspace-level Slack notifications integration. Pass this URL to Slack's OAuth flow and exchange the resulting code with createWorkspaceSlackIntegration. # workspaceSlackIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackIntegration Returns a single workspace-level Slack notifications integration by ID, or null if not found. # workspaceSlackIntegrations Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackIntegrations Returns a paginated list of all workspace-level Slack notifications integrations for this workspace. # workspaceSlackSidekickInstallationInfo Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackSidekickInstallationInfo Returns the OAuth installation URL to begin installing Plain's Sidekick AI agent into your Slack workspace. Pass the returned URL to your users to redirect them through Slack's OAuth flow; on completion, pass the resulting auth code to createWorkspaceSlackSidekickIntegration. # workspaceSlackSidekickIntegration Source: https://www.plain.com/docs/graphql-reference/queries/workspaceSlackSidekickIntegration Returns the current workspace's Slack Sidekick integration, or null if Sidekick has not been installed. Requires the workspaceSlackSidekickIntegration:read permission. # AcceptSuggestedLabelTypesInput Source: https://www.plain.com/docs/graphql-reference/types/AcceptSuggestedLabelTypesInput # AcceptSuggestedLabelTypesOutput Source: https://www.plain.com/docs/graphql-reference/types/AcceptSuggestedLabelTypesOutput # AcceptWorkspaceInviteInput Source: https://www.plain.com/docs/graphql-reference/types/AcceptWorkspaceInviteInput # AcceptWorkspaceInviteOutput Source: https://www.plain.com/docs/graphql-reference/types/AcceptWorkspaceInviteOutput # Actor Source: https://www.plain.com/docs/graphql-reference/types/Actor # ActorConnection Source: https://www.plain.com/docs/graphql-reference/types/ActorConnection # ActorEdge Source: https://www.plain.com/docs/graphql-reference/types/ActorEdge # AddAdditionalAssigneesInput Source: https://www.plain.com/docs/graphql-reference/types/AddAdditionalAssigneesInput # AddAdditionalAssigneesOutput Source: https://www.plain.com/docs/graphql-reference/types/AddAdditionalAssigneesOutput # AddCustomerToCustomerGroupsInput Source: https://www.plain.com/docs/graphql-reference/types/AddCustomerToCustomerGroupsInput # AddCustomerToCustomerGroupsOutput Source: https://www.plain.com/docs/graphql-reference/types/AddCustomerToCustomerGroupsOutput # AddCustomerToTenantsInput Source: https://www.plain.com/docs/graphql-reference/types/AddCustomerToTenantsInput # AddCustomerToTenantsOutput Source: https://www.plain.com/docs/graphql-reference/types/AddCustomerToTenantsOutput # AddGeneratedReplyInput Source: https://www.plain.com/docs/graphql-reference/types/AddGeneratedReplyInput # AddGeneratedReplyOutput Source: https://www.plain.com/docs/graphql-reference/types/AddGeneratedReplyOutput # AddLabelsInput Source: https://www.plain.com/docs/graphql-reference/types/AddLabelsInput # AddLabelsOutput Source: https://www.plain.com/docs/graphql-reference/types/AddLabelsOutput # AddLabelsToUserInput Source: https://www.plain.com/docs/graphql-reference/types/AddLabelsToUserInput # AddLabelsToUserOutput Source: https://www.plain.com/docs/graphql-reference/types/AddLabelsToUserOutput # AddMembersToTierInput Source: https://www.plain.com/docs/graphql-reference/types/AddMembersToTierInput # AddMembersToTierOutput Source: https://www.plain.com/docs/graphql-reference/types/AddMembersToTierOutput # AddUserToActiveBillingRotaInput Source: https://www.plain.com/docs/graphql-reference/types/AddUserToActiveBillingRotaInput # AddUserToActiveBillingRotaOutput Source: https://www.plain.com/docs/graphql-reference/types/AddUserToActiveBillingRotaOutput # AddWorkspaceAlternateSupportEmailAddressInput Source: https://www.plain.com/docs/graphql-reference/types/AddWorkspaceAlternateSupportEmailAddressInput # AddWorkspaceAlternateSupportEmailAddressOutput Source: https://www.plain.com/docs/graphql-reference/types/AddWorkspaceAlternateSupportEmailAddressOutput # AgentApprovalDecision Source: https://www.plain.com/docs/graphql-reference/types/AgentApprovalDecision Subset of AgentApprovalStatus valid as a resolution input (excludes PENDING). # AgentApprovalStatus Source: https://www.plain.com/docs/graphql-reference/types/AgentApprovalStatus # AgentSandboxToolMode Source: https://www.plain.com/docs/graphql-reference/types/AgentSandboxToolMode When Sidekick is allowed to use a tool: - NOT_REQUIRED: Sidekick runs the tool directly. - APPROVAL_REQUIRED: Sidekick must request human approval before running it. - DISABLED: the tool is listed to Sidekick but every call is rejected. # AgentSandboxToolPolicy Source: https://www.plain.com/docs/graphql-reference/types/AgentSandboxToolPolicy The resolved approval policy for one Sidekick tool: its effective mode plus the factory default it derives from. # AgentStatus Source: https://www.plain.com/docs/graphql-reference/types/AgentStatus # AgentStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/AgentStatusDetail # AgentStatusDetailHandedOff Source: https://www.plain.com/docs/graphql-reference/types/AgentStatusDetailHandedOff # AgentStatusDetailHandled Source: https://www.plain.com/docs/graphql-reference/types/AgentStatusDetailHandled # AgentStatusDetailInProgress Source: https://www.plain.com/docs/graphql-reference/types/AgentStatusDetailInProgress # AgentStatusFilter Source: https://www.plain.com/docs/graphql-reference/types/AgentStatusFilter # AiAgentFeedbackDetails Source: https://www.plain.com/docs/graphql-reference/types/AiAgentFeedbackDetails # AiFeatureFeedbackDetails Source: https://www.plain.com/docs/graphql-reference/types/AiFeatureFeedbackDetails # AiFeedback Source: https://www.plain.com/docs/graphql-reference/types/AiFeedback A single piece of feedback a teammate submitted on a Plain AI feature result. # AiFeedbackConnection Source: https://www.plain.com/docs/graphql-reference/types/AiFeedbackConnection # AiFeedbackEdge Source: https://www.plain.com/docs/graphql-reference/types/AiFeedbackEdge # AiFeedbackFeature Source: https://www.plain.com/docs/graphql-reference/types/AiFeedbackFeature The Plain AI feature a piece of feedback relates to. # AiFeedbackFilter Source: https://www.plain.com/docs/graphql-reference/types/AiFeedbackFilter # AiFeedbackSentiment Source: https://www.plain.com/docs/graphql-reference/types/AiFeedbackSentiment # AiToneRule Source: https://www.plain.com/docs/graphql-reference/types/AiToneRule # AiToneRuleConnection Source: https://www.plain.com/docs/graphql-reference/types/AiToneRuleConnection # AiToneRuleEdge Source: https://www.plain.com/docs/graphql-reference/types/AiToneRuleEdge # AiToneRuleUpdate Source: https://www.plain.com/docs/graphql-reference/types/AiToneRuleUpdate # AiToneRulesFilter Source: https://www.plain.com/docs/graphql-reference/types/AiToneRulesFilter # ApiKey Source: https://www.plain.com/docs/graphql-reference/types/ApiKey # ApiKeyConnection Source: https://www.plain.com/docs/graphql-reference/types/ApiKeyConnection # ApiKeyEdge Source: https://www.plain.com/docs/graphql-reference/types/ApiKeyEdge # ApiKeyImpersonationAllowList Source: https://www.plain.com/docs/graphql-reference/types/ApiKeyImpersonationAllowList The workspace users, roles and custom roles an API key may reply as. # ApiKeyImpersonationAllowListInput Source: https://www.plain.com/docs/graphql-reference/types/ApiKeyImpersonationAllowListInput # ArchiveLabelTypeInput Source: https://www.plain.com/docs/graphql-reference/types/ArchiveLabelTypeInput # ArchiveLabelTypeOutput Source: https://www.plain.com/docs/graphql-reference/types/ArchiveLabelTypeOutput # AriKnowledgeGapSignal Source: https://www.plain.com/docs/graphql-reference/types/AriKnowledgeGapSignal # AssignRolesToUserInput Source: https://www.plain.com/docs/graphql-reference/types/AssignRolesToUserInput # AssignRolesToUserOutput Source: https://www.plain.com/docs/graphql-reference/types/AssignRolesToUserOutput # AssignThreadInput Source: https://www.plain.com/docs/graphql-reference/types/AssignThreadInput # AssignThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/AssignThreadOutput # Attachment Source: https://www.plain.com/docs/graphql-reference/types/Attachment # AttachmentDownloadUrl Source: https://www.plain.com/docs/graphql-reference/types/AttachmentDownloadUrl # AttachmentType Source: https://www.plain.com/docs/graphql-reference/types/AttachmentType # AttachmentUploadUrl Source: https://www.plain.com/docs/graphql-reference/types/AttachmentUploadUrl # AttachmentVirusScanResult Source: https://www.plain.com/docs/graphql-reference/types/AttachmentVirusScanResult # Autoresponder Source: https://www.plain.com/docs/graphql-reference/types/Autoresponder # AutoresponderBusinessHoursCondition Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderBusinessHoursCondition Condition that matches threads based on whether the thread was created outside configured business hours. # AutoresponderCondition Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderCondition # AutoresponderConditionInput Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderConditionInput # AutoresponderConnection Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderConnection # AutoresponderEdge Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderEdge # AutoresponderLabelCondition Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderLabelCondition Condition that matches threads that have at least one of the specified labels applied. # AutoresponderMessageSource Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderMessageSource The channel through which an inbound thread was created. Used to restrict which autoresponders are eligible to fire. # AutoresponderOrderInput Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderOrderInput # AutoresponderPrioritiesCondition Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderPrioritiesCondition Condition that matches threads at one of the specified priority levels. # AutoresponderSupportEmailsCondition Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderSupportEmailsCondition Condition that restricts the autoresponder to threads received on specific support email addresses. # AutoresponderTierCondition Source: https://www.plain.com/docs/graphql-reference/types/AutoresponderTierCondition Condition that matches threads belonging to a specific tier. # BeforeBreachAction Source: https://www.plain.com/docs/graphql-reference/types/BeforeBreachAction A breach action that triggers a notification a set number of minutes before the SLA deadline is reached. # BeforeBreachActionInput Source: https://www.plain.com/docs/graphql-reference/types/BeforeBreachActionInput # BillingCreditBalance Source: https://www.plain.com/docs/graphql-reference/types/BillingCreditBalance # BillingCreditBalanceType Source: https://www.plain.com/docs/graphql-reference/types/BillingCreditBalanceType # BillingFeatureEntitlement Source: https://www.plain.com/docs/graphql-reference/types/BillingFeatureEntitlement # BillingInterval Source: https://www.plain.com/docs/graphql-reference/types/BillingInterval # BillingIntervalUnit Source: https://www.plain.com/docs/graphql-reference/types/BillingIntervalUnit # BillingMonthlyAllowanceCreditBalance Source: https://www.plain.com/docs/graphql-reference/types/BillingMonthlyAllowanceCreditBalance # BillingPlan Source: https://www.plain.com/docs/graphql-reference/types/BillingPlan # BillingPlanChangePreview Source: https://www.plain.com/docs/graphql-reference/types/BillingPlanChangePreview # BillingPlanConnection Source: https://www.plain.com/docs/graphql-reference/types/BillingPlanConnection # BillingPlanEdge Source: https://www.plain.com/docs/graphql-reference/types/BillingPlanEdge # BillingPlanKey Source: https://www.plain.com/docs/graphql-reference/types/BillingPlanKey # BillingRota Source: https://www.plain.com/docs/graphql-reference/types/BillingRota # BillingSeatType Source: https://www.plain.com/docs/graphql-reference/types/BillingSeatType # BillingSubscription Source: https://www.plain.com/docs/graphql-reference/types/BillingSubscription # BillingSubscriptionStatus Source: https://www.plain.com/docs/graphql-reference/types/BillingSubscriptionStatus # BillingTopupCreditBalance Source: https://www.plain.com/docs/graphql-reference/types/BillingTopupCreditBalance # BooleanInput Source: https://www.plain.com/docs/graphql-reference/types/BooleanInput # BooleanSetting Source: https://www.plain.com/docs/graphql-reference/types/BooleanSetting A boolean setting # BreachAction Source: https://www.plain.com/docs/graphql-reference/types/BreachAction # BreachActionInput Source: https://www.plain.com/docs/graphql-reference/types/BreachActionInput # Broadcast Source: https://www.plain.com/docs/graphql-reference/types/Broadcast The authored content of a broadcast, before it is sent to any channel. # BroadcastAudience Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudience A named, reusable set of broadcast recipients, resolved to concrete channels at send time. # BroadcastAudienceConnection Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudienceConnection # BroadcastAudienceEdge Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudienceEdge # BroadcastAudienceFilter Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudienceFilter What a saved audience selects, and what a broadcast send target reaches. A tree: `and`, `or` and `not` hold more of this same type, ANDed with the dimensions beside them. Dimensions on one node AND together, values within a dimension OR. An empty dimension does not constrain the audience and cannot be written — omit it instead. # BroadcastAudienceFilterInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudienceFilterInput # BroadcastAudienceTenantFieldFilter Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudienceTenantFieldFilter Matches a tenant field against one value. Exactly one value field must be set. # BroadcastAudienceTenantFieldFilterInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastAudienceTenantFieldFilterInput # BroadcastConnection Source: https://www.plain.com/docs/graphql-reference/types/BroadcastConnection # BroadcastContentFormat Source: https://www.plain.com/docs/graphql-reference/types/BroadcastContentFormat How the `content` of a broadcast is encoded. # BroadcastContentFormatInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastContentFormatInput # BroadcastEdge Source: https://www.plain.com/docs/graphql-reference/types/BroadcastEdge # BroadcastReactionCount Source: https://www.plain.com/docs/graphql-reference/types/BroadcastReactionCount One emoji and how many times it was used on a broadcast's messages. # BroadcastRecipientType Source: https://www.plain.com/docs/graphql-reference/types/BroadcastRecipientType The channel a recipient is reached on. A broadcast's own `type` decides which of these its target may name. # BroadcastSend Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSend One run of a broadcast: the recipients it resolved to and what became of each of them. A broadcast's `status`, `scheduledAt`, `startedAt` and `completedAt` come from its most recent send, which is why they read as null or `DRAFT` on a broadcast that has none. # BroadcastSendConnection Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendConnection # BroadcastSendDeliveriesFilter Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveriesFilter Narrows a send's delivery list. Omit a field to leave that dimension unconstrained. # BroadcastSendDelivery Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDelivery One recipient's copy of a broadcast, and what became of it. # BroadcastSendDeliveryConnection Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveryConnection # BroadcastSendDeliveryCounts Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveryCounts How many of a send's recipients are in each state. Read as one snapshot: the counts are taken by a single query, so they always sum to `total`. # BroadcastSendDeliveryEdge Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveryEdge # BroadcastSendDeliveryFailureReason Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveryFailureReason Why a delivery failed. Terminal in every case — a failure that was worth retrying was retried before the delivery reached `FAILED`. # BroadcastSendDeliveryRecipient Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveryRecipient Who one delivery was addressed to. The variant matches the channel the broadcast was authored for. Slack channels are identified rather than named — resolve the name through `connectedSlackChannels`, bearing in mind that a `CHANNEL_NOT_CONNECTED` failure means there is no channel there to name. # BroadcastSendDeliveryStatus Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendDeliveryStatus Where one recipient's copy of a broadcast is in its lifecycle. # BroadcastSendEdge Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendEdge # BroadcastSendStatus Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendStatus Where one run of a broadcast is in its lifecycle. The same values `BroadcastStatus` carries apart from `DRAFT`, which describes a broadcast with no send rather than a send. # BroadcastSendTarget Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTarget # BroadcastSendTargetInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetInput # BroadcastSendTargetRecipient Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetRecipient Someone a broadcast is aimed at by name rather than by filter. Flat with a `type` rather than a union, because GraphQL has no input unions and the input and output shapes should not diverge. The per-channel fields are nullable for the same reason: an email recipient will carry an address and no channel, and making them nullable now is what keeps that from being a breaking change later. Read `type` first. # BroadcastSendTargetRecipientConnection Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetRecipientConnection Its own connection rather than `ConnectedSlackChannelConnection`, which carries the filters it was queried by. An audience with `and`/`or`/`not` is not expressible as one channel filter, so there is no honest value to put there. The edges are Slack channels because a broadcast can only be authored for Slack today. A second broadcast type widens the node rather than adding a second connection. # BroadcastSendTargetRecipientInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetRecipientInput Mirrors `BroadcastSendTargetRecipient`. Supply the fields belonging to the `type` given. # BroadcastSendTargetRecipients Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetRecipients How many recipients a target resolves to right now. Point-in-time: it moves as tenants, tiers and tenant fields change, and as channels are connected or disabled, so it is not a promise about who will receive a send made later. Resolved through the same path a send uses, so this is the number that would actually be delivered to rather than an estimate assembled another way. # BroadcastSendTargetRecipientsEmptyReason Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetRecipientsEmptyReason Why a broadcast or audience currently resolves to nobody. # BroadcastSendTargetRecipientsInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetRecipientsInput # BroadcastSendTargetScope Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendTargetScope # BroadcastSender Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSender Who a broadcast is sent as. Which sender a broadcast carries is decided by the channel it is authored for, so each channel contributes its own variant. # BroadcastSenderType Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSenderType Who a broadcast is sent as. Set alongside the matching id on input: `PLAIN_USER` requires `senderUserId`, `PLAIN_WORKSPACE` takes none. # BroadcastSenderTypeInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSenderTypeInput Nullable, unlike `BroadcastContentFormatInput`: clearing the sender is how a broadcast goes back to having none. # BroadcastSendsFilter Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSendsFilter Narrows a broadcast's send list. Omit a field to leave that dimension unconstrained. # BroadcastSlackChannelRef Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSlackChannelRef A Slack channel. A channel id is only unique within its team, so both are needed to name one. # BroadcastSlackChannelRefInput Source: https://www.plain.com/docs/graphql-reference/types/BroadcastSlackChannelRefInput # BroadcastStatus Source: https://www.plain.com/docs/graphql-reference/types/BroadcastStatus Where a broadcast is in its lifecycle. Derived from the broadcast's latest real send, so it is never stored on the broadcast itself. Test sends do not affect it. # BroadcastType Source: https://www.plain.com/docs/graphql-reference/types/BroadcastType The channel a broadcast is authored for. Content is written against a specific channel's rendering rules, so it is not portable between channels. # BroadcastsFilter Source: https://www.plain.com/docs/graphql-reference/types/BroadcastsFilter Narrows a list of broadcasts. Omit a field to leave that dimension unconstrained. # BroadcastsSearchQuery Source: https://www.plain.com/docs/graphql-reference/types/BroadcastsSearchQuery Query to search for broadcasts. # BulkJoinSlackChannelsInput Source: https://www.plain.com/docs/graphql-reference/types/BulkJoinSlackChannelsInput # BulkJoinSlackChannelsOutput Source: https://www.plain.com/docs/graphql-reference/types/BulkJoinSlackChannelsOutput # BulkUpdateConnectedSlackChannelItem Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateConnectedSlackChannelItem A single update applied by the `bulkUpdateConnectedSlackChannels` mutation. Mirrors `UpdateConnectedSlackChannelInput`. # BulkUpdateConnectedSlackChannelResult Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateConnectedSlackChannelResult The outcome of a single update inside `bulkUpdateConnectedSlackChannels`. # BulkUpdateConnectedSlackChannelsInput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateConnectedSlackChannelsInput An input provided to the `bulkUpdateConnectedSlackChannels` mutation. # BulkUpdateConnectedSlackChannelsOutput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateConnectedSlackChannelsOutput An output type provided by the `bulkUpdateConnectedSlackChannels` mutation. Returns per-update results so the caller can distinguish successful writes from failed ones. # BulkUpdateSlackChannelSettingItem Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateSlackChannelSettingItem A single update applied by the `bulkUpdateSlackChannelSettings` mutation. # BulkUpdateSlackChannelSettingResult Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateSlackChannelSettingResult The outcome of a single update inside `bulkUpdateSlackChannelSettings`. # BulkUpdateSlackChannelSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateSlackChannelSettingsInput An input provided to the `bulkUpdateSlackChannelSettings` mutation. # BulkUpdateSlackChannelSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpdateSlackChannelSettingsOutput An output type provided by the `bulkUpdateSlackChannelSettings` mutation. Returns per-update results so the caller can distinguish successful writes from failed ones. # BulkUpsertThreadFieldResult Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertThreadFieldResult # BulkUpsertThreadFieldsInput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertThreadFieldsInput # BulkUpsertThreadFieldsOutput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertThreadFieldsOutput # BulkUpsertWorkflowStepInput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertWorkflowStepInput Input for a single step in the bulk upsert operation. # BulkUpsertWorkflowStepResult Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertWorkflowStepResult # BulkUpsertWorkflowStepResultItem Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertWorkflowStepResultItem # BulkUpsertWorkflowStepsInput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertWorkflowStepsInput # BulkUpsertWorkflowStepsOutput Source: https://www.plain.com/docs/graphql-reference/types/BulkUpsertWorkflowStepsOutput # BusinessHoursSchedule Source: https://www.plain.com/docs/graphql-reference/types/BusinessHoursSchedule A named set of business hours slots. A workspace can have several schedules, each covering a different team or region. # BusinessHoursScheduleConnection Source: https://www.plain.com/docs/graphql-reference/types/BusinessHoursScheduleConnection # BusinessHoursScheduleEdge Source: https://www.plain.com/docs/graphql-reference/types/BusinessHoursScheduleEdge # BusinessHoursSlot Source: https://www.plain.com/docs/graphql-reference/types/BusinessHoursSlot # BusinessHoursSlotInput Source: https://www.plain.com/docs/graphql-reference/types/BusinessHoursSlotInput # CalculateRoleChangeCostInput Source: https://www.plain.com/docs/graphql-reference/types/CalculateRoleChangeCostInput # CalculateRoleChangeCostOutput Source: https://www.plain.com/docs/graphql-reference/types/CalculateRoleChangeCostOutput # ChangeBillingPlanInput Source: https://www.plain.com/docs/graphql-reference/types/ChangeBillingPlanInput # ChangeBillingPlanOutput Source: https://www.plain.com/docs/graphql-reference/types/ChangeBillingPlanOutput # ChangeThreadCustomerInput Source: https://www.plain.com/docs/graphql-reference/types/ChangeThreadCustomerInput # ChangeThreadCustomerOutput Source: https://www.plain.com/docs/graphql-reference/types/ChangeThreadCustomerOutput # ChangeThreadDiscussionStatusInput Source: https://www.plain.com/docs/graphql-reference/types/ChangeThreadDiscussionStatusInput # ChangeThreadDiscussionStatusOutput Source: https://www.plain.com/docs/graphql-reference/types/ChangeThreadDiscussionStatusOutput # ChangeThreadPriorityInput Source: https://www.plain.com/docs/graphql-reference/types/ChangeThreadPriorityInput # ChangeThreadPriorityOutput Source: https://www.plain.com/docs/graphql-reference/types/ChangeThreadPriorityOutput # ChangeUserStatusInput Source: https://www.plain.com/docs/graphql-reference/types/ChangeUserStatusInput # ChangeUserStatusOutput Source: https://www.plain.com/docs/graphql-reference/types/ChangeUserStatusOutput # Chat Source: https://www.plain.com/docs/graphql-reference/types/Chat # ChatApp Source: https://www.plain.com/docs/graphql-reference/types/ChatApp # ChatAppConnection Source: https://www.plain.com/docs/graphql-reference/types/ChatAppConnection # ChatAppEdge Source: https://www.plain.com/docs/graphql-reference/types/ChatAppEdge # ChatAppHiddenSecret Source: https://www.plain.com/docs/graphql-reference/types/ChatAppHiddenSecret Metadata confirming that a signing secret exists for a chat app, without exposing the secret value. The raw secret is only available at creation time via `createChatAppSecret`. # ChatAppSecret Source: https://www.plain.com/docs/graphql-reference/types/ChatAppSecret # ChatEntry Source: https://www.plain.com/docs/graphql-reference/types/ChatEntry # ChatThreadChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ChatThreadChannelDetails # ChildThreadDetails Source: https://www.plain.com/docs/graphql-reference/types/ChildThreadDetails # CompaniesFilter Source: https://www.plain.com/docs/graphql-reference/types/CompaniesFilter # CompaniesSearchQuery Source: https://www.plain.com/docs/graphql-reference/types/CompaniesSearchQuery Query to search for companies. # Company Source: https://www.plain.com/docs/graphql-reference/types/Company # CompanyConnection Source: https://www.plain.com/docs/graphql-reference/types/CompanyConnection # CompanyEdge Source: https://www.plain.com/docs/graphql-reference/types/CompanyEdge # CompanyIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/CompanyIdentifierInput # CompanySearchResult Source: https://www.plain.com/docs/graphql-reference/types/CompanySearchResult # CompanySearchResultConnection Source: https://www.plain.com/docs/graphql-reference/types/CompanySearchResultConnection # CompanySearchResultEdge Source: https://www.plain.com/docs/graphql-reference/types/CompanySearchResultEdge # CompanyTierMembership Source: https://www.plain.com/docs/graphql-reference/types/CompanyTierMembership # CompleteJiraAuthorizationInput Source: https://www.plain.com/docs/graphql-reference/types/CompleteJiraAuthorizationInput # CompleteServiceAuthorizationInput Source: https://www.plain.com/docs/graphql-reference/types/CompleteServiceAuthorizationInput # CompleteServiceAuthorizationOutput Source: https://www.plain.com/docs/graphql-reference/types/CompleteServiceAuthorizationOutput # CompleteSidekickMcpServerConnectionInput Source: https://www.plain.com/docs/graphql-reference/types/CompleteSidekickMcpServerConnectionInput # CompleteSidekickMcpServerConnectionOutput Source: https://www.plain.com/docs/graphql-reference/types/CompleteSidekickMcpServerConnectionOutput # ComponentBadge Source: https://www.plain.com/docs/graphql-reference/types/ComponentBadge # ComponentBadgeColor Source: https://www.plain.com/docs/graphql-reference/types/ComponentBadgeColor # ComponentBadgeInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentBadgeInput # ComponentContainer Source: https://www.plain.com/docs/graphql-reference/types/ComponentContainer # ComponentContainerContent Source: https://www.plain.com/docs/graphql-reference/types/ComponentContainerContent # ComponentContainerContentInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentContainerContentInput # ComponentContainerInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentContainerInput # ComponentCopyButton Source: https://www.plain.com/docs/graphql-reference/types/ComponentCopyButton # ComponentCopyButtonInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentCopyButtonInput # ComponentDateTime Source: https://www.plain.com/docs/graphql-reference/types/ComponentDateTime # ComponentDateTimeInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentDateTimeInput # ComponentDivider Source: https://www.plain.com/docs/graphql-reference/types/ComponentDivider # ComponentDividerInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentDividerInput # ComponentDividerSpacingSize Source: https://www.plain.com/docs/graphql-reference/types/ComponentDividerSpacingSize # ComponentInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentInput # ComponentLinkButton Source: https://www.plain.com/docs/graphql-reference/types/ComponentLinkButton # ComponentLinkButtonInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentLinkButtonInput # ComponentPlainText Source: https://www.plain.com/docs/graphql-reference/types/ComponentPlainText # ComponentPlainTextColor Source: https://www.plain.com/docs/graphql-reference/types/ComponentPlainTextColor # ComponentPlainTextInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentPlainTextInput # ComponentPlainTextSize Source: https://www.plain.com/docs/graphql-reference/types/ComponentPlainTextSize # ComponentRow Source: https://www.plain.com/docs/graphql-reference/types/ComponentRow # ComponentRowContent Source: https://www.plain.com/docs/graphql-reference/types/ComponentRowContent # ComponentRowContentInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentRowContentInput # ComponentRowInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentRowInput # ComponentSpacer Source: https://www.plain.com/docs/graphql-reference/types/ComponentSpacer # ComponentSpacerInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentSpacerInput # ComponentSpacerSize Source: https://www.plain.com/docs/graphql-reference/types/ComponentSpacerSize # ComponentText Source: https://www.plain.com/docs/graphql-reference/types/ComponentText # ComponentTextColor Source: https://www.plain.com/docs/graphql-reference/types/ComponentTextColor # ComponentTextInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentTextInput # ComponentTextSize Source: https://www.plain.com/docs/graphql-reference/types/ComponentTextSize # ComponentUser Source: https://www.plain.com/docs/graphql-reference/types/ComponentUser # ComponentUserInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentUserInput # ComponentWorkflowButton Source: https://www.plain.com/docs/graphql-reference/types/ComponentWorkflowButton # ComponentWorkflowButtonInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentWorkflowButtonInput # ComponentWorkflowButtonWorkflowIdentifier Source: https://www.plain.com/docs/graphql-reference/types/ComponentWorkflowButtonWorkflowIdentifier # ComponentWorkflowButtonWorkflowIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/ComponentWorkflowButtonWorkflowIdentifierInput # ConnectedDiscordChannel Source: https://www.plain.com/docs/graphql-reference/types/ConnectedDiscordChannel # ConnectedDiscordChannelConnection Source: https://www.plain.com/docs/graphql-reference/types/ConnectedDiscordChannelConnection # ConnectedDiscordChannelEdge Source: https://www.plain.com/docs/graphql-reference/types/ConnectedDiscordChannelEdge # ConnectedMSTeamsChannel Source: https://www.plain.com/docs/graphql-reference/types/ConnectedMSTeamsChannel # ConnectedMSTeamsChannelConnection Source: https://www.plain.com/docs/graphql-reference/types/ConnectedMSTeamsChannelConnection # ConnectedMSTeamsChannelEdge Source: https://www.plain.com/docs/graphql-reference/types/ConnectedMSTeamsChannelEdge # ConnectedSlackChannel Source: https://www.plain.com/docs/graphql-reference/types/ConnectedSlackChannel # ConnectedSlackChannelConnection Source: https://www.plain.com/docs/graphql-reference/types/ConnectedSlackChannelConnection # ConnectedSlackChannelEdge Source: https://www.plain.com/docs/graphql-reference/types/ConnectedSlackChannelEdge # ConnectedSlackChannelType Source: https://www.plain.com/docs/graphql-reference/types/ConnectedSlackChannelType # ConnectedSlackChannelsFilter Source: https://www.plain.com/docs/graphql-reference/types/ConnectedSlackChannelsFilter # CreateAiFeedbackInput Source: https://www.plain.com/docs/graphql-reference/types/CreateAiFeedbackInput # CreateAiFeedbackOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateAiFeedbackOutput # CreateAiToneRuleInput Source: https://www.plain.com/docs/graphql-reference/types/CreateAiToneRuleInput # CreateAiToneRuleOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateAiToneRuleOutput # CreateApiKeyInput Source: https://www.plain.com/docs/graphql-reference/types/CreateApiKeyInput # CreateApiKeyOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateApiKeyOutput # CreateAttachmentDownloadUrlInput Source: https://www.plain.com/docs/graphql-reference/types/CreateAttachmentDownloadUrlInput # CreateAttachmentDownloadUrlOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateAttachmentDownloadUrlOutput # CreateAttachmentUploadUrlInput Source: https://www.plain.com/docs/graphql-reference/types/CreateAttachmentUploadUrlInput # CreateAttachmentUploadUrlOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateAttachmentUploadUrlOutput # CreateAutoresponderInput Source: https://www.plain.com/docs/graphql-reference/types/CreateAutoresponderInput # CreateAutoresponderOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateAutoresponderOutput # CreateBroadcastAudienceInput Source: https://www.plain.com/docs/graphql-reference/types/CreateBroadcastAudienceInput # CreateBroadcastAudienceOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateBroadcastAudienceOutput # CreateBroadcastInput Source: https://www.plain.com/docs/graphql-reference/types/CreateBroadcastInput # CreateBroadcastOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateBroadcastOutput # CreateBusinessHoursScheduleInput Source: https://www.plain.com/docs/graphql-reference/types/CreateBusinessHoursScheduleInput # CreateBusinessHoursScheduleOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateBusinessHoursScheduleOutput # CreateChatAppInput Source: https://www.plain.com/docs/graphql-reference/types/CreateChatAppInput # CreateChatAppOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateChatAppOutput # CreateChatAppSecretInput Source: https://www.plain.com/docs/graphql-reference/types/CreateChatAppSecretInput # CreateChatAppSecretOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateChatAppSecretOutput # CreateCustomRoleInput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomRoleInput # CreateCustomRoleOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomRoleOutput # CreateCustomerCardConfigInput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerCardConfigInput Input type to create a new customer card config. By default new customer cards will have an ordering of 100000 (to place them at the bottom). # CreateCustomerCardConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerCardConfigOutput # CreateCustomerEventInput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerEventInput # CreateCustomerEventOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerEventOutput # CreateCustomerGroupInput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerGroupInput # CreateCustomerGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerGroupOutput # CreateCustomerSurveyInput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerSurveyInput # CreateCustomerSurveyOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateCustomerSurveyOutput # CreateDemoChannelInput Source: https://www.plain.com/docs/graphql-reference/types/CreateDemoChannelInput # CreateDemoChannelOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateDemoChannelOutput # CreateDiscussionInput Source: https://www.plain.com/docs/graphql-reference/types/CreateDiscussionInput # CreateDiscussionOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateDiscussionOutput # CreateEmailPreviewUrlInput Source: https://www.plain.com/docs/graphql-reference/types/CreateEmailPreviewUrlInput # CreateEmailPreviewUrlOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateEmailPreviewUrlOutput # CreateEscalationPathInput Source: https://www.plain.com/docs/graphql-reference/types/CreateEscalationPathInput # CreateEscalationPathOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateEscalationPathOutput # CreateGithubUserAuthIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateGithubUserAuthIntegrationInput # CreateGithubUserAuthIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateGithubUserAuthIntegrationOutput # CreateHelpCenterArticleGroupInput Source: https://www.plain.com/docs/graphql-reference/types/CreateHelpCenterArticleGroupInput # CreateHelpCenterArticleGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateHelpCenterArticleGroupOutput # CreateHelpCenterInput Source: https://www.plain.com/docs/graphql-reference/types/CreateHelpCenterInput # CreateHelpCenterOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateHelpCenterOutput # CreateHyperlineBillingPortalSessionOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateHyperlineBillingPortalSessionOutput # CreateHyperlineComponentsAuthTokenOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateHyperlineComponentsAuthTokenOutput # CreateImportSyncInput Source: https://www.plain.com/docs/graphql-reference/types/CreateImportSyncInput # CreateImportSyncOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateImportSyncOutput # CreateIndexedDocumentInput Source: https://www.plain.com/docs/graphql-reference/types/CreateIndexedDocumentInput # CreateIndexedDocumentOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateIndexedDocumentOutput # CreateIssueTrackerIssueInput Source: https://www.plain.com/docs/graphql-reference/types/CreateIssueTrackerIssueInput # CreateIssueTrackerIssueOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateIssueTrackerIssueOutput # CreateKnowledgeSourceInput Source: https://www.plain.com/docs/graphql-reference/types/CreateKnowledgeSourceInput # CreateKnowledgeSourceOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateKnowledgeSourceOutput # CreateLabelTypeInput Source: https://www.plain.com/docs/graphql-reference/types/CreateLabelTypeInput # CreateLabelTypeOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateLabelTypeOutput # CreateLinearAppIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateLinearAppIntegrationInput # CreateLinearAppIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateLinearAppIntegrationOutput # CreateMachineUserInput Source: https://www.plain.com/docs/graphql-reference/types/CreateMachineUserInput # CreateMachineUserOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateMachineUserOutput # CreateMyFavoritePageInput Source: https://www.plain.com/docs/graphql-reference/types/CreateMyFavoritePageInput # CreateMyFavoritePageOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateMyFavoritePageOutput # CreateMyLinearIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateMyLinearIntegrationInput # CreateMyLinearIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateMyLinearIntegrationOutput # CreateMyMSTeamsIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateMyMSTeamsIntegrationInput # CreateMyMSTeamsIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateMyMSTeamsIntegrationOutput # CreateMySlackIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateMySlackIntegrationInput # CreateMySlackIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateMySlackIntegrationOutput # CreateNoteInput Source: https://www.plain.com/docs/graphql-reference/types/CreateNoteInput # CreateNoteOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateNoteOutput # CreateSavedThreadsViewInput Source: https://www.plain.com/docs/graphql-reference/types/CreateSavedThreadsViewInput # CreateSavedThreadsViewOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateSavedThreadsViewOutput # CreateServiceLevelAgreementInput Source: https://www.plain.com/docs/graphql-reference/types/CreateServiceLevelAgreementInput # CreateServiceLevelAgreementOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateServiceLevelAgreementOutput # CreateServiceLevelAgreementPolicyInput Source: https://www.plain.com/docs/graphql-reference/types/CreateServiceLevelAgreementPolicyInput # CreateServiceLevelAgreementPolicyOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateServiceLevelAgreementPolicyOutput # CreateSidekickCustomSkillInput Source: https://www.plain.com/docs/graphql-reference/types/CreateSidekickCustomSkillInput # CreateSidekickCustomSkillOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateSidekickCustomSkillOutput # CreateSidekickMcpServerInput Source: https://www.plain.com/docs/graphql-reference/types/CreateSidekickMcpServerInput # CreateSidekickMcpServerOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateSidekickMcpServerOutput # CreateSnippetInput Source: https://www.plain.com/docs/graphql-reference/types/CreateSnippetInput # CreateSnippetOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateSnippetOutput # CreateTaskAssignedToInput Source: https://www.plain.com/docs/graphql-reference/types/CreateTaskAssignedToInput Only one of the fields can be set. # CreateTaskInput Source: https://www.plain.com/docs/graphql-reference/types/CreateTaskInput # CreateTaskOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateTaskOutput # CreateTenantInput Source: https://www.plain.com/docs/graphql-reference/types/CreateTenantInput # CreateTenantOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateTenantOutput # CreateThreadAssignedToInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadAssignedToInput Only one of the fields can be set. # CreateThreadDiscussionInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadDiscussionInput # CreateThreadDiscussionOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadDiscussionOutput # CreateThreadDiscussionType Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadDiscussionType # CreateThreadEventInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadEventInput # CreateThreadEventOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadEventOutput # CreateThreadFieldOnThreadInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadFieldOnThreadInput # CreateThreadFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadFieldSchemaInput # CreateThreadFieldSchemaOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadFieldSchemaOutput # CreateThreadFromSlackMessageInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadFromSlackMessageInput Identifies the Slack message to ingest. Optional thread attributes are applied only when a new thread is created. An already-ingested message returns the existing thread and ignores them. When set, these values win over the Slack channel association and other inferred defaults. # CreateThreadFromSlackMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadFromSlackMessageOutput # CreateThreadInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadInput # CreateThreadLinkInput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadLinkInput # CreateThreadLinkOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadLinkOutput # CreateThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateThreadOutput # CreateTierInput Source: https://www.plain.com/docs/graphql-reference/types/CreateTierInput # CreateTierOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateTierOutput # CreateUserAccountInput Source: https://www.plain.com/docs/graphql-reference/types/CreateUserAccountInput # CreateUserAccountOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateUserAccountOutput # CreateUserAuthDiscordChannelIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateUserAuthDiscordChannelIntegrationInput # CreateUserAuthDiscordChannelIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateUserAuthDiscordChannelIntegrationOutput # CreateUserAuthSlackIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateUserAuthSlackIntegrationInput # CreateUserAuthSlackIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateUserAuthSlackIntegrationOutput # CreateWebhookTargetInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWebhookTargetInput # CreateWebhookTargetOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWebhookTargetOutput # CreateWorkflowInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowInput # CreateWorkflowOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowOutput # CreateWorkflowRuleInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowRuleInput # CreateWorkflowRuleOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowRuleOutput # CreateWorkflowShareLinkInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowShareLinkInput # CreateWorkflowShareLinkOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowShareLinkOutput # CreateWorkflowStepInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowStepInput # CreateWorkflowStepOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkflowStepOutput # CreateWorkspaceCursorIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceCursorIntegrationInput # CreateWorkspaceCursorIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceCursorIntegrationOutput # CreateWorkspaceEmailDomainSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceEmailDomainSettingsInput # CreateWorkspaceEmailDomainSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceEmailDomainSettingsOutput # CreateWorkspaceFileDownloadUrlInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceFileDownloadUrlInput # CreateWorkspaceFileDownloadUrlOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceFileDownloadUrlOutput # CreateWorkspaceFileUploadUrlInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceFileUploadUrlInput # CreateWorkspaceFileUploadUrlOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceFileUploadUrlOutput # CreateWorkspaceSlackChannelIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceSlackChannelIntegrationInput # CreateWorkspaceSlackChannelIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceSlackChannelIntegrationOutput # CreateWorkspaceSlackIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceSlackIntegrationInput # CreateWorkspaceSlackIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceSlackIntegrationOutput # CreateWorkspaceSlackSidekickIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceSlackSidekickIntegrationInput # CreateWorkspaceSlackSidekickIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/CreateWorkspaceSlackSidekickIntegrationOutput # CsatCustomerSurveyTemplate Source: https://www.plain.com/docs/graphql-reference/types/CsatCustomerSurveyTemplate # CsatCustomerSurveyTemplateInput Source: https://www.plain.com/docs/graphql-reference/types/CsatCustomerSurveyTemplateInput # CurrencyCode Source: https://www.plain.com/docs/graphql-reference/types/CurrencyCode # CursorRepository Source: https://www.plain.com/docs/graphql-reference/types/CursorRepository # CustomEntry Source: https://www.plain.com/docs/graphql-reference/types/CustomEntry # CustomRole Source: https://www.plain.com/docs/graphql-reference/types/CustomRole # CustomRoleConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomRoleConnection # CustomRoleEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomRoleEdge # CustomSidekickSkill Source: https://www.plain.com/docs/graphql-reference/types/CustomSidekickSkill A workspace-authored skill, as it appears in the skills list. # CustomTimelineEntryComponent Source: https://www.plain.com/docs/graphql-reference/types/CustomTimelineEntryComponent # Customer Source: https://www.plain.com/docs/graphql-reference/types/Customer The core customer entity. A customer only exists (ideally) once. Uniqueness is guaranteed on both of these fields: 1. `externalId` if provided 2. `email` # CustomerActor Source: https://www.plain.com/docs/graphql-reference/types/CustomerActor # CustomerCardComponent Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardComponent # CustomerCardConfig Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardConfig The configuration of a customer card that defines four important things: - The title of the card - The key of the card, which will be used in the request payload to the API URL - The order in which the cards should appear - Which API the card should be loaded from (and the required authentication headers) Configs that have the same API URL and API Headers will be loaded in batch. API header names are treated case insensitively. A maximum of 25 customer cards can be configured. # CustomerCardConfigApiHeader Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardConfigApiHeader An API header that will be sent to the configured API URL. # CustomerCardConfigApiHeaderInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardConfigApiHeaderInput An API header that will be sent to the configured API URL. # CustomerCardConfigOrderInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardConfigOrderInput # CustomerCardInstance Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstance Represents the current load state of a single customer card for a specific customer. A customer can only have one card instance per config at any point in time. The three concrete implementations — `CustomerCardInstanceLoading`, `CustomerCardInstanceLoaded`, and `CustomerCardInstanceError` — reflect whether the card is being fetched, has loaded successfully, or failed to load. # CustomerCardInstanceCardTooBigErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceCardTooBigErrorDetail The card exceeded the maximum allowed size. # CustomerCardInstanceError Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceError A customer card instance that failed to load. Inspect `errorDetail` to determine why: the card API returned a non-200 status, timed out, returned an invalid body, or did not include the requested card key. # CustomerCardInstanceErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceErrorDetail Details for the reasons why the customer card failed to load. # CustomerCardInstanceLoaded Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceLoaded A successfully loaded customer card instance containing the card components returned by your API. The card remains valid until `expiresAt`, after which the next access will trigger a reload. # CustomerCardInstanceLoading Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceLoading A customer card instance that is currently being fetched from the configured API URL. The `createdAt` timestamp indicates when the load was initiated. Subscribe to `customerCardInstanceChanges` to be notified when it transitions to `CustomerCardInstanceLoaded` or `CustomerCardInstanceError`. # CustomerCardInstanceMissingCardErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceMissingCardErrorDetail The configured API URL didn't return a requested card key. # CustomerCardInstanceRequestErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceRequestErrorDetail Plain failed to make the request to the configured API URL. # CustomerCardInstanceResponseBodyErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceResponseBodyErrorDetail An invalid response body was returned from the configured API URL. # CustomerCardInstanceStatusCodeErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceStatusCodeErrorDetail A non-200 status code was returned from the configured API URL. # CustomerCardInstanceTimeoutErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceTimeoutErrorDetail The card failed to load within the timeout. # CustomerCardInstanceUnknownErrorDetail Source: https://www.plain.com/docs/graphql-reference/types/CustomerCardInstanceUnknownErrorDetail An unknown error occurred. If this error is persistent, please contact our support. # CustomerConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomerConnection # CustomerEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomerEdge # CustomerEmailActor Source: https://www.plain.com/docs/graphql-reference/types/CustomerEmailActor # CustomerEvent Source: https://www.plain.com/docs/graphql-reference/types/CustomerEvent # CustomerEventEntry Source: https://www.plain.com/docs/graphql-reference/types/CustomerEventEntry # CustomerGroup Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroup # CustomerGroupConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupConnection # CustomerGroupEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupEdge # CustomerGroupIdentifier Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupIdentifier Identifies a customer group by exactly one of: its Plain-assigned ID, its unique key, or the external ID from your system. Provide exactly one field. # CustomerGroupMembership Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupMembership # CustomerGroupMembershipConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupMembershipConnection # CustomerGroupMembershipEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupMembershipEdge # CustomerGroupMembershipsFilter Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupMembershipsFilter # CustomerGroupsFilter Source: https://www.plain.com/docs/graphql-reference/types/CustomerGroupsFilter # CustomerIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerIdentifierInput Only one of the fields can be set. # CustomerIdentity Source: https://www.plain.com/docs/graphql-reference/types/CustomerIdentity # CustomerImpersonationInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerImpersonationInput # CustomerSearchCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSearchCondition The customer attributes available for search, each of them mapped to a search expression. Exactly one of them must be provided in a single search condition. # CustomerSearchConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomerSearchConnection # CustomerSearchEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomerSearchEdge # CustomerStatus Source: https://www.plain.com/docs/graphql-reference/types/CustomerStatus Deprecated: customer-level status has been replaced by per-thread status. Use `Thread.status` and `ThreadStatus` instead. # CustomerSurvey Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurvey # CustomerSurveyCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyCondition # CustomerSurveyConditionInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyConditionInput # CustomerSurveyConditionOperator Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyConditionOperator # CustomerSurveyConditionsOperator Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyConditionsOperator # CustomerSurveyConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyConnection # CustomerSurveyEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyEdge # CustomerSurveyLabelCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyLabelCondition # CustomerSurveyMessageSourceCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyMessageSourceCondition # CustomerSurveyOrderInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyOrderInput # CustomerSurveyPrioritiesCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyPrioritiesCondition # CustomerSurveyRequestedEntry Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyRequestedEntry # CustomerSurveySupportEmailsCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveySupportEmailsCondition # CustomerSurveyTemplate Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyTemplate # CustomerSurveyTemplateInput Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyTemplateInput # CustomerSurveyTiersCondition Source: https://www.plain.com/docs/graphql-reference/types/CustomerSurveyTiersCondition # CustomerTenantMembership Source: https://www.plain.com/docs/graphql-reference/types/CustomerTenantMembership Represents a customer's membership in a tenant. Returned on the `tenantMemberships` sub-query of a `Customer`. # CustomerTenantMembershipConnection Source: https://www.plain.com/docs/graphql-reference/types/CustomerTenantMembershipConnection # CustomerTenantMembershipEdge Source: https://www.plain.com/docs/graphql-reference/types/CustomerTenantMembershipEdge # CustomersFilter Source: https://www.plain.com/docs/graphql-reference/types/CustomersFilter # CustomersSearchQuery Source: https://www.plain.com/docs/graphql-reference/types/CustomersSearchQuery A query to search for customers. Search queries are combinations of search conditions, as defined below. At least one search condition must be provided. # CustomersSort Source: https://www.plain.com/docs/graphql-reference/types/CustomersSort # CustomersSortField Source: https://www.plain.com/docs/graphql-reference/types/CustomersSortField # DateTime Source: https://www.plain.com/docs/graphql-reference/types/DateTime # DatetimeFilter Source: https://www.plain.com/docs/graphql-reference/types/DatetimeFilter # DatetimeFilterOutput Source: https://www.plain.com/docs/graphql-reference/types/DatetimeFilterOutput # DefaultServiceIntegration Source: https://www.plain.com/docs/graphql-reference/types/DefaultServiceIntegration # DeleteAiToneRulesInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteAiToneRulesInput # DeleteAiToneRulesOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteAiToneRulesOutput # DeleteApiKeyInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteApiKeyInput # DeleteApiKeyOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteApiKeyOutput # DeleteAutoresponderInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteAutoresponderInput # DeleteAutoresponderOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteAutoresponderOutput # DeleteBroadcastAudienceInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteBroadcastAudienceInput # DeleteBroadcastAudienceOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteBroadcastAudienceOutput # DeleteBroadcastInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteBroadcastInput # DeleteBroadcastOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteBroadcastOutput # DeleteBusinessHoursScheduleInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteBusinessHoursScheduleInput # DeleteBusinessHoursScheduleOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteBusinessHoursScheduleOutput # DeleteChatAppInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteChatAppInput # DeleteChatAppOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteChatAppOutput # DeleteChatAppSecretInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteChatAppSecretInput # DeleteChatAppSecretOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteChatAppSecretOutput # DeleteCompanyInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCompanyInput # DeleteCompanyOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCompanyOutput # DeleteCustomRoleInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomRoleInput # DeleteCustomRoleOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomRoleOutput # DeleteCustomerCardConfigInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerCardConfigInput # DeleteCustomerCardConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerCardConfigOutput # DeleteCustomerGroupInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerGroupInput # DeleteCustomerGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerGroupOutput # DeleteCustomerInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerInput # DeleteCustomerOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerOutput # DeleteCustomerSurveyInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerSurveyInput # DeleteCustomerSurveyOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteCustomerSurveyOutput # DeleteEmailSuppressionInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteEmailSuppressionInput # DeleteEmailSuppressionOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteEmailSuppressionOutput # DeleteEscalationPathInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteEscalationPathInput # DeleteEscalationPathOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteEscalationPathOutput # DeleteGithubUserAuthIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteGithubUserAuthIntegrationOutput # DeleteHelpCenterArticleGroupInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteHelpCenterArticleGroupInput # DeleteHelpCenterArticleGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteHelpCenterArticleGroupOutput # DeleteHelpCenterArticleInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteHelpCenterArticleInput # DeleteHelpCenterArticleOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteHelpCenterArticleOutput # DeleteHelpCenterInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteHelpCenterInput # DeleteHelpCenterOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteHelpCenterOutput # DeleteKnowledgeSourceInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteKnowledgeSourceInput # DeleteKnowledgeSourceOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteKnowledgeSourceOutput # DeleteLinearAppIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteLinearAppIntegrationOutput # DeleteMachineUserInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMachineUserInput # DeleteMachineUserOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMachineUserOutput # DeleteMyFavoritePageInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMyFavoritePageInput # DeleteMyFavoritePageOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMyFavoritePageOutput # DeleteMyLinearIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMyLinearIntegrationOutput # DeleteMyMSTeamsIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMyMSTeamsIntegrationOutput # DeleteMyServiceAuthorizationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMyServiceAuthorizationInput # DeleteMyServiceAuthorizationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMyServiceAuthorizationOutput # DeleteMySlackIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteMySlackIntegrationOutput # DeleteNoteInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteNoteInput # DeleteNoteOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteNoteOutput # DeleteQueuedAgentSessionMessageInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteQueuedAgentSessionMessageInput # DeleteQueuedAgentSessionMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteQueuedAgentSessionMessageOutput # DeleteSavedThreadsViewInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSavedThreadsViewInput # DeleteSavedThreadsViewOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSavedThreadsViewOutput # DeleteServiceAuthorizationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteServiceAuthorizationInput # DeleteServiceAuthorizationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteServiceAuthorizationOutput # DeleteServiceLevelAgreementInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteServiceLevelAgreementInput # DeleteServiceLevelAgreementOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteServiceLevelAgreementOutput # DeleteServiceLevelAgreementPolicyInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteServiceLevelAgreementPolicyInput # DeleteServiceLevelAgreementPolicyOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteServiceLevelAgreementPolicyOutput # DeleteSettingInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSettingInput An input provided to the `deleteSetting` mutation. # DeleteSettingOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSettingOutput An output type provided by the `deleteSetting` mutation. Returns the deleted setting (or null if it did not exist) or an error. # DeleteSidekickCustomSkillInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSidekickCustomSkillInput # DeleteSidekickCustomSkillOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSidekickCustomSkillOutput # DeleteSidekickMcpServerInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSidekickMcpServerInput # DeleteSidekickMcpServerOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSidekickMcpServerOutput # DeleteSnippetInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSnippetInput # DeleteSnippetOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteSnippetOutput # DeleteTaskInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTaskInput # DeleteTaskOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTaskOutput # DeleteTenantFieldInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTenantFieldInput # DeleteTenantFieldOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTenantFieldOutput # DeleteTenantFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTenantFieldSchemaInput # DeleteTenantFieldSchemaOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTenantFieldSchemaOutput # DeleteTenantInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTenantInput # DeleteTenantOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTenantOutput # DeleteThreadChannelAssociationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadChannelAssociationInput # DeleteThreadChannelAssociationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadChannelAssociationOutput # DeleteThreadDiscussionInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadDiscussionInput # DeleteThreadDiscussionOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadDiscussionOutput # DeleteThreadFieldIdentifier Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadFieldIdentifier # DeleteThreadFieldInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadFieldInput # DeleteThreadFieldOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadFieldOutput # DeleteThreadFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadFieldSchemaInput # DeleteThreadFieldSchemaOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadFieldSchemaOutput # DeleteThreadInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadInput # DeleteThreadLinkInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadLinkInput # DeleteThreadLinkOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadLinkOutput # DeleteThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteThreadOutput # DeleteTierInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTierInput # DeleteTierOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteTierOutput # DeleteUserAuthDiscordChannelIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteUserAuthDiscordChannelIntegrationInput # DeleteUserAuthDiscordChannelIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteUserAuthDiscordChannelIntegrationOutput # DeleteUserAuthSlackIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteUserAuthSlackIntegrationInput # DeleteUserAuthSlackIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteUserAuthSlackIntegrationOutput # DeleteUserInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteUserInput # DeleteUserOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteUserOutput # DeleteWebhookTargetInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWebhookTargetInput # DeleteWebhookTargetOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWebhookTargetOutput # DeleteWorkflowInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkflowInput # DeleteWorkflowOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkflowOutput # DeleteWorkflowRuleInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkflowRuleInput # DeleteWorkflowRuleOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkflowRuleOutput # DeleteWorkflowStepInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkflowStepInput # DeleteWorkflowStepOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkflowStepOutput # DeleteWorkspaceCursorIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceCursorIntegrationOutput # DeleteWorkspaceDiscordChannelIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceDiscordChannelIntegrationInput # DeleteWorkspaceDiscordChannelIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceDiscordChannelIntegrationOutput # DeleteWorkspaceDiscordIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceDiscordIntegrationInput # DeleteWorkspaceDiscordIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceDiscordIntegrationOutput # DeleteWorkspaceEmailDomainSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceEmailDomainSettingsOutput # DeleteWorkspaceFileInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceFileInput # DeleteWorkspaceFileOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceFileOutput # DeleteWorkspaceInviteInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceInviteInput # DeleteWorkspaceInviteOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceInviteOutput # DeleteWorkspaceMSTeamsIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceMSTeamsIntegrationInput # DeleteWorkspaceMSTeamsIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceMSTeamsIntegrationOutput # DeleteWorkspaceSlackChannelIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceSlackChannelIntegrationInput # DeleteWorkspaceSlackChannelIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceSlackChannelIntegrationOutput # DeleteWorkspaceSlackIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceSlackIntegrationInput # DeleteWorkspaceSlackIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceSlackIntegrationOutput # DeleteWorkspaceSlackSidekickIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/DeleteWorkspaceSlackSidekickIntegrationOutput # DeletedCustomerActor Source: https://www.plain.com/docs/graphql-reference/types/DeletedCustomerActor # DeletedCustomerEmailActor Source: https://www.plain.com/docs/graphql-reference/types/DeletedCustomerEmailActor # DeletedThread Source: https://www.plain.com/docs/graphql-reference/types/DeletedThread A record of a thread that has been deleted, returned by the `deletedThreads` query. # DeletedThreadConnection Source: https://www.plain.com/docs/graphql-reference/types/DeletedThreadConnection # DeletedThreadEdge Source: https://www.plain.com/docs/graphql-reference/types/DeletedThreadEdge # DeletedThreadsFilter Source: https://www.plain.com/docs/graphql-reference/types/DeletedThreadsFilter # DemoChannelType Source: https://www.plain.com/docs/graphql-reference/types/DemoChannelType # DependsOnLabelType Source: https://www.plain.com/docs/graphql-reference/types/DependsOnLabelType # DependsOnThreadFieldInput Source: https://www.plain.com/docs/graphql-reference/types/DependsOnThreadFieldInput Makes a thread field conditional on a sibling field's value. Nesting is capped at one level: `threadFieldSchemaId` must reference a field that does not itself depend on another thread field, otherwise the mutation fails with `cannot_create_thread_field_schema` (the dependent nesting level is too deep). # DependsOnThreadFieldType Source: https://www.plain.com/docs/graphql-reference/types/DependsOnThreadFieldType # DiscordCustomerIdentity Source: https://www.plain.com/docs/graphql-reference/types/DiscordCustomerIdentity # DiscordMessage Source: https://www.plain.com/docs/graphql-reference/types/DiscordMessage # DiscordMessageEntry Source: https://www.plain.com/docs/graphql-reference/types/DiscordMessageEntry # DiscordThreadChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/DiscordThreadChannelDetails # DiscussionAgentType Source: https://www.plain.com/docs/graphql-reference/types/DiscussionAgentType Which kind of agent is working on a discussion. This is about who runs the agent, not which channel the discussion is on: a Sidekick session can run in Plain, in a workflow or in Slack. # DiscussionResolvedNotificationDetail Source: https://www.plain.com/docs/graphql-reference/types/DiscussionResolvedNotificationDetail # DiscussionSourceEntityType Source: https://www.plain.com/docs/graphql-reference/types/DiscussionSourceEntityType # DiscussionSourceType Source: https://www.plain.com/docs/graphql-reference/types/DiscussionSourceType What kind of source a discussion was started from. CHART is a reporting chart/page (carries sourcePageLink, no sourceEntityId); ENTITY carries sourceEntityId + sourceEntityType; PAGE carries just sourcePageLink; THREAD is thread-scoped. # DiscussionToolCallStatus Source: https://www.plain.com/docs/graphql-reference/types/DiscussionToolCallStatus PENDING while in flight, then SUCCESS or ERROR (final). # DiscussionType Source: https://www.plain.com/docs/graphql-reference/types/DiscussionType # DiscussionsFilter Source: https://www.plain.com/docs/graphql-reference/types/DiscussionsFilter # DiscussionsSort Source: https://www.plain.com/docs/graphql-reference/types/DiscussionsSort # DiscussionsSortField Source: https://www.plain.com/docs/graphql-reference/types/DiscussionsSortField # DismissSuggestedLabelTypesInput Source: https://www.plain.com/docs/graphql-reference/types/DismissSuggestedLabelTypesInput # DismissSuggestedLabelTypesOutput Source: https://www.plain.com/docs/graphql-reference/types/DismissSuggestedLabelTypesOutput # DnsRecord Source: https://www.plain.com/docs/graphql-reference/types/DnsRecord # DoneStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/DoneStatusDetail # EditQueuedAgentSessionMessageInput Source: https://www.plain.com/docs/graphql-reference/types/EditQueuedAgentSessionMessageInput # EditQueuedAgentSessionMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/EditQueuedAgentSessionMessageOutput # Email Source: https://www.plain.com/docs/graphql-reference/types/Email # EmailActor Source: https://www.plain.com/docs/graphql-reference/types/EmailActor # EmailAddress Source: https://www.plain.com/docs/graphql-reference/types/EmailAddress An object modelling an email address and if it's been verified. # EmailAddressInput Source: https://www.plain.com/docs/graphql-reference/types/EmailAddressInput # EmailAuthenticity Source: https://www.plain.com/docs/graphql-reference/types/EmailAuthenticity # EmailBounce Source: https://www.plain.com/docs/graphql-reference/types/EmailBounce # EmailBounceNotificationDetail Source: https://www.plain.com/docs/graphql-reference/types/EmailBounceNotificationDetail # EmailBounceReason Source: https://www.plain.com/docs/graphql-reference/types/EmailBounceReason # EmailBroadcastSendDeliveryRecipient Source: https://www.plain.com/docs/graphql-reference/types/EmailBroadcastSendDeliveryRecipient # EmailCategory Source: https://www.plain.com/docs/graphql-reference/types/EmailCategory # EmailCustomerIdentity Source: https://www.plain.com/docs/graphql-reference/types/EmailCustomerIdentity # EmailEntry Source: https://www.plain.com/docs/graphql-reference/types/EmailEntry # EmailParticipant Source: https://www.plain.com/docs/graphql-reference/types/EmailParticipant # EmailParticipantInput Source: https://www.plain.com/docs/graphql-reference/types/EmailParticipantInput # EmailPreviewUrl Source: https://www.plain.com/docs/graphql-reference/types/EmailPreviewUrl # EmailSendStatus Source: https://www.plain.com/docs/graphql-reference/types/EmailSendStatus # EmailSignature Source: https://www.plain.com/docs/graphql-reference/types/EmailSignature # EmailSuppression Source: https://www.plain.com/docs/graphql-reference/types/EmailSuppression # EmailSuppressionReason Source: https://www.plain.com/docs/graphql-reference/types/EmailSuppressionReason # EmbedToken Source: https://www.plain.com/docs/graphql-reference/types/EmbedToken A short-lived signed JWT that an embed iframe can pass to a customer's backend for verification against the Plain-hosted JWKS at `jwksUrl`. # Entry Source: https://www.plain.com/docs/graphql-reference/types/Entry A union of all possible entries that can appear in a timeline. # EscalateThreadInput Source: https://www.plain.com/docs/graphql-reference/types/EscalateThreadInput # EscalateThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/EscalateThreadOutput # EscalationPath Source: https://www.plain.com/docs/graphql-reference/types/EscalationPath # EscalationPathConnection Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathConnection # EscalationPathEdge Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathEdge # EscalationPathStep Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathStep A single step in an escalation path. Each step either targets a specific user or all owners of a label type. # EscalationPathStepInput Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathStepInput # EscalationPathStepLabelType Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathStepLabelType An escalation step that assigns the thread the given label type, routing it to that label type's owners. # EscalationPathStepType Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathStepType # EscalationPathStepUser Source: https://www.plain.com/docs/graphql-reference/types/EscalationPathStepUser An escalation step that directly assigns the thread to a specific user. # EventComponent Source: https://www.plain.com/docs/graphql-reference/types/EventComponent # EventComponentInput Source: https://www.plain.com/docs/graphql-reference/types/EventComponentInput # ExportWorkflowTemplateInput Source: https://www.plain.com/docs/graphql-reference/types/ExportWorkflowTemplateInput # ExportWorkflowTemplateOutput Source: https://www.plain.com/docs/graphql-reference/types/ExportWorkflowTemplateOutput # FavoritePage Source: https://www.plain.com/docs/graphql-reference/types/FavoritePage # FavoritePageConnection Source: https://www.plain.com/docs/graphql-reference/types/FavoritePageConnection # FavoritePageEdge Source: https://www.plain.com/docs/graphql-reference/types/FavoritePageEdge # FeatureKey Source: https://www.plain.com/docs/graphql-reference/types/FeatureKey # FileSize Source: https://www.plain.com/docs/graphql-reference/types/FileSize # FirstResolutionTimeServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/types/FirstResolutionTimeServiceLevelAgreement An SLA that tracks the time from thread creation until the thread is first marked Done. Reopening a thread does not start a new tracker. # FirstResponseTimeServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/types/FirstResponseTimeServiceLevelAgreement An SLA that tracks the time from thread creation until a teammate sends the first reply. # ForkThreadInput Source: https://www.plain.com/docs/graphql-reference/types/ForkThreadInput # ForkThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/ForkThreadOutput # GenerateAiToneRulesFromDescriptionInput Source: https://www.plain.com/docs/graphql-reference/types/GenerateAiToneRulesFromDescriptionInput # GenerateAiToneRulesFromDescriptionOutput Source: https://www.plain.com/docs/graphql-reference/types/GenerateAiToneRulesFromDescriptionOutput # GenerateHelpCenterArticleInput Source: https://www.plain.com/docs/graphql-reference/types/GenerateHelpCenterArticleInput # GenerateHelpCenterArticleOutput Source: https://www.plain.com/docs/graphql-reference/types/GenerateHelpCenterArticleOutput # GenerateReplyOption Source: https://www.plain.com/docs/graphql-reference/types/GenerateReplyOption # GeneratedReply Source: https://www.plain.com/docs/graphql-reference/types/GeneratedReply # GeneratedReplyFeedbackInput Source: https://www.plain.com/docs/graphql-reference/types/GeneratedReplyFeedbackInput # GeneratedReplyFeedbackType Source: https://www.plain.com/docs/graphql-reference/types/GeneratedReplyFeedbackType # GenericThreadLink Source: https://www.plain.com/docs/graphql-reference/types/GenericThreadLink # GithubUserAuthIntegration Source: https://www.plain.com/docs/graphql-reference/types/GithubUserAuthIntegration # HeatmapMetricName Source: https://www.plain.com/docs/graphql-reference/types/HeatmapMetricName # HelpCenter Source: https://www.plain.com/docs/graphql-reference/types/HelpCenter # HelpCenterAccessSettings Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAccessSettings # HelpCenterAccessSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAccessSettingsInput # HelpCenterAiConversationMessageEntry Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAiConversationMessageEntry # HelpCenterArticle Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticle # HelpCenterArticleConnection Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleConnection # HelpCenterArticleCopyOptionSettings Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleCopyOptionSettings # HelpCenterArticleCopyOptionSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleCopyOptionSettingsInput # HelpCenterArticleCopyOptions Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleCopyOptions # HelpCenterArticleCopyOptionsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleCopyOptionsInput # HelpCenterArticleDocument Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleDocument A help center article as a unit of citable knowledge. # HelpCenterArticleEdge Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleEdge # HelpCenterArticleGroup Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleGroup # HelpCenterArticleGroupConnection Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleGroupConnection # HelpCenterArticleGroupEdge Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleGroupEdge # HelpCenterArticleSearchResult Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleSearchResult # HelpCenterArticleStatus Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterArticleStatus # HelpCenterAuthMechanism Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAuthMechanism # HelpCenterAuthMechanismInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAuthMechanismInput # HelpCenterAuthMechanismType Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAuthMechanismType # HelpCenterAuthMechanismWorkosAuthkit Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAuthMechanismWorkosAuthkit # HelpCenterAuthMechanismWorkosConnect Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterAuthMechanismWorkosConnect # HelpCenterConnection Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterConnection # HelpCenterDomainNameVerificationTxtRecord Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterDomainNameVerificationTxtRecord # HelpCenterDomainSettings Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterDomainSettings # HelpCenterEdge Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterEdge # HelpCenterIndex Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterIndex # HelpCenterIndexItem Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterIndexItem # HelpCenterIndexItemInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterIndexItemInput # HelpCenterIndexItemType Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterIndexItemType # HelpCenterPortalSettings Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettings # HelpCenterPortalSettingsDropdownFormField Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsDropdownFormField # HelpCenterPortalSettingsDropdownOption Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsDropdownOption # HelpCenterPortalSettingsDropdownOptionInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsDropdownOptionInput # HelpCenterPortalSettingsFormField Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsFormField # HelpCenterPortalSettingsFormFieldInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsFormFieldInput # HelpCenterPortalSettingsFormFieldType Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsFormFieldType # HelpCenterPortalSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsInput # HelpCenterPortalSettingsOverrideCustomerCompany Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsOverrideCustomerCompany # HelpCenterPortalSettingsOverrideCustomerCompanyInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsOverrideCustomerCompanyInput # HelpCenterPortalSettingsOverrideCustomerTenants Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsOverrideCustomerTenants # HelpCenterPortalSettingsOverrideCustomerTenantsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsOverrideCustomerTenantsInput # HelpCenterPortalSettingsTextFormField Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsTextFormField # HelpCenterPortalSettingsThreadDetails Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsThreadDetails # HelpCenterPortalSettingsThreadDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsThreadDetailsInput # HelpCenterPortalSettingsThreadFields Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsThreadFields # HelpCenterPortalSettingsThreadFieldsInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsThreadFieldsInput # HelpCenterPortalSettingsThreadVisibility Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsThreadVisibility # HelpCenterPortalSettingsThreadVisibilityInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterPortalSettingsThreadVisibilityInput # HelpCenterThemedImage Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterThemedImage # HelpCenterThemedImageInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterThemedImageInput # HelpCenterType Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterType # HelpCenterWorkosAuthkitAuthMechanismInput Source: https://www.plain.com/docs/graphql-reference/types/HelpCenterWorkosAuthkitAuthMechanismInput # HelpCentersFilter Source: https://www.plain.com/docs/graphql-reference/types/HelpCentersFilter # HyperlineCheckoutSession Source: https://www.plain.com/docs/graphql-reference/types/HyperlineCheckoutSession # HyperlineCheckoutSessionStatus Source: https://www.plain.com/docs/graphql-reference/types/HyperlineCheckoutSessionStatus # ImpersonationInput Source: https://www.plain.com/docs/graphql-reference/types/ImpersonationInput Exactly one field must be set. # ImportCustomerInput Source: https://www.plain.com/docs/graphql-reference/types/ImportCustomerInput # ImportCustomerTenantInput Source: https://www.plain.com/docs/graphql-reference/types/ImportCustomerTenantInput # ImportCustomersInput Source: https://www.plain.com/docs/graphql-reference/types/ImportCustomersInput # ImportCustomersOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportCustomersOutput # ImportJob Source: https://www.plain.com/docs/graphql-reference/types/ImportJob # ImportJobConnection Source: https://www.plain.com/docs/graphql-reference/types/ImportJobConnection # ImportJobDefinition Source: https://www.plain.com/docs/graphql-reference/types/ImportJobDefinition # ImportJobDefinitionList Source: https://www.plain.com/docs/graphql-reference/types/ImportJobDefinitionList # ImportJobDefinitionMetadata Source: https://www.plain.com/docs/graphql-reference/types/ImportJobDefinitionMetadata # ImportJobEdge Source: https://www.plain.com/docs/graphql-reference/types/ImportJobEdge # ImportJobsFilter Source: https://www.plain.com/docs/graphql-reference/types/ImportJobsFilter # ImportResult Source: https://www.plain.com/docs/graphql-reference/types/ImportResult # ImportRun Source: https://www.plain.com/docs/graphql-reference/types/ImportRun # ImportSyncFiltersInput Source: https://www.plain.com/docs/graphql-reference/types/ImportSyncFiltersInput # ImportTenantFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantFieldSchemaInput # ImportTenantFieldSchemasFromServiceInput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantFieldSchemasFromServiceInput # ImportTenantFieldSchemasFromServiceOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantFieldSchemasFromServiceOutput # ImportTenantFieldSchemasInput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantFieldSchemasInput # ImportTenantFieldSchemasOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantFieldSchemasOutput # ImportTenantFieldValueInput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantFieldValueInput # ImportTenantInput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantInput # ImportTenantsInput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantsInput # ImportTenantsOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportTenantsOutput # ImportThreadAssignedToInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadAssignedToInput Only one of the fields can be set. # ImportThreadChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadChannelDetails # ImportThreadDiscussionInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadDiscussionInput # ImportThreadDiscussionOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadDiscussionOutput # ImportThreadDiscussionSlackDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadDiscussionSlackDetailsInput # ImportThreadDiscussionType Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadDiscussionType # ImportThreadInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadInput # ImportThreadMessageAuthorInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadMessageAuthorInput Only one of customerId or userId must be provided. # ImportThreadMessageInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadMessageInput # ImportThreadMessageResult Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadMessageResult # ImportThreadMessageType Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadMessageType # ImportThreadMessagesInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadMessagesInput # ImportThreadMessagesOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadMessagesOutput # ImportThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadOutput # ImportThreadStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadStatusDetail # ImportThreadStatusDetailInput Source: https://www.plain.com/docs/graphql-reference/types/ImportThreadStatusDetailInput # ImportedThreadMessage Source: https://www.plain.com/docs/graphql-reference/types/ImportedThreadMessage # ImporterEntityType Source: https://www.plain.com/docs/graphql-reference/types/ImporterEntityType # ImporterStatus Source: https://www.plain.com/docs/graphql-reference/types/ImporterStatus # ImporterTenantList Source: https://www.plain.com/docs/graphql-reference/types/ImporterTenantList A list or view of tenants/companies available in a connected external service, used to scope which records are synced during an import. # ImporterTenantListConnection Source: https://www.plain.com/docs/graphql-reference/types/ImporterTenantListConnection # ImporterTenantListEdge Source: https://www.plain.com/docs/graphql-reference/types/ImporterTenantListEdge # IndexedDocument Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocument # IndexedDocumentConnection Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentConnection # IndexedDocumentEdge Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentEdge # IndexedDocumentSearchResult Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentSearchResult # IndexedDocumentStatus Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentStatus # IndexedDocumentStatusFailed Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentStatusFailed # IndexedDocumentStatusIndexed Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentStatusIndexed # IndexedDocumentStatusPending Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentStatusPending # IndexedDocumentStatusType Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentStatusType The ingestion status of an indexed document, used to filter documents in the `indexedDocuments` query. # IndexedDocumentsFilter Source: https://www.plain.com/docs/graphql-reference/types/IndexedDocumentsFilter # IndexingStatus Source: https://www.plain.com/docs/graphql-reference/types/IndexingStatus # IndexingStatusFailed Source: https://www.plain.com/docs/graphql-reference/types/IndexingStatusFailed # IndexingStatusIndexed Source: https://www.plain.com/docs/graphql-reference/types/IndexingStatusIndexed # IndexingStatusPending Source: https://www.plain.com/docs/graphql-reference/types/IndexingStatusPending # IntArrayInput Source: https://www.plain.com/docs/graphql-reference/types/IntArrayInput # IntInput Source: https://www.plain.com/docs/graphql-reference/types/IntInput # IntegrationReauthRequiredNotificationDetail Source: https://www.plain.com/docs/graphql-reference/types/IntegrationReauthRequiredNotificationDetail An integration's stored credentials can no longer be refreshed, so it must be reconnected before it will work again. # InternalActor Source: https://www.plain.com/docs/graphql-reference/types/InternalActor # InternalNotification Source: https://www.plain.com/docs/graphql-reference/types/InternalNotification An internal notification displayed to workspace members in the Plain app. Each notification is for a specific user. # InternalNotificationConnection Source: https://www.plain.com/docs/graphql-reference/types/InternalNotificationConnection # InternalNotificationDetail Source: https://www.plain.com/docs/graphql-reference/types/InternalNotificationDetail # InternalNotificationEdge Source: https://www.plain.com/docs/graphql-reference/types/InternalNotificationEdge # InternalNotificationsFilter Source: https://www.plain.com/docs/graphql-reference/types/InternalNotificationsFilter # InviteUserToWorkspaceInput Source: https://www.plain.com/docs/graphql-reference/types/InviteUserToWorkspaceInput # InviteUserToWorkspaceOutput Source: https://www.plain.com/docs/graphql-reference/types/InviteUserToWorkspaceOutput # IssueTrackerField Source: https://www.plain.com/docs/graphql-reference/types/IssueTrackerField # IssueTrackerFieldInput Source: https://www.plain.com/docs/graphql-reference/types/IssueTrackerFieldInput # IssueTrackerFieldOption Source: https://www.plain.com/docs/graphql-reference/types/IssueTrackerFieldOption # IssueTrackerFieldType Source: https://www.plain.com/docs/graphql-reference/types/IssueTrackerFieldType # JiraIntegrationToken Source: https://www.plain.com/docs/graphql-reference/types/JiraIntegrationToken An OAuth access token representing the current user's connection to Jira. Use this token to make authenticated calls to the Jira API on behalf of the user. # JiraIssueThreadLink Source: https://www.plain.com/docs/graphql-reference/types/JiraIssueThreadLink # JiraIssueThreadLinkInput Source: https://www.plain.com/docs/graphql-reference/types/JiraIssueThreadLinkInput # JiraIssueType Source: https://www.plain.com/docs/graphql-reference/types/JiraIssueType # JiraSite Source: https://www.plain.com/docs/graphql-reference/types/JiraSite # JiraSiteIntegration Source: https://www.plain.com/docs/graphql-reference/types/JiraSiteIntegration # KnowledgeDocument Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeDocument A single unit of indexed, retrievable, citable knowledge (the content), as opposed to a KnowledgeSource which is the configuration of where that content is ingested from. Reusable anywhere a knowledge document is returned, e.g. citations today and knowledge document listings in future. # KnowledgeGap Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGap # KnowledgeGapConnection Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapConnection # KnowledgeGapEdge Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapEdge # KnowledgeGapFeedbackDetails Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapFeedbackDetails # KnowledgeGapSignal Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapSignal # KnowledgeGapSignalConnection Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapSignalConnection # KnowledgeGapSignalEdge Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapSignalEdge # KnowledgeGapSignalType Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapSignalType # KnowledgeGapStatus Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapStatus # KnowledgeGapTaskLink Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapTaskLink # KnowledgeGapsFilter Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapsFilter # KnowledgeGapsSort Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapsSort # KnowledgeGapsSortField Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeGapsSortField # KnowledgeSource Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSource # KnowledgeSourceCitation Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceCitation A knowledge document that an AI agent reply cited, linked to the timeline entry it was cited in. One reply can produce multiple citations; each is returned as its own entry. # KnowledgeSourceCitationType Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceCitationType The kind of knowledge source an AI agent citation points at. # KnowledgeSourceConnection Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceConnection # KnowledgeSourceEdge Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceEdge # KnowledgeSourceSearchResult Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceSearchResult # KnowledgeSourceSearchResultType Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceSearchResultType # KnowledgeSourceSitemap Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceSitemap # KnowledgeSourceSitemapIndexedDocumentCounts Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceSitemapIndexedDocumentCounts Counts of a sitemap's crawled URLs, broken down by indexing status. # KnowledgeSourceType Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceType # KnowledgeSourceUrl Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourceUrl # KnowledgeSourcesFilter Source: https://www.plain.com/docs/graphql-reference/types/KnowledgeSourcesFilter # Label Source: https://www.plain.com/docs/graphql-reference/types/Label A label applied to a thread or user. Each label is an instance of a LabelType and records who applied it and when. # LabelType Source: https://www.plain.com/docs/graphql-reference/types/LabelType # LabelTypeConnection Source: https://www.plain.com/docs/graphql-reference/types/LabelTypeConnection # LabelTypeEdge Source: https://www.plain.com/docs/graphql-reference/types/LabelTypeEdge # LabelTypeFilter Source: https://www.plain.com/docs/graphql-reference/types/LabelTypeFilter # LabelTypeType Source: https://www.plain.com/docs/graphql-reference/types/LabelTypeType # LinearIntegrationToken Source: https://www.plain.com/docs/graphql-reference/types/LinearIntegrationToken # LinearIssueState Source: https://www.plain.com/docs/graphql-reference/types/LinearIssueState # LinearIssueStateType Source: https://www.plain.com/docs/graphql-reference/types/LinearIssueStateType Represents the possible states of a Linear issue, sourced from the Linear API. Reference: https://studio.apollographql.com/public/Linear-API/variant/current/schema/reference/objects/WorkflowState#type # LinearIssueThreadLink Source: https://www.plain.com/docs/graphql-reference/types/LinearIssueThreadLink # LinearIssueThreadLinkInput Source: https://www.plain.com/docs/graphql-reference/types/LinearIssueThreadLinkInput # LinearIssueThreadLinkStateTransitionedEntry Source: https://www.plain.com/docs/graphql-reference/types/LinearIssueThreadLinkStateTransitionedEntry # LockThreadInput Source: https://www.plain.com/docs/graphql-reference/types/LockThreadInput # LockThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/LockThreadOutput # MSTeamsChannelMember Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsChannelMember # MSTeamsChannelMemberRole Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsChannelMemberRole # MSTeamsChannelMembers Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsChannelMembers # MSTeamsMessage Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsMessage # MSTeamsMessageEntry Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsMessageEntry # MSTeamsMessageType Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsMessageType # MSTeamsThreadChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsThreadChannelDetails # MSTeamsThreadChannelDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/MSTeamsThreadChannelDetailsInput # MachineUser Source: https://www.plain.com/docs/graphql-reference/types/MachineUser # MachineUserActor Source: https://www.plain.com/docs/graphql-reference/types/MachineUserActor # MachineUserConnection Source: https://www.plain.com/docs/graphql-reference/types/MachineUserConnection # MachineUserEdge Source: https://www.plain.com/docs/graphql-reference/types/MachineUserEdge # MachineUserType Source: https://www.plain.com/docs/graphql-reference/types/MachineUserType # MachineUsersFilter Source: https://www.plain.com/docs/graphql-reference/types/MachineUsersFilter # MarkCustomerAsSpamInput Source: https://www.plain.com/docs/graphql-reference/types/MarkCustomerAsSpamInput # MarkCustomerAsSpamOutput Source: https://www.plain.com/docs/graphql-reference/types/MarkCustomerAsSpamOutput # MarkThreadAsDoneInput Source: https://www.plain.com/docs/graphql-reference/types/MarkThreadAsDoneInput # MarkThreadAsDoneOutput Source: https://www.plain.com/docs/graphql-reference/types/MarkThreadAsDoneOutput # MarkThreadAsTodoInput Source: https://www.plain.com/docs/graphql-reference/types/MarkThreadAsTodoInput # MarkThreadAsTodoOutput Source: https://www.plain.com/docs/graphql-reference/types/MarkThreadAsTodoOutput # MarkThreadDiscussionReadInput Source: https://www.plain.com/docs/graphql-reference/types/MarkThreadDiscussionReadInput # MarkThreadDiscussionReadOutput Source: https://www.plain.com/docs/graphql-reference/types/MarkThreadDiscussionReadOutput # MentionInput Source: https://www.plain.com/docs/graphql-reference/types/MentionInput # MergedThreadMessageEntry Source: https://www.plain.com/docs/graphql-reference/types/MergedThreadMessageEntry # MessageSource Source: https://www.plain.com/docs/graphql-reference/types/MessageSource # MeteredFeatureEntitlement Source: https://www.plain.com/docs/graphql-reference/types/MeteredFeatureEntitlement # MinimalThreadWithDistance Source: https://www.plain.com/docs/graphql-reference/types/MinimalThreadWithDistance # MintEmbedTokenInput Source: https://www.plain.com/docs/graphql-reference/types/MintEmbedTokenInput # MintEmbedTokenOutput Source: https://www.plain.com/docs/graphql-reference/types/MintEmbedTokenOutput # MoveLabelTypeInput Source: https://www.plain.com/docs/graphql-reference/types/MoveLabelTypeInput # MoveLabelTypeOutput Source: https://www.plain.com/docs/graphql-reference/types/MoveLabelTypeOutput # MoveWorkflowInput Source: https://www.plain.com/docs/graphql-reference/types/MoveWorkflowInput # MoveWorkflowOutput Source: https://www.plain.com/docs/graphql-reference/types/MoveWorkflowOutput # MutationError Source: https://www.plain.com/docs/graphql-reference/types/MutationError A type indicating an error has occurred while making a mutation. # MutationErrorType Source: https://www.plain.com/docs/graphql-reference/types/MutationErrorType An enum for why the mutation failed overall. # MutationFieldError Source: https://www.plain.com/docs/graphql-reference/types/MutationFieldError A type indicating an error has occurred with a specific field in the input. # MutationFieldErrorType Source: https://www.plain.com/docs/graphql-reference/types/MutationFieldErrorType An enum specific to each field, explaining why validation failed. # NextResponseTimeServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/types/NextResponseTimeServiceLevelAgreement An SLA that tracks the time from each new customer message until a teammate replies. On a tier, this requires a first-response-time SLA to exist on the same tier; in an SLA policy it stands on its own. # Note Source: https://www.plain.com/docs/graphql-reference/types/Note # NoteEntry Source: https://www.plain.com/docs/graphql-reference/types/NoteEntry # NoteMentionNotificationDetail Source: https://www.plain.com/docs/graphql-reference/types/NoteMentionNotificationDetail # NumberSetting Source: https://www.plain.com/docs/graphql-reference/types/NumberSetting A number setting # OptionalBooleanInput Source: https://www.plain.com/docs/graphql-reference/types/OptionalBooleanInput # OptionalDateTimeInput Source: https://www.plain.com/docs/graphql-reference/types/OptionalDateTimeInput # OptionalDependsOnThreadFieldInput Source: https://www.plain.com/docs/graphql-reference/types/OptionalDependsOnThreadFieldInput # OptionalFloatInput Source: https://www.plain.com/docs/graphql-reference/types/OptionalFloatInput # OptionalGeneratedReplyFeedbackInput Source: https://www.plain.com/docs/graphql-reference/types/OptionalGeneratedReplyFeedbackInput # OptionalStringInput Source: https://www.plain.com/docs/graphql-reference/types/OptionalStringInput # PageInfo Source: https://www.plain.com/docs/graphql-reference/types/PageInfo # PerSeatRecurringPrice Source: https://www.plain.com/docs/graphql-reference/types/PerSeatRecurringPrice # Permissions Source: https://www.plain.com/docs/graphql-reference/types/Permissions A list of permission strings granted to a user or machine user in the current workspace context. # PlainHelpCenterArticleSearchResult Source: https://www.plain.com/docs/graphql-reference/types/PlainHelpCenterArticleSearchResult A result from a semantic search over Plain's own public help center (help.plain.com). # PlainTaskThreadLink Source: https://www.plain.com/docs/graphql-reference/types/PlainTaskThreadLink # PlainTaskThreadLinkInput Source: https://www.plain.com/docs/graphql-reference/types/PlainTaskThreadLinkInput # PlainThreadLinkInput Source: https://www.plain.com/docs/graphql-reference/types/PlainThreadLinkInput # PlainThreadThreadLink Source: https://www.plain.com/docs/graphql-reference/types/PlainThreadThreadLink # PlainWorkspaceBroadcastSender Source: https://www.plain.com/docs/graphql-reference/types/PlainWorkspaceBroadcastSender The workspace itself, rather than any one person. Its name and logo are applied to the Slack message, so the broadcast arrives from the company rather than from Plain. # PreviewBillingPlanChangeInput Source: https://www.plain.com/docs/graphql-reference/types/PreviewBillingPlanChangeInput # PreviewBillingPlanChangeOutput Source: https://www.plain.com/docs/graphql-reference/types/PreviewBillingPlanChangeOutput # Price Source: https://www.plain.com/docs/graphql-reference/types/Price # PriceTier Source: https://www.plain.com/docs/graphql-reference/types/PriceTier # PurchaseCreditsInput Source: https://www.plain.com/docs/graphql-reference/types/PurchaseCreditsInput # PurchaseCreditsOutput Source: https://www.plain.com/docs/graphql-reference/types/PurchaseCreditsOutput # QueuedAgentSessionMessage Source: https://www.plain.com/docs/graphql-reference/types/QueuedAgentSessionMessage A user message that has been submitted to a Sidekick AGENT_SESSION discussion while the agent was mid-turn. Lives in the queue until the agent picks it up. Once picked up, it's promoted to a regular ThreadDiscussionMessage and removed from the queue. # RecurringPrice Source: https://www.plain.com/docs/graphql-reference/types/RecurringPrice # RefreshConnectedDiscordChannelsInput Source: https://www.plain.com/docs/graphql-reference/types/RefreshConnectedDiscordChannelsInput # RefreshConnectedDiscordChannelsOutput Source: https://www.plain.com/docs/graphql-reference/types/RefreshConnectedDiscordChannelsOutput # RefreshSidekickMcpServerToolsInput Source: https://www.plain.com/docs/graphql-reference/types/RefreshSidekickMcpServerToolsInput # RefreshSidekickMcpServerToolsOutput Source: https://www.plain.com/docs/graphql-reference/types/RefreshSidekickMcpServerToolsOutput # RefreshWorkspaceSlackChannelIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/RefreshWorkspaceSlackChannelIntegrationInput # RefreshWorkspaceSlackChannelIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/RefreshWorkspaceSlackChannelIntegrationOutput # RefreshWorkspaceSlackSidekickIntegrationInput Source: https://www.plain.com/docs/graphql-reference/types/RefreshWorkspaceSlackSidekickIntegrationInput # RefreshWorkspaceSlackSidekickIntegrationOutput Source: https://www.plain.com/docs/graphql-reference/types/RefreshWorkspaceSlackSidekickIntegrationOutput # RegenerateWorkspaceHmacOutput Source: https://www.plain.com/docs/graphql-reference/types/RegenerateWorkspaceHmacOutput # ReindexKnowledgeSourceInput Source: https://www.plain.com/docs/graphql-reference/types/ReindexKnowledgeSourceInput # ReindexKnowledgeSourceOutput Source: https://www.plain.com/docs/graphql-reference/types/ReindexKnowledgeSourceOutput # ReloadCustomerCardInstanceInput Source: https://www.plain.com/docs/graphql-reference/types/ReloadCustomerCardInstanceInput # ReloadCustomerCardInstanceOutput Source: https://www.plain.com/docs/graphql-reference/types/ReloadCustomerCardInstanceOutput # RemoveAdditionalAssigneesInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveAdditionalAssigneesInput # RemoveAdditionalAssigneesOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveAdditionalAssigneesOutput # RemoveCustomerFromCustomerGroupsInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveCustomerFromCustomerGroupsInput # RemoveCustomerFromCustomerGroupsOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveCustomerFromCustomerGroupsOutput # RemoveCustomerFromTenantsInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveCustomerFromTenantsInput # RemoveCustomerFromTenantsOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveCustomerFromTenantsOutput # RemoveLabelsFromUserInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveLabelsFromUserInput # RemoveLabelsFromUserOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveLabelsFromUserOutput # RemoveLabelsInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveLabelsInput # RemoveLabelsOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveLabelsOutput # RemoveMembersFromTierInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveMembersFromTierInput # RemoveMembersFromTierOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveMembersFromTierOutput # RemoveTenantFieldSchemaMappingInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveTenantFieldSchemaMappingInput # RemoveTenantFieldSchemaMappingOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveTenantFieldSchemaMappingOutput # RemoveUserFromActiveBillingRotaInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveUserFromActiveBillingRotaInput # RemoveUserFromActiveBillingRotaOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveUserFromActiveBillingRotaOutput # RemoveWorkspaceAlternateSupportEmailAddressInput Source: https://www.plain.com/docs/graphql-reference/types/RemoveWorkspaceAlternateSupportEmailAddressInput # RemoveWorkspaceAlternateSupportEmailAddressOutput Source: https://www.plain.com/docs/graphql-reference/types/RemoveWorkspaceAlternateSupportEmailAddressOutput # ReorderAutorespondersInput Source: https://www.plain.com/docs/graphql-reference/types/ReorderAutorespondersInput # ReorderAutorespondersOutput Source: https://www.plain.com/docs/graphql-reference/types/ReorderAutorespondersOutput # ReorderCustomerCardConfigsInput Source: https://www.plain.com/docs/graphql-reference/types/ReorderCustomerCardConfigsInput # ReorderCustomerCardConfigsOutput Source: https://www.plain.com/docs/graphql-reference/types/ReorderCustomerCardConfigsOutput # ReorderCustomerSurveysInput Source: https://www.plain.com/docs/graphql-reference/types/ReorderCustomerSurveysInput # ReorderCustomerSurveysOutput Source: https://www.plain.com/docs/graphql-reference/types/ReorderCustomerSurveysOutput # ReorderThreadFieldSchemasInput Source: https://www.plain.com/docs/graphql-reference/types/ReorderThreadFieldSchemasInput # ReorderThreadFieldSchemasOutput Source: https://www.plain.com/docs/graphql-reference/types/ReorderThreadFieldSchemasOutput # ReplyToEmailInput Source: https://www.plain.com/docs/graphql-reference/types/ReplyToEmailInput # ReplyToEmailOutput Source: https://www.plain.com/docs/graphql-reference/types/ReplyToEmailOutput # ReplyToThreadChannelSpecificOptionsInput Source: https://www.plain.com/docs/graphql-reference/types/ReplyToThreadChannelSpecificOptionsInput # ReplyToThreadEmailChannelSpecificOptionsInput Source: https://www.plain.com/docs/graphql-reference/types/ReplyToThreadEmailChannelSpecificOptionsInput # ReplyToThreadInput Source: https://www.plain.com/docs/graphql-reference/types/ReplyToThreadInput # ReplyToThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/ReplyToThreadOutput # ResolveAgentApprovalInput Source: https://www.plain.com/docs/graphql-reference/types/ResolveAgentApprovalInput # ResolveAgentApprovalOutput Source: https://www.plain.com/docs/graphql-reference/types/ResolveAgentApprovalOutput # ResolveCustomerForMSTeamsChannelInput Source: https://www.plain.com/docs/graphql-reference/types/ResolveCustomerForMSTeamsChannelInput # ResolveCustomerForMSTeamsChannelOutput Source: https://www.plain.com/docs/graphql-reference/types/ResolveCustomerForMSTeamsChannelOutput # ResolveCustomerForSlackChannelInput Source: https://www.plain.com/docs/graphql-reference/types/ResolveCustomerForSlackChannelInput # ResolveCustomerForSlackChannelOutput Source: https://www.plain.com/docs/graphql-reference/types/ResolveCustomerForSlackChannelOutput # Role Source: https://www.plain.com/docs/graphql-reference/types/Role # RoleChangeCost Source: https://www.plain.com/docs/graphql-reference/types/RoleChangeCost # RoleConnection Source: https://www.plain.com/docs/graphql-reference/types/RoleConnection # RoleEdge Source: https://www.plain.com/docs/graphql-reference/types/RoleEdge # RoleFilter Source: https://www.plain.com/docs/graphql-reference/types/RoleFilter # RoleKey Source: https://www.plain.com/docs/graphql-reference/types/RoleKey Stable identifiers for the built-in workspace roles. # RoleScope Source: https://www.plain.com/docs/graphql-reference/types/RoleScope # RoleScopeAccessMode Source: https://www.plain.com/docs/graphql-reference/types/RoleScopeAccessMode # RoleScopeDefinition Source: https://www.plain.com/docs/graphql-reference/types/RoleScopeDefinition # RoleScopeResourceType Source: https://www.plain.com/docs/graphql-reference/types/RoleScopeResourceType The type of resource that a role scope applies to. Currently only threads are supported. # SavedThreadsView Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsView # SavedThreadsViewConnection Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewConnection # SavedThreadsViewEdge Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewEdge # SavedThreadsViewFilter Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilter # SavedThreadsViewFilterInput Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilterInput # SavedThreadsViewFilterTenantField Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilterTenantField # SavedThreadsViewFilterThreadField Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilterThreadField # SavedThreadsViewFilterThreadFieldDate Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilterThreadFieldDate # SavedThreadsViewFilterThreadFieldNumber Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilterThreadFieldNumber # SavedThreadsViewFilterThreadLinkSource Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewFilterThreadLinkSource Filters threads by a specific external link source, combining the source system type and the source's identifier. # SavedThreadsViewNestedFilter Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewNestedFilter Filter fields for nested and/or/not expressions in SavedThreadsViewFilter. This is separate from SavedThreadsViewFilter because nested filters should only contain filter criteria, not top-level display configuration (sort, displayOptions, groupBy, layout). Unlike ThreadsFilter which is self-referential (pure filtering at every level), SavedThreadsViewFilter has display config that only makes sense at the top level. # SavedThreadsViewSort Source: https://www.plain.com/docs/graphql-reference/types/SavedThreadsViewSort # ScheduleBroadcastInput Source: https://www.plain.com/docs/graphql-reference/types/ScheduleBroadcastInput # ScheduleBroadcastOutput Source: https://www.plain.com/docs/graphql-reference/types/ScheduleBroadcastOutput # ScopeConditionInput Source: https://www.plain.com/docs/graphql-reference/types/ScopeConditionInput # SearchKnowledgeSourcesOptions Source: https://www.plain.com/docs/graphql-reference/types/SearchKnowledgeSourcesOptions # SelectedIssueTrackerField Source: https://www.plain.com/docs/graphql-reference/types/SelectedIssueTrackerField # SendBulkEmailInput Source: https://www.plain.com/docs/graphql-reference/types/SendBulkEmailInput # SendBulkEmailOutput Source: https://www.plain.com/docs/graphql-reference/types/SendBulkEmailOutput # SendBulkEmailSkippedThread Source: https://www.plain.com/docs/graphql-reference/types/SendBulkEmailSkippedThread # SendBulkEmailSkippedThreadReason Source: https://www.plain.com/docs/graphql-reference/types/SendBulkEmailSkippedThreadReason # SendChatInput Source: https://www.plain.com/docs/graphql-reference/types/SendChatInput # SendChatOutput Source: https://www.plain.com/docs/graphql-reference/types/SendChatOutput # SendCustomerChatInput Source: https://www.plain.com/docs/graphql-reference/types/SendCustomerChatInput # SendCustomerChatOutput Source: https://www.plain.com/docs/graphql-reference/types/SendCustomerChatOutput # SendDiscordMessageInput Source: https://www.plain.com/docs/graphql-reference/types/SendDiscordMessageInput # SendDiscordMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/SendDiscordMessageOutput # SendDiscussionMessageInput Source: https://www.plain.com/docs/graphql-reference/types/SendDiscussionMessageInput # SendDiscussionMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/SendDiscussionMessageOutput # SendMSTeamsMessageInput Source: https://www.plain.com/docs/graphql-reference/types/SendMSTeamsMessageInput # SendMSTeamsMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/SendMSTeamsMessageOutput # SendNewEmailInput Source: https://www.plain.com/docs/graphql-reference/types/SendNewEmailInput # SendNewEmailOutput Source: https://www.plain.com/docs/graphql-reference/types/SendNewEmailOutput # SendSlackMessageInput Source: https://www.plain.com/docs/graphql-reference/types/SendSlackMessageInput # SendSlackMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/SendSlackMessageOutput # SendTestBroadcastInput Source: https://www.plain.com/docs/graphql-reference/types/SendTestBroadcastInput # SendTestBroadcastOutput Source: https://www.plain.com/docs/graphql-reference/types/SendTestBroadcastOutput # SendThreadDiscussionMessageChannelDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/SendThreadDiscussionMessageChannelDetailsInput # SendThreadDiscussionMessageInput Source: https://www.plain.com/docs/graphql-reference/types/SendThreadDiscussionMessageInput # SendThreadDiscussionMessageOutput Source: https://www.plain.com/docs/graphql-reference/types/SendThreadDiscussionMessageOutput # SendThreadDiscussionMessageSlackChannelDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/SendThreadDiscussionMessageSlackChannelDetailsInput # SentimentType Source: https://www.plain.com/docs/graphql-reference/types/SentimentType # ServiceAuthorization Source: https://www.plain.com/docs/graphql-reference/types/ServiceAuthorization # ServiceAuthorizationConnection Source: https://www.plain.com/docs/graphql-reference/types/ServiceAuthorizationConnection # ServiceAuthorizationConnectionDetails Source: https://www.plain.com/docs/graphql-reference/types/ServiceAuthorizationConnectionDetails # ServiceAuthorizationEdge Source: https://www.plain.com/docs/graphql-reference/types/ServiceAuthorizationEdge # ServiceAuthorizationStatus Source: https://www.plain.com/docs/graphql-reference/types/ServiceAuthorizationStatus The status of the service authorization. The status transitions are: PENDING_AUTH → COMPLETED_AUTH → CONNECTED ↔ REINSTALL_REQUIRED Once connected, the status may revert to REINSTALL_REQUIRED if the integration is revoked in the third-party service; re-running the authorization flow will restore it to CONNECTED. # ServiceAuthorizationsFilter Source: https://www.plain.com/docs/graphql-reference/types/ServiceAuthorizationsFilter # ServiceIntegration Source: https://www.plain.com/docs/graphql-reference/types/ServiceIntegration # ServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreement A service level agreement (SLA) attached to a tier. Every thread belonging to the tier inherits the SLA and is tracked against its time target. # ServiceLevelAgreementFilter Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementFilter # ServiceLevelAgreementInput Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementInput # ServiceLevelAgreementPauseStatusDetailType Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPauseStatusDetailType Thread status details a resolution-time SLA can pause on. # ServiceLevelAgreementPauseStatusDetailTypeArrayInput Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPauseStatusDetailTypeArrayInput # ServiceLevelAgreementPoliciesFilter Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPoliciesFilter Narrows the SLA policy list. Omit a field to leave that dimension unconstrained. # ServiceLevelAgreementPolicy Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPolicy A named group of SLA targets that a workflow or a user applies to a thread. Unlike tier SLAs, a policy's targets are selected by type alone, so a policy holds at most one target per type. # ServiceLevelAgreementPolicyConnection Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPolicyConnection # ServiceLevelAgreementPolicyEdge Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPolicyEdge # ServiceLevelAgreementPolicyRef Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPolicyRef An SLA policy as it was when a timeline entry was written. Policies can be renamed or deleted afterwards, so this is a snapshot rather than a link. # ServiceLevelAgreementPolicyTarget Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPolicyTarget One time-to-target promise inside an SLA policy. A policy holds at most one target of each type. # ServiceLevelAgreementPolicyTargetInput Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementPolicyTargetInput # ServiceLevelAgreementStatus Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatus The lifecycle status of an SLA tracker for a given thread. # ServiceLevelAgreementStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetail # ServiceLevelAgreementStatusDetailAchieved Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetailAchieved # ServiceLevelAgreementStatusDetailBreached Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetailBreached # ServiceLevelAgreementStatusDetailBreaching Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetailBreaching # ServiceLevelAgreementStatusDetailCancelled Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetailCancelled # ServiceLevelAgreementStatusDetailImminentBreach Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetailImminentBreach # ServiceLevelAgreementStatusDetailPending Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusDetailPending # ServiceLevelAgreementStatusSummary Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusSummary A snapshot of the current SLA tracking status for a thread, broken down by SLA type. # ServiceLevelAgreementStatusTransitionedEntry Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementStatusTransitionedEntry A timeline entry recording a change in the SLA tracking status for a thread. # ServiceLevelAgreementThreadLabelTypeIdFilter Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementThreadLabelTypeIdFilter Restricts which threads an SLA applies to based on their label types. # ServiceLevelAgreementThreadLabelTypeIdFilterInput Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementThreadLabelTypeIdFilterInput # ServiceLevelAgreementType Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementType # ServiceLevelAgreementWarnBefore Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementWarnBefore How far ahead of an SLA target's deadline the thread is treated as close to breaching. # ServiceLevelAgreementWarnBeforeInput Source: https://www.plain.com/docs/graphql-reference/types/ServiceLevelAgreementWarnBeforeInput # SetCustomerTenantsInput Source: https://www.plain.com/docs/graphql-reference/types/SetCustomerTenantsInput # SetCustomerTenantsOutput Source: https://www.plain.com/docs/graphql-reference/types/SetCustomerTenantsOutput # SetSlackAutoJoinRulesInput Source: https://www.plain.com/docs/graphql-reference/types/SetSlackAutoJoinRulesInput An input provided to the `setSlackAutoJoinRules` mutation. # SetSlackAutoJoinRulesOutput Source: https://www.plain.com/docs/graphql-reference/types/SetSlackAutoJoinRulesOutput An output type provided by the `setSlackAutoJoinRules` mutation. # Setting Source: https://www.plain.com/docs/graphql-reference/types/Setting A union of all possible setting value types. Use inline fragments (`... on BooleanSetting`, `... on StringSetting`, `... on NumberSetting`, `... on StringArraySetting`) to access the concrete value for a given setting code. # SettingScope Source: https://www.plain.com/docs/graphql-reference/types/SettingScope Identifies the context to which a setting value is attached. The combination of `scopeType` and `id` uniquely addresses one setting row. # SettingScopeInput Source: https://www.plain.com/docs/graphql-reference/types/SettingScopeInput An input to specify the scope for a setting. # SettingScopeType Source: https://www.plain.com/docs/graphql-reference/types/SettingScopeType An enum to describe the type of scope the setting is for. # SettingValueInput Source: https://www.plain.com/docs/graphql-reference/types/SettingValueInput An input "union" where exactly one field may be be provided as an input. Current API only supports booleans but as the API expands more optional fields will be added. # SetupTenantFieldSchemaMappingInput Source: https://www.plain.com/docs/graphql-reference/types/SetupTenantFieldSchemaMappingInput # SetupTenantFieldSchemaMappingOutput Source: https://www.plain.com/docs/graphql-reference/types/SetupTenantFieldSchemaMappingOutput # ShareThreadToUserInSlackInput Source: https://www.plain.com/docs/graphql-reference/types/ShareThreadToUserInSlackInput # ShareThreadToUserInSlackOutput Source: https://www.plain.com/docs/graphql-reference/types/ShareThreadToUserInSlackOutput # SidekickConnectRequestStatus Source: https://www.plain.com/docs/graphql-reference/types/SidekickConnectRequestStatus # SidekickConnectRequestTool Source: https://www.plain.com/docs/graphql-reference/types/SidekickConnectRequestTool # SidekickCreditAllowanceBalance Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditAllowanceBalance The monthly allowance credit bucket. # SidekickCreditBalance Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditBalance The workspace's current Sidekick (Plain) credit balance. # SidekickCreditBalanceStatus Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditBalanceStatus Whether metered Sidekick credits apply to the workspace. # SidekickCreditTopupBalance Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditTopupBalance The purchased top-up credit bucket. # SidekickCreditUsageByDay Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditUsageByDay Credit usage broken down by UTC day. # SidekickCreditUsageByDayInput Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditUsageByDayInput # SidekickCreditUsageDay Source: https://www.plain.com/docs/graphql-reference/types/SidekickCreditUsageDay Credit usage for a single UTC day. # SidekickCustomSkill Source: https://www.plain.com/docs/graphql-reference/types/SidekickCustomSkill A workspace-authored Sidekick skill, including its instructions body. # SidekickGithubRepo Source: https://www.plain.com/docs/graphql-reference/types/SidekickGithubRepo A GitHub repository the workspace's Sidekick GitHub integration has access to. # SidekickGithubRepoInput Source: https://www.plain.com/docs/graphql-reference/types/SidekickGithubRepoInput A repository to select for the workspace's Sidekick GitHub integration, with optional per-repo operating instructions. # SidekickGithubSelectedRepo Source: https://www.plain.com/docs/graphql-reference/types/SidekickGithubSelectedRepo A repository selected for the workspace's Sidekick GitHub integration. # SidekickGithubServiceConfig Source: https://www.plain.com/docs/graphql-reference/types/SidekickGithubServiceConfig The Sidekick GitHub configuration for a workspace: selected repositories and operating instructions. # SidekickMcpApiKeyAuthInput Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpApiKeyAuthInput API-key auth config for a custom MCP server. Providing this on create registers the server as API-key rather than OAuth. # SidekickMcpAuthParam Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpAuthParam One configured API-key auth attachment: the non-secret name and where it is attached. The secret value is never exposed. # SidekickMcpAuthParamInput Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpAuthParamInput One API-key auth attachment to configure on create: the non-secret name plus where the secret is attached. # SidekickMcpAuthParamPlacement Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpAuthParamPlacement Where an API-key secret is attached on each outbound request: an HTTP header or a URL query param. # SidekickMcpIcon Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpIcon An icon a custom MCP server declares in its serverInfo, captured at discovery. src is an https or data: URI. # SidekickMcpServer Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpServer A customer-owned MCP server registered for Sidekick. Sidekick reaches it only via the trusted proxy (the customer credential never enters the sandbox). # SidekickMcpServerAuthType Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpServerAuthType How a custom MCP server authenticates: brokered OAuth, or a static API key attached in configurable headers and/or URL query params. # SidekickMcpTool Source: https://www.plain.com/docs/graphql-reference/types/SidekickMcpTool One tool discovered on a custom MCP server, served from the cached discovery snapshot. # SidekickPosthogServiceConfig Source: https://www.plain.com/docs/graphql-reference/types/SidekickPosthogServiceConfig The Sidekick PostHog configuration for a workspace: operating instructions plus the default project the agent queries. # SidekickServiceConfig Source: https://www.plain.com/docs/graphql-reference/types/SidekickServiceConfig The Sidekick configuration for a connected service whose only user-editable setting is its operating instructions. Covers Datadog, Sentry, Grafana, Linear, Notion, incident.io, Attio, HubSpot, Jira, Granola and LaunchDarkly. The access scope of each service is enforced by the credentials the workspace connected, not by this configuration. GitHub has a richer shape — see SidekickGithubServiceConfig. # SidekickSettings Source: https://www.plain.com/docs/graphql-reference/types/SidekickSettings Workspace-level settings for Sidekick. Wrapper type so additional settings can be added without breaking existing clients. # SidekickSkill Source: https://www.plain.com/docs/graphql-reference/types/SidekickSkill A skill available to Sidekick in this workspace, with its effective enabled state. The concrete type (SystemSidekickSkill or CustomSidekickSkill) indicates how the skill is provided. Use the sidekickCustomSkill query to load a custom skill's instructions. # SingleValueMetricName Source: https://www.plain.com/docs/graphql-reference/types/SingleValueMetricName # SlackAutoJoinRule Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRule A rule defining which Slack channels the Plain bot automatically joins, plus optional default channel options applied when a channel is connected via this rule. # SlackAutoJoinRuleChannelMode Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRuleChannelMode The default channel mode an auto-join rule applies to newly joined channels. # SlackAutoJoinRuleIngestionMode Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRuleIngestionMode The default thread-creation (ingestion) configuration an auto-join rule applies to channels it connects. `manual` is set only when `type` is `MANUAL`; it is null for other modes. # SlackAutoJoinRuleIngestionModeInput Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRuleIngestionModeInput The default thread-creation (ingestion) configuration for an auto-join rule. Provide `manual` only when `type` is `MANUAL` — it is ignored for other modes. Omit the whole object to inherit the team default ingestion mode. # SlackAutoJoinRuleInput Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRuleInput # SlackAutoJoinRuleManualIngestion Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRuleManualIngestion Manual (emoji-reaction) ingestion configuration. Each field is null when the team default for that option applies. # SlackAutoJoinRuleManualIngestionInput Source: https://www.plain.com/docs/graphql-reference/types/SlackAutoJoinRuleManualIngestionInput Manual (emoji-reaction) ingestion configuration provided to setSlackAutoJoinRules. # SlackBroadcastSendDeliveryRecipient Source: https://www.plain.com/docs/graphql-reference/types/SlackBroadcastSendDeliveryRecipient # SlackBroadcastSender Source: https://www.plain.com/docs/graphql-reference/types/SlackBroadcastSender # SlackChannelMembership Source: https://www.plain.com/docs/graphql-reference/types/SlackChannelMembership # SlackCustomerIdentity Source: https://www.plain.com/docs/graphql-reference/types/SlackCustomerIdentity # SlackIngestionMode Source: https://www.plain.com/docs/graphql-reference/types/SlackIngestionMode How threads are created from messages in a connected slack channel. # SlackMessageEntry Source: https://www.plain.com/docs/graphql-reference/types/SlackMessageEntry # SlackMessageEntryRelatedThread Source: https://www.plain.com/docs/graphql-reference/types/SlackMessageEntryRelatedThread # SlackReaction Source: https://www.plain.com/docs/graphql-reference/types/SlackReaction # SlackReplyEntry Source: https://www.plain.com/docs/graphql-reference/types/SlackReplyEntry # SlackThreadChannelAssociation Source: https://www.plain.com/docs/graphql-reference/types/SlackThreadChannelAssociation A thread channel association backed by a connected Slack channel. # SlackThreadChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/SlackThreadChannelDetails # SlackThreadChannelDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/SlackThreadChannelDetailsInput # SlackUser Source: https://www.plain.com/docs/graphql-reference/types/SlackUser # SlackUserConnection Source: https://www.plain.com/docs/graphql-reference/types/SlackUserConnection # SlackUserEdge Source: https://www.plain.com/docs/graphql-reference/types/SlackUserEdge # SlackUserIdentity Source: https://www.plain.com/docs/graphql-reference/types/SlackUserIdentity # Snippet Source: https://www.plain.com/docs/graphql-reference/types/Snippet # SnippetConnection Source: https://www.plain.com/docs/graphql-reference/types/SnippetConnection # SnippetEdge Source: https://www.plain.com/docs/graphql-reference/types/SnippetEdge # SnoozeStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/SnoozeStatusDetail # SnoozeThreadInput Source: https://www.plain.com/docs/graphql-reference/types/SnoozeThreadInput # SnoozeThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/SnoozeThreadOutput # SortDirection Source: https://www.plain.com/docs/graphql-reference/types/SortDirection # StartServiceAuthorizationInput Source: https://www.plain.com/docs/graphql-reference/types/StartServiceAuthorizationInput # StartServiceAuthorizationOutput Source: https://www.plain.com/docs/graphql-reference/types/StartServiceAuthorizationOutput # StatusDetailType Source: https://www.plain.com/docs/graphql-reference/types/StatusDetailType # StringArrayInput Source: https://www.plain.com/docs/graphql-reference/types/StringArrayInput # StringArraySetting Source: https://www.plain.com/docs/graphql-reference/types/StringArraySetting A string array setting # StringInput Source: https://www.plain.com/docs/graphql-reference/types/StringInput # StringSearchExpression Source: https://www.plain.com/docs/graphql-reference/types/StringSearchExpression The different ways in which a string is matched. Exactly one of these must be provided in a single search expression. # StringSetting Source: https://www.plain.com/docs/graphql-reference/types/StringSetting A string setting # SubscriptionEventType Source: https://www.plain.com/docs/graphql-reference/types/SubscriptionEventType # SuggestedLabelType Source: https://www.plain.com/docs/graphql-reference/types/SuggestedLabelType An AI-proposed label type awaiting human review. Once accepted, a real LabelType is created and this record moves to ACCEPTED; dismissing it moves it to DISMISSED without creating a label type. # SuggestedLabelTypeSource Source: https://www.plain.com/docs/graphql-reference/types/SuggestedLabelTypeSource How a suggested label type was produced. # SuggestedLabelTypeStatus Source: https://www.plain.com/docs/graphql-reference/types/SuggestedLabelTypeStatus # SuggestedSlackTeammate Source: https://www.plain.com/docs/graphql-reference/types/SuggestedSlackTeammate A teammate from the workspace's connected Slack workspace who can be invited to Plain. Distinct from SlackUser, which is used in customer-facing channel contexts and does not expose email. # SupportEmailAddressEmailActor Source: https://www.plain.com/docs/graphql-reference/types/SupportEmailAddressEmailActor # SurveyResponse Source: https://www.plain.com/docs/graphql-reference/types/SurveyResponse # SurveyResponseFilter Source: https://www.plain.com/docs/graphql-reference/types/SurveyResponseFilter # SurveyResponseFilterOutput Source: https://www.plain.com/docs/graphql-reference/types/SurveyResponseFilterOutput # SyncBusinessHoursSlotsInput Source: https://www.plain.com/docs/graphql-reference/types/SyncBusinessHoursSlotsInput # SyncBusinessHoursSlotsOutput Source: https://www.plain.com/docs/graphql-reference/types/SyncBusinessHoursSlotsOutput # SyncUserWorkingHoursInput Source: https://www.plain.com/docs/graphql-reference/types/SyncUserWorkingHoursInput # SyncUserWorkingHoursOutput Source: https://www.plain.com/docs/graphql-reference/types/SyncUserWorkingHoursOutput # System Source: https://www.plain.com/docs/graphql-reference/types/System # SystemActor Source: https://www.plain.com/docs/graphql-reference/types/SystemActor # SystemSidekickSkill Source: https://www.plain.com/docs/graphql-reference/types/SystemSidekickSkill A Plain-managed skill defined in code, available to every workspace. # Task Source: https://www.plain.com/docs/graphql-reference/types/Task # TaskAssignee Source: https://www.plain.com/docs/graphql-reference/types/TaskAssignee # TaskConnection Source: https://www.plain.com/docs/graphql-reference/types/TaskConnection # TaskEdge Source: https://www.plain.com/docs/graphql-reference/types/TaskEdge # TaskLink Source: https://www.plain.com/docs/graphql-reference/types/TaskLink A link from a task back to the entity that caused it to be raised. # TaskLinkConnection Source: https://www.plain.com/docs/graphql-reference/types/TaskLinkConnection # TaskLinkEdge Source: https://www.plain.com/docs/graphql-reference/types/TaskLinkEdge # TaskStatus Source: https://www.plain.com/docs/graphql-reference/types/TaskStatus The lifecycle status of a task. # TasksFilter Source: https://www.plain.com/docs/graphql-reference/types/TasksFilter # TasksSort Source: https://www.plain.com/docs/graphql-reference/types/TasksSort # TasksSortField Source: https://www.plain.com/docs/graphql-reference/types/TasksSortField # TeamSettings Source: https://www.plain.com/docs/graphql-reference/types/TeamSettings # Tenant Source: https://www.plain.com/docs/graphql-reference/types/Tenant # TenantConnection Source: https://www.plain.com/docs/graphql-reference/types/TenantConnection # TenantEdge Source: https://www.plain.com/docs/graphql-reference/types/TenantEdge # TenantField Source: https://www.plain.com/docs/graphql-reference/types/TenantField # TenantFieldBooleanValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldBooleanValue # TenantFieldDateTimeValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldDateTimeValue # TenantFieldFilter Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldFilter # TenantFieldIdentifier Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldIdentifier # TenantFieldMappingConcept Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldMappingConcept # TenantFieldNumberValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldNumberValue # TenantFieldSchema Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldSchema # TenantFieldSchemaConnection Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldSchemaConnection # TenantFieldSchemaEdge Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldSchemaEdge # TenantFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldSchemaInput # TenantFieldSchemasFilter Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldSchemasFilter # TenantFieldStringArrayValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldStringArrayValue # TenantFieldStringValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldStringValue # TenantFieldType Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldType The data type of a tenant field schema, determining which value field to use when upserting a tenant field. # TenantFieldUserReferenceValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldUserReferenceValue # TenantFieldValue Source: https://www.plain.com/docs/graphql-reference/types/TenantFieldValue # TenantIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/TenantIdentifierInput # TenantMembershipPolicy Source: https://www.plain.com/docs/graphql-reference/types/TenantMembershipPolicy Controls how tenants are assigned when a message from an associated channel is received. # TenantSearchResult Source: https://www.plain.com/docs/graphql-reference/types/TenantSearchResult # TenantSearchResultConnection Source: https://www.plain.com/docs/graphql-reference/types/TenantSearchResultConnection # TenantSearchResultEdge Source: https://www.plain.com/docs/graphql-reference/types/TenantSearchResultEdge # TenantSource Source: https://www.plain.com/docs/graphql-reference/types/TenantSource # TenantTierMembership Source: https://www.plain.com/docs/graphql-reference/types/TenantTierMembership # TenantsFilter Source: https://www.plain.com/docs/graphql-reference/types/TenantsFilter # TenantsSearchQuery Source: https://www.plain.com/docs/graphql-reference/types/TenantsSearchQuery Query to search for tenants. # Thread Source: https://www.plain.com/docs/graphql-reference/types/Thread A thread represents a conversation with a customer, around a specific topic. # ThreadAdditionalAssigneesTransitionedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadAdditionalAssigneesTransitionedEntry # ThreadAssignee Source: https://www.plain.com/docs/graphql-reference/types/ThreadAssignee The entity a thread is assigned to: a human user, a machine user (bot), or the Plain system itself. # ThreadAssigneeInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadAssigneeInput # ThreadAssignmentNotificationDetail Source: https://www.plain.com/docs/graphql-reference/types/ThreadAssignmentNotificationDetail # ThreadAssignmentTransitionedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadAssignmentTransitionedEntry # ThreadCatchupCustomerEvent Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupCustomerEvent # ThreadCatchupDetail Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupDetail # ThreadCatchupFeedbackDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupFeedbackDetails # ThreadCatchupSuggestedAction Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupSuggestedAction # ThreadCatchupSuggestedActionStatus Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupSuggestedActionStatus # ThreadCatchupSuggestedCustomerAction Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupSuggestedCustomerAction # ThreadCatchupSuggestedInternalAction Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupSuggestedInternalAction # ThreadCatchupSuggestedSidekickPrompt Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupSuggestedSidekickPrompt # ThreadCatchupUserEvent Source: https://www.plain.com/docs/graphql-reference/types/ThreadCatchupUserEvent # ThreadChannel Source: https://www.plain.com/docs/graphql-reference/types/ThreadChannel # ThreadChannelAssociation Source: https://www.plain.com/docs/graphql-reference/types/ThreadChannelAssociation A link between a connected messaging channel and a company or tenant. When a message arrives in the associated channel, Plain uses this association to route threads to the correct customer context. Implemented by SlackThreadChannelAssociation. # ThreadChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadChannelDetails # ThreadChannelDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadChannelDetailsInput # ThreadCluster Source: https://www.plain.com/docs/graphql-reference/types/ThreadCluster # ThreadClusterConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadClusterConnection # ThreadClusterEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadClusterEdge # ThreadClustersFeedbackDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadClustersFeedbackDetails # ThreadClustersFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadClustersFilter # ThreadConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadConnection # ThreadDiscussion Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussion # ThreadDiscussionAgentSessionChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionAgentSessionChannelDetails # ThreadDiscussionAgentStatus Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionAgentStatus The state of the agent working on a discussion, independent of whether the discussion itself is open or resolved. # ThreadDiscussionApprovalRequestEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionApprovalRequestEntryPayload # ThreadDiscussionChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionChannelDetails # ThreadDiscussionConnectRequestEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionConnectRequestEntryPayload Sidekick asked the workspace to connect one or more of its tools. Rendered as a card in the Sidekick transcript. Only produced for in-app sessions. # ThreadDiscussionConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionConnection # ThreadDiscussionCursorDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionCursorDetailsInput # ThreadDiscussionCursorWorkspaceBackgroundAgentChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionCursorWorkspaceBackgroundAgentChannelDetails # ThreadDiscussionEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionEdge # ThreadDiscussionEmailChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionEmailChannelDetails # ThreadDiscussionEmailDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionEmailDetailsInput # ThreadDiscussionEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionEntry # ThreadDiscussionEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionEntryPayload # ThreadDiscussionMessage Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessage # ThreadDiscussionMessageConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessageConnection # ThreadDiscussionMessageEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessageEdge # ThreadDiscussionMessageEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessageEntry # ThreadDiscussionMessageEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessageEntryPayload # ThreadDiscussionMessageReaction Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessageReaction # ThreadDiscussionMessageType Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionMessageType # ThreadDiscussionResolvedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionResolvedEntry # ThreadDiscussionSlackChannelDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionSlackChannelDetails # ThreadDiscussionSlackDetailsInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionSlackDetailsInput # ThreadDiscussionStatus Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionStatus # ThreadDiscussionToolCallApprovalEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionToolCallApprovalEntryPayload A custom agent's approval on one tool call it has already reported. Sidekick's approvals are ThreadDiscussionApprovalRequestEntryPayload. # ThreadDiscussionToolCallEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionToolCallEntryPayload # ThreadDiscussionTurnStoppedEntryPayload Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionTurnStoppedEntryPayload A person stopped Sidekick mid-turn. Rendered as a plain line in the transcript so a reader can see why the agent stopped talking. Who stopped it and when are the message's own createdBy and createdAt. # ThreadDiscussionType Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionType # ThreadDiscussionVisibility Source: https://www.plain.com/docs/graphql-reference/types/ThreadDiscussionVisibility # ThreadEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadEdge # ThreadEscalationDetails Source: https://www.plain.com/docs/graphql-reference/types/ThreadEscalationDetails # ThreadEvent Source: https://www.plain.com/docs/graphql-reference/types/ThreadEvent # ThreadEventEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadEventEntry # ThreadField Source: https://www.plain.com/docs/graphql-reference/types/ThreadField A stored value for a custom thread field on a specific thread. # ThreadFieldDateFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldDateFilter # ThreadFieldFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldFilter # ThreadFieldNumberFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldNumberFilter # ThreadFieldSchema Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldSchema Defines the shape and behaviour of a custom field that can be attached to threads. # ThreadFieldSchemaConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldSchemaConnection # ThreadFieldSchemaEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldSchemaEdge # ThreadFieldSchemaOrderInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldSchemaOrderInput # ThreadFieldSchemaType Source: https://www.plain.com/docs/graphql-reference/types/ThreadFieldSchemaType The data type of a thread field schema, which determines which value field is used when reading or writing thread field values. # ThreadHeatmapHour Source: https://www.plain.com/docs/graphql-reference/types/ThreadHeatmapHour One cell of a thread heatmap grid, representing activity for a specific day-of-week and hour-of-day combination. # ThreadHeatmapMetric Source: https://www.plain.com/docs/graphql-reference/types/ThreadHeatmapMetric Result of a `threadHeatmapMetric` query. Activity distributed across a 7 × 24 grid (Monday–Sunday, hour 0–23 UTC). # ThreadHeatmapMetricInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadHeatmapMetricInput # ThreadHeatmapThreadIdsArgs Source: https://www.plain.com/docs/graphql-reference/types/ThreadHeatmapThreadIdsArgs Identifies the heatmap slice to retrieve thread ids from. Supply both fields for a single cell (one day-of-week/hour-of-day pair across the range), only `hourOfDay` for a column (that hour across all days), or only `dayOfWeek` for a row (that day across all hours). At least one is required in threadIds mode. # ThreadLabelsChangedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadLabelsChangedEntry # ThreadLink Source: https://www.plain.com/docs/graphql-reference/types/ThreadLink # ThreadLinkCandidate Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkCandidate # ThreadLinkCandidateConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkCandidateConnection # ThreadLinkCandidateEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkCandidateEdge # ThreadLinkCandidateFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkCandidateFilter # ThreadLinkConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkConnection # ThreadLinkCreatedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkCreatedEntry # ThreadLinkDeletedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkDeletedEntry # ThreadLinkEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkEdge # ThreadLinkGroup Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroup # ThreadLinkGroupAggregateMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupAggregateMetrics # ThreadLinkGroupCompanyMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupCompanyMetrics # ThreadLinkGroupConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupConnection # ThreadLinkGroupEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupEdge # ThreadLinkGroupFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupFilter # ThreadLinkGroupSingleCompanyMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupSingleCompanyMetrics # ThreadLinkGroupSingleTenantMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupSingleTenantMetrics # ThreadLinkGroupSingleTierMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupSingleTierMetrics # ThreadLinkGroupTenantMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupTenantMetrics # ThreadLinkGroupTierMetrics Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkGroupTierMetrics # ThreadLinkLinkType Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkLinkType # ThreadLinkSourceFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkSourceFilter # ThreadLinkSourceStatus Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkSourceStatus # ThreadLinkStatus Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkStatus Represents a simplified, high-level status of a thread link which can be used for filtering and sorting. Statuses from different external providers (e.g. Linear, Jira, Incident.io, Notion... etc) are mapped to one of these values. # ThreadLinkTargetCreatedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkTargetCreatedEntry # ThreadLinkTargetDeletedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkTargetDeletedEntry # ThreadLinkUpdatedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadLinkUpdatedEntry # ThreadMessageInfo Source: https://www.plain.com/docs/graphql-reference/types/ThreadMessageInfo # ThreadMetricFilters Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricFilters # ThreadMetricGroup Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricGroup Identifies which group bucket a series or value belongs to in a grouped thread metric result. # ThreadMetricGroupBy Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricGroupBy Dimension by which thread metric results can be grouped. # ThreadMetricGroupByInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricGroupByInput Sub-key required when dimension is keyed (THREAD_FIELD key, TENANT_FIELD externalFieldId). # ThreadMetricInterval Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricInterval # ThreadMetricIntervalUnit Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricIntervalUnit # ThreadMetricMode Source: https://www.plain.com/docs/graphql-reference/types/ThreadMetricMode What a thread metric query returns: the chart data or the thread ids behind a slice. # ThreadPriorityChangedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadPriorityChangedEntry # ThreadScopePrimitiveType Source: https://www.plain.com/docs/graphql-reference/types/ThreadScopePrimitiveType The dimension of a thread used to filter visibility for a custom role scope. # ThreadSearchResult Source: https://www.plain.com/docs/graphql-reference/types/ThreadSearchResult # ThreadSearchResultConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadSearchResultConnection # ThreadSearchResultEdge Source: https://www.plain.com/docs/graphql-reference/types/ThreadSearchResultEdge # ThreadServiceLevelAgreementPolicyChangedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadServiceLevelAgreementPolicyChangedEntry A timeline entry recording a change to the SLA policy applied to a thread. # ThreadSingleValueMetric Source: https://www.plain.com/docs/graphql-reference/types/ThreadSingleValueMetric Result of a `threadSingleValueMetric` query. Contains one aggregate value per group bucket. # ThreadSingleValueMetricInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadSingleValueMetricInput # ThreadSingleValueMetricValue Source: https://www.plain.com/docs/graphql-reference/types/ThreadSingleValueMetricValue # ThreadStatus Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatus The lifecycle status of a thread. # ThreadStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetail # ThreadStatusDetailCreated Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailCreated # ThreadStatusDetailDoneAutomaticallySet Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailDoneAutomaticallySet # ThreadStatusDetailDoneManuallySet Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailDoneManuallySet # ThreadStatusDetailIgnored Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailIgnored # ThreadStatusDetailInProgress Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailInProgress # ThreadStatusDetailLinearUpdated Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailLinearUpdated # ThreadStatusDetailNewReply Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailNewReply # ThreadStatusDetailReplied Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailReplied # ThreadStatusDetailSnoozed Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailSnoozed # ThreadStatusDetailThreadDiscussionResolved Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailThreadDiscussionResolved # ThreadStatusDetailThreadLinkUpdated Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailThreadLinkUpdated # ThreadStatusDetailUnsnoozed Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailUnsnoozed # ThreadStatusDetailWaitingForCustomer Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailWaitingForCustomer # ThreadStatusDetailWaitingForDuration Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailWaitingForDuration # ThreadStatusDetailWaitingIndefinitely Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusDetailWaitingIndefinitely # ThreadStatusTransitionedEntry Source: https://www.plain.com/docs/graphql-reference/types/ThreadStatusTransitionedEntry # ThreadTimeSeriesMetric Source: https://www.plain.com/docs/graphql-reference/types/ThreadTimeSeriesMetric Result of a `threadTimeSeriesMetric` query. Each element in `timestamps` aligns with the same index across all series. # ThreadTimeSeriesMetricInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadTimeSeriesMetricInput # ThreadTimeSeriesSeries Source: https://www.plain.com/docs/graphql-reference/types/ThreadTimeSeriesSeries # ThreadTimelineEntriesFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadTimelineEntriesFilter # ThreadWithDistance Source: https://www.plain.com/docs/graphql-reference/types/ThreadWithDistance A thread paired with a semantic similarity score, returned by `relatedThreads`. # ThreadsByExternalIdConnection Source: https://www.plain.com/docs/graphql-reference/types/ThreadsByExternalIdConnection # ThreadsDisplayOptions Source: https://www.plain.com/docs/graphql-reference/types/ThreadsDisplayOptions # ThreadsDisplayOptionsInput Source: https://www.plain.com/docs/graphql-reference/types/ThreadsDisplayOptionsInput # ThreadsFilter Source: https://www.plain.com/docs/graphql-reference/types/ThreadsFilter # ThreadsGroupBy Source: https://www.plain.com/docs/graphql-reference/types/ThreadsGroupBy # ThreadsLayout Source: https://www.plain.com/docs/graphql-reference/types/ThreadsLayout # ThreadsSearchQuery Source: https://www.plain.com/docs/graphql-reference/types/ThreadsSearchQuery Query to search for threads. The search term provided is used to match against different parts of the thread: - its title - its messages - the customer's name - the customer's email # ThreadsSort Source: https://www.plain.com/docs/graphql-reference/types/ThreadsSort # ThreadsSortField Source: https://www.plain.com/docs/graphql-reference/types/ThreadsSortField # Tier Source: https://www.plain.com/docs/graphql-reference/types/Tier # TierConnection Source: https://www.plain.com/docs/graphql-reference/types/TierConnection # TierEdge Source: https://www.plain.com/docs/graphql-reference/types/TierEdge # TierIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/TierIdentifierInput # TierMemberIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/TierMemberIdentifierInput # TierMembership Source: https://www.plain.com/docs/graphql-reference/types/TierMembership # TierMembershipConnection Source: https://www.plain.com/docs/graphql-reference/types/TierMembershipConnection # TierMembershipEdge Source: https://www.plain.com/docs/graphql-reference/types/TierMembershipEdge # TieredRecurringPrice Source: https://www.plain.com/docs/graphql-reference/types/TieredRecurringPrice # TimeSeriesMetricName Source: https://www.plain.com/docs/graphql-reference/types/TimeSeriesMetricName # TimelineEntry Source: https://www.plain.com/docs/graphql-reference/types/TimelineEntry # TimelineEntryConnection Source: https://www.plain.com/docs/graphql-reference/types/TimelineEntryConnection # TimelineEntryEdge Source: https://www.plain.com/docs/graphql-reference/types/TimelineEntryEdge # TimelineEntryType Source: https://www.plain.com/docs/graphql-reference/types/TimelineEntryType Discriminates the type of a timeline entry, used when filtering the thread timeline. # TimelineEventEntry Source: https://www.plain.com/docs/graphql-reference/types/TimelineEventEntry # Timezone Source: https://www.plain.com/docs/graphql-reference/types/Timezone # TodoStatusDetail Source: https://www.plain.com/docs/graphql-reference/types/TodoStatusDetail # ToggleFeatureEntitlement Source: https://www.plain.com/docs/graphql-reference/types/ToggleFeatureEntitlement # ToggleSlackMessageReactionInput Source: https://www.plain.com/docs/graphql-reference/types/ToggleSlackMessageReactionInput # ToggleSlackMessageReactionOutput Source: https://www.plain.com/docs/graphql-reference/types/ToggleSlackMessageReactionOutput # ToggleWorkflowRulePublishedInput Source: https://www.plain.com/docs/graphql-reference/types/ToggleWorkflowRulePublishedInput # ToggleWorkflowRulePublishedOutput Source: https://www.plain.com/docs/graphql-reference/types/ToggleWorkflowRulePublishedOutput # ToneRuleFeedbackDetails Source: https://www.plain.com/docs/graphql-reference/types/ToneRuleFeedbackDetails # TotalResolutionTimeServiceLevelAgreement Source: https://www.plain.com/docs/graphql-reference/types/TotalResolutionTimeServiceLevelAgreement An SLA that tracks the time from thread creation until the thread is marked Done, including after it is reopened. Reopening a very old thread can immediately breach this SLA. # TriggerWorkflowInput Source: https://www.plain.com/docs/graphql-reference/types/TriggerWorkflowInput # TriggerWorkflowOutput Source: https://www.plain.com/docs/graphql-reference/types/TriggerWorkflowOutput # TriggerWorkflowRuleInput Source: https://www.plain.com/docs/graphql-reference/types/TriggerWorkflowRuleInput # TriggerWorkflowRuleOutput Source: https://www.plain.com/docs/graphql-reference/types/TriggerWorkflowRuleOutput # UnarchiveLabelTypeInput Source: https://www.plain.com/docs/graphql-reference/types/UnarchiveLabelTypeInput # UnarchiveLabelTypeOutput Source: https://www.plain.com/docs/graphql-reference/types/UnarchiveLabelTypeOutput # UnassignThreadInput Source: https://www.plain.com/docs/graphql-reference/types/UnassignThreadInput # UnassignThreadOutput Source: https://www.plain.com/docs/graphql-reference/types/UnassignThreadOutput # UnmarkCustomerAsSpamInput Source: https://www.plain.com/docs/graphql-reference/types/UnmarkCustomerAsSpamInput # UnmarkCustomerAsSpamOutput Source: https://www.plain.com/docs/graphql-reference/types/UnmarkCustomerAsSpamOutput # UpdateActiveBillingRotaInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateActiveBillingRotaInput # UpdateActiveBillingRotaOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateActiveBillingRotaOutput # UpdateAgentSandboxToolPolicyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateAgentSandboxToolPolicyInput # UpdateAgentSandboxToolPolicyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateAgentSandboxToolPolicyOutput # UpdateAiToneRulesInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateAiToneRulesInput # UpdateAiToneRulesOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateAiToneRulesOutput # UpdateApiKeyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateApiKeyInput # UpdateApiKeyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateApiKeyOutput # UpdateAutoresponderInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateAutoresponderInput # UpdateAutoresponderOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateAutoresponderOutput # UpdateBroadcastAudienceInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateBroadcastAudienceInput # UpdateBroadcastAudienceOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateBroadcastAudienceOutput # UpdateBroadcastInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateBroadcastInput # UpdateBroadcastOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateBroadcastOutput # UpdateBusinessHoursScheduleInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateBusinessHoursScheduleInput # UpdateBusinessHoursScheduleOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateBusinessHoursScheduleOutput # UpdateChatAppInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateChatAppInput # UpdateChatAppOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateChatAppOutput # UpdateCompanyTierInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCompanyTierInput # UpdateCompanyTierOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCompanyTierOutput # UpdateConnectedDiscordChannelInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateConnectedDiscordChannelInput # UpdateConnectedDiscordChannelOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateConnectedDiscordChannelOutput # UpdateConnectedSlackChannelInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateConnectedSlackChannelInput # UpdateConnectedSlackChannelOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateConnectedSlackChannelOutput # UpdateCustomRoleInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomRoleInput # UpdateCustomRoleOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomRoleOutput # UpdateCustomerCardConfigInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerCardConfigInput For constraints and details on the fields see the `CustomerCardConfig` type. # UpdateCustomerCardConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerCardConfigOutput # UpdateCustomerCompanyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerCompanyInput # UpdateCustomerCompanyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerCompanyOutput # UpdateCustomerGroupInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerGroupInput # UpdateCustomerGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerGroupOutput # UpdateCustomerSurveyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerSurveyInput # UpdateCustomerSurveyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateCustomerSurveyOutput # UpdateEscalationPathInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateEscalationPathInput # UpdateEscalationPathOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateEscalationPathOutput # UpdateGeneratedReplyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateGeneratedReplyInput # UpdateGeneratedReplyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateGeneratedReplyOutput # UpdateHelpCenterArticleCopyOptionSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterArticleCopyOptionSettingsInput # UpdateHelpCenterArticleCopyOptionsInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterArticleCopyOptionsInput # UpdateHelpCenterArticleGroupInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterArticleGroupInput # UpdateHelpCenterArticleGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterArticleGroupOutput # UpdateHelpCenterCustomDomainNameInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterCustomDomainNameInput # UpdateHelpCenterCustomDomainNameOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterCustomDomainNameOutput # UpdateHelpCenterIndexInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterIndexInput # UpdateHelpCenterIndexOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterIndexOutput # UpdateHelpCenterInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterInput # UpdateHelpCenterOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateHelpCenterOutput # UpdateImportJobDefinitionInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateImportJobDefinitionInput # UpdateImportJobDefinitionOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateImportJobDefinitionOutput # UpdateInternalNotificationsInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateInternalNotificationsInput # UpdateInternalNotificationsOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateInternalNotificationsOutput # UpdateLabelTypeInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateLabelTypeInput # UpdateLabelTypeOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateLabelTypeOutput # UpdateMachineUserInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateMachineUserInput # UpdateMachineUserOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateMachineUserOutput # UpdateMyUserInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateMyUserInput # UpdateMyUserOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateMyUserOutput # UpdateNoteInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateNoteInput # UpdateNoteOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateNoteOutput # UpdateSavedThreadsViewInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSavedThreadsViewInput # UpdateSavedThreadsViewOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSavedThreadsViewOutput # UpdateServiceLevelAgreementInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateServiceLevelAgreementInput # UpdateServiceLevelAgreementOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateServiceLevelAgreementOutput # UpdateServiceLevelAgreementPolicyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateServiceLevelAgreementPolicyInput # UpdateServiceLevelAgreementPolicyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateServiceLevelAgreementPolicyOutput # UpdateSettingInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSettingInput An input provided to the `updateSetting` mutation. # UpdateSettingOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSettingOutput An output type provided by the `updateSetting` mutation. Returns the updated setting or an error. # UpdateSidekickCustomSkillInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickCustomSkillInput # UpdateSidekickCustomSkillOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickCustomSkillOutput # UpdateSidekickGithubConfigInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickGithubConfigInput # UpdateSidekickGithubConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickGithubConfigOutput # UpdateSidekickMcpServerInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickMcpServerInput # UpdateSidekickMcpServerOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickMcpServerOutput # UpdateSidekickPosthogConfigInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickPosthogConfigInput # UpdateSidekickPosthogConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickPosthogConfigOutput # UpdateSidekickServiceConfigInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickServiceConfigInput # UpdateSidekickServiceConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickServiceConfigOutput # UpdateSidekickSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickSettingsInput # UpdateSidekickSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickSettingsOutput # UpdateSidekickSlackConfigInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickSlackConfigInput # UpdateSidekickSlackConfigOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSidekickSlackConfigOutput # UpdateSnippetInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSnippetInput # UpdateSnippetOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateSnippetOutput # UpdateTaskAssignedToInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTaskAssignedToInput Only one of the fields can be set. # UpdateTaskInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTaskInput # UpdateTaskOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTaskOutput # UpdateTenantTierInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTenantTierInput # UpdateTenantTierOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTenantTierOutput # UpdateThreadAgentStatusInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadAgentStatusInput # UpdateThreadAgentStatusOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadAgentStatusOutput # UpdateThreadChannelAssociationTenantMembershipPolicyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadChannelAssociationTenantMembershipPolicyInput # UpdateThreadChannelAssociationTenantMembershipPolicyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadChannelAssociationTenantMembershipPolicyOutput # UpdateThreadEscalationPathInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadEscalationPathInput # UpdateThreadEscalationPathOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadEscalationPathOutput # UpdateThreadExternalIdInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadExternalIdInput # UpdateThreadExternalIdOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadExternalIdOutput # UpdateThreadFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadFieldSchemaInput # UpdateThreadFieldSchemaOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadFieldSchemaOutput # UpdateThreadServiceLevelAgreementPolicyInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadServiceLevelAgreementPolicyInput # UpdateThreadServiceLevelAgreementPolicyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadServiceLevelAgreementPolicyOutput # UpdateThreadSuggestedActionStatusInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadSuggestedActionStatusInput # UpdateThreadSuggestedActionStatusOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadSuggestedActionStatusOutput # UpdateThreadTenantInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadTenantInput # UpdateThreadTenantOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadTenantOutput # UpdateThreadTierInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadTierInput # UpdateThreadTierOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadTierOutput # UpdateThreadTitleInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadTitleInput # UpdateThreadTitleOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateThreadTitleOutput # UpdateTierInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTierInput # UpdateTierOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateTierOutput # UpdateUserDefaultSavedThreadsViewInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateUserDefaultSavedThreadsViewInput # UpdateUserDefaultSavedThreadsViewOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateUserDefaultSavedThreadsViewOutput # UpdateWebhookTargetInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWebhookTargetInput # UpdateWebhookTargetOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWebhookTargetOutput # UpdateWorkflowInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkflowInput # UpdateWorkflowOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkflowOutput # UpdateWorkflowRuleInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkflowRuleInput # UpdateWorkflowRuleOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkflowRuleOutput # UpdateWorkflowStepInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkflowStepInput # UpdateWorkflowStepOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkflowStepOutput # UpdateWorkspaceEmailSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkspaceEmailSettingsInput # UpdateWorkspaceEmailSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkspaceEmailSettingsOutput # UpdateWorkspaceInput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkspaceInput # UpdateWorkspaceOutput Source: https://www.plain.com/docs/graphql-reference/types/UpdateWorkspaceOutput # UploadFormData Source: https://www.plain.com/docs/graphql-reference/types/UploadFormData # UpsertCompanyInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCompanyInput # UpsertCompanyOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCompanyOutput # UpsertCustomerGroupInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerGroupInput # UpsertCustomerGroupOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerGroupOutput # UpsertCustomerIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerIdentifierInput # UpsertCustomerInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerInput # UpsertCustomerOnCreateInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerOnCreateInput # UpsertCustomerOnUpdateInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerOnUpdateInput # UpsertCustomerOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertCustomerOutput # UpsertHelpCenterArticleInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertHelpCenterArticleInput # UpsertHelpCenterArticleOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertHelpCenterArticleOutput # UpsertMyEmailSignatureInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertMyEmailSignatureInput # UpsertMyEmailSignatureOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertMyEmailSignatureOutput # UpsertResult Source: https://www.plain.com/docs/graphql-reference/types/UpsertResult # UpsertRoleScopesInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertRoleScopesInput # UpsertRoleScopesOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertRoleScopesOutput # UpsertTeamSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTeamSettingsInput # UpsertTeamSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTeamSettingsOutput # UpsertTenantFieldInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTenantFieldInput # UpsertTenantFieldOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTenantFieldOutput # UpsertTenantFieldSchemaInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTenantFieldSchemaInput # UpsertTenantFieldSchemaOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTenantFieldSchemaOutput # UpsertTenantInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTenantInput # UpsertTenantOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertTenantOutput # UpsertThreadFieldIdentifier Source: https://www.plain.com/docs/graphql-reference/types/UpsertThreadFieldIdentifier # UpsertThreadFieldInput Source: https://www.plain.com/docs/graphql-reference/types/UpsertThreadFieldInput # UpsertThreadFieldOutput Source: https://www.plain.com/docs/graphql-reference/types/UpsertThreadFieldOutput # User Source: https://www.plain.com/docs/graphql-reference/types/User # UserAccount Source: https://www.plain.com/docs/graphql-reference/types/UserAccount A Plain user's core account record, representing their identity independent of any workspace membership. # UserActor Source: https://www.plain.com/docs/graphql-reference/types/UserActor # UserAuthDiscordChannelInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/UserAuthDiscordChannelInstallationInfo # UserAuthDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/types/UserAuthDiscordChannelIntegration # UserAuthDiscordChannelIntegrationConnection Source: https://www.plain.com/docs/graphql-reference/types/UserAuthDiscordChannelIntegrationConnection # UserAuthDiscordChannelIntegrationEdge Source: https://www.plain.com/docs/graphql-reference/types/UserAuthDiscordChannelIntegrationEdge # UserAuthSlackInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/UserAuthSlackInstallationInfo # UserAuthSlackIntegration Source: https://www.plain.com/docs/graphql-reference/types/UserAuthSlackIntegration # UserConnection Source: https://www.plain.com/docs/graphql-reference/types/UserConnection # UserEdge Source: https://www.plain.com/docs/graphql-reference/types/UserEdge # UserEmailActor Source: https://www.plain.com/docs/graphql-reference/types/UserEmailActor # UserIdentifierInput Source: https://www.plain.com/docs/graphql-reference/types/UserIdentifierInput Identifies a Plain user or machine user. Exactly one field must be set. # UserImpersonationInput Source: https://www.plain.com/docs/graphql-reference/types/UserImpersonationInput # UserLinearInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/UserLinearInstallationInfo # UserLinearIntegration Source: https://www.plain.com/docs/graphql-reference/types/UserLinearIntegration # UserMSTeamsInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/UserMSTeamsInstallationInfo # UserMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/types/UserMSTeamsIntegration # UserSlackInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/UserSlackInstallationInfo # UserSlackIntegration Source: https://www.plain.com/docs/graphql-reference/types/UserSlackIntegration # UserStatus Source: https://www.plain.com/docs/graphql-reference/types/UserStatus # UserWorkingHours Source: https://www.plain.com/docs/graphql-reference/types/UserWorkingHours Configuration for automatic status switching based on a user's working hours. # UserWorkingHoursSlot Source: https://www.plain.com/docs/graphql-reference/types/UserWorkingHoursSlot A time slot representing when a user is available during a specific day. # UserWorkingHoursSlotInput Source: https://www.plain.com/docs/graphql-reference/types/UserWorkingHoursSlotInput # UsersFilter Source: https://www.plain.com/docs/graphql-reference/types/UsersFilter # VerifyHelpCenterCustomDomainNameInput Source: https://www.plain.com/docs/graphql-reference/types/VerifyHelpCenterCustomDomainNameInput # VerifyHelpCenterCustomDomainNameOutput Source: https://www.plain.com/docs/graphql-reference/types/VerifyHelpCenterCustomDomainNameOutput # VerifyWorkspaceEmailDnsSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/VerifyWorkspaceEmailDnsSettingsOutput # VerifyWorkspaceEmailForwardingSettingsInput Source: https://www.plain.com/docs/graphql-reference/types/VerifyWorkspaceEmailForwardingSettingsInput # VerifyWorkspaceEmailForwardingSettingsOutput Source: https://www.plain.com/docs/graphql-reference/types/VerifyWorkspaceEmailForwardingSettingsOutput # WebhookDeliveryAttempt Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttempt # WebhookDeliveryAttemptConnection Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptConnection # WebhookDeliveryAttemptEdge Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptEdge # WebhookDeliveryAttemptErrorResult Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptErrorResult # WebhookDeliveryAttemptFailedResult Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptFailedResult # WebhookDeliveryAttemptFilter Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptFilter # WebhookDeliveryAttemptRejectedResult Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptRejectedResult # WebhookDeliveryAttemptResult Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptResult # WebhookDeliveryAttemptResultStatus Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptResultStatus # WebhookDeliveryAttemptSchemaValidationFailedResult Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptSchemaValidationFailedResult # WebhookDeliveryAttemptSuccessfulResult Source: https://www.plain.com/docs/graphql-reference/types/WebhookDeliveryAttemptSuccessfulResult # WebhookTarget Source: https://www.plain.com/docs/graphql-reference/types/WebhookTarget # WebhookTargetConnection Source: https://www.plain.com/docs/graphql-reference/types/WebhookTargetConnection # WebhookTargetEdge Source: https://www.plain.com/docs/graphql-reference/types/WebhookTargetEdge # WebhookTargetEventSubscription Source: https://www.plain.com/docs/graphql-reference/types/WebhookTargetEventSubscription # WebhookTargetEventSubscriptionInput Source: https://www.plain.com/docs/graphql-reference/types/WebhookTargetEventSubscriptionInput # WebhookTargetHeader Source: https://www.plain.com/docs/graphql-reference/types/WebhookTargetHeader A custom HTTP header sent with every webhook delivery. Only the name is exposed — values can be auth tokens and are never returned; supply a value via an input to set or change it. # WebhookTargetHeaderInput Source: https://www.plain.com/docs/graphql-reference/types/WebhookTargetHeaderInput A custom HTTP header sent with every webhook delivery. # WebhookVersion Source: https://www.plain.com/docs/graphql-reference/types/WebhookVersion # WebhookVersionConnection Source: https://www.plain.com/docs/graphql-reference/types/WebhookVersionConnection # WebhookVersionEdge Source: https://www.plain.com/docs/graphql-reference/types/WebhookVersionEdge # WeekDay Source: https://www.plain.com/docs/graphql-reference/types/WeekDay # WorkOSConfiguration Source: https://www.plain.com/docs/graphql-reference/types/WorkOSConfiguration Short-lived WorkOS admin portal URLs and an embeddable widget token for configuring SSO, directory sync, and domain verification. All URLs and the widget token are generated on demand and should be used immediately; do not cache or store them. # Workflow Source: https://www.plain.com/docs/graphql-reference/types/Workflow # WorkflowCapabilities Source: https://www.plain.com/docs/graphql-reference/types/WorkflowCapabilities Which blocks a workflow of a given trigger type may contain. Used to drive the builder palette. # WorkflowConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkflowConnection # WorkflowEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkflowEdge # WorkflowExecution Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecution # WorkflowExecutionByEntityFilter Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecutionByEntityFilter # WorkflowExecutionConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecutionConnection # WorkflowExecutionEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecutionEdge # WorkflowExecutionEntityType Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecutionEntityType # WorkflowExecutionStatus Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecutionStatus The lifecycle state of a workflow execution. # WorkflowExecutionsFilter Source: https://www.plain.com/docs/graphql-reference/types/WorkflowExecutionsFilter Optional narrowing for `workflowExecutionsForWorkspace`. Every field is independent; omit them all to list the whole workspace. # WorkflowRule Source: https://www.plain.com/docs/graphql-reference/types/WorkflowRule # WorkflowRuleConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkflowRuleConnection # WorkflowRuleEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkflowRuleEdge # WorkflowShareLink Source: https://www.plain.com/docs/graphql-reference/types/WorkflowShareLink # WorkflowShareLinkStep Source: https://www.plain.com/docs/graphql-reference/types/WorkflowShareLinkStep # WorkflowStep Source: https://www.plain.com/docs/graphql-reference/types/WorkflowStep # WorkflowStepEntityRef Source: https://www.plain.com/docs/graphql-reference/types/WorkflowStepEntityRef An entity an action step produced or affected (e.g. a Sidekick discussion it started), so the run can link to it. # WorkflowStepEntityType Source: https://www.plain.com/docs/graphql-reference/types/WorkflowStepEntityType # WorkflowStepExecution Source: https://www.plain.com/docs/graphql-reference/types/WorkflowStepExecution # WorkflowStepExecutionStatus Source: https://www.plain.com/docs/graphql-reference/types/WorkflowStepExecutionStatus # WorkflowStepType Source: https://www.plain.com/docs/graphql-reference/types/WorkflowStepType The role a step plays in a workflow's execution graph. # WorkflowSummary Source: https://www.plain.com/docs/graphql-reference/types/WorkflowSummary A summary of a workflow with only id and name fields. # WorkflowTemplate Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplate # WorkflowTemplateContentBlock Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplateContentBlock # WorkflowTemplateDependencies Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplateDependencies # WorkflowTemplateFile Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplateFile # WorkflowTemplateGalleryItem Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplateGalleryItem # WorkflowTemplateStep Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplateStep # WorkflowTemplateWorkflow Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTemplateWorkflow A workflow a template installs. Deliberately mirrors the shape the workflow editor parses. # WorkflowTriggerType Source: https://www.plain.com/docs/graphql-reference/types/WorkflowTriggerType Controls how a workflow is triggered. # WorkflowsFilter Source: https://www.plain.com/docs/graphql-reference/types/WorkflowsFilter # WorkflowsSort Source: https://www.plain.com/docs/graphql-reference/types/WorkflowsSort # WorkflowsSortField Source: https://www.plain.com/docs/graphql-reference/types/WorkflowsSortField How to order the `workflows` connection. # WorkosConnectAuthMechanismInput Source: https://www.plain.com/docs/graphql-reference/types/WorkosConnectAuthMechanismInput # Workspace Source: https://www.plain.com/docs/graphql-reference/types/Workspace # WorkspaceChatSettings Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceChatSettings Workspace-level settings controlling the chat channel. # WorkspaceConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceConnection # WorkspaceCursorIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceCursorIntegration # WorkspaceDiscordChannelInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordChannelInstallationInfo # WorkspaceDiscordChannelIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordChannelIntegration # WorkspaceDiscordChannelIntegrationConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordChannelIntegrationConnection # WorkspaceDiscordChannelIntegrationEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordChannelIntegrationEdge # WorkspaceDiscordIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordIntegration # WorkspaceDiscordIntegrationConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordIntegrationConnection # WorkspaceDiscordIntegrationEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceDiscordIntegrationEdge # WorkspaceEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceEdge # WorkspaceEmailDomainSettings Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceEmailDomainSettings # WorkspaceEmailSettings Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceEmailSettings # WorkspaceFile Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceFile # WorkspaceFileDownloadUrl Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceFileDownloadUrl # WorkspaceFileInput Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceFileInput # WorkspaceFileUploadUrl Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceFileUploadUrl # WorkspaceFileVisibility Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceFileVisibility Controls where the file is stored and how it can be accessed. # WorkspaceHmac Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceHmac # WorkspaceInvite Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceInvite # WorkspaceInviteConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceInviteConnection # WorkspaceInviteEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceInviteEdge # WorkspaceLinearInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceLinearInstallationInfo # WorkspaceLinearIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceLinearIntegration A workspace-level Linear integration using the Linear app actor OAuth flow. Unlike UserLinearIntegration this is not tied to a single user, so machine users can use it. # WorkspaceMSTeamsInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceMSTeamsInstallationInfo # WorkspaceMSTeamsIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceMSTeamsIntegration # WorkspaceSlackChannelInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackChannelInstallationInfo # WorkspaceSlackChannelIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackChannelIntegration # WorkspaceSlackChannelIntegrationConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackChannelIntegrationConnection # WorkspaceSlackChannelIntegrationEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackChannelIntegrationEdge # WorkspaceSlackInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackInstallationInfo # WorkspaceSlackIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackIntegration # WorkspaceSlackIntegrationConnection Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackIntegrationConnection # WorkspaceSlackIntegrationEdge Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackIntegrationEdge # WorkspaceSlackSidekickInstallationInfo Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackSidekickInstallationInfo # WorkspaceSlackSidekickIntegration Source: https://www.plain.com/docs/graphql-reference/types/WorkspaceSlackSidekickIntegration # AI feedback Source: https://www.plain.com/docs/graphql/ai-feedback List the feedback your team has left on Ari replies and other Plain AI features. When a user rates an [Ari](/docs/product/agents/ari) reply or another Plain AI feature with a thumbs up or down, Plain stores the vote and any comment. `aiFeedback` lists that feedback, newest first. The API is read-only. Feedback is submitted from the Plain app. This operation requires the following permission: * `aiFeatureFeedback:read` ## Get AI feedback `details` depends on the `feature`, so select its fields with fragments: * **`AI_AGENT`**: an Ari reply, with `threadId` and `timelineEntryId` * **`THREAD_CATCHUP`**: a thread summary, with `threadId` * **`THREAD_CLUSTERS`**: a cluster of related threads, with `clusterId` * **`TONE_RULE`**: a [tone of voice](/docs/product/agents/tone-of-voice) rule, with `toneRuleId` * **`KNOWLEDGE_GAP`**: a [knowledge gap](/docs/product/agents/knowledge-gaps), with `knowledgeGapId` Every `details` type has a `sentiment`, a `reason`, and an optional `comment`. Filter with `features`, `sentiments`, and a `createdAt` window. Feedback submitted before Plain captured sentiment has none, so `sentiments` excludes it. # API explorer Source: https://www.plain.com/docs/graphql/api-explorer # Attachments Source: https://www.plain.com/docs/graphql/attachments How to upload attachments programmatically for messages and events in Plain. This page outlines how to upload attachments programmatically. At a high level to upload attachments you: * Make an API call to get an upload url and some metadata * You then upload your file, and metadata to that upload url. * Use the ID of the attachment you uploaded in other API calls (e.g. create a thread or send an email). ## Step by step guide To try this, you will need an [API key](/docs/graphql/authentication/) with the following permission: * `attachment:create` - `fileName` is the name under which the attachment will appear in the timeline - `fileSizeBytes` is the exact size of the attachment in bytes - `c_XXXXXXXXXXXXXXXXXXXXXXXXXX` is the customer id you are uploading the attachment for The GraphQL mutation to create an attachment upload URL is the following: In the `AttachmentUploadUrl` we created in the previous step we get back two fields needed to upload the attachment: * `uploadFormUrl`: The URL to which to upload the file to * `uploadFormData`: A list of key, value pairs that have to be included in the data we upload along with the actual file data. With this information we can now upload our actual file to Plain. To do this we need to build a form (`multipart/form-data`) with the data contained in `uploadFormData` and submit it to the `uploadFormUrl`. Here is some example code showing how you would do this in the Browser and from a Node server: ## Limitations * A maximum of **100 attachments** can be added to a message * The **combined** size of all attachments you add to a message cannot exceed the following limits based on attachment type: * **Email attachments**: 6 MB * **Chat attachments**: 100 MB * **Slack attachments**: 50 MB * **Microsoft Teams attachments**: 50 MB * **Discord attachments**: 50 MB * **Thread discussion attachments**: 50 MB * **Note attachments**: 50 MB * The following file extensions are not allowed as attachments: ` bat, bin, chm, com, cpl, crt, exe, hlp, hta, inf, ins, isp, jse, lnk, mdb, msc, msi, msp, mst, pcd, pif, reg, scr, sct, shs, vba, vbe, vbs, wsf, wsh, wsl` * Attachments uploaded, but never referenced by a message, will be **deleted after 24 hours**. * Upload URLs are only **valid for 2 hours** after which a new URL needs to be created. # Authentication Source: https://www.plain.com/docs/graphql/authentication Create a machine user and an API key, and scope it with fine-grained permissions. A machine user can have several API keys, so you can rotate them without downtime. Each API key carries its own fine-grained permissions. Go to **Settings** → **Machine Users** and click **+ Add Machine User** A machine user has two fields: * **Name:** visible only to you and could indicate the usage e.g. "Autoresponder" * **Public name:** This is the name visible to customers (if the machine user interacts with customers) e.g. "Mr Robot" Click "Add API key" and select the permissions you need. When making API calls, if you have insufficient permissions, the error should tell you which permissions you need. The relevant documentation will tell you which permissions are required for each feature. Once you've made an API key you should copy it and put it somewhere safe, as you will not be able to see it again once you navigate away. Now that you have an API key, pass it on any API call as a header: ```plaintext theme={null} Authorization: Bearer plainApiKey_xxx ``` # Companies Source: https://www.plain.com/docs/graphql/companies Companies group customers by email domain. Plain infers them automatically, and you can set them yourself. Within Plain every customer can belong to one company. The company is inferred automatically using the customer's email address. For example if their email address ends with "@nike.com" then their company will be automatically set to "Nike". Companies allow you to prioritize and filter your threads. Additionally [tiers and SLAs](/docs/product/platform/tiers) can be associated with a company. # Delete a company Source: https://www.plain.com/docs/graphql/companies/delete Delete a company and unlink it from its customers, without deleting the customers themselves. Deleting a company unlinks it from all of its customers. The customers themselves are not deleted, they no longer belong to a company. A company is identified by either its Plain `companyId` or its `companyDomainName`. This operation requires the following permissions: * `company:delete` # Fetch companies Source: https://www.plain.com/docs/graphql/companies/get-companies Fetch companies by ID, by domain, or as a paginated collection. There are three ways to fetch companies: * [Get companies](#get-companies) (To fetch more than one company at a time) * [Get company by ID](#get-company-by-id) * [Search for companies](#search-for-companies) These operations require the following permissions: * `company:read` ## Get companies You can get all companies you've interacted with in your workspace using the `companies` query. This endpoint supports [Pagination](/docs/graphql/pagination). ## Get company by ID If you already have the ID of a company you can fetch it directly using the `company` query. ## Search for companies The `searchCompanies` query performs a case-insensitive partial match across a company's name and domain. The search term must be at least 2 characters long. # Update customer company Source: https://www.plain.com/docs/graphql/companies/update-customer-company Override the company Plain inferred for a customer, or clear it. Plain automatically derives a customer's company for you, but you can also update it manually. The customer in question is identified by their id (ie `c_...`). With regards to the company, you can either specify an existing company using the ID we've generated (ie `co_...`), or pass the company domain, which we'll use to derive the rest of the company's info. If you wish to only remove the customer's associated company, then you can pass `null` as the `companyIdentifier`. This operation requires the following permissions: * `customer:edit` # Upsert a company Source: https://www.plain.com/docs/graphql/companies/upsert Create or update a company by domain, so you control its name and details rather than the inferred ones. Plain auto-creates companies from customer email domains, but you can also upsert them directly via the API. This is useful when you want to set details like the company name, logo or account owner ahead of any customers being created. `upsertCompany` will create a new company if one with the given identifier doesn't exist, or update it in place if it does. The mutation returns a `result` field of either `CREATED` or `UPDATED` so you can tell which happened. A company is identified by either its Plain `companyId` or its `companyDomainName`. When upserting by domain, you can pass either a bare domain (e.g. `plain.com`) or a full URL (e.g. `https://www.plain.com`) and we'll extract the domain for you. This operation requires the following permissions: * `company:create` * `company:edit` # Building your own ticket importer Source: https://www.plain.com/docs/graphql/custom-ticket-importer Write your own importer to bring support history into Plain from a tool with no built-in importer. If your support history lives somewhere Plain doesn't have a one-click importer for, you can bring it across yourself with a short script built on the Plain API. Building your own ticket importer in Plain ## When to use this Plain has one-click importers for [Zendesk](/docs/product/integrations/zendesk), [Freshdesk](/docs/product/integrations/freshdesk), [Intercom](/docs/product/integrations/intercom), and [Help Scout](/docs/product/integrations/help-scout). If you're coming from one of those, use the importer and skip this page. A custom import is the route for everything else: a less common support tool, a shared inbox, an internal ticketing system, or a spreadsheet of past conversations you still want your team to be able to search. ## What comes across A custom import gives you the same foundations as the one-click importers: * **Your conversation history**, as threads with their messages, replies, and internal notes * **Original timestamps**, on every thread and every message, so your archive reflects when each thing happened * **The right authors**, with inbound messages attributed to the customer and replies attributed to the user who sent them * **Attachments**, uploaded to Plain and attached to the messages they belong to * **Thread details** you decide to map across, including title, status, priority, labels, assignee, and a link back to the original ticket Imported threads don't trigger [SLAs](/docs/product/platform/slas), [auto-responses](/docs/product/platform/auto-responses), or [workflows](/docs/product/workflows). Bringing in years of history is quiet, and nothing goes out to your customers.