Skip to main content

Objects

Account​

No description

type Account {
activatedAt: DateTime
expiresAt: DateTime
id: ID!
state: AccountState!
subdomain: String!
}

AccountIntegration​

No description

type AccountIntegration implements Integration {
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
uid: String
updatedAt: DateTime!
}

AccountPreferenceUpsertPayload​

Autogenerated return type of AccountPreferenceUpsert

type AccountPreferenceUpsertPayload {
accountPreferences: AccountPreferences
clientMutationId: String
errors: [UserError!]!
}

AccountPreferences​

No description

type AccountPreferences {
helplyAccountId: String
helplyCopilotGuidance: String
twoFactorAuthenticationGloballyEnforced: Boolean!
}

Address​

A full address.

type Address {
city: String
country: String
postalCode: String
state: String
street: String
street2: String
}

Agent​

An agent is a user on Groove that is part of an organization.

To find all active agents, along with the teams they belong to, ordered by name:

query Agents {
agents {
edges {
node {
account {
id
subdomain
}
avatarUrl
createdAt
email
id
name
role
state
subdomain
preferences {
edges {
node {
key
value
}
}
}
teams {
edges {
node {
id
name
}
}
pageInfo {
hasNextPage
}
}
oauthCredentials {
edges {
node {
uid
provider
accessToken
refreshToken
expiresAt
createdAt
updatedAt
}
}
}
username
updatedAt
twoFactorAuthCode {
uri
code
}
}
}
}
}

To query for invited agents:

query Agents {
agents(filter: {state: INVITED}){
edges {
node {
id
name
}
}
}
}

To reverse order the search:

query Agents {
agents( orderBy: { field: NAME, direction: DESC } ) {
edges {
node {
id
name
}
}
}
}

To fetch agents ordered by the most times you assigned them to a conversation:

query Agents {
agents( orderBy: { field: ASSIGNMENT_COUNT, direction: DESC } ) {
nodes {
id
name
}
}
}

To fetch a single agent:

query Node {
node(id: $agentId) {
... on Agent {
id
name
}
}
}
type Agent implements Node, Timestamped {
account: Account!
assignmentCount: Int!
avatarUrl: Url!
conversationCount: Int!
createdAt: DateTime!
defaultNotificationPreferences: [AgentNotificationPreference!]!
email: String!
firstName: String
helplyCopilotAuthGrant: String
helplyIdentifyToken: String
id: ID!
lastName: String
name: String!
notificationPreferences(
after: String
before: String
first: Int
last: Int
): AgentNotificationPreferenceConnection
oauthCredentials(
after: String
before: String
first: Int
last: Int
): OauthCredentialsConnection
preferences(
after: String
before: String
first: Int
last: Int
): AgentPreferenceConnection!
role: AgentRole!
state: AgentState!
status2fa: AgentTwoFactorAuthStatus!
subdomain: String!
teams(
after: String
before: String
first: Int
last: Int
filter: TeamFilter
orderBy: TeamOrder
): TeamConnection
twoFactorAuthCode: TwoFactorAuthCode
updatedAt: DateTime!
username: String
}

AgentChanged​

A conversation was reassigned to another agent.

type AgentChanged implements Timestamped {
createdAt: DateTime!
from: Agent
id: ID!
to: Agent
updatedAt: DateTime!
}

AgentConnection​

The connection type for Agent.

