AsyncAPI description of the PartyKit realtime protocol. PartyKit is a realtime backend framework (acquired by Cloudflare) that wraps Cloudflare Durable Objects with an opinionated developer experience for building multiplayer applications. A "party" is a server instance backed by a Durable Object, and a "room" is a uniquely identified party instance. Clients connect over WebSockets (typically via the PartySocket client) to `/parties/{party}/{room}` on a deployed PartyKit project. The same URL also accepts standard HTTP requests, which are dispatched to the server's `onRequest` handler. This specification describes the platform protocol surface that PartyKit exposes to clients: room connections, server-to-client broadcast, and bidirectional message exchange. The shape of individual application messages is defined by the developer's Party.Server implementation; this spec models the transport contract.
View SpecView on GitHubReal-TimeMultiplayerWebSocketsCloudflareDurable ObjectsEdgeCRDTYjsServerlessAsyncAPIWebhooksEvents
Channels
/parties/{party}/{room}
publishclientSendMessage
Client sends a message to the party.
A PartyKit room channel. The `party` segment identifies which Party class to route to (defaults to `main`), and the `room` segment is the room id. The PartyKit runtime guarantees that every connection using the same `room` id is routed to the same Durable Object instance, so a room represents a single, isolated, stateful server. Clients open a WebSocket against this path; the server invokes `onConnect` for each new connection and `onMessage` for each inbound message, and may use `Room.broadcast()` to deliver messages to all connected clients.
Messages
✉
ClientMessage
Client to Party Message
An inbound message from a connected client.
✉
ServerMessage
Party to Client Message
A targeted message sent by the party to one connection.
✉
BroadcastMessage
Party Broadcast Message
A message fanned out by the party to all connected clients via `Room.broadcast()`. The party may pass an optional list of connection ids to exclude from delivery.
Servers
wss
production{project}.{user}.partykit.dev
Deployed PartyKit project endpoint. Each deployed project is served at `{project}.{user}.partykit.dev` and accepts both WebSocket upgrades and standard HTTP requests under `/parties/{party}/{room}`.
ws
locallocalhost:1999
Local development server started by `partykit dev`. Defaults to port 1999.
asyncapi: '2.6.0'
info:
title: PartyKit Realtime Protocol
version: '1.0.0'
description: >-
AsyncAPI description of the PartyKit realtime protocol. PartyKit is a
realtime backend framework (acquired by Cloudflare) that wraps Cloudflare
Durable Objects with an opinionated developer experience for building
multiplayer applications. A "party" is a server instance backed by a
Durable Object, and a "room" is a uniquely identified party instance.
Clients connect over WebSockets (typically via the PartySocket client) to
`/parties/{party}/{room}` on a deployed PartyKit project. The same URL
also accepts standard HTTP requests, which are dispatched to the server's
`onRequest` handler.
This specification describes the platform protocol surface that PartyKit
exposes to clients: room connections, server-to-client broadcast, and
bidirectional message exchange. The shape of individual application
messages is defined by the developer's Party.Server implementation; this
spec models the transport contract.
contact:
name: PartyKit
url: https://docs.partykit.io
license:
name: Documentation
url: https://docs.partykit.io
defaultContentType: application/json
servers:
production:
url: '{project}.{user}.partykit.dev'
protocol: wss
description: >-
Deployed PartyKit project endpoint. Each deployed project is served at
`{project}.{user}.partykit.dev` and accepts both WebSocket upgrades and
standard HTTP requests under `/parties/{party}/{room}`.
variables:
project:
description: The deployed project name.
default: my-project
user:
description: The PartyKit user (account) the project belongs to.
default: my-user
local:
url: 'localhost:1999'
protocol: ws
description: >-
Local development server started by `partykit dev`. Defaults to port
1999.
channels:
'/parties/{party}/{room}':
description: >-
A PartyKit room channel. The `party` segment identifies which Party
class to route to (defaults to `main`), and the `room` segment is the
room id. The PartyKit runtime guarantees that every connection using
the same `room` id is routed to the same Durable Object instance, so a
room represents a single, isolated, stateful server. Clients open a
WebSocket against this path; the server invokes `onConnect` for each
new connection and `onMessage` for each inbound message, and may use
`Room.broadcast()` to deliver messages to all connected clients.
parameters:
party:
description: >-
The name of the Party (Party.Server class) to route to. PartyKit
defaults this to `main` when omitted by the client.
schema:
type: string
default: main
room:
description: >-
The room id. Connections sharing the same room id are routed to
the same party instance (Durable Object).
schema:
type: string
bindings:
ws:
query:
type: object
description: >-
Query parameters appended to the WebSocket URL. PartySocket
clients may pass an optional `id` to identify the connection,
and a developer-defined `query` async function may append
additional parameters (for example, an auth token).
properties:
id:
type: string
description: Optional connection id supplied by the client.
bindingVersion: '0.1.0'
publish:
operationId: clientSendMessage
summary: Client sends a message to the party.
description: >-
A connected client sends a message over the WebSocket. The PartyKit
runtime delivers it to the party's `onMessage(message, sender)`
handler. Messages are either UTF-8 strings or binary `ArrayBuffer`
payloads; application-level structure (for example, JSON envelopes)
is defined by the developer.
message:
$ref: '#/components/messages/ClientMessage'
subscribe:
operationId: serverPushMessage
summary: Server pushes a message to the client.
description: >-
The party sends a message to a connection. This covers both
targeted sends via `connection.send()` and fan-out via
`Room.broadcast(message, without?)`, which delivers the same
payload to every connected client (optionally excluding a list of
connection ids, typically used to skip the original sender).
message:
oneOf:
- $ref: '#/components/messages/ServerMessage'
- $ref: '#/components/messages/BroadcastMessage'
components:
messages:
ClientMessage:
name: ClientMessage
title: Client to Party Message
summary: An inbound message from a connected client.
contentType: application/json
payload:
$ref: '#/components/schemas/Payload'
ServerMessage:
name: ServerMessage
title: Party to Client Message
summary: A targeted message sent by the party to one connection.
contentType: application/json
payload:
$ref: '#/components/schemas/Payload'
BroadcastMessage:
name: BroadcastMessage
title: Party Broadcast Message
summary: >-
A message fanned out by the party to all connected clients via
`Room.broadcast()`. The party may pass an optional list of
connection ids to exclude from delivery.
contentType: application/json
payload:
$ref: '#/components/schemas/Payload'
schemas:
Payload:
description: >-
PartyKit does not define a payload schema at the transport layer.
The runtime delivers either a UTF-8 string or a binary
`ArrayBuffer` to the developer's handlers; the application is
responsible for serialization (commonly JSON).
oneOf:
- type: string
description: A UTF-8 string payload.
- type: string
format: binary
description: A binary payload delivered as an ArrayBuffer.