Stream Chat Devices and Push API
Register, list, and remove a user's push devices (APNs, Firebase) so Stream can deliver offline push notifications, and manage push providers for the application.
Register, list, and remove a user's push devices (APNs, Firebase) so Stream can deliver offline push notifications, and manage push providers for the application.
openapi: 3.0.3
info:
title: Stream Chat API (Server-side REST)
description: >-
Server-side REST API for Stream (GetStream.io) Chat. This is a curated subset
of Stream's published Chat protocol (https://getstream.github.io/protocol),
grounding the endpoints modeled in the API Evangelist catalog against the real
base URL and paths. The Chat API is addressed at https://chat.stream-io-api.com.
Every request carries the application `api_key` as a query parameter and is
authenticated with a JWT sent in the `Authorization` header together with a
`Stream-Auth-Type: jwt` header. Server-side tokens (no `user_id` claim) are
used for the operations in this document; client tokens are used to open the
real-time WebSocket connection modeled in the companion AsyncAPI document.
Path and method choices here are taken from Stream's official
chat-openapi.yaml (github.com/GetStream/protocol). Request and response bodies
are represented generically; consult the linked protocol reference for the full
schemas.
version: '1.0'
contact:
name: API Evangelist
url: https://apievangelist.com
email: kin@apievangelist.com
license:
name: API documentation - Stream Terms
url: https://getstream.io/legal/terms/
servers:
- url: https://chat.stream-io-api.com
description: Stream Chat API (edge, global)
security:
- JWT: []
ApiKey: []
tags:
- name: Channels
description: Query, create, update, truncate, and delete chat channels.
- name: Messages
description: Send, retrieve, update, delete, and search messages and replies.
- name: Members
description: Query and partially update channel members.
- name: Reactions
description: Add and remove emoji reactions on messages.
- name: Threads
description: Query and retrieve message threads.
- name: Users
description: Upsert, query, update, deactivate, and reactivate users.
- name: Devices
description: Register and manage push notification devices.
- name: Moderation
description: Ban, flag, and mute users, messages, and channels.
- name: Permissions
description: Inspect application permissions.
- name: Roles
description: List, create, and delete custom roles.
- name: Campaigns
description: Create and control bulk messaging campaigns.
- name: Application
description: Application-level utilities such as rate limits and search.
paths:
/channels:
post:
operationId: QueryChannels
tags:
- Channels
summary: Query channels
description: >-
Query the channels a user has access to, using a filter, sort, and
pagination. Returns channel state including members, messages, reads,
and channel configuration.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/QueryChannelsRequest'
responses:
'200':
description: A list of channels with their state.
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelsResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/channels/{type}/{id}:
parameters:
- $ref: '#/components/parameters/ChannelType'
- $ref: '#/components/parameters/ChannelId'
post:
operationId: UpdateChannel
tags:
- Channels
summary: Update a channel (overwrite)
description: Overwrite a channel's custom data and, optionally, its member set.
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
$ref: '#/components/responses/Channel'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
patch:
operationId: UpdateChannelPartial
tags:
- Channels
summary: Partially update a channel
description: Set or unset individual fields of a channel's custom data.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
set:
type: object
unset:
type: array
items:
type: string
responses:
'200':
$ref: '#/components/responses/Channel'
'429':
$ref: '#/components/responses/TooManyRequests'
delete:
operationId: DeleteChannel
tags:
- Channels
summary: Delete a channel
description: Delete a channel and all of its messages (soft or hard delete).
parameters:
- name: hard_delete
in: query
schema:
type: boolean
responses:
'200':
$ref: '#/components/responses/Channel'
'429':
$ref: '#/components/responses/TooManyRequests'
/channels/{type}/{id}/query:
parameters:
- $ref: '#/components/parameters/ChannelType'
- $ref: '#/components/parameters/ChannelId'
post:
operationId: GetOrCreateChannel
tags:
- Channels
summary: Get or create a channel
description: >-
Fetch a channel's full state, creating it if it does not yet exist, and
optionally start watching it. This is the primary way to load a channel.
requestBody:
content:
application/json:
schema:
type: object
properties:
watch:
type: boolean
state:
type: boolean
presence:
type: boolean
data:
type: object
responses:
'200':
$ref: '#/components/responses/Channel'
'429':
$ref: '#/components/responses/TooManyRequests'
/channels/{type}/{id}/message:
parameters:
- $ref: '#/components/parameters/ChannelType'
- $ref: '#/components/parameters/ChannelId'
post:
operationId: SendMessage
tags:
- Messages
summary: Send a message
description: >-
Send a new message to a channel. Emits a `message.new` event over the
WebSocket to watchers of the channel.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SendMessageRequest'
responses:
'201':
$ref: '#/components/responses/Message'
'400':
$ref: '#/components/responses/BadRequest'
'429':
$ref: '#/components/responses/TooManyRequests'
/channels/{type}/{id}/member:
parameters:
- $ref: '#/components/parameters/ChannelType'
- $ref: '#/components/parameters/ChannelId'
patch:
operationId: UpdateMemberPartial
tags:
- Members
summary: Partially update a channel member
description: >-
Set or unset channel-scoped attributes for a member, such as
notifications muted, pinned, or archived state.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
set:
type: object
unset:
type: array
items:
type: string
responses:
'200':
description: The updated channel member.
content:
application/json:
schema:
type: object
'429':
$ref: '#/components/responses/TooManyRequests'
/channels/{type}/{id}/truncate:
parameters:
- $ref: '#/components/parameters/ChannelType'
- $ref: '#/components/parameters/ChannelId'
post:
operationId: TruncateChannel
tags:
- Channels
summary: Truncate a channel
description: Remove all messages from a channel while keeping the channel itself.
responses:
'200':
$ref: '#/components/responses/Channel'
'429':
$ref: '#/components/responses/TooManyRequests'
/channels/{type}/{id}/read:
parameters:
- $ref: '#/components/parameters/ChannelType'
- $ref: '#/components/parameters/ChannelId'
post:
operationId: MarkRead
tags:
- Channels
summary: Mark a channel read
description: >-
Mark messages in a channel as read for a user, updating unread counts and
emitting a `message.read` event.
requestBody:
content:
application/json:
schema:
type: object
responses:
'200':
description: Read state updated.
content:
application/json:
schema:
type: object
'429':
$ref: '#/components/responses/TooManyRequests'
/members:
get:
operationId: QueryMembers
tags:
- Members
summary: Query members
description: Query channel members across the application with filtering and sorting.
parameters:
- name: payload
in: query
description: URL-encoded JSON query (filter_conditions, sort, limit, offset).
schema:
type: string
responses:
'200':
description: A list of members.
content:
application/json:
schema:
type: object
properties:
members:
type: array
items:
type: object
'429':
$ref: '#/components/responses/TooManyRequests'
/messages/{id}:
parameters:
- $ref: '#/components/parameters/MessageId'
get:
operationId: GetMessage
tags:
- Messages
summary: Get a message
responses:
'200':
$ref: '#/components/responses/Message'
'404':
$ref: '#/components/responses/NotFound'
post:
operationId: UpdateMessage
tags:
- Messages
summary: Update a message (overwrite)
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
$ref: '#/components/responses/Message'
put:
operationId: UpdateMessagePartial
tags:
- Messages
summary: Partially update a message
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
set:
type: object
unset:
type: array
items:
type: string
responses:
'200':
$ref: '#/components/responses/Message'
delete:
operationId: DeleteMessage
tags:
- Messages
summary: Delete a message
parameters:
- name: hard
in: query
schema:
type: boolean
responses:
'200':
$ref: '#/components/responses/Message'
'429':
$ref: '#/components/responses/TooManyRequests'
/messages/{id}/reaction:
parameters:
- $ref: '#/components/parameters/MessageId'
post:
operationId: SendReaction
tags:
- Reactions
summary: Send a reaction
description: Add an emoji reaction to a message, emitting a `reaction.new` event.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reaction:
type: object
properties:
type:
type: string
example: like
score:
type: integer
responses:
'201':
$ref: '#/components/responses/Message'
'429':
$ref: '#/components/responses/TooManyRequests'
/messages/{id}/reaction/{type}:
parameters:
- $ref: '#/components/parameters/MessageId'
- name: type
in: path
required: true
description: The reaction type to remove (e.g. like).
schema:
type: string
delete:
operationId: DeleteReaction
tags:
- Reactions
summary: Delete a reaction
description: Remove a user's reaction of a given type from a message.
responses:
'200':
$ref: '#/components/responses/Message'
'429':
$ref: '#/components/responses/TooManyRequests'
/messages/{parent_id}/replies:
parameters:
- name: parent_id
in: path
required: true
description: The id of the parent message whose thread replies to fetch.
schema:
type: string
get:
operationId: GetReplies
tags:
- Messages
summary: Get thread replies
description: Paginate the replies under a parent (thread) message.
responses:
'200':
description: A list of reply messages.
content:
application/json:
schema:
type: object
properties:
messages:
type: array
items:
$ref: '#/components/schemas/Message'
/threads:
post:
operationId: QueryThreads
tags:
- Threads
summary: Query threads
description: Query the threads a user participates in.
requestBody:
content:
application/json:
schema:
type: object
responses:
'200':
description: A list of threads.
content:
application/json:
schema:
type: object
properties:
threads:
type: array
items:
type: object
/threads/{message_id}:
parameters:
- name: message_id
in: path
required: true
description: The parent message id identifying the thread.
schema:
type: string
get:
operationId: GetThread
tags:
- Threads
summary: Get a thread
responses:
'200':
description: The thread and its metadata.
content:
application/json:
schema:
type: object
patch:
operationId: UpdateThreadPartial
tags:
- Threads
summary: Partially update a thread
requestBody:
content:
application/json:
schema:
type: object
responses:
'200':
description: The updated thread.
content:
application/json:
schema:
type: object
/users:
get:
operationId: QueryUsers
tags:
- Users
summary: Query users
description: Query users with filtering, sorting, and pagination.
parameters:
- name: payload
in: query
description: URL-encoded JSON query (filter_conditions, sort, limit, offset).
schema:
type: string
responses:
'200':
description: A list of users.
content:
application/json:
schema:
type: object
properties:
users:
type: array
items:
$ref: '#/components/schemas/User'
post:
operationId: UpsertUsers
tags:
- Users
summary: Upsert users
description: Create or update a batch of users by id.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
users:
type: object
additionalProperties:
$ref: '#/components/schemas/User'
responses:
'201':
description: The upserted users keyed by id.
content:
application/json:
schema:
type: object
'429':
$ref: '#/components/responses/TooManyRequests'
patch:
operationId: UpdateUsersPartial
tags:
- Users
summary: Partially update users
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
users:
type: array
items:
type: object
responses:
'200':
description: The updated users.
content:
application/json:
schema:
type: object
/users/{user_id}/deactivate:
parameters:
- name: user_id
in: path
required: true
schema:
type: string
post:
operationId: DeactivateUser
tags:
- Users
summary: Deactivate a user
description: Deactivate a user, preventing them from connecting or sending messages.
responses:
'200':
description: The deactivated user.
content:
application/json:
schema:
type: object
/devices:
get:
operationId: ListDevices
tags:
- Devices
summary: List devices
description: List the push devices registered for a user.
parameters:
- name: user_id
in: query
schema:
type: string
responses:
'200':
description: A list of devices.
content:
application/json:
schema:
type: object
properties:
devices:
type: array
items:
$ref: '#/components/schemas/Device'
post:
operationId: CreateDevice
tags:
- Devices
summary: Register a device
description: Register a push device (APNs or Firebase) for a user.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Device'
responses:
'201':
description: Device registered.
content:
application/json:
schema:
type: object
delete:
operationId: DeleteDevice
tags:
- Devices
summary: Remove a device
parameters:
- name: id
in: query
required: true
schema:
type: string
- name: user_id
in: query
schema:
type: string
responses:
'200':
description: Device removed.
content:
application/json:
schema:
type: object
/moderation/ban:
post:
operationId: Ban
tags:
- Moderation
summary: Ban a user
description: Ban a user globally or within a specific channel, optionally with a timeout.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
target_user_id:
type: string
timeout:
type: integer
reason:
type: string
type:
type: string
id:
type: string
responses:
'200':
description: User banned.
content:
application/json:
schema:
type: object
delete:
operationId: Unban
tags:
- Moderation
summary: Unban a user
parameters:
- name: target_user_id
in: query
required: true
schema:
type: string
responses:
'200':
description: User unbanned.
content:
application/json:
schema:
type: object
/moderation/flag:
post:
operationId: Flag
tags:
- Moderation
summary: Flag a message or user
description: Flag a message or user for moderation review.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
target_message_id:
type: string
target_user_id:
type: string
reason:
type: string
responses:
'200':
description: Flag created.
content:
application/json:
schema:
type: object
/moderation/mute:
post:
operationId: MuteUser
tags:
- Moderation
summary: Mute a user
description: Mute one or more target users for the requesting user.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
target_ids:
type: array
items:
type: string
timeout:
type: integer
responses:
'200':
description: User(s) muted.
content:
application/json:
schema:
type: object
/permissions:
get:
operationId: ListPermissions
tags:
- Permissions
summary: List permissions
description: List all permissions available in the application.
responses:
'200':
description: A list of permissions.
content:
application/json:
schema:
type: object
properties:
permissions:
type: array
items:
type: object
/permissions/{id}:
parameters:
- name: id
in: path
required: true
schema:
type: string
get:
operationId: GetPermission
tags:
- Permissions
summary: Get a permission
responses:
'200':
description: A single permission.
content:
application/json:
schema:
type: object
/roles:
get:
operationId: ListRoles
tags:
- Roles
summary: List roles
description: List all roles defined in the application.
responses:
'200':
description: A list of roles.
content:
application/json:
schema:
type: object
properties:
roles:
type: array
items:
type: object
post:
operationId: CreateRole
tags:
- Roles
summary: Create a role
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
responses:
'201':
description: Role created.
content:
application/json:
schema:
type: object
/roles/{name}:
parameters:
- name: name
in: path
required: true
schema:
type: string
delete:
operationId: DeleteRole
tags:
- Roles
summary: Delete a role
responses:
'200':
description: Role deleted.
content:
application/json:
schema:
type: object
/campaigns:
post:
operationId: CreateCampaign
tags:
- Campaigns
summary: Create a campaign
description: Create a bulk messaging campaign targeting a user segment.
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: Campaign created.
content:
application/json:
schema:
type: object
/campaigns/{id}:
parameters:
- name: id
in: path
required: true
schema:
type: string
get:
operationId: GetCampaign
tags:
- Campaigns
summary: Get a campaign
responses:
'200':
description: A single campaign.
content:
application/json:
schema:
type: object
put:
operationId: UpdateCampaign
tags:
- Campaigns
summary: Update a campaign
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
description: Campaign updated.
content:
application/json:
schema:
type: object
delete:
operationId: DeleteCampaign
tags:
- Campaigns
summary: Delete a campaign
responses:
'200':
description: Campaign deleted.
content:
application/json:
schema:
type: object
/campaigns/{id}/start:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
operationId: StartCampaign
tags:
- Campaigns
summary: Start a campaign
responses:
'200':
description: Campaign started.
content:
application/json:
schema:
type: object
/campaigns/{id}/stop:
parameters:
- name: id
in: path
required: true
schema:
type: string
post:
operationId: StopCampaign
tags:
- Campaigns
summary: Stop a campaign
responses:
'200':
description: Campaign stopped.
content:
application/json:
schema:
type: object
/search:
get:
operationId: Search
tags:
- Application
summary: Search messages
description: Full-text search of messages across an application's channels.
parameters:
- name: payload
in: query
description: URL-encoded JSON search request (filter_conditions, query, sort, limit).
schema:
type: string
responses:
'200':
description: Search results.
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
type: object
/rate_limits:
get:
operationId: GetRateLimits
tags:
- Application
summary: Get rate limits
description: >-
Return the rate limit quotas and current usage for the application,
optionally filtered by platform and endpoint.
parameters:
- name: server_side
in: query
schema:
type: boolean
- name: android
in: query
schema:
type: boolean
- name: ios
in: query
schema:
type: boolean
- name: web
in: query
schema:
type: boolean
- name: endpoints
in: query
schema:
type: string
responses:
'200':
description: Rate limit quotas per platform and endpoint.
content:
application/json:
schema:
type: object
components:
securitySchemes:
JWT:
type: http
scheme: bearer
bearerFormat: JWT
description: >-
A Stream JWT sent in the `Authorization` header. Server-side tokens omit
the `user_id` claim; a `Stream-Auth-Type: jwt` header must accompany the
request.
ApiKey:
type: apiKey
in: query
name: api_key
description: The application API key, sent as the `api_key` query parameter on every request.
parameters:
ChannelType:
name: type
in: path
required: true
description: The channel type, e.g. messaging, livestream, team, gaming, commerce.
schema:
type: string
ChannelId:
name: id
in: path
required: true
description: The channel id, unique within the channel type.
schema:
type: string
MessageId:
name: id
in: path
required: true
description: The unique id of the message.
schema:
type: string
responses:
Channel:
description: A channel and its state.
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelStateResponse'
Message:
description: A message wrapped in a response envelope.
content:
application/json:
schema:
type: object
properties:
message:
$ref: '#/components/schemas/Message'
duration:
type: string
BadRequest:
description: The request was malformed.
content:
application/json:
schema:
$ref: '#/components/schemas/APIError'
Unauthorized:
description: Missing or invalid authentication.
content:
application/json:
schema:
$ref: '#/components/schemas/APIError'
NotFound:
description: The requested resource does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/APIError'
TooManyRequests:
description: >-
Rate limit exceeded for this app, platform, and endpoint. Inspect the
X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.
headers:
X-RateLimit-Limit:
schema:
type: integer
X-RateLimit-Remaining:
schema:
type: integer
X-RateLimit-Reset:
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/APIError'
schemas:
QueryChannelsRequest:
type: object
properties:
filter_conditions:
type: object
description: MongoDB-style filter over channel fields.
sort:
type: array
items:
type: object
limit:
type: integer
offset:
type: integer
watch:
type: boolean
state:
type: boolean
presence:
type: boolean
ChannelsResponse:
type: object
properties:
channels:
type: array
items:
$ref: '#/components/schemas/ChannelStateResponse'
duration:
type: string
ChannelStateResponse:
type: object
properties:
channel:
$ref: '#/components/schemas/Channel'
messages:
type: array
items:
$ref: '#/components/schemas/Message'
members:
type: array
items:
type: object
read:
type: array
items:
type: object
duration:
type: string
Channel:
type: object
properties:
id:
type: string
type:
type: string
cid:
type: string
description: The composite channel id, "{type}:{id}".
member_count:
type: integer
created_by:
$ref: '#/components/schemas/User'
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
SendMessageRequest:
type: object
required:
- message
properties:
message:
type: object
properties:
text:
type: string
attachments:
type
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/getstream/refs/heads/main/openapi/getstream-openapi.yml