type AgentConnection {
edges: [AgentEdge]
nodes: [Agent]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

AgentEdge​

An edge in a connection.

type AgentEdge {
cursor: String!
node: Agent
}

AgentNotificationPreference​

No description

type AgentNotificationPreference implements Node, Timestamped {
agent: Agent!
createdAt: DateTime!
event: String
id: ID!
key: String!
namespace: AgentNotificationPreferenceNotificationNamespaceType!
scopeId: ID
scopeType: String
updatedAt: DateTime!
value: [AgentNotificationPreferenceNotificationType!]!
}

AgentNotificationPreferenceBulkDeletePayload​

Autogenerated return type of AgentNotificationPreferenceBulkDelete

type AgentNotificationPreferenceBulkDeletePayload {
clientMutationId: String
errors: [UserError!]!
ids: [ID!]
}

AgentNotificationPreferenceBulkUpsertPayload​

Autogenerated return type of AgentNotificationPreferenceBulkUpsert

type AgentNotificationPreferenceBulkUpsertPayload {
clientMutationId: String
errors: [UserError!]!
notificationPreferences: [AgentNotificationPreference!]
}

AgentNotificationPreferenceConnection​

The connection type for AgentNotificationPreference.

type AgentNotificationPreferenceConnection {
edges: [AgentNotificationPreferenceEdge]
nodes: [AgentNotificationPreference]
pageInfo: PageInfo!
}

AgentNotificationPreferenceEdge​

An edge in a connection.

type AgentNotificationPreferenceEdge {
cursor: String!
node: AgentNotificationPreference
}

AgentPreference​

No description

type AgentPreference {
agent: Agent!
key: String!
namespace: String
value: Untyped!
}

AgentPreferenceConnection​

The connection type for AgentPreference.

type AgentPreferenceConnection {
edges: [AgentPreferenceEdge]
nodes: [AgentPreference]
pageInfo: PageInfo!
}

AgentPreferenceDeletePayload​

Autogenerated return type of AgentPreferenceDelete

type AgentPreferenceDeletePayload {
clientMutationId: String
errors: [UserError!]!
}

AgentPreferenceEdge​

An edge in a connection.

type AgentPreferenceEdge {
cursor: String!
node: AgentPreference
}

AgentPreferenceUpsertPayload​

Autogenerated return type of AgentPreferenceUpsert

type AgentPreferenceUpsertPayload {
agentPreference: AgentPreference
clientMutationId: String
errors: [UserError!]!
}

AgentResetLoginAttemptsPayload​

Autogenerated return type of AgentResetLoginAttempts

type AgentResetLoginAttemptsPayload {
agent: Agent
clientMutationId: String
errors: [UserError!]!
}

AgentResetPasswordPayload​

Autogenerated return type of AgentResetPassword

type AgentResetPasswordPayload {
clientMutationId: String
errors: [UserError!]!
}

AgentSendAdminEmailNotificationPayload​

Autogenerated return type of AgentSendAdminEmailNotification

type AgentSendAdminEmailNotificationPayload {
clientMutationId: String
errors: [UserError!]!
}

AiSuggestion​

No description

type AiSuggestion {
conversationId: String!
id: ID!
type: String!
value: JSON
}

AiSuggestionConnection​

The connection type for AiSuggestion.

type AiSuggestionConnection {
edges: [AiSuggestionEdge]
nodes: [AiSuggestion]
pageInfo: PageInfo!
}

AiSuggestionEdge​

An edge in a connection.

type AiSuggestionEdge {
cursor: String!
node: AiSuggestion
}

Article​

An article from a Knowledge Base. Each article can be assigned to one category.

To fetch multiple Knowledge Bases with related articles:

query KbArticles {
articles {
totalCount
totalPageCount
edges {
node {
attachments {
nodes {
id
}
}
body
category {
id
}
createdAt
deletedAt
description
id
ratings {
nodes {
id
}
}
ratingsType
relatedArticles{
nodes {
id
}
}
tags
updatedAt

... on Publishable {
author {
id
email
}
description
featured
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
position
publishedAt
slug
state
title
updater {
id
email
}
}

}
}
}
}

To fetch only the latest 5 articles:

query KbArticles {
articles(
first: 5,
filter: {
knowledgeBase: "Support"
},
orderBy: {
field: UPDATED_AT,
direction: DESC
}
){
totalCount
totalPageCount
edges {
node {
id
title
}
}
}
}

To search for articles:

query KbArticles {
articles(
filter: {
knowledgeBase: "Support",
keywords: "rad"
}
){
totalCount
totalPageCount
edges {
node {
id
title
}
}
}
}
type Article implements Node, Timestamped, Publishable {
attachments(
after: String
before: String
first: Int
last: Int
): ArticleAttachmentConnection
author: Agent
body: String
category: KbCategory
createdAt: DateTime!
currentSlug: String
currentVersion: ArticleVersion
deletedAt: DateTime
description: String
featured: Boolean!
id: ID!
knowledgeBase: KnowledgeBase!
latestVersion: ArticleVersion
meta: Meta
openGraph: OpenGraph
pageTitle: String
position: Int!
previousSlugs: [String!]!
publishedAt: DateTime
ratings(
after: String
before: String
first: Int
last: Int
): ArticleRatingConnection
ratingsType: ArticleRatingTypes
relatedArticles(
after: String
before: String
first: Int
last: Int
): ArticleConnection
slug: String
state: PublishState!
tags: [String!]
title: String
updatedAt: DateTime!
updater: Agent
url: String
}

An object that can be published, for example Knowledge Base categories or articles.

For example:


... on Publishable {
author {
id
email
}
description
featured
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
position
publishedAt
slug
state
title
updater {
id
email
}
}

ArticleAttachment​

A file attached to a Knowledge Base article.

type ArticleAttachment implements Node, Timestamped {
createdAt: DateTime!
fileName: String!
id: ID!
mimeType: String!
name: String
size: Int!
updatedAt: DateTime!
url: Url
uuid: String
}

ArticleAttachmentConnection​

The connection type for ArticleAttachment.

type ArticleAttachmentConnection {
edges: [ArticleAttachmentEdge]
nodes: [ArticleAttachment]
pageInfo: PageInfo!
}

ArticleAttachmentEdge​

An edge in a connection.

type ArticleAttachmentEdge {
cursor: String!
node: ArticleAttachment
}

ArticleConnection​

The connection type for Article.

type ArticleConnection {
edges: [ArticleEdge]
nodes: [Article]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

ArticleEdge​

An edge in a connection.

type ArticleEdge {
cursor: String!
node: Article
}

ArticleRating​

A rating given to an article by a visitor of the Knowledge Base.

type ArticleRating implements Node, Timestamped {
count: Int!
createdAt: DateTime!
id: ID!
updatedAt: DateTime!
value: Int!
}

ArticleRatingConnection​

The connection type for ArticleRating.

type ArticleRatingConnection {
edges: [ArticleRatingEdge]
nodes: [ArticleRating]
pageInfo: PageInfo!
}

ArticleRatingEdge​

An edge in a connection.

type ArticleRatingEdge {
cursor: String!
node: ArticleRating
}

ArticleVersion​

No description

type ArticleVersion implements Timestamped {
body: String
createdAt: DateTime!
description: String
metaRobots: String
pageTitle: String
publishedAt: DateTime
title: String
updatedAt: DateTime!
}

Assignment​

The agents and/or teams that are assigned to the conversation.

type Assignment {
agent: Agent
at: DateTime
team: Team
}

AsyncRpcPayload​

Autogenerated return type of AsyncRpc

type AsyncRpcPayload {
clientMutationId: String
errors: [UserError!]!
jobId: ID
}

Attachment​

A file attached to a message.

type Attachment implements Node, Timestamped {
contentId: String
createdAt: DateTime!
creator: Agent
deliverBy: DateTime
downloadUrl: String
fileName: String
fileSize: String
fileType: String
id: ID!
s3Key: String
scanReport: AttachmentScanReport
type: AttachmentType
updatedAt: DateTime!
url: String
}

AttachmentConnection​

The connection type for Attachment.

type AttachmentConnection {
edges: [AttachmentEdge]
nodes: [Attachment]
pageInfo: PageInfo!
}

AttachmentEdge​

An edge in a connection.

type AttachmentEdge {
cursor: String!
node: Attachment
}

AttachmentScanReport​

The attachment scan report

type AttachmentScanReport {
matches: [String!]!
status: AttachmentScanReportStatus!
}

BillingFeatureType​

The billing feature name value pair

type BillingFeatureType {
key: String!
name: String!
value: BillingFeatureValueType!
}

BillingType​

No description

type BillingType {
availableFeatures: [BillingFeatureType!]!
cardSetupIntents: [CardSetupIntent!]!
creditCards: [CreditCard!]!
discount: Discount
plans(
state: [PlanState!] = [TRIAL, PAID]
): [Plan!]!
pricings(
showAll: Boolean = false
): [Pricing!]!
usages: [BillingUsageType!]!
}

Fetch all available features of the current plan of current account:

query FeaturesQuery {
billing {
availableFeatures {
key
name
value
}
}
}

Fetch all usage for the current account:

query FeaturesQuery {
billing {
usage {
key
value
}
}
}

BillingUsageType​

The billing usage name value pair

type BillingUsageType {
key: String!
value: BillingFeatureValueType!
}

Browser​

The web browser used by the contact.

type Browser {
family: String
version: String
}

CancelDowngradePayload​

Autogenerated return type of CancelDowngrade

type CancelDowngradePayload {
clientMutationId: String
errors: [UserError!]!
}

CannedReply​

A canned reply is a prewritten answer to commonly asked customer questions.

To fetch all canned replies:

query CannedReplies {
cannedReplies {
nodes {
body
category {
id
}
createdAt
creator {
id
}
id
name
snippet
subject
updatedAt
lastUsedAt
countUsed
attachments {
id
}
}
}
}

To fetch all canned replies with a given search string:

query CannedReplies {
cannedReplies( filter: { keywords: "foo" } ) {
nodes {
id
name
}
}
}

To fetch all canned replies with a given search string in a particular category:

query CannedReplies {
cannedReplies( filter: { keywords: "foo", category_ids: [ "crc_123456" ] } ) {
nodes {
id
name
}
}
}
type CannedReply implements Node, Timestamped, Utilizationabled {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection!
automaticActions: [CannedReplyAutomaticAction!]!
body: String
category: CannedReplyCategory
countUsed: Int!
createdAt: DateTime!
creator: Agent
id: ID!
interpolatedBody(
contactId: ID!
conversationId: ID
messageId: ID
channelId: ID
): String
lastUsedAt: DateTime
mailboxIds: [String!]
name: String
snippet: String
subject: String
updatedAt: DateTime!
}

CannedReplyAutomaticAction​

No description

type CannedReplyAutomaticAction {
type: String
value: String
}

CannedReplyCategory​

A canned reply category is a grouping for canned replies.

To fetch all canned reply categories in the account:

query CannedReplyCategories{
cannedReplyCategories {
nodes {
createdAt
id
name
updatedAt
}
pageInfo {
hasNextPage
}
}
}

To fetch all canned reply categories with a given search string:

query CannedReplyCategories{
cannedReplyCategories(filter: { keyword: "Billing" }){
nodes {
createdAt
id
name
updatedAt
}
pageInfo {
hasNextPage
}
}
}
type CannedReplyCategory implements Node, Timestamped {
cannedReplies(
after: String
before: String
first: Int
last: Int
filter: CannedReplyFilter
orderBy: CannedReplyOrder
): CannedReplyConnection
createdAt: DateTime!
id: ID!
locked: Boolean!
name: String!
updatedAt: DateTime!
}

CannedReplyCategoryConnection​

The connection type for CannedReplyCategory.

type CannedReplyCategoryConnection {
edges: [CannedReplyCategoryEdge]
nodes: [CannedReplyCategory]
pageInfo: PageInfo!
}

CannedReplyCategoryEdge​

An edge in a connection.

type CannedReplyCategoryEdge {
cursor: String!
node: CannedReplyCategory
}

CannedReplyConnection​

The connection type for CannedReply.

type CannedReplyConnection {
edges: [CannedReplyEdge]
nodes: [CannedReply]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

CannedReplyEdge​

An edge in a connection.

type CannedReplyEdge {
cursor: String!
node: CannedReply
}

CardSetupIntent​

Represents the intent of a customer to create/replace a payment method on there account

Fetch all setup intents for the current account:

query SetupIntentsQuery {
billing {
cardSetupIntents {
id,
clientSecret
usage
status
createdAt
}
}
}
type CardSetupIntent {
clientSecret: String!
createdAt: DateTime!
id: ID!
status: SetupIntentStatus!
usage: SetupIntentUsage!
}

CardSetupIntentCreatePayload​

Autogenerated return type of CardSetupIntentCreate

type CardSetupIntentCreatePayload {
clientMutationId: String
errors: [UserError!]!
setupIntent: CardSetupIntent
}

CardSetupIntentSucceedPayload​

Autogenerated return type of CardSetupIntentSucceed

type CardSetupIntentSucceedPayload {
clientMutationId: String
errors: [UserError!]!
setupIntent: CardSetupIntent
}

ChannelChanged​

A conversation was moved to another channel.

type ChannelChanged implements Timestamped {
createdAt: DateTime!
from: Channel
id: ID!
to: Channel
updatedAt: DateTime!
}

ChannelConnection​

The connection type for Channel.

type ChannelConnection {
edges: [ChannelEdge]
nodes: [Channel]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

ChannelDeletePayload​

Autogenerated return type of ChannelDelete

type ChannelDeletePayload {
clientMutationId: String
deletedChannelId: ID!
errors: [UserError!]!
}

ChannelEdge​

An edge in a connection.

type ChannelEdge {
cursor: String!
node: Channel
}

ChannelIntegration​

No description

type ChannelIntegration implements Integration {
channel: Channel!
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
uid: String
updatedAt: DateTime!
}

CheckAccessByMatrixIdsPayload​

Autogenerated return type of CheckAccessByMatrixIds

type CheckAccessByMatrixIdsPayload {
clientMutationId: String
errors: [UserError!]!
rooms: [RoomAccess!]
}

ClickCreatePayload​

Autogenerated return type of ClickCreate

type ClickCreatePayload {
clickId: String
clientMutationId: String
errors: [UserError!]!
}

CommentDeleted​

A comment was deleted.

type CommentDeleted {
id: ID!
}

CommentEdited​

A comment was edited.

type CommentEdited {
id: ID!
}

CommentReacted​

A reaction was left on a comment.

type CommentReacted {
id: ID!
isAdded: Boolean!
reaction: String!
}

Company​

A company represents an organization containing one or more contacts.

type Company implements Node, Timestamped, CustomFieldValuesField {
contacts(
after: String
before: String
first: Int
last: Int
): ContactConnection
conversationCount: Int!
createdAt: DateTime!
createdBy: Agent!
customFieldValues(
after: String
before: String
first: Int
last: Int
filter: CustomFieldValuesFilter
): CustomFieldValueConnection
domain: String
id: ID!
logoUrl: String
name: String
updatedAt: DateTime!
updatedBy: Agent!
}

CompanyAddContactsPayload​

Autogenerated return type of CompanyAddContacts

type CompanyAddContactsPayload {
clientMutationId: String
company: Company!
errors: [UserError!]!
}

CompanyConnection​

The connection type for Company.

type CompanyConnection {
edges: [CompanyEdge]
nodes: [Company]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

CompanyCreatePayload​

Autogenerated return type of CompanyCreate

type CompanyCreatePayload {
clientMutationId: String
company: Company
errors: [UserError!]!
}

CompanyDeletePayload​

Autogenerated return type of CompanyDelete

type CompanyDeletePayload {
clientMutationId: String
deletedCompanyId: ID
errors: [UserError!]!
}

CompanyEdge​

An edge in a connection.

type CompanyEdge {
cursor: String!
node: Company
}

CompanyMergePayload​

Autogenerated return type of CompanyMerge

type CompanyMergePayload {
clientMutationId: String
errors: [UserError!]!
target: Company!
}

CompanyRemoveContactsPayload​

Autogenerated return type of CompanyRemoveContacts

type CompanyRemoveContactsPayload {
clientMutationId: String
company: Company!
errors: [UserError!]!
}

Condition​

A folder condition provides the logic for matching relevant conversations.

For example, to match conversations with the "suggestion" tag:

  1. param: TAG
  2. operator: CONTAINS
  3. value: "suggestion"

To fetch all folders and their conditions:

query Folders {
folders {
edges {
node {
conditions {
edges {
node {
id
param
operator
value
}
}
pageInfo {
hasNextPage
}
}
createdAt
id
matchType
name
updatedAt
}
}
}
}
type Condition implements Node, Timestamped {
createdAt: DateTime!
id: ID!
operator: ConditionOperator!
param: ConditionParam!
source: ConditionSourceUnion
updatedAt: DateTime!
value: String
}

ConditionConnection​

The connection type for Condition.

type ConditionConnection {
edges: [ConditionEdge]
nodes: [Condition]
pageInfo: PageInfo!
}

ConditionEdge​

An edge in a connection.

type ConditionEdge {
cursor: String!
node: Condition
}

Contact​

that role is defined by their participation with a particular conversation. This means the same contact could be the customer on one conversation, and a collaborator on another.

type Contact implements Node, Timestamped, CustomFieldValuesField {
avatarUrl: String
companies(
after: String
before: String
first: Int
last: Int
): CompanyConnection
contactType: ContactType!
conversationCount: Int!
createdAt: DateTime!
createdBy: Agent
customFieldValues(
after: String
before: String
first: Int
last: Int
filter: CustomFieldValuesFilter
): CustomFieldValueConnection
email: EmailAddress
firstName: String
hasEnduser: Boolean!
id: ID!
lastName: String
lastSeenAt: DateTime
name: String
role: ContactRole
secondaryEmails: [EmailAddress!]
updatedAt: DateTime!
updatedBy: Agent!
}

ContactChange​

A conversation was reassigned to another contact.

type ContactChange implements Timestamped {
createdAt: DateTime!
from: Contact
id: ID!
to: Contact
updatedAt: DateTime!
}

ContactConnection​

The connection type for Contact.

type ContactConnection {
edges: [ContactEdge]
nodes: [Contact]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

ContactCreatePayload​

Autogenerated return type of ContactCreate

type ContactCreatePayload {
clientMutationId: String
contact: Contact
errors: [UserError!]!
}

ContactDeletePayload​

Autogenerated return type of ContactDelete

type ContactDeletePayload {
clientMutationId: String
deletedContactId: ID
errors: [UserError!]!
}

ContactEdge​

An edge in a connection.

type ContactEdge {
cursor: String!
node: Contact
}

ContactMergePayload​

Autogenerated return type of ContactMerge

type ContactMergePayload {
clientMutationId: String
errors: [UserError!]!
target: Contact!
}

ContactOpenedMessage​

A contact opened a message.

type ContactOpenedMessage implements Timestamped {
createdAt: DateTime!
id: ID!
message: Message!
updatedAt: DateTime!
}

ContactResyncPayload​

Autogenerated return type of ContactResync

type ContactResyncPayload {
clientMutationId: String
contact: Contact!
errors: [UserError!]!
}

ContactUpdatePayload​

Autogenerated return type of ContactUpdate

type ContactUpdatePayload {
clientMutationId: String
contact: Contact!
errors: [UserError!]!
}

conversationAddNotePayload​

Autogenerated return type of conversationAddNote

type conversationAddNotePayload {
changesetId: String
clientMutationId: String
conversation: Conversation
deletedDraftId: String
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
message: Note
}

ConversationAssignPayload​

Autogenerated return type of ConversationAssign

type ConversationAssignPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationAttachment​

A file attached to a message.

type ConversationAttachment implements Node, Timestamped {
changesetId: String!
commentId: String!
contentId: String
createdAt: DateTime!
creator: Agent
deliverBy: DateTime
downloadUrl: String
fileName: String
fileSize: String
fileType: String
id: ID!
s3Key: String
scanReport: AttachmentScanReport
ticketId: String!
type: AttachmentType
updatedAt: DateTime!
url: String
}

ConversationAttachmentConnection​

The connection type for ConversationAttachment.

type ConversationAttachmentConnection {
edges: [ConversationAttachmentEdge]
nodes: [ConversationAttachment]
pageInfo: PageInfo!
}

ConversationAttachmentEdge​

An edge in a connection.

type ConversationAttachmentEdge {
cursor: String!
node: ConversationAttachment
}

ConversationBulkDeletePayload​

Autogenerated return type of ConversationBulkDelete

type ConversationBulkDeletePayload {
clientMutationId: String
errors: [UserError!]!
jid: String!
}

ConversationChangeChannelPayload​

Autogenerated return type of ConversationChangeChannel

type ConversationChangeChannelPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationChangeContactPayload​

Autogenerated return type of ConversationChangeContact

type ConversationChangeContactPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationClosePayload​

Autogenerated return type of ConversationClose

type ConversationClosePayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationConnection​

The connection type for Conversation.

type ConversationConnection {
edges: [ConversationEdge]
nodes: [Conversation]
pageInfo: PageInfo!
totalCount: Int!
totalCountCapped: Boolean!
totalPageCount: Int!
}

ConversationCounts​

The statistics about the messages and interactions in the conversation.

type ConversationCounts {
attachments: Int!
interactions: Int!
messages: Int!
notes: Int!
stateChanges: Int!
}

ConversationCreateEmailPayload​

Autogenerated return type of ConversationCreateEmail

type ConversationCreateEmailPayload {
changesetId: String
clientMutationId: String
conversation: EmailConversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

conversationDeleteNotePayload​

Autogenerated return type of conversationDeleteNote

type conversationDeleteNotePayload {
changesetId: String
clientMutationId: String
conversation: Conversation
deletedMessageId: ID!
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationDeletePayload​

Autogenerated return type of ConversationDelete

type ConversationDeletePayload {
clientMutationId: String
deletedConversationIds: [ID!]!
diffs: [Diff!]!
errors: [UserError!]!
}

ConversationDeleted​

A conversation was moved to trash.

type ConversationDeleted implements Timestamped {
createdAt: DateTime!
id: ID!
updatedAt: DateTime!
}

ConversationEdge​

An edge in a connection.

type ConversationEdge {
cursor: String!
node: Conversation
}

conversationEditNotePayload​

Autogenerated return type of conversationEditNote

type conversationEditNotePayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
message: Note
}

ConversationFollowPayload​

Autogenerated return type of ConversationFollow

type ConversationFollowPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationForwardPayload​

Autogenerated return type of ConversationForward

type ConversationForwardPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
deletedDraftId: String
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
message: Message
}

ConversationForwardV2Payload​

Autogenerated return type of ConversationForwardV2

type ConversationForwardV2Payload {
changesetId: String
clientMutationId: String
conversation: Conversation
deletedDraftId: String
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
message: Message
}

conversationLinkResourcePayload​

Autogenerated return type of conversationLinkResource

type conversationLinkResourcePayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationLogPayload​

Autogenerated return type of ConversationLog

type ConversationLogPayload {
changesetId: String
clientMutationId: String
conversation: EmailConversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationMergePayload​

Autogenerated return type of ConversationMerge

type ConversationMergePayload {
changesetId: String
clientMutationId: String
errors: [UserError!]!
source: Conversation!
sourceDiffs: [Diff!]!
target: Conversation!
targetDiffs: [Diff!]!
}

ConversationMerged​

A conversation was merged into another conversation.

type ConversationMerged implements Timestamped {
createdAt: DateTime!
id: ID!
sourceChannelId: ID
sourceContactId: ID
sourceCreatedAt: DateTime
sourceNumber: Int!
target: Conversation!
updatedAt: DateTime!
}

ConversationMoveMessagePayload​

Autogenerated return type of ConversationMoveMessage

type ConversationMoveMessagePayload {
changesetId: String
clientMutationId: String
conversation: Conversation!
errors: [UserError!]!
}

ConversationOpenPayload​

Autogenerated return type of ConversationOpen

type ConversationOpenPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationPreferences​

No description

type ConversationPreferences {
defaultReplyState: ConversationReplyState!
groupFolders: Boolean!
scopedContactsSearch: Boolean!
showAllInboxes: Boolean!
}

ConversationReplyPayload​

Autogenerated return type of ConversationReply

type ConversationReplyPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
deletedDraftId: String
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
message: Message
}

conversationRestorePayload​

Autogenerated return type of conversationRestore

type conversationRestorePayload {
clientMutationId: String
conversations(
after: String
before: String
first: Int
last: Int
): ConversationConnection
diffs: [Diff!]!
errors: [UserError!]!
}

ConversationRestored​

A conversation was restored from trash.

type ConversationRestored implements Timestamped {
createdAt: DateTime!
id: ID!
updatedAt: DateTime!
}

ConversationSnoozePayload​

Autogenerated return type of ConversationSnooze

type ConversationSnoozePayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationSpamPayload​

Autogenerated return type of ConversationSpam

type ConversationSpamPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationStarPayload​

Autogenerated return type of ConversationStar

type ConversationStarPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationStarred​

The conversation was starred.

type ConversationStarred implements Timestamped {
createdAt: DateTime!
id: ID!
updatedAt: DateTime!
}

ConversationSubjectPayload​

Autogenerated return type of ConversationSubject

type ConversationSubjectPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationTagPayload​

Autogenerated return type of ConversationTag

type ConversationTagPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

conversationToggleNoteReactionPayload​

Autogenerated return type of conversationToggleNoteReaction

type conversationToggleNoteReactionPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
message: Note
}

ConversationTrashPayload​

Autogenerated return type of ConversationTrash

type ConversationTrashPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationUnassignPayload​

Autogenerated return type of ConversationUnassign

type ConversationUnassignPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

conversationUndoSendPayload​

Autogenerated return type of conversationUndoSend

type conversationUndoSendPayload {
changesetId: String
clientMutationId: String
diffs: [Diff!]!
errors: [UserError!]!
}

ConversationUnfollowPayload​

Autogenerated return type of ConversationUnfollow

type ConversationUnfollowPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationUnreadPayload​

Autogenerated return type of ConversationUnread

type ConversationUnreadPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationUnstarPayload​

Autogenerated return type of ConversationUnstar

type ConversationUnstarPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

ConversationUnstarred​

The conversation was unstarred.

type ConversationUnstarred implements Timestamped {
createdAt: DateTime!
id: ID!
updatedAt: DateTime!
}

ConversationUntagPayload​

Autogenerated return type of ConversationUntag

type ConversationUntagPayload {
changesetId: String
clientMutationId: String
conversation: Conversation
diffs: [Diff!]!
errors: [UserError!]!
eventGroup: EventGroupType
}

Coupon​

Represents a coupon that can be associated with a discount.

type Coupon {
amountOff: Int
createdAt: DateTime!
duration: CouponDuration!
durationInMonths: Int
id: ID!
maxRedemptions: Int
name: String
percentOff: Int
timesRedeemed: Int!
valid: Boolean!
}

Credentials​

No description

type Credentials {
createdAt: DateTime!
expiresAt: DateTime
expiresIn: Int
token: String!
}

CreditCard​

Represents all the credit cards currently added to the groove account

Fetch all credit cards for the current account:

query CreditCardsQuery {
billing {
creditCards {
id,
name
brand
country
cvcCheck
expiryMonth
expiryYear
funding
last4
}
}
}
type CreditCard {
brand: String!
country: String
cvcCheck: String
expiryMonth: Int!
expiryYear: Int!
funding: CreditCardFunding!
id: ID!
last4: String!
name: String
}

CrmEnduserUpsertPayload​

Autogenerated return type of CrmEnduserUpsert

type CrmEnduserUpsertPayload {
clientMutationId: String
contactId: ID!
errors: [UserError!]!
}

CustomDomain​

A custom domain lets you customize the URL of your Knowledge Base.

It contains expiry and Let's Encrypt certificate details.

type CustomDomain {
domain: String
expiresAt: String
letsencrypt: Boolean!
status: String
valid: Boolean
}

CustomField​

Custom fields provide agents with the ability to define extra data on a contact or company, along with the means of specifying how that information is entered and displayed.

type CustomField implements Node, Timestamped {
allowedOperators: [SupportedOperatorType!]
category: CustomFieldCategory!
createdAt: DateTime!
createdBy: Agent!
deletable: Boolean!
description: String
handleType: CustomFieldHandleType
hidden: Boolean!
icon: CustomFieldIcon!
id: ID!
isArray: Boolean!
key: String!
name: String
options(
after: String
before: String
first: Int
last: Int
): CustomFieldOptionConnection
placeholder: String
position: Int
required: Boolean!
type: CustomFieldType!
updatedAt: DateTime!
updatedBy: Agent!
}

CustomFieldCategory​

A grouping of contact or company fields.

type CustomFieldCategory implements Node, Timestamped {
createdAt: DateTime!
customFields(
after: String
before: String
first: Int
last: Int
): CustomFieldConnection!
deletable: Boolean!
id: ID!
key: String!
name: String!
type: CustomFieldCategoryType!
updatedAt: DateTime!
}

CustomFieldCategoryConnection​

The connection type for CustomFieldCategory.

type CustomFieldCategoryConnection {
edges: [CustomFieldCategoryEdge]
nodes: [CustomFieldCategory]
pageInfo: PageInfo!
}

CustomFieldCategoryCreatePayload​

Autogenerated return type of CustomFieldCategoryCreate

type CustomFieldCategoryCreatePayload {
category: CustomFieldCategory
clientMutationId: String
errors: [UserError!]!
}

CustomFieldCategoryDeletePayload​

Autogenerated return type of CustomFieldCategoryDelete

type CustomFieldCategoryDeletePayload {
clientMutationId: String
deletedCategoryId: ID
errors: [UserError!]!
newCategory: CustomFieldCategory
}

CustomFieldCategoryEdge​

An edge in a connection.

type CustomFieldCategoryEdge {
cursor: String!
node: CustomFieldCategory
}

CustomFieldCategoryUpdatePayload​

Autogenerated return type of CustomFieldCategoryUpdate

type CustomFieldCategoryUpdatePayload {
category: CustomFieldCategory
clientMutationId: String
errors: [UserError!]!
}

CustomFieldConnection​

The connection type for CustomField.

type CustomFieldConnection {
edges: [CustomFieldEdge]
nodes: [CustomField]
pageInfo: PageInfo!
}

CustomFieldCreatePayload​

Autogenerated return type of CustomFieldCreate

type CustomFieldCreatePayload {
clientMutationId: String
customField: CustomField
errors: [UserError!]!
}

CustomFieldDeletePayload​

Autogenerated return type of CustomFieldDelete

type CustomFieldDeletePayload {
clientMutationId: String
deletedCustomFieldId: ID
errors: [UserError!]!
}

CustomFieldEdge​

An edge in a connection.

type CustomFieldEdge {
cursor: String!
node: CustomField
}

CustomFieldOption​

An option for a custom field of type DROPDOWN.

type CustomFieldOption {
customField: CustomField!
label: String!
value: String!
}

CustomFieldOptionConnection​

The connection type for CustomFieldOption.

type CustomFieldOptionConnection {
edges: [CustomFieldOptionEdge]
nodes: [CustomFieldOption]
pageInfo: PageInfo!
}

CustomFieldOptionDeletePayload​

Autogenerated return type of CustomFieldOptionDelete

type CustomFieldOptionDeletePayload {
clientMutationId: String
deletedCustomFieldOptionId: ID
errors: [UserError!]!
}

CustomFieldOptionEdge​

An edge in a connection.

type CustomFieldOptionEdge {
cursor: String!
node: CustomFieldOption
}

CustomFieldRemovePayload​

Autogenerated return type of CustomFieldRemove

type CustomFieldRemovePayload {
clientMutationId: String
errors: [UserError!]!
item: CustomFieldSubjectType!
removedItemId: ID!
}

customFieldRestorePayload​

Autogenerated return type of customFieldRestore

type customFieldRestorePayload {
clientMutationId: String
customField: CustomField!
errors: [UserError!]!
}

CustomFieldUpdatePayload​

Autogenerated return type of CustomFieldUpdate

type CustomFieldUpdatePayload {
clientMutationId: String
customField: CustomField!
errors: [UserError!]!
}

CustomFieldValue​

The value of a contact or company custom field.

type CustomFieldValue {
customField: CustomField!
id: ID!
value: ValueTypeUnion!
}

CustomFieldValueConnection​

The connection type for CustomFieldValue.

type CustomFieldValueConnection {
edges: [CustomFieldValueEdge]
nodes: [CustomFieldValue]
pageInfo: PageInfo!
}

CustomFieldValueEdge​

An edge in a connection.

type CustomFieldValueEdge {
cursor: String!
node: CustomFieldValue
}

CustomFieldValuesBulkUpdatePayload​

Autogenerated return type of CustomFieldValuesBulkUpdate

type CustomFieldValuesBulkUpdatePayload {
clientMutationId: String
errors: [UserError!]!
jid: String
}

CustomFieldValuesUpdatePayload​

Autogenerated return type of CustomFieldValuesUpdate

type CustomFieldValuesUpdatePayload {
clientMutationId: String
errors: [UserError!]!
subject: CustomFieldSubjectType!
}

CustomerRatingSetting​

No description

type CustomerRatingSetting {
account: Account!
id: ID!
locale: String!
mailboxIds: [String!]
name: String!
translations: [CustomerRatingSettingTranslation!]
}

CustomerRatingSettingConnection​

The connection type for CustomerRatingSetting.

type CustomerRatingSettingConnection {
edges: [CustomerRatingSettingEdge]
nodes: [CustomerRatingSetting]
pageInfo: PageInfo!
}

CustomerRatingSettingDeletePayload​

Autogenerated return type of CustomerRatingSettingDelete

type CustomerRatingSettingDeletePayload {
clientMutationId: String
deletedCustomerRatingSettingId: ID
errors: [UserError!]!
}

CustomerRatingSettingEdge​

An edge in a connection.

type CustomerRatingSettingEdge {
cursor: String!
node: CustomerRatingSetting
}

CustomerRatingSettingTranslation​

No description

type CustomerRatingSettingTranslation {
id: ID!
locale: String!
value: String!
}

CustomerRatingSettingUpsertPayload​

Autogenerated return type of CustomerRatingSettingUpsert

type CustomerRatingSettingUpsertPayload {
clientMutationId: String
customerRatingSetting: CustomerRatingSetting
errors: [UserError!]!
}

DeleteRoomPayload​

Autogenerated return type of DeleteRoom

type DeleteRoomPayload {
clientMutationId: String
deletedConversationId: ID
errors: [UserError!]!
}

DemoEmailChannel​

A channel for email conversations.

To fetch your active mailboxes, you can issue this query:

query Channels {
channels {
nodes {
... on DemoEmailChannel {
color
createdAt
forwardEmailAddress
fromName
id
name
signature
updatedAt
}
}
pageInfo {
hasNextPage
}
}
}

To fetch inactive mailboxes:

query Channels {
channels(filter: { state: UNCONFIRMED }) {
nodes {
... on DemoEmailChannel {
id
name
}
}
}
}

To fetch accessible folders (paginated) for each of your mailboxes:

query Channels {
channels {
nodes {
... on DemoEmailChannel {
id
name
folders {
nodes {
id
name
}
pageInfo {
hasNextPage
}
}
}
}
}
}

To fetch conversations in this mailbox, use the QueryRoot conversations field with a filter argument e.g.:

query Conversations {
conversations(filter: { channel_id: "ch_12345678" }) {
nodes {
... on Conversation {
id
number
}
}
pageInfo {
hasNextPage
}
}
}
type DemoEmailChannel implements Node, Channel, EmailInterface {
aiDraftsChannels: [EmailChannel!]
aiDraftsKnowledgeBases: [KnowledgeBase!]
aiQualityRating: String
autoBccAddress: String
color: String!
conversationCount(
state: [ConversationState!]
): Int!
createdAt: DateTime!
customFields(
after: String
before: String
first: Int
last: Int
): CustomFieldConnection!
email: String
emailTemplates: [EmailTemplate!]!
errors: [ChannelErrorTypeUnion!]!
folders(
after: String
before: String
first: Int
last: Int
filter: FolderFilter
orderBy: FolderOrder
): FolderConnection
forwardEmailAddress: String!
fromName: String!
id: ID!
incomingEmailServer: IncomingServerTypeUnion
name: String!
outgoingEmailServer: OutgoingServerTypeUnion
permittedAgents(
after: String
before: String
first: Int
last: Int
agentIds: [ID!]
): AgentConnection!
pinnedSearches(
after: String
before: String
first: Int
last: Int
filter: PinnedSearchFilter
orderBy: PinnedSearchOrder
): PinnedSearchConnection
position: Int!
provider: String!
restriction: Restriction!
senderName: String
signature: String
state: ChannelState!
tags(
after: String
before: String
first: Int
last: Int
filter: TagFilter
orderBy: TagOrder
): TagConnection
threadingType: ThreadingType!
type: ChannelType!
updatedAt: DateTime!
useAgentName: Boolean
}

A channel is a source of incoming conversations. It dictates how messages in those conversations are sent and received.

For example, an EmailChannel is a channel where messages are sent as email. To fetch all of them:

query Channels {
channels {
nodes {
... on Channel {
__typename
id
name
conversationCount
}
}
}
}

By default channels are sorted by their user-defined row-order, called their position. To sort by name instead:

query Channels {
channels( orderBy: { field: NAME, direction: ASC } ) {
nodes {
... on EmailChannel {
id
}
}
}
}

To find which agents have permission to view this channel:

query Channels {
channels {
nodes {
id
name
permittedAgents {
totalCount
nodes {
id
}
}
}
}
}

Only find channels where the user is granted access to view it:

query Channels {
channels(filter: { scope: CURRENT_USER }) {
nodes {
id
name
permittedAgents {
totalCount
nodes {
id
}
}
}
}
}

Find all channels the user is allowed to view. Admin users can always view all channels:

query Channels {
channels(filter: { scope: ALL }) {
nodes {
id
name
permittedAgents {
totalCount
nodes {
id
}
}
}
}
}

Device​

The device used by the contact.

type Device {
family: String
}

Diff​

Diffs represent the changes to search or folder counts as a result of a mutation.

Clients can read the diff(s) from a mutation, and apply those deltas to their cached folder counts without having to re-query the API for the correct counts.

In some cases it's possible to guess how a particular mutation might affect folder counts. Indeed, the Groove apps generally try to make an optimistic guess while the mutation request is in-flight.

Often, however, it's non-trivial to do so, and in some cases not possible. It's more more correct to rely on the API to provide the correct numbers, and these are provided conveniently inside mutation diffs.

For example, say you have a "question" tag, and there are 20 conversations with that tag applied. Then, an agent triggers a conversationUntag mutation for the "question" tag on one of those conversations. That mutation will then return a diff field showing a -1 delta for the general search query for that tag. For example:

"diffs" => [
"tag:tag_1234567" => -1,
]

The client could then cheaply recompute their cached counts for that tag, and update any previously cached search result counts.

Similarly, if you also had a folder whose rule matches all "question" tags as well, then that same mutation might result in a folder diff field like so:

"diffs" => [
"tag:tag_1234567" => -1,
"folder:fol_2345678" => -1,
]

The client could use this information to quickly update any visible folder counts without having to re-query the API.

Finally, diffs are also provided at the 'All Channels' level (like above) and for individual channels. If there was a channel where the above folder was visible, the diff results would look something like so:

"diffs" => [
"tag:tag_1234567" => -1,
"folder:fol_2345678" => -1,
"channel:ch_4567890 folder:fol_2345678" => -1,
]
type Diff {
delta: Int
query: String!
}

DisconnectMutationPayload​

Autogenerated return type of DisconnectMutation

type DisconnectMutationPayload {
channel: Channel
clientMutationId: String
errors: [UserError!]!
}

Discount​

Represents a discount applied to the customer or subscription

Fetch all credit cards for the current account:

query CreditCardsQuery {
billing {
discount {
id,
type
startAt
endAt
coupon {
id
duration
durationInMonths
maxRedemptions
name
percentOff
amountOff
timesRedeemed
valid
createdAt
}
}
}
}
type Discount {
coupon: Coupon!
endAt: DateTime
id: ID!
startAt: DateTime!
type: DiscountType!
}

DraftConnection​

The connection type for Draft.

type DraftConnection {
edges: [DraftEdge]
nodes: [Draft]
pageInfo: PageInfo!
}

DraftDeletePayload​

Autogenerated return type of DraftDelete

type DraftDeletePayload {
clientMutationId: String
deletedDraftId: String
errors: [UserError!]!
success: Boolean!
}

DraftEdge​

An edge in a connection.

type DraftEdge {
cursor: String!
node: Draft
}

DraftSavePayload​

Autogenerated return type of DraftSave

type DraftSavePayload {
clientMutationId: String
contextId: ID
draftId: ID!
draftType: String!
errors: [UserError!]!
payload: String
success: Boolean!
version: Int!
}

DraftUpsertPayload​

Autogenerated return type of DraftUpsert

type DraftUpsertPayload {
clientMutationId: String
draft: DraftTypeUnion
errors: [UserError!]!
}

EmailChannel​

A channel for email conversations.

To fetch your active mailboxes, you can issue this query:

query Channels {
channels {
nodes {
... on EmailChannel {
color
createdAt
forwardEmailAddress
fromName
id
name
signature
updatedAt
}
}
pageInfo {
hasNextPage
}
}
}

To fetch inactive mailboxes:

query Channels {
channels(filter: { state: UNCONFIRMED }) {
nodes {
... on EmailChannel {
id
name
}
}
}
}

To fetch accessible folders (paginated) for each of your mailboxes:

query Channels {
channels {
nodes {
... on EmailChannel {
id
name
folders {
nodes {
id
name
}
pageInfo {
hasNextPage
}
}
}
}
}
}

To fetch conversations in this mailbox, use the QueryRoot conversations field with a filter argument e.g.:

query Conversations {
conversations(filter: { channel_id: "ch_12345678" }) {
nodes {
... on Conversation {
id
number
}
}
pageInfo {
hasNextPage
}
}
}
type EmailChannel implements Node, Channel, EmailInterface {
aiDraftsChannels: [EmailChannel!]
aiDraftsKnowledgeBases: [KnowledgeBase!]
aiQualityRating: String
autoBccAddress: String
color: String!
conversationCount(
state: [ConversationState!]
): Int!
createdAt: DateTime!
customFields(
after: String
before: String
first: Int
last: Int
): CustomFieldConnection!
email: String
emailTemplates: [EmailTemplate!]!
errors: [ChannelErrorTypeUnion!]!
folders(
after: String
before: String
first: Int
last: Int
filter: FolderFilter
orderBy: FolderOrder
): FolderConnection
forwardEmailAddress: String!
fromName: String!
id: ID!
incomingEmailServer: IncomingServerTypeUnion
name: String!
outgoingEmailServer: OutgoingServerTypeUnion
permittedAgents(
after: String
before: String
first: Int
last: Int
agentIds: [ID!]
): AgentConnection!
pinnedSearches(
after: String
before: String
first: Int
last: Int
filter: PinnedSearchFilter
orderBy: PinnedSearchOrder
): PinnedSearchConnection
position: Int!
provider: String!
restriction: Restriction!
senderName: String
signature: String
state: ChannelState!
tags(
after: String
before: String
first: Int
last: Int
filter: TagFilter
orderBy: TagOrder
): TagConnection
threadingType: ThreadingType!
type: ChannelType!
updatedAt: DateTime!
useAgentName: Boolean
}

A channel is a source of incoming conversations. It dictates how messages in those conversations are sent and received.

For example, an EmailChannel is a channel where messages are sent as email. To fetch all of them:

query Channels {
channels {
nodes {
... on Channel {
__typename
id
name
conversationCount
}
}
}
}

By default channels are sorted by their user-defined row-order, called their position. To sort by name instead:

query Channels {
channels( orderBy: { field: NAME, direction: ASC } ) {
nodes {
... on EmailChannel {
id
}
}
}
}

To find which agents have permission to view this channel:

query Channels {
channels {
nodes {
id
name
permittedAgents {
totalCount
nodes {
id
}
}
}
}
}

Only find channels where the user is granted access to view it:

query Channels {
channels(filter: { scope: CURRENT_USER }) {
nodes {
id
name
permittedAgents {
totalCount
nodes {
id
}
}
}
}
}

Find all channels the user is allowed to view. Admin users can always view all channels:

query Channels {
channels(filter: { scope: ALL }) {
nodes {
id
name
permittedAgents {
totalCount
nodes {
id
}
}
}
}
}

EmailChannelCreatePayload​

Autogenerated return type of EmailChannelCreate

type EmailChannelCreatePayload {
channel: EmailChannel
clientMutationId: String
errors: [UserError!]!
}

EmailChannelUpdatePayload​

Autogenerated return type of EmailChannelUpdate

type EmailChannelUpdatePayload {
channel: EmailChannel
clientMutationId: String
errors: [UserError!]!
}

EmailConversation​

A Groove conversation initiated in an email channel.

To fetch a specific conversation by ID:

query Conversation {
node(id: "cnv_12345678") {
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt
}
}
})

To fetch all conversations in a specific channel or folder:

query Conversations {
conversations(
filter: {
channel: "ch_4567890",
folder: "fol_8901234",
}
) {
nodes {
... on Conversation {
id
number
}
}
pageInfo {
hasNextPage
}
}
}

To find conversations in "all channels" that apply to a specific folder, omit the channel.

query Conversations {
conversations( filter: { folder: "fol_8901234" }) {
nodes {
... on Conversation {
id
number
}
}
pageInfo {
hasNextPage
}
}
}

By default, conversations are returned with the newest conversations first. To sort showing oldest first:

query Conversations {
conversations( orderBy: { field: UPDATED_AT, direction: ASC } ) {
nodes {
... on Conversation {
id
number
}
}
pageInfo {
hasNextPage
}
}
}
type EmailConversation implements Node, Conversation {
assigned: Assignment
channel: Channel!
contact: Contact
counts: ConversationCounts!
createdAt: DateTime!
customFieldValues(
after: String
before: String
first: Int
last: Int
filter: CustomFieldValuesFilter
): CustomFieldValueConnection
deletedAt: DateTime
drafts(
after: String
before: String
first: Int
last: Int
): DraftConnection
followers(
after: String
before: String
first: Int
last: Int
filter: AgentFilter
orderBy: AgentOrder
): AgentConnection
id: ID!
lastUnansweredUserMessageAt: DateTime!
mentions: [Mention!]!
number: Int!
searchSummary: SearchSummary
snoozed: Snooze
starred: Boolean!
state: ConversationState!
stateUpdatedAt: DateTime
subject: String
summaryMessage: SummaryMessage
systemUpdatedAt: DateTime!
tags(
after: String
before: String
first: Int
last: Int
filter: TagFilter
orderBy: TagOrder
): TagConnection
updatedAt: DateTime!
}

A Groove conversation is a thread of messages (for example emails, chats, or notes) and associated actions or events (for example 'opened', 'snoozed', and 'assigned').

To fetch Messages/Ratings/StateChanges/etc. on a conversation, query the Events connection (on the QueryRoot) with the conversation ID.

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
}

To search conversations matching a specific keyword:

query Conversations {
conversations(filter: { keywords: "rad" }) {
edges {
node {
... on Conversation {
id
number
searchSummary {
author {
__typename
... on Agent {
email
role
}
... on Contact {
email
}
}
body
forwarded
note
}
}
}
}
}
}

EmailEngineError​

Email engine error that occurred when interacting with the underlying mailbox.

type EmailEngineError implements ErrorType {
createdAt: DateTime!
message: String!
type: String!
updatedAt: DateTime!
}

EmailMarketingIntegration​

No description

type EmailMarketingIntegration {
id: ID!
lists(
contactId: ID
): [EmailMarketingList!]!
type: EmailMarketingIntegrationType!
}

EmailMarketingIntegrationConnection​

The connection type for EmailMarketingIntegration.

type EmailMarketingIntegrationConnection {
edges: [EmailMarketingIntegrationEdge]
nodes: [EmailMarketingIntegration]
pageInfo: PageInfo!
}

EmailMarketingIntegrationEdge​

An edge in a connection.

type EmailMarketingIntegrationEdge {
cursor: String!
node: EmailMarketingIntegration
}

EmailMarketingList​

No description

type EmailMarketingList {
id: String!
name: String!
}

EmailMarketingSubscription​

No description

type EmailMarketingSubscription {
externalUrl: String
id: String!
listId: String!
listName: String!
subscribedAt: DateTime
}

EmailMarketingSubscriptionConnection​

The connection type for EmailMarketingSubscription.

type EmailMarketingSubscriptionConnection {
edges: [EmailMarketingSubscriptionEdge]
nodes: [EmailMarketingSubscription]
pageInfo: PageInfo!
}

EmailMarketingSubscriptionCreatePayload​

Autogenerated return type of EmailMarketingSubscriptionCreate

type EmailMarketingSubscriptionCreatePayload {
clientMutationId: String
errors: [UserError!]!
}

EmailMarketingSubscriptionDeletePayload​

Autogenerated return type of EmailMarketingSubscriptionDelete

type EmailMarketingSubscriptionDeletePayload {
clientMutationId: String
errors: [UserError!]!
}

EmailMarketingSubscriptionEdge​

An edge in a connection.

type EmailMarketingSubscriptionEdge {
cursor: String!
node: EmailMarketingSubscription
}

EmailMessage​

A message created in Groove as a result of an incoming email.

Both contacts and agents can author these type of messages. For example, if an agent replies directly to a contact (possibly using a Groove notification email), then Groove will register the agent's email response as a MessageFromEmailChange.

type EmailMessage implements Node, Message, Emailable {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
bcc(
after: String
before: String
first: Int
last: Int
): RecipientConnection
body: String
bodyPlainText: String
cannedReply: CannedReply
cc(
after: String
before: String
first: Int
last: Int
): RecipientConnection
channel: Channel!
createdAt: DateTime!
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
parts(
after: String
before: String
first: Int
last: Int
): EmailPartConnection!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
to(
after: String
before: String
first: Int
last: Int
): RecipientConnection!
updatedAt: DateTime!
}

EmailPart​

No description

type EmailPart {
content: String!
type: BodyPartTypeEnum!
}

EmailPartConnection​

The connection type for EmailPart.

type EmailPartConnection {
edges: [EmailPartEdge]
nodes: [EmailPart]
pageInfo: PageInfo!
}

EmailPartEdge​

An edge in a connection.

type EmailPartEdge {
cursor: String!
node: EmailPart
}

EmailTemplate​

Represents an email template used for automated or manual email communication.

type EmailTemplate implements Timestamped {
body: String!
createdAt: DateTime!
state: EmailTemplateState!
subject: String!
trigger: EmailTemplateTrigger
updatedAt: DateTime!
}

EphemeralJobResult​

No description

type EphemeralJobResult implements BaseInterface {
state: EphemeralJobResultState
value: JSON
}

Event​

No description

type Event implements Previewable {
actor: Actor
change: ChangeTypeUnion
createdAt: DateTime!
id: ID!
preview: [Int!]
}

EventConnection​

The connection type for Event.

type EventConnection {
edges: [EventEdge]
nodes: [Event]
pageInfo: PageInfo!
}

EventEdge​

An edge in a connection.

type EventEdge {
cursor: String!
node: Event
}

EventGroupType​

A group of events associated with a conversation.

query EventGroups {
eventGroups(filter: "cnv_12345678") {
edges {
node {
id
collapsed
fromMerge
isNote
isForward
isCollaborator
hasAttachments
conversationId
actor {
__typename
... on Contact {
name
}
... on Agent {
name
email
}
}
summary {
body
}
events {
nodes {
id
change {
__typename
... on Message {
body
}

}
}
}
}
}
}
}
type EventGroupType {
actor: Actor
changesetId: String!
collapsed: Boolean!
conversationId: String!
events(
after: String
before: String
first: Int
last: Int
): EventConnection!
fromMerge: Boolean!
hasAttachments: Boolean!
hasRawEmail: Boolean!
id: ID!
isCollaborator: Boolean!
isForward: Boolean!
isNote: Boolean!
lastEventId: String
parsingCompleted: Boolean!
rawEmailId: String
summary: SummaryMessage
}

EventGroupTypeConnection​

The connection type for EventGroupType.

type EventGroupTypeConnection {
edges: [EventGroupTypeEdge]
nodes: [EventGroupType]
pageInfo: PageInfo!
}

EventGroupTypeEdge​

An edge in a connection.

type EventGroupTypeEdge {
cursor: String!
node: EventGroupType
}

EventsShopifyCreatePayload​

Autogenerated return type of EventsShopifyCreate

type EventsShopifyCreatePayload {
clientMutationId: String
errors: [UserError!]!
event: Event
}

ExcludedDomain​

A domain that is excluded from being automatically created as a company.

To fetch all excluded domains:

query ExcludedDomains {
excludedDomains {
nodes {
id
domain
}
}
}
type ExcludedDomain {
domain: String!
id: ID!
}

ExcludedDomainConnection​

The connection type for ExcludedDomain.

type ExcludedDomainConnection {
edges: [ExcludedDomainEdge]
nodes: [ExcludedDomain]
pageInfo: PageInfo!
}

ExcludedDomainCreatePayload​

Autogenerated return type of ExcludedDomainCreate

type ExcludedDomainCreatePayload {
clientMutationId: String
errors: [UserError!]!
excludedDomain: ExcludedDomain
}

ExcludedDomainDeletePayload​

Autogenerated return type of ExcludedDomainDelete

type ExcludedDomainDeletePayload {
clientMutationId: String
deletedExcludedDomainId: ID
errors: [UserError!]!
}

ExcludedDomainEdge​

An edge in a connection.

type ExcludedDomainEdge {
cursor: String!
node: ExcludedDomain
}

ExcludedDomainUpdatePayload​

Autogenerated return type of ExcludedDomainUpdate

type ExcludedDomainUpdatePayload {
clientMutationId: String
errors: [UserError!]!
excludedDomain: ExcludedDomain
}

Export​

query Exports($filter: ExportFilter, $orderBy: ExportOrder) {
exports(filter: $filter, orderBy: $orderBy) {
nodes {
id
name
state
createdAt
updatedAt
queuedAt
startedAt
exportedAt
completedAt
failedAt
cancelledAt
dateRangeStart
dateRangeEnd
requestedBy {
id
}
}
}
}
type Export {
cancelledAt: DateTime
completedAt: DateTime
createdAt: DateTime!
dateRangeEnd: DateTime
dateRangeStart: DateTime
exportedAt: DateTime
failedAt: DateTime
id: ID!
name: String
queuedAt: DateTime
requestedBy: Agent!
startedAt: DateTime
state: ExportState!
updatedAt: DateTime!
}

ExportConnection​

The connection type for Export.

type ExportConnection {
edges: [ExportEdge]
nodes: [Export]
pageInfo: PageInfo!
}

ExportEdge​

An edge in a connection.

type ExportEdge {
cursor: String!
node: Export
}

FacebookConversation​

A Groove conversation initiated from Facebook.

To fetch a specific Facebook conversation by ID:

query Conversation {
node(id: "cnv_12345678") {

... on FacebookConversation {
facebookId
}

}
})

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
})
type FacebookConversation implements Node, Conversation {
assigned: Assignment
channel: Channel!
contact: Contact
counts: ConversationCounts!
createdAt: DateTime!
customFieldValues(
after: String
before: String
first: Int
last: Int
filter: CustomFieldValuesFilter
): CustomFieldValueConnection
deletedAt: DateTime
drafts(
after: String
before: String
first: Int
last: Int
): DraftConnection
facebookId: String
followers(
after: String
before: String
first: Int
last: Int
filter: AgentFilter
orderBy: AgentOrder
): AgentConnection
id: ID!
lastUnansweredUserMessageAt: DateTime!
mentions: [Mention!]!
number: Int!
searchSummary: SearchSummary
snoozed: Snooze
starred: Boolean!
state: ConversationState!
stateUpdatedAt: DateTime
subject: String
summaryMessage: SummaryMessage
systemUpdatedAt: DateTime!
tags(
after: String
before: String
first: Int
last: Int
filter: TagFilter
orderBy: TagOrder
): TagConnection
updatedAt: DateTime!
}

