{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.slack.dev/channel",
  "title": "Slack Channel",
  "description": "A Slack conversation object representing a channel, direct message, multi-person direct message, or group conversation. This is the unified model returned by the conversations.* family of Web API methods, which consolidated the legacy channels.*, groups.*, im.*, and mpim.* endpoints. The type of conversation is identified by boolean flags (is_channel, is_group, is_im, is_mpim) and the is_private flag. Channels are uniquely identified by their id field, with public channels starting with C, private channels and multi-person DMs starting with G, and direct messages starting with D.",
  "type": "object",
  "required": [
    "id",
    "created"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The unique identifier for this conversation. Public channels begin with C, private channels and multi-person DMs begin with G, and direct messages begin with D.",
      "pattern": "^[CGDW][A-Z0-9]+$"
    },
    "name": {
      "type": "string",
      "description": "The name of the channel without the leading # sign. Channel names can contain lowercase letters, numbers, hyphens, and underscores, with a maximum length of 80 characters. Not present for direct messages.",
      "maxLength": 80,
      "pattern": "^[a-z0-9][a-z0-9_-]*$"
    },
    "name_normalized": {
      "type": "string",
      "description": "A normalized, lowercase version of the channel name. Useful for case-insensitive comparisons and sorting."
    },
    "is_channel": {
      "type": "boolean",
      "description": "Whether this conversation is a public channel. Public channels are visible to all members of the workspace and can be joined by anyone."
    },
    "is_group": {
      "type": "boolean",
      "description": "Whether this conversation is a private channel. Private channels are invite-only and not visible in the channel browser."
    },
    "is_im": {
      "type": "boolean",
      "description": "Whether this conversation is a direct message between two people."
    },
    "is_mpim": {
      "type": "boolean",
      "description": "Whether this conversation is a multi-person direct message. MPIMs are group DMs between 3 or more people."
    },
    "is_private": {
      "type": "boolean",
      "description": "Whether this conversation is private. True for private channels, DMs, and MPIMs. False for public channels."
    },
    "is_archived": {
      "type": "boolean",
      "description": "Whether the channel is archived. Archived channels are read-only and do not accept new messages. They can be unarchived by workspace admins."
    },
    "is_general": {
      "type": "boolean",
      "description": "Whether this is the workspace's #general channel. Every workspace has exactly one general channel that all members are automatically added to."
    },
    "is_shared": {
      "type": "boolean",
      "description": "Whether the channel is shared with another workspace using Slack Connect."
    },
    "is_ext_shared": {
      "type": "boolean",
      "description": "Whether the channel is shared with an external organization via Slack Connect. External shared channels allow cross-organization collaboration."
    },
    "is_org_shared": {
      "type": "boolean",
      "description": "Whether the channel is shared across the entire Enterprise Grid organization. Org-wide channels are available to all workspaces in the grid."
    },
    "is_pending_ext_shared": {
      "type": "boolean",
      "description": "Whether there is a pending Slack Connect invitation for this channel that has not yet been accepted."
    },
    "is_member": {
      "type": "boolean",
      "description": "Whether the authenticated user or bot is a member of this conversation. Users must be members to read history or post messages in private channels."
    },
    "is_open": {
      "type": "boolean",
      "description": "Whether the direct message or MPIM is currently open in the user's sidebar. Only relevant for DMs and MPIMs."
    },
    "is_frozen": {
      "type": "boolean",
      "description": "Whether the channel is frozen. Frozen channels do not accept new messages."
    },
    "is_read_only": {
      "type": "boolean",
      "description": "Whether the channel is read-only. In read-only channels, only admins and approved users can post."
    },
    "is_thread_only": {
      "type": "boolean",
      "description": "Whether the channel only allows threaded replies. Top-level posts are not permitted."
    },
    "is_non_threadable": {
      "type": "boolean",
      "description": "Whether threading is disabled in this channel."
    },
    "created": {
      "type": "integer",
      "description": "Unix timestamp (in seconds) of when the conversation was created."
    },
    "creator": {
      "type": "string",
      "description": "The user ID of the member who created this channel. Not present for DMs.",
      "pattern": "^[UW][A-Z0-9]+$"
    },
    "updated": {
      "type": "integer",
      "description": "Unix timestamp of the last update to the conversation metadata (not the last message)."
    },
    "unlinked": {
      "type": "integer",
      "description": "The number of times this shared channel has been unlinked from a partner workspace."
    },
    "topic": {
      "type": "object",
      "description": "The channel's topic. Topics appear below the channel name in the Slack client and help describe what the channel is currently being used for.",
      "properties": {
        "value": {
          "type": "string",
          "description": "The topic text. Supports mrkdwn formatting. Maximum 250 characters.",
          "maxLength": 250
        },
        "creator": {
          "type": "string",
          "description": "The user ID of the person who last set the topic.",
          "pattern": "^[UW][A-Z0-9]*$"
        },
        "last_set": {
          "type": "integer",
          "description": "Unix timestamp of when the topic was last set. 0 if never set."
        }
      },
      "required": [
        "value",
        "creator",
        "last_set"
      ]
    },
    "purpose": {
      "type": "object",
      "description": "The channel's purpose. Purposes describe the intended use of the channel and help users decide whether to join.",
      "properties": {
        "value": {
          "type": "string",
          "description": "The purpose text. Supports mrkdwn formatting. Maximum 250 characters.",
          "maxLength": 250
        },
        "creator": {
          "type": "string",
          "description": "The user ID of the person who last set the purpose.",
          "pattern": "^[UW][A-Z0-9]*$"
        },
        "last_set": {
          "type": "integer",
          "description": "Unix timestamp of when the purpose was last set. 0 if never set."
        }
      },
      "required": [
        "value",
        "creator",
        "last_set"
      ]
    },
    "previous_names": {
      "type": "array",
      "description": "A list of all previous names this channel has had. Useful for tracking channel history and identifying channels that have been renamed.",
      "items": {
        "type": "string"
      }
    },
    "num_members": {
      "type": "integer",
      "description": "The approximate number of members in the channel. Only included in responses when explicitly requested via the include_num_members parameter. May not be perfectly accurate for large channels.",
      "minimum": 0
    },
    "locale": {
      "type": "string",
      "description": "The IETF language code for the channel's locale. Only included in responses when explicitly requested via the include_locale parameter."
    },
    "user": {
      "type": "string",
      "description": "For direct messages, the user ID of the other participant. Not present for channels, groups, or MPIMs.",
      "pattern": "^[UW][A-Z0-9]+$"
    },
    "shared_team_ids": {
      "type": "array",
      "description": "An array of team (workspace) IDs that share this channel. Present for shared and Slack Connect channels.",
      "items": {
        "type": "string",
        "pattern": "^T[A-Z0-9]+$"
      }
    },
    "pending_shared": {
      "type": "array",
      "description": "An array of team IDs for pending shared channel invitations.",
      "items": {
        "type": "string"
      }
    },
    "pending_connected_team_ids": {
      "type": "array",
      "description": "An array of team IDs for pending Slack Connect invitations.",
      "items": {
        "type": "string"
      }
    },
    "parent_conversation": {
      "type": ["string", "null"],
      "description": "The parent conversation ID if this is a sub-conversation or thread-only channel. Null for top-level conversations."
    },
    "context_team_id": {
      "type": "string",
      "description": "The team (workspace) ID providing context for this conversation. Useful in Enterprise Grid environments where channels may be shared across workspaces.",
      "pattern": "^T[A-Z0-9]+$"
    },
    "properties": {
      "type": "object",
      "description": "Additional channel properties including canvas and tab configurations.",
      "properties": {
        "tabs": {
          "type": "array",
          "description": "An array of tab objects associated with the channel.",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "type": {
                "type": "string"
              }
            }
          }
        },
        "canvas": {
          "type": "object",
          "description": "The channel canvas configuration.",
          "properties": {
            "file_id": {
              "type": "string"
            },
            "is_empty": {
              "type": "boolean"
            },
            "quip_thread_id": {
              "type": "string"
            }
          }
        }
      }
    },
    "last_read": {
      "type": "string",
      "description": "The timestamp of the last message read by the authenticated user in this channel.",
      "pattern": "^[0-9]+\\.[0-9]+$"
    },
    "latest": {
      "type": "object",
      "description": "The most recent message in the channel. Only included in some API responses."
    },
    "unread_count": {
      "type": "integer",
      "description": "The number of unread messages the authenticated user has in this channel.",
      "minimum": 0
    },
    "unread_count_display": {
      "type": "integer",
      "description": "The number of unread messages to display (may differ from unread_count based on notification settings).",
      "minimum": 0
    },
    "priority": {
      "type": "number",
      "description": "A priority value used for sorting channels in the sidebar."
    }
  }
}