A Groove conversation is a thread of messages (for example emails, chats, or notes) and associated actions or events (for example 'opened', 'snoozed', and 'assigned').

To fetch Messages/Ratings/StateChanges/etc. on a conversation, query the Events connection (on the QueryRoot) with the conversation ID.

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
}

To search conversations matching a specific keyword:

query Conversations {
conversations(filter: { keywords: "rad" }) {
edges {
node {
... on Conversation {
id
number
searchSummary {
author {
__typename
... on Agent {
email
role
}
... on Contact {
email
}
}
body
forwarded
note
}
}
}
}
}
}

FacebookDraft​

No description

type FacebookDraft implements Draft {
agent: Agent!
assignment: Assignment
body: String!
contextId: ID
conversation: Conversation!
conversationId: ID!
createdAt: DateTime!
draftId: String
draftType: DraftType
id: ID!
lastSyncedAt: DateTime!
metadata: JSON!
payload: JSON
updatedAt: DateTime!
version: Int!
}

FacebookMessage​

A message sent to or received from Facebook.

type FacebookMessage implements Node, Message {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
body: String
bodyPlainText: String
cannedReply: CannedReply
channel: Channel!
createdAt: DateTime!
editedAt: DateTime
facebookId: String
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
updatedAt: DateTime!
}

FeatureTemplateRule​

An automation rule feature template

type FeatureTemplateRule {
categories: [String!]!
description: String!
id: ID!
name: String!
personas: [String!]
planFeatures: [String!]!
popular: Boolean!
template: FeatureTemplateRuleData!
type: String!
}

FeatureTemplateRuleData​

The configuration for a rule template

type FeatureTemplateRuleData {
actions: [FeatureTemplateRuleDataAction!]!
conditions: [FeatureTemplateRuleDataCondition!]!
matchType: RuleMatchTypes!
name: String!
scheduleSettings: FeatureTemplateRuleScheduleSettings
scheduleType: ScheduleType
state: RuleState!
stopUpcoming: Boolean!
triggers: [FeatureTemplateRuleDataTrigger!]!
}

FeatureTemplateRuleDataAction​

Rule template action

type FeatureTemplateRuleDataAction {
toAgent: String
type: RuleActionType!
value: String
}

FeatureTemplateRuleDataCondition​

A rule template condition

type FeatureTemplateRuleDataCondition {
operator: RuleConditionOperator!
param: RuleConditionParam!
value: String
}

FeatureTemplateRuleDataTrigger​

A rule template configuration trigger

type FeatureTemplateRuleDataTrigger {
type: RuleTriggerType!
}

FeatureTemplateRuleScheduleSettings​

The schedule settings configuration for a rule.

type FeatureTemplateRuleScheduleSettings {
day: Int
dayOfWeek: String
days: Int
seconds: Int
time: String
}

FeatureTemplates​

Features Templates

type FeatureTemplates {
rules: [FeatureTemplateRule!]
}

File​

A file attached to a contact or company.

type File {
contentDisposition: CustomFieldFileContentDisposition!
contentType: String!
fileName: String!
fileSize: Int!
url: String!
}

Folder​

A folder contains a set of conditions that allow for smart filtering of conversations.

For example, to show only your active conversations, you can create a folder called "Mine" which contains these two conditions:

  1. "Assigned agent" is "Current User".
  2. "Status" is "Opened".

By default, folders apply to, and are visible across, all of your channels. However, you can configure them to be only visible to selected channels, agents, or teams.

To fetch all folders and their conditions:

query Folders {
folders {
nodes {
agents {
nodes {
id
email
}
pageInfo {
hasNextPage
}
}
conditions(
orderBy: { field: CREATED_AT, direction: DESC }
) {
nodes {
id
param
operator
value
}
pageInfo {
hasNextPage
}
}
conversationCount
createdAt
default
description
displayCountWhenInactive
hideIfZeroConversations
id
locked
matchType
name
position
state
teams {
nodes {
id
name
}
pageInfo {
hasNextPage
}
}
updatedAt
}
}
}

To find associated conversations in a folder, use the QueryRoot conversations with a filter argument:

conversations(filter: { folderId: "fol_1234567" }) { ...

By default folders are sorted by their user-defined row order. To sort by name instead:

query Folders {
folders( orderBy: { field: NAME, direction: ASC } ) {
nodes {
id
}
}
}

To find conversations in a folder for a specific channel:

query Folders {
folders {
nodes {
id
conversations ( channel: "ch_12345678" ) {
nodes {
... on Conversation {
id
number
}
}
pageInfo {
hasNextPage
}
}
}
}
}
type Folder implements Node, Timestamped {
agents(
after: String
before: String
first: Int
last: Int
filter: AgentFilter
orderBy: AgentOrder
): AgentConnection
channel: Channel!
channelRestriction: ChannelRestrictionType!
channels(
after: String
before: String
first: Int
last: Int
filter: ChannelFilter
orderBy: ChannelOrder
): ChannelConnection!
conditions(
after: String
before: String
first: Int
last: Int
id: ID
orderBy: ConditionOrder
): ConditionConnection
conversationCount: Int!
createdAt: DateTime!
default: Boolean!
description: String
displayCountWhenInactive: Boolean!
hideIfZeroConversations: Boolean!
id: ID!
locked: Boolean!
matchType: FolderMatchTypes!
name: String!
position: Int!
restriction: Restriction!
state: FolderState!
teams(
after: String
before: String
first: Int
last: Int
orderBy: TeamOrder
): TeamConnection
type: FolderType!
updatedAt: DateTime!
}

FolderConnection​

The connection type for Folder.

type FolderConnection {
edges: [FolderEdge]
nodes: [Folder]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

FolderCreatePayload​

Autogenerated return type of FolderCreate

type FolderCreatePayload {
clientMutationId: String
errors: [UserError!]!
folder: Folder
}

FolderDeletePayload​

Autogenerated return type of FolderDelete

type FolderDeletePayload {
clientMutationId: String
deletedFolderId: ID
errors: [UserError!]!
}

FolderEdge​

An edge in a connection.

type FolderEdge {
cursor: String!
node: Folder
}

FolderUpdatePayload​

Autogenerated return type of FolderUpdate

type FolderUpdatePayload {
clientMutationId: String
errors: [UserError!]!
folder: Folder
}

FollowerAdded​

A conversation is followed by an agent.

type FollowerAdded implements Timestamped {
createdAt: DateTime!
follower: Agent!
id: ID!
updatedAt: DateTime!
}

FollowerRemoved​

A conversation is unfollowed by an agent.

type FollowerRemoved implements Timestamped {
createdAt: DateTime!
follower: Agent!
id: ID!
updatedAt: DateTime!
}

ForwardedMessage​

A message forwarded by an agent from Groove to a third party.

type ForwardedMessage implements Node, Message, Delayable, Emailable {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
bcc(
after: String
before: String
first: Int
last: Int
): RecipientConnection
body: String
bodyPlainText: String
cannedReply: CannedReply
cc(
after: String
before: String
first: Int
last: Int
): RecipientConnection
channel: Channel!
createdAt: DateTime!
deliverBy: DateTime
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
to(
after: String
before: String
first: Int
last: Int
): RecipientConnection!
updatedAt: DateTime!
}

No description

type Header {
name: String!
value: String
}

ImapServer​

A server for retrieving emails using the IMAP protocol.

type ImapServer implements Server {
createdAt: DateTime!
encryption: EncryptionType
host: String!
id: ID!
port: Int!
protocol: ProtocolType!
updatedAt: DateTime!
username: String!
verified: Boolean!
}

Import​

No description

type Import {
id: ID!
payed: Boolean!
redirectUrl: String!
status: String
token: String!
}

Import2CreatePayload​

Autogenerated return type of Import2Create

type Import2CreatePayload {
clientMutationId: String
errors: [UserError!]!
redirectUrl: String!
}

ImportConnection​

The connection type for Import.

type ImportConnection {
edges: [ImportEdge]
nodes: [Import]
pageInfo: PageInfo!
}

ImportEdge​

An edge in a connection.

type ImportEdge {
cursor: String!
node: Import
}

ImportMutationPayload​

Autogenerated return type of ImportMutation

type ImportMutationPayload {
clientMutationId: String
errors: [UserError!]!
jid: String
}

IntegrationAdded​

An integration was added to a conversation.

type IntegrationAdded implements Timestamped {
conversationId: String!
createdAt: DateTime!
externalId: ID!
id: ID!
provider: IntegrationProvider!
title: String!
updatedAt: DateTime!
url: Url!
}

IntegrationAddedConnection​

The connection type for IntegrationAdded.

type IntegrationAddedConnection {
edges: [IntegrationAddedEdge]
nodes: [IntegrationAdded]
pageInfo: PageInfo!
}

IntegrationAddedEdge​

An edge in a connection.

type IntegrationAddedEdge {
cursor: String!
node: IntegrationAdded
}

IntegrationConnection​

The connection type for Integration.

type IntegrationConnection {
edges: [IntegrationEdge]
nodes: [Integration]
pageInfo: PageInfo!
}

IntegrationDeleteByProviderPayload​

Autogenerated return type of IntegrationDeleteByProvider

type IntegrationDeleteByProviderPayload {
clientMutationId: String
deletedIntegrationIds: [ID!]
errors: [UserError!]!
}

IntegrationDeletePayload​

Autogenerated return type of IntegrationDelete

type IntegrationDeletePayload {
clientMutationId: String
deletedIntegrationId: ID
errors: [UserError!]!
}

IntegrationEdge​

An edge in a connection.

type IntegrationEdge {
cursor: String!
node: Integration
}

IntegrationExternalChange​

A change to a conversation was triggered by a linked integration.

type IntegrationExternalChange implements Timestamped {
action: JSON!
createdAt: DateTime!
externalId: ID!
id: ID!
provider: IntegrationProvider!
updatedAt: DateTime!
}

IntegrationJiraServerCreatePayload​

Autogenerated return type of IntegrationJiraServerCreate

type IntegrationJiraServerCreatePayload {
clientMutationId: String
errors: [UserError!]!
integration: JiraServerIntegration
}

IntegrationProviderSettingsUpdatePayload​

Autogenerated return type of IntegrationProviderSettingsUpdate

type IntegrationProviderSettingsUpdatePayload {
clientMutationId: String
errors: [UserError!]!
integrations(
after: String
before: String
first: Int
last: Int
): IntegrationConnection!
settings: IntegrationSettings
}

IntegrationRemoved​

An integration was removed from a conversation.

type IntegrationRemoved implements Timestamped {
conversation: Conversation!
createdAt: DateTime!
externalId: ID!
id: ID!
provider: IntegrationProvider!
title: String!
updatedAt: DateTime!
url: Url!
}

IntegrationSettings​

No description

type IntegrationSettings {
provider: IntegrationProvider!
settings: JSON!
}

IntegrationSettingsUpdatePayload​

Autogenerated return type of IntegrationSettingsUpdate

type IntegrationSettingsUpdatePayload {
clientMutationId: String
errors: [UserError!]!
integration: IntegrationUnion!
}

IntegrationUnionConnection​

The connection type for IntegrationUnion.

type IntegrationUnionConnection {
edges: [IntegrationUnionEdge]
nodes: [IntegrationUnion]
pageInfo: PageInfo!
}

IntegrationUnionEdge​

An edge in a connection.

type IntegrationUnionEdge {
cursor: String!
node: IntegrationUnion
}

IpAddress​

An IP address.

type IpAddress {
accuracy: Float
address: String!
city: String
country: String
domain: String
isp: String
latitude: Float
longitude: Float
organization: String
postalCode: String
subdivisions: String
timeZone: String
}

JiraServerIntegration​

No description

type JiraServerIntegration implements Integration {
agent: Agent!
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
uid: String
updatedAt: DateTime!
url: String!
username: String!
}

KbArticleDeletePayload​

Autogenerated return type of KbArticleDelete

type KbArticleDeletePayload {
clientMutationId: String
deletedArticleId: ID
errors: [UserError!]!
}

KbCategory​

A category from a Knowledge Base. Each category can contain multiple articles.

To fetch multiple Knowledge Bases with related categories:

query KbsWithCategories {
knowledgeBases {
nodes {
id
categories {
nodes {
articles {
nodes {
id
}
}
createdAt
coverImageUrl
id
updatedAt

... on Publishable {
author {
id
email
}
description
featured
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
position
publishedAt
slug
state
title
updater {
id
email
}
}

}
}
}
}
}
type KbCategory implements Node, Publishable, Timestamped {
articles(
after: String
before: String
first: Int
last: Int
): ArticleConnection!
author: Agent
coverImageUrl: Url
createdAt: DateTime!
currentSlug: String
description: String
featured: Boolean!
id: ID!
knowledgeBase: KnowledgeBase!
meta: Meta
openGraph: OpenGraph
pageTitle: String
position: Int!
previousSlugs: [String!]!
publishedAt: DateTime
slug: String
state: PublishState!
title: String
updatedAt: DateTime!
updater: Agent
}

An object that can be published, for example Knowledge Base categories or articles.

For example:


... on Publishable {
author {
id
email
}
description
featured
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
position
publishedAt
slug
state
title
updater {
id
email
}
}

KbCategoryConnection​

The connection type for KbCategory.

type KbCategoryConnection {
edges: [KbCategoryEdge]
nodes: [KbCategory]
pageInfo: PageInfo!
}

KbCategoryEdge​

An edge in a connection.

type KbCategoryEdge {
cursor: String!
node: KbCategory
}

KbSlugAvailabilityPayload​

Autogenerated return type of KbSlugAvailability

type KbSlugAvailabilityPayload {
available: Boolean!
clientMutationId: String
errors: [UserError!]!
}

KbSubdomainAvailabilityPayload​

Autogenerated return type of KbSubdomainAvailability

type KbSubdomainAvailabilityPayload {
available: Boolean!
clientMutationId: String
errors: [UserError!]!
suggestion: String
}

KnowledgeBase​

A Groove Knowledge Base, containing categories and articles.

To fetch all Knowledge Bases on the account:

query Kbs {
knowledgeBases {
nodes {
createdAt
customDomain {
domain
expiresAt
letsencrypt
status
valid
}
customScriptsEnabled
enabled
gaAnonymized
gaCode
id
ipAddresses
ipAddressesEnabled
language
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
password
passwordEnabled
primary
ratingsType
redirectLegacy
siteUrl
subdomain
subdomainUrl
title
updatedAt
newWidgetId
}
}

To fetch related articles:

query KbsWithArticles {
knowledgeBases {
nodes {
id
articles {
totalCount
totalPageCount
edges {
node {
attachments {
nodes {
id
}
}
body
category {
id
}
createdAt
deletedAt
id
ratings {
nodes {
id
}
}
ratingsType
relatedArticles{
nodes {
id
}
}
tags
updatedAt

... on Publishable {
author {
id
email
}
description
featured
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
position
publishedAt
slug
state
title
updater {
id
email
}
}

}
}
}
}
}
}

To fetch related Knowledge Base categories:

query KbsWithCategories {
knowledgeBases {
nodes {
id
categories {
nodes {
articles {
nodes {
id
}
}
createdAt
coverImageUrl
id
updatedAt

... on Publishable {
author {
id
email
}
description
featured
meta {
description
robots
}
openGraph {
description
imageUrl
title
}
pageTitle
position
publishedAt
slug
state
title
updater {
id
email
}
}

}
}
}
}
}
type KnowledgeBase implements Node, Timestamped {
articles(
after: String
before: String
first: Int
last: Int
): ArticleConnection!
canMigrate: Boolean!
categories(
after: String
before: String
first: Int
last: Int
): KbCategoryConnection!
createdAt: DateTime!
customDomain: CustomDomain!
customScriptsEnabled: Boolean
enabled: Boolean!
gaAnonymized: Boolean
gaCode: String
gaVersion: Int
id: ID!
instantDocsKbId: String
instantDocsMigrationToken: String
instantDocsUrl: String
ipAddresses: [String!]
ipAddressesEnabled: Boolean!
isReadOnly: Boolean!
language: String
meta: Meta
migrationCutoffEnforced: Boolean!
migrationInitiatedAt: ISO8601DateTime
migrationStatus: String!
newWidgetId: ID
openGraph: OpenGraph
pageTitle: String
password: String
passwordEnabled: Boolean!
primary: Boolean!
publishedTheme: Theme!
ratingsType: KbRating!
redirectLegacy: Boolean!
siteUrl: Url!
subdomain: String!
subdomainUrl: Url!
theme: Theme!
title: String
updatedAt: DateTime!
}

KnowledgeBaseConnection​

The connection type for KnowledgeBase.

type KnowledgeBaseConnection {
edges: [KnowledgeBaseEdge]
nodes: [KnowledgeBase]
pageInfo: PageInfo!
}

KnowledgeBaseEdge​

An edge in a connection.

type KnowledgeBaseEdge {
cursor: String!
node: KnowledgeBase
}

A text link.

type Link {
link: String!
text: String
}

LoginPayload​

Autogenerated return type of Login

type LoginPayload {
authState: AuthState!
clientMutationId: String
credentials: Credentials
errors: [UserError!]!
otpChallenge: Boolean
otpIdentifier: String
user: Agent
}

Mention​

A Groove conversation initiated from a Groove Widget.

To fetch mentions for conversation by ID:

query Conversation {
node(id: "cnv_12345678") {
mentions {
id
agent {
id
}
}
}
})
type Mention {
agent: Agent
id: ID!
}

MessageMoved​

A message was moved from one conversation to start another.

type MessageMoved {
destination: Conversation
id: ID!
message: Message!
}

Meta​

The metadata fields for a Knowledge Base.

type Meta {
description: String
robots: String!
}

MobileNotificationPreferencesUpsertPayload​

Autogenerated return type of MobileNotificationPreferencesUpsert

type MobileNotificationPreferencesUpsertPayload {
agentPreferences(
after: String
before: String
first: Int
last: Int
): AgentPreferenceConnection!
clientMutationId: String
errors: [UserError!]!
}

Money​

A amount with the linked defined currency.

type Money {
amount: Float!
currencyCode: String
}

NewWidget​

No description

type NewWidget {
channelColor: String!
channelType: WidgetChannelType!
createdAt: DateTime!
hasAccess: Boolean
id: ID!
kind: WidgetKind
name: String!
status: WidgetStatus
updatedAt: DateTime!
}

NewWidgetConnection​

The connection type for NewWidget.

type NewWidgetConnection {
edges: [NewWidgetEdge]
nodes: [NewWidget]
pageInfo: PageInfo!
}

NewWidgetEdge​

An edge in a connection.

type NewWidgetEdge {
cursor: String!
node: NewWidget
}

Note​

A message created by an agent in Groove, visible only to other agents.

type Note implements Node, Message {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
body: String
bodyPlainText: String
cannedReply: CannedReply
channel: Channel!
createdAt: DateTime!
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
updatedAt: DateTime!
}

NoteDraft​

No description

type NoteDraft implements Draft {
agent: Agent!
assignment: Assignment
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection!
body: String!
contextId: ID
conversation: Conversation!
conversationId: ID!
createdAt: DateTime!
draftId: String
draftType: DraftType
id: ID!
lastSyncedAt: DateTime!
metadata: JSON!
payload: JSON
updatedAt: DateTime!
version: Int!
}

OauthCredentials​

No description

type OauthCredentials implements Node, Timestamped {
accessToken: String!
createdAt: DateTime!
expiresAt: DateTime
id: ID!
provider: String!
refreshToken: String
uid: String!
updatedAt: DateTime!
}

OauthCredentialsConnection​

The connection type for OauthCredentials.

type OauthCredentialsConnection {
edges: [OauthCredentialsEdge]
nodes: [OauthCredentials]
pageInfo: PageInfo!
}

OauthCredentialsEdge​

An edge in a connection.

type OauthCredentialsEdge {
cursor: String!
node: OauthCredentials
}

OpenGraph​

The Open Graph fields for a Knowledge Base.

type OpenGraph {
description: String
imageUrl: Url
title: String
}

PageInfo​

Information about pagination in a connection.

type PageInfo {
endCursor: String
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
}

PageView​

An instance of a page being loaded in browser by a visitor.

type PageView {
id: String
ipAddress: IpAddress
language: String
occurredAt: String
referrer: ReferrerUrl
timeOnPage: Float
title: String
url: UrlStruct!
userAgent: UserAgent
}

PinnedSearch​

A pinned search is a search query that has been stored by the user for easy reuse.

To fetch all pinned searches:

query PinnedSearches {
pinnedSearches {
nodes {
id
position
createdAt
queryId
conversationCount
}
}
}
type PinnedSearch implements Node, Timestamped {
agent: Agent!
conversationCount: Int!
createdAt: DateTime!
id: ID!
position: Int!
queryId: String
title: String!
updatedAt: DateTime!
}

PinnedSearchConnection​

The connection type for PinnedSearch.

type PinnedSearchConnection {
edges: [PinnedSearchEdge]
nodes: [PinnedSearch]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

PinnedSearchEdge​

An edge in a connection.

type PinnedSearchEdge {
cursor: String!
node: PinnedSearch
}

Plan​

Represents all the plans currently added to the groove account

Fetch all plans for the current account:

query PlansQuery {
billing {
plans {
id
createdAt
expiresAt
externalId
quantity
state
updatedAt
pricing {
id
annual
externalAnnualPriceId
externalMonthlyPriceId
minimumQuantity
monthly
name
pricingModel
trialAvailable
type
usageFrom
version
addonPricingIds
features {
name
value
}
}
}
}
}
type Plan {
createdAt: DateTime!
expiresAt: DateTime
externalId: String!
id: ID!
pricing: Pricing!
quantity: Int
state: PlanState!
updatedAt: DateTime
}

Platform​

No description

type Platform {
family: String
version: String
}

Pricing​

Represents pricing that can be added to a groove subscription to enable features or usage on the account

Fetch all possible fields for the current account:

query PricingQuery {
billing {
pricings {
id
annual
externalAnnualPriceId
externalMonthlyPriceId
minimumQuantity
monthly
name
pricingModel
trialAvailable
type
usageFrom
version
addonPricingIds
features {
name
value
}
}
}
}

Fetch all possible fields for and all plans:

query PricingQuery {
billing {
pricings(showAll: true) {
id
annual
externalAnnualPriceId
externalMonthlyPriceId
minimumQuantity
monthly
name
pricingModel
trialAvailable
type
usageFrom
version
addonPricingIds
features {
name
value
}
}
}
}
type Pricing {
active: Boolean!
addonPricingIds: [String!]!
annual: Int!
externalAnnualPriceId: String!
externalMonthlyPriceId: String!
features: [BillingFeatureType!]!
id: String!
minimumQuantity: Int!
monthly: Int!
name: String!
pricingModel: PricingModel!
trialAvailable: Boolean!
type: PricingType!
usageFrom: PricingUsageFrom!
version: String!
}

PushToken​

No description

type PushToken implements Timestamped {
createdAt: DateTime!
id: ID!
notificationCount: Int!
token: String!
updatedAt: DateTime!
}

PushTokenClearNotificationCountPayload​

Autogenerated return type of PushTokenClearNotificationCount

type PushTokenClearNotificationCountPayload {
clientMutationId: String
errors: [UserError!]!
pushToken: PushToken!
}

PushTokenConnection​

The connection type for PushToken.

type PushTokenConnection {
edges: [PushTokenEdge]
nodes: [PushToken]
pageInfo: PageInfo!
}

PushTokenCreatePayload​

Autogenerated return type of PushTokenCreate

type PushTokenCreatePayload {
clientMutationId: String
errors: [UserError!]!
pushToken: PushToken
}

PushTokenDeletePayload​

Autogenerated return type of PushTokenDelete

type PushTokenDeletePayload {
clientMutationId: String
deletedPushTokenId: ID
errors: [UserError!]!
}

PushTokenEdge​

An edge in a connection.

type PushTokenEdge {
cursor: String!
node: PushToken
}

Rating​

A rating is feedback on a conversation message from a contact for an agent.

type Rating implements Node, Timestamped {
agent: Agent
createdAt: DateTime!
feedback: String
grade: RatingEnum
id: ID!
message: Message!
updatedAt: DateTime!
}

RawEmail​

No description

type RawEmail implements Node, Timestamped {
body: String
bodyPlainText: String
createdAt: DateTime!
headers: [Header!]
id: ID!
updatedAt: DateTime!
}

RechargeIntegration​

No description

type RechargeIntegration implements Integration {
createdAt: DateTime!
fullStoreDomain: String!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
storeDomain: String!
storeName: String!
uid: String
updatedAt: DateTime!
}

RecipientConnection​

The connection type for Recipient.

type RecipientConnection {
edges: [RecipientEdge]
nodes: [Recipient]
pageInfo: PageInfo!
}

RecipientEdge​

An edge in a connection.

type RecipientEdge {
cursor: String!
node: Recipient
}

ReferrerUrl​

The address of the webpage from which the visitor came to your page.

type ReferrerUrl {
domain: String
hash: String
medium: String
path: String
protocol: String
query: String
raw: String!
searchTerm: String
source: String
}

Reply​

An email message from an agent to a contact.

type Reply implements Node, Message, Delayable, Emailable {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
bcc(
after: String
before: String
first: Int
last: Int
): RecipientConnection
body: String
bodyPlainText: String
cannedReply: CannedReply
cc(
after: String
before: String
first: Int
last: Int
): RecipientConnection
channel: Channel!
createdAt: DateTime!
deliverBy: DateTime
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
to(
after: String
before: String
first: Int
last: Int
): RecipientConnection!
updatedAt: DateTime!
}

ReplyConnection​

The connection type for Reply.

type ReplyConnection {
edges: [ReplyEdge]
nodes: [Reply]
pageInfo: PageInfo!
}

ReplyDraft​

No description

type ReplyDraft implements Draft {
agent: Agent!
assignment: Assignment
attachments: JSON
bcc: JSON
body: String!
cc: JSON
contextId: ID
conversation: Conversation!
conversationId: ID!
createdAt: DateTime!
draftId: String
draftType: DraftType
id: ID!
lastSyncedAt: DateTime!
metadata: JSON!
payload: JSON
subject: String
to: JSON
updatedAt: DateTime!
version: Int!
}

ReplyEdge​

An edge in a connection.

type ReplyEdge {
cursor: String!
node: Reply
}

Restriction​

The agents and/or teams that are assigned to the conversation.

type Restriction {
agents: [Agent!]
teams: [Team!]
type: RestrictionType!
}

Room​

A Room represents a chat room

type Room {
agentId: ID
assigneeType: String
channelId: ID
contact: RoomContactType
id: ID!
isRead: Boolean
isStarred: Boolean
name: String
number: Int
roomType: RoomKindType!
snoozedUntilTimestamp: BigInt
state: RoomStateType
tags: [ID!]
teamId: ID
topic: String
updatedTimestamp: BigInt!
}

RoomAccess​

No description

type RoomAccess {
hasAccess: Boolean!
id: ID!
number: Int
}

RoomConnection​

The connection type for Room.

type RoomConnection {
edges: [RoomEdge]
nodes: [Room]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

RoomContactType​

Basic contact information for this room

type RoomContactType {
id: ID!
name: String
}

RoomEdge​

An edge in a connection.

type RoomEdge {
cursor: String!
node: Room
}

RoomsCount​

The chat room count for the given state.

type RoomsCount {
conversationCount: Int
id: ID!
unreadCount: Int
}

RoomsCountsResult​

The chat room counts with the date and time that the chat room was last updated.

type RoomsCountsResult {
data: [RoomsCount!]!
lastUpdatedAt: BigInt!
}

Rule​

  1. A set of actions that will be performed on matching conversations.

To fetch all rules and their conditions:

query Rules {
rules {
nodes {
createdAt
creator {
id
}
description
id
name
position
state
updatedAt
}
}
}

By default rules are sorted by their user-defined row order. To sort by name instead:

query Rules {
rules ( orderBy: { field: NAME, direction: ASC } ) {
nodes {
id
}
}
}
type Rule implements Node, Timestamped {
actions(
after: String
before: String
first: Int
last: Int
): RuleActionConnection
conditions(
after: String
before: String
first: Int
last: Int
id: ID
orderBy: ConditionOrder
): RuleConditionConnection
createdAt: DateTime!
creator: Agent
description: String
id: ID!
lastRunAt: DateTime
matchType: RuleMatchTypes!
name: String!
position: Int!
scheduleSettings: FeatureTemplateRuleScheduleSettings
scheduleType: ScheduleType
state: RuleState!
stopUpcoming: Boolean!
totalExecutions: Int!
triggers(
after: String
before: String
first: Int
last: Int
): RuleTriggerConnection
updatedAt: DateTime!
}

RuleAction​

An action to be performed by an automation rule.

type RuleAction implements Timestamped {
createdAt: DateTime!
id: ID!
replyTemplate: RuleReplyTemplate
toAgent: String
type: RuleActionType!
updatedAt: DateTime!
value: String
}

RuleActionConnection​

The connection type for RuleAction.

type RuleActionConnection {
edges: [RuleActionEdge]
nodes: [RuleAction]
pageInfo: PageInfo!
}

RuleActionEdge​

An edge in a connection.

type RuleActionEdge {
cursor: String!
node: RuleAction
}

RuleCondition​

A rule template condition

type RuleCondition {
id: ID!
operator: RuleConditionOperator!
param: RuleConditionParam!
source: RuleConditionSourceUnion
value: String
}

RuleConditionConnection​

The connection type for RuleCondition.

type RuleConditionConnection {
edges: [RuleConditionEdge]
nodes: [RuleCondition]
pageInfo: PageInfo!
}

RuleConditionEdge​

An edge in a connection.

type RuleConditionEdge {
cursor: String!
node: RuleCondition
}

RuleConnection​

The connection type for Rule.

type RuleConnection {
edges: [RuleEdge]
nodes: [Rule]
pageInfo: PageInfo!
}

RuleCreatePayload​

Autogenerated return type of RuleCreate

type RuleCreatePayload {
clientMutationId: String
errors: [UserError!]!
rule: Rule
}

RuleDeletePayload​

Autogenerated return type of RuleDelete

type RuleDeletePayload {
clientMutationId: String
deletedRuleId: ID
errors: [UserError!]!
}

RuleEdge​

An edge in a connection.

type RuleEdge {
cursor: String!
node: Rule
}

RuleReplyTemplate​

Represents an email message template used by rules.

type RuleReplyTemplate implements Timestamped {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection!
body: String!
createdAt: DateTime!
id: ID!
subject: String
updatedAt: DateTime!
}

RuleTrigger​

A trigger for an automation rule.

type RuleTrigger implements Timestamped {
createdAt: DateTime!
id: ID!
settings: JSON
type: RuleTriggerType!
updatedAt: DateTime!
}

RuleTriggerConnection​

The connection type for RuleTrigger.

type RuleTriggerConnection {
edges: [RuleTriggerEdge]
nodes: [RuleTrigger]
pageInfo: PageInfo!
}

RuleTriggerEdge​

An edge in a connection.

type RuleTriggerEdge {
cursor: String!
node: RuleTrigger
}

RuleUpdatePayload​

Autogenerated return type of RuleUpdate

type RuleUpdatePayload {
clientMutationId: String
errors: [UserError!]!
rule: Rule
}

SalesforceIntegration​

No description

type SalesforceIntegration implements Integration {
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
salesforceDomain: String!
settings: IntegrationSettings!
uid: String
updatedAt: DateTime!
}

SearchSummary​

A search summary shows the details about matching messages on a conversation search.

type SearchSummary {
author: Author
body: String!
forwarded: Boolean!
note: Boolean!
}

Session​

A contact visit session as recorded by the Widget.

type Session {
firstPageView: PageView
id: String
lastPageView: PageView
penultimatePageView: PageView
totalPageViews: Int
totalTimeOnPage: Float
}

ShopifyExternalChange​

A change that happened on Shopify.

type ShopifyExternalChange {
changeType: ShopifyChangeType!
externalId: String!
link: String!
meta: JSON
}

ShopifyIntegration​

No description

type ShopifyIntegration implements Integration {
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
storeDomain: String!
storeName: String
uid: String
updatedAt: DateTime!
}

ShopifyV2Integration​

No description

type ShopifyV2Integration implements Integration {
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
storeDomain: String!
storeName: String!
uid: String
updatedAt: DateTime!
}

SmtpError​

An error that occurred during the last attempts to send an email.

type SmtpError {
createdAt: DateTime!
message: String!
}

SmtpServer​

A server for sending emails using the SMTP protocol.

type SmtpServer implements Server {
authentication: String
createdAt: DateTime!
encryption: EncryptionType
errors: [SmtpError!]!
host: String!
id: ID!
port: Int!
protocol: ProtocolType!
updatedAt: DateTime!
username: String!
verified: Boolean!
}

Snooze​

A snooze represents the agent that snoozed the conversation and when it is snoozed until.

type Snooze {
by: Agent
until: DateTime
}

Snoozed​

A conversation was snoozed.

type Snoozed implements Timestamped {
by: Agent
createdAt: DateTime!
id: ID!
until: DateTime
updatedAt: DateTime!
}

StarredCannedReply​

A canned reply is a prewritten answer to commonly asked customer questions.

To fetch all canned replies:

query CannedReplies {
cannedReplies {
nodes {
body
category {
id
}
createdAt
creator {
id
}
id
name
snippet
subject
updatedAt
lastUsedAt
countUsed
attachments {
id
}
}
}
}

To fetch all canned replies with a given search string:

query CannedReplies {
cannedReplies( filter: { keywords: "foo" } ) {
nodes {
id
name
}
}
}

To fetch all canned replies with a given search string in a particular category:

query CannedReplies {
cannedReplies( filter: { keywords: "foo", category_ids: [ "crc_123456" ] } ) {
nodes {
id
name
}
}
}
type StarredCannedReply implements Node, Timestamped, Utilizationabled {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection!
automaticActions: [CannedReplyAutomaticAction!]!
body: String
category: CannedReplyCategory
countUsed: Int!
createdAt: DateTime!
creator: Agent
id: ID!
interpolatedBody(
contactId: ID!
conversationId: ID
messageId: ID
channelId: ID
): String
lastUsedAt: DateTime
mailboxIds: [String!]
name: String
snippet: String
subject: String
updatedAt: DateTime!
}

StarredCannedReplyConnection​

The connection type for StarredCannedReply.

type StarredCannedReplyConnection {
edges: [StarredCannedReplyEdge]
nodes: [StarredCannedReply]
pageInfo: PageInfo!
}

StarredCannedReplyCreatePayload​

Autogenerated return type of StarredCannedReplyCreate

type StarredCannedReplyCreatePayload {
clientMutationId: String
errors: [UserError!]!
starredCannedReply: StarredCannedReply
}

StarredCannedReplyDeletePayload​

Autogenerated return type of StarredCannedReplyDelete

type StarredCannedReplyDeletePayload {
clientMutationId: String
errors: [UserError!]!
messageTemplateId: ID
}

StarredCannedReplyEdge​

An edge in a connection.

type StarredCannedReplyEdge {
cursor: String!
node: StarredCannedReply
}

StateChanged​

The state of the conversation changed.

type StateChanged implements Timestamped {
createdAt: DateTime!
from: ConversationState
id: ID!
to: ConversationState
updatedAt: DateTime!
}

SubjectChanged​

A conversation subject was updated.

type SubjectChanged implements Timestamped {
createdAt: DateTime!
from: String
id: ID!
to: String
updatedAt: DateTime!
}

SuggestionUpsertPayload​

Autogenerated return type of SuggestionUpsert

type SuggestionUpsertPayload {
clientMutationId: String
errors: [UserError!]!
}

SummaryMessage​

An individual message with the body truncated.

Sample usage:

query Conversations {
conversations {
nodes {
id
number
summaryMessage {
id
bodyPlainText
isNote
}
}
}
}
type SummaryMessage implements Message {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
body: String
bodyPlainText: String
cannedReply: CannedReply
channel: Channel!
createdAt: DateTime!
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
truncated: Boolean
updatedAt: DateTime!
}

SupportedOperatorType​

Represents supported operators and their associated systems in various condition types.

type SupportedOperatorType {
operator: Operator!
supportedSystems: [ConditionSystem!]!
}

SyncRpcPayload​

Autogenerated return type of SyncRpc

type SyncRpcPayload {
clientMutationId: String
errors: [UserError!]!
response: JSON
}

Tag​

A label that can be added to any conversation. Tags can be used in folder definitions to create 'smart' folders, in Inbox to search for specific conversations, and in Reporting to monitor trends.

To fetch all tags in the account:

query Tags {
tags {
nodes {
color
conversationCount
createdAt
creator {
id
}
id
lastUsedAt
name
updatedAt
}
pageInfo {
hasNextPage
}
}
}

To fetch all tags applied to a specific conversation:

%(query Conversation {
node(id: $conversationId) {
... on Conversation {
id
number
tags {
nodes {
color
conversationCount
createdAt
creator {
id
}
id
lastUsedAt
name
updatedAt
}
pageInfo {
hasNextPage
}
}
}
}
}

To fetch a single tag:

query Node($tagId: ID!) {
node(id: $tagId) {
... on Tag {
id
name
}
}
}
type Tag implements Node, Timestamped {
color: String
conversationCount(
filter: ConversationCountFilter
): Int!
createdAt: DateTime!
creator: Agent
id: ID!
lastUsedAt: DateTime
name: String!
updatedAt: DateTime!
}

TagBatchDeletePayload​

Autogenerated return type of TagBatchDelete

type TagBatchDeletePayload {
clientMutationId: String
errors: [UserError!]!
jobId: ID!
}

TagConnection​

The connection type for Tag.

type TagConnection {
edges: [TagEdge]
nodes: [Tag]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

TagCreatePayload​

Autogenerated return type of TagCreate

type TagCreatePayload {
clientMutationId: String
errors: [UserError!]!
tag: Tag
}

TagDeletePayload​

Autogenerated return type of TagDelete

type TagDeletePayload {
clientMutationId: String
deletedTagId: ID!
errors: [UserError!]!
}

TagEdge​

An edge in a connection.

type TagEdge {
cursor: String!
node: Tag
}

TagMergePayload​

Autogenerated return type of TagMerge

type TagMergePayload {
clientMutationId: String
errors: [UserError!]!
jobId: ID!
}

TagUpdatePayload​

Autogenerated return type of TagUpdate

type TagUpdatePayload {
clientMutationId: String
errors: [UserError!]!
tag: Tag
}

Tagged​

A tag was added to a conversation.

type Tagged implements Timestamped {
createdAt: DateTime!
id: ID!
tag: Tag
updatedAt: DateTime!
}

Team​

A team is a group of zero or more agents.

To find all teams on your account along with the associated agents:

query Teams {
teams {
nodes {
agents {
nodes {
id
}
pageInfo {
hasNextPage
}
}
createdAt
id
description
name
updatedAt
}
}
}

By default team results are sorted by name. To sort by when they were created:

query Teams {
teams( orderBy: { field: CREATED_AT, direction: ASC } ) {
nodes {
id
name
}
}
}

To order teams by largest first:

query Teams {
teams( orderBy: { field: SIZE, direction: DESC } ) {
nodes {
id
name
}
}
}
type Team implements Node, Timestamped {
agents(
after: String
before: String
first: Int
last: Int
filter: AgentFilter
orderBy: AgentOrder
): AgentConnection
createdAt: DateTime!
description: String
id: ID!
name: String!
updatedAt: DateTime!
}

TeamChanged​

A conversation was reassigned to another team.

type TeamChanged implements Timestamped {
createdAt: DateTime!
from: Team
id: ID!
to: Team
updatedAt: DateTime!
}

TeamConnection​

The connection type for Team.

type TeamConnection {
edges: [TeamEdge]
nodes: [Team]
pageInfo: PageInfo!
}

TeamEdge​

An edge in a connection.

type TeamEdge {
cursor: String!
node: Team
}

teamsCreatePayload​

Autogenerated return type of teamsCreate

type teamsCreatePayload {
clientMutationId: String
errors: [UserError!]!
team: Team!
}

teamsDestroyPayload​

Autogenerated return type of teamsDestroy

type teamsDestroyPayload {
clientMutationId: String
errors: [UserError!]!
team: Team!
}

teamsUpdatePayload​

Autogenerated return type of teamsUpdate

type teamsUpdatePayload {
clientMutationId: String
errors: [UserError!]!
team: Team!
}

Text​

A text string. It can represent either a single line, multiple lines, or an email.

type Text {
content: String!
}

Theme​

A theme for a Knowledge Base that is provided out of the box.

To fetch all themes:

query Themes {
themes {
nodes {

createdAt
id
name
description
screenshotUrl
updatedAt

}
}
}
type Theme implements Node, Timestamped {
createdAt: DateTime!
description: String
id: ID!
name: String
screenshotUrl: String
updatedAt: DateTime!
}

ThemeConnection​

The connection type for Theme.

type ThemeConnection {
edges: [ThemeEdge]
nodes: [Theme]
pageInfo: PageInfo!
}

ThemeEdge​

An edge in a connection.

type ThemeEdge {
cursor: String!
node: Theme
}

Tool​

No description

type Tool {
label: String
name: String!
}

ToolConnection​

The connection type for Tool.

type ToolConnection {
edges: [ToolEdge]
nodes: [Tool]
pageInfo: PageInfo!
}

ToolEdge​

An edge in a connection.

type ToolEdge {
cursor: String!
node: Tool
}

TwitterConversation​

A Groove conversation initiated from Twitter.

To fetch a specific Twitter conversation by ID:

query Conversation {
node(id: "cnv_12345678") {

... on TwitterConversation {
twitterId
}

}
})

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
})
type TwitterConversation implements Node, Conversation {
assigned: Assignment
channel: Channel!
contact: Contact
counts: ConversationCounts!
createdAt: DateTime!
customFieldValues(
after: String
before: String
first: Int
last: Int
filter: CustomFieldValuesFilter
): CustomFieldValueConnection
deletedAt: DateTime
drafts(
after: String
before: String
first: Int
last: Int
): DraftConnection
followers(
after: String
before: String
first: Int
last: Int
filter: AgentFilter
orderBy: AgentOrder
): AgentConnection
id: ID!
lastUnansweredUserMessageAt: DateTime!
mentions: [Mention!]!
number: Int!
searchSummary: SearchSummary
snoozed: Snooze
starred: Boolean!
state: ConversationState!
stateUpdatedAt: DateTime
subject: String
summaryMessage: SummaryMessage
systemUpdatedAt: DateTime!
tags(
after: String
before: String
first: Int
last: Int
filter: TagFilter
orderBy: TagOrder
): TagConnection
twitterId: String
updatedAt: DateTime!
}

A Groove conversation is a thread of messages (for example emails, chats, or notes) and associated actions or events (for example 'opened', 'snoozed', and 'assigned').

To fetch Messages/Ratings/StateChanges/etc. on a conversation, query the Events connection (on the QueryRoot) with the conversation ID.

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
}

To search conversations matching a specific keyword:

query Conversations {
conversations(filter: { keywords: "rad" }) {
edges {
node {
... on Conversation {
id
number
searchSummary {
author {
__typename
... on Agent {
email
role
}
... on Contact {
email
}
}
body
forwarded
note
}
}
}
}
}
}

TwitterDraft​

No description

type TwitterDraft implements Draft {
agent: Agent!
assignment: Assignment
body: String!
contextId: ID
conversation: Conversation!
conversationId: ID!
createdAt: DateTime!
draftId: String
draftType: DraftType
id: ID!
lastSyncedAt: DateTime!
metadata: JSON!
payload: JSON
updatedAt: DateTime!
version: Int!
}

TwitterMessage​

A message sent to or received from Twitter.

type TwitterMessage implements Node, Message {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
body: String
bodyPlainText: String
cannedReply: CannedReply
channel: Channel!
createdAt: DateTime!
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
twitterId: String
updatedAt: DateTime!
}

TwoFactorAuthCode​

query TwoFactorAuthCode {
me {
twoFactorAuthCode {
uri
code
}
}
}
type TwoFactorAuthCode {
code: String
uri: String
}

Unsnoozed​

A conversation was unsnoozed.

type Unsnoozed implements Timestamped {
by: Agent
createdAt: DateTime!
id: ID!
updatedAt: DateTime!
}

Untagged​

A tag was removed from a conversation.

type Untagged implements Timestamped {
createdAt: DateTime!
id: ID!
tag: Tag
updatedAt: DateTime!
}

UpdatePresencePayload​

Autogenerated return type of UpdatePresence

type UpdatePresencePayload {
accessibleWidgetIds: [ID!]
clientMutationId: String
errors: [UserError!]!
lastActiveAt: BigInt
presenceStatus: PresenceStatusType
updatedAt: BigInt
}

UploadPayloadField​

No description

type UploadPayloadField {
name: String!
value: String!
}

UploadPayloadGeneratePayload​

Autogenerated return type of UploadPayloadGenerate

type UploadPayloadGeneratePayload {
clientMutationId: String
errors: [UserError!]!
key: String!
previewUrl: String!
request: UploadPayloadRequest!
}

UploadPayloadRequest​

No description

type UploadPayloadRequest {
contentType: String!
data: [UploadPayloadField!]!
method: String!
url: String!
}

UrlStruct​

A URL.

type UrlStruct {
domain: String
hash: String
path: String
protocol: String
query: String
raw: String!
}

UserAgent​

A characteristic string used to identify visitors.

type UserAgent {
browser: Browser
device: Device
platform: Platform
raw: String!
}

UserError​

A user-readable error

type UserError {
message: String!
path: [String!]
type: String
}

UserIntegration​

No description

type UserIntegration implements Integration {
agent: Agent
createdAt: DateTime!
id: ID!
legacyId: String!
provider: IntegrationProvider!
settings: IntegrationSettings!
uid: String
updatedAt: DateTime!
}

Wallet​

No description

type Wallet implements Node, Timestamped {
autorenew: Boolean
autorenewAmount: Int
autorenewAt: ISO8601DateTime
autorenewSchedule: Int
autorenewThreshold: Int
autorenewUsedTimes: Int
autorenewUses: Int
balance: Int!
canUse: Boolean!
createdAt: DateTime!
feature: String!
id: ID!
limit: Int
limitType: String
ownerId: String!
ownerType: String!
parent: Wallet
updatedAt: DateTime!
}

WalletConnection​

The connection type for Wallet.

type WalletConnection {
edges: [WalletEdge]
nodes: [Wallet]
pageInfo: PageInfo!
}

WalletEdge​

An edge in a connection.

type WalletEdge {
cursor: String!
node: Wallet
}

WalletTransactionCreatePayload​

Autogenerated return type of WalletTransactionCreate

type WalletTransactionCreatePayload {
clientMutationId: String
errors: [UserError!]!
success: Boolean!
}

WalletUpdatePayload​

Autogenerated return type of WalletUpdate

type WalletUpdatePayload {
clientMutationId: String
errors: [UserError!]!
wallet: Wallet
}

Webhook​

Represents a webhook endpoint configured for account events.

type Webhook implements Node {
createdAt: ISO8601DateTime!
event: WebhookEvent!
failureCount: Int!
failureReason: String
id: ID!
signingEnabled: Boolean!
state: WebhookState!
updatedAt: ISO8601DateTime!
url: String!
}

WebhookConnection​

The connection type for Webhook.

type WebhookConnection {
edges: [WebhookEdge]
nodes: [Webhook]
pageInfo: PageInfo!
totalCount: Int!
totalPageCount: Int!
}

WebhookCreatePayload​

Autogenerated return type of WebhookCreate

type WebhookCreatePayload {
clientMutationId: String
errors: [UserError!]!
webhook: Webhook
}

WebhookDeletePayload​

Autogenerated return type of WebhookDelete

type WebhookDeletePayload {
clientMutationId: String
deletedWebhookId: ID
errors: [UserError!]!
}

WebhookEdge​

An edge in a connection.

type WebhookEdge {
cursor: String!
node: Webhook
}

WebhookReactivatePayload​

Autogenerated return type of WebhookReactivate

type WebhookReactivatePayload {
clientMutationId: String
errors: [UserError!]!
webhook: Webhook
}

WebhookTestPayload​

Autogenerated return type of WebhookTest

type WebhookTestPayload {
clientMutationId: String
errors: [UserError!]!
statusCode: Int
success: Boolean!
webhook: Webhook
}

WebhookUpdatePayload​

Autogenerated return type of WebhookUpdate

type WebhookUpdatePayload {
clientMutationId: String
errors: [UserError!]!
webhook: Webhook
}

WidgetConversation​

A Groove conversation initiated from a Groove Widget.

To fetch a specific Widget conversation by ID:

query Conversation {
node(id: "cnv_12345678") {

... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}
})

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
})
type WidgetConversation implements Node, Conversation {
assigned: Assignment
browser: String
channel: Channel!
contact: Contact
counts: ConversationCounts!
createdAt: DateTime!
customFieldValues(
after: String
before: String
first: Int
last: Int
filter: CustomFieldValuesFilter
): CustomFieldValueConnection
deletedAt: DateTime
drafts(
after: String
before: String
first: Int
last: Int
): DraftConnection
followers(
after: String
before: String
first: Int
last: Int
filter: AgentFilter
orderBy: AgentOrder
): AgentConnection
id: ID!
lastUnansweredUserMessageAt: DateTime!
mentions: [Mention!]!
number: Int!
pageTitle: String
pageUrl: String
platform: String
referrer: String
searchSummary: SearchSummary
snoozed: Snooze
starred: Boolean!
state: ConversationState!
stateUpdatedAt: DateTime
subject: String
summaryMessage: SummaryMessage
systemUpdatedAt: DateTime!
tags(
after: String
before: String
first: Int
last: Int
filter: TagFilter
orderBy: TagOrder
): TagConnection
updatedAt: DateTime!
}

A Groove conversation is a thread of messages (for example emails, chats, or notes) and associated actions or events (for example 'opened', 'snoozed', and 'assigned').

To fetch Messages/Ratings/StateChanges/etc. on a conversation, query the Events connection (on the QueryRoot) with the conversation ID.

To fetch all possible fields:

query Conversation {
node(id: "cnv_12345678") {

__typename
... on Conversation {
assigned {
at
agent {
id
name
}
team {
id
name
}
}
counts {
attachments
interactions
messages
notes
stateChanges
}
createdAt
contact {
id
email
}
deletedAt
drafts {
nodes {
id
}
}
followers {
nodes {
id
email
}
}
id
number
snoozed {
by { id }
until
}
starred
state
stateUpdatedAt
summaryMessage {
id
bodyPlainText
}
subject
systemUpdatedAt
tags {
nodes {
id
name
}
}
updatedAt

... on FacebookConversation {
facebookId
}


... on TwitterConversation {
twitterId
}


... on WidgetConversation {
browser
referrer
pageTitle
pageUrl
platform
referrer
}

}

}
}

To search conversations matching a specific keyword:

query Conversations {
conversations(filter: { keywords: "rad" }) {
edges {
node {
... on Conversation {
id
number
searchSummary {
author {
__typename
... on Agent {
email
role
}
... on Contact {
email
}
}
body
forwarded
note
}
}
}
}
}
}

WidgetHelplyProvisionPayload​

Autogenerated return type of WidgetHelplyProvision

type WidgetHelplyProvisionPayload {
clientMutationId: String
errors: [UserError!]!
message: String
success: Boolean!
widgetCount: Int!
}

WidgetMessage​

A message received from a contact using the Widget.

type WidgetMessage implements Node, Message {
attachments(
after: String
before: String
first: Int
last: Int
): AttachmentConnection
author: Author
body: String
bodyPlainText: String
cannedReply: CannedReply
channel: Channel!
createdAt: DateTime!
editedAt: DateTime
fromMerge: Boolean
fromMove: Boolean
id: ID!
isNote: Boolean!
rule: Rule
sourceConversation: Conversation
summary: SummaryMessage!
updatedAt: DateTime!
}