Files
soulseek-rs-modded/soulseek-rs/docs/openrpc.json
T
Michel de Graaf 19791d1699 feat(rooms): private room membership, operators and refusals
Private rooms were unreachable: the client could ask to join one but had
no way to invite, promote, resign or be told what happened, and a room
name already owned by someone else came back as silence rather than a
refusal (code 1003).

Adds the rosters the server pushes after login (133/148), the changes it
narrates to them (134/135, 143/144), our own standing (139/140, 145/146),
and the messages that drive them, with the rosters kept current in client
state. The daemon protocol and the TUI room transcript carry the new
events rather than dropping them.
2026-09-09 16:33:59 +00:00

2496 lines
58 KiB
JSON

{
"components": {
"schemas": {
"Ack": {
"description": "A void result. JSON-RPC allows a null result, but an object leaves room to\nadd a field later without changing the shape a client already parses.",
"properties": {
"ok": {
"type": "boolean"
}
},
"required": [
"ok"
],
"type": "object"
},
"AuthParams": {
"properties": {
"protocol": {
"default": 0,
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"token": {
"description": "Required on TCP. Omitted on a Unix socket, where the socket's own\npermissions already prove the caller is this user.",
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"AuthResult": {
"properties": {
"daemon_version": {
"type": "string"
},
"protocol": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"username": {
"description": "The Soulseek account the daemon is logged in as.",
"type": "string"
}
},
"required": [
"protocol",
"daemon_version",
"username"
],
"type": "object"
},
"BrowseEvent": {
"description": "A peer answered a browse request. Carried whole rather than as a \"go ask\nfor it\" nudge, because the daemon's own copy is consumed when it drains.",
"properties": {
"directories": {
"items": {
"$ref": "#/components/schemas/SharedDirectoryDto"
},
"type": "array"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"directories"
],
"type": "object"
},
"ChatMessageDto": {
"description": "One line of chat history. Unlike a live [`UserMessageDto`] this carries a\ndirection, because a conversation the daemon collected includes what this\naccount sent as well as what it received.",
"properties": {
"at": {
"description": "Unix seconds.",
"format": "int64",
"type": "integer"
},
"outgoing": {
"type": "boolean"
},
"peer": {
"description": "The other party, whichever way the message went.",
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"peer",
"outgoing",
"text",
"at"
],
"type": "object"
},
"DaemonStatus": {
"description": "What the daemon is and what its session is doing, from `daemon.status`.",
"properties": {
"clients": {
"description": "Control connections currently attached.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"daemon_version": {
"type": "string"
},
"download_dir": {
"type": "string"
},
"listen_port": {
"default": null,
"format": "uint16",
"maximum": 65535,
"minimum": 0,
"type": [
"integer",
"null"
]
},
"protocol": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"server": {
"type": "string"
},
"session_loss": {
"anyOf": [
{
"$ref": "#/components/schemas/SessionLossDto"
},
{
"type": "null"
}
],
"default": null
},
"shared_files": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"shared_folders": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"uptime_secs": {
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"server",
"daemon_version",
"protocol",
"shared_folders",
"shared_files",
"download_dir",
"clients",
"uptime_secs"
],
"type": "object"
},
"DirectoriesParams": {
"properties": {
"directories": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"directories"
],
"type": "object"
},
"DirectoryParams": {
"description": "Where the daemon should land transfers from now on, on *its* filesystem.\nThe same trust as `shares.set`: an authenticated caller is the owner.",
"properties": {
"directory": {
"type": "string"
}
},
"required": [
"directory"
],
"type": "object"
},
"DownloadDto": {
"properties": {
"download_directory": {
"type": "string"
},
"filename": {
"type": "string"
},
"metadata": {
"$ref": "#/components/schemas/DownloadMetadataDto",
"default": {
"bitrate": null,
"length_seconds": null,
"peer_free_slots": null,
"peer_upload_speed": null
}
},
"queue_position": {
"default": null,
"format": "uint32",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"size": {
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"status": {
"$ref": "#/components/schemas/DownloadStatusDto"
},
"token": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"filename",
"token",
"size",
"download_directory",
"status"
],
"type": "object"
},
"DownloadMetadataDto": {
"properties": {
"bitrate": {
"default": null,
"format": "uint32",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"length_seconds": {
"default": null,
"format": "uint32",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"peer_free_slots": {
"default": null,
"format": "uint8",
"maximum": 255,
"minimum": 0,
"type": [
"integer",
"null"
]
},
"peer_upload_speed": {
"default": null,
"format": "uint32",
"minimum": 0,
"type": [
"integer",
"null"
]
}
},
"type": "object"
},
"DownloadStartParams": {
"properties": {
"filename": {
"type": "string"
},
"metadata": {
"$ref": "#/components/schemas/DownloadMetadataDto",
"default": {
"bitrate": null,
"length_seconds": null,
"peer_free_slots": null,
"peer_upload_speed": null
}
},
"size": {
"default": 0,
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"filename"
],
"type": "object"
},
"DownloadStarted": {
"properties": {
"download": {
"$ref": "#/components/schemas/DownloadDto"
}
},
"required": [
"download"
],
"type": "object"
},
"DownloadStatusDto": {
"oneOf": [
{
"properties": {
"state": {
"const": "queued",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"bytes_downloaded": {
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"speed_bytes_per_sec": {
"format": "double",
"type": "number"
},
"state": {
"const": "in_progress",
"type": "string"
},
"total_bytes": {
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"state",
"bytes_downloaded",
"total_bytes",
"speed_bytes_per_sec"
],
"type": "object"
},
{
"properties": {
"bytes_downloaded": {
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"state": {
"const": "paused",
"type": "string"
},
"total_bytes": {
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"state",
"bytes_downloaded",
"total_bytes"
],
"type": "object"
},
{
"properties": {
"state": {
"const": "completed",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"state": {
"const": "cancelled",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"reason": {
"type": [
"string",
"null"
]
},
"state": {
"const": "failed",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"state": {
"const": "timed_out",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
}
]
},
"DownloadStatusEvent": {
"description": "One step in a transfer this client started.",
"properties": {
"filename": {
"type": "string"
},
"status": {
"$ref": "#/components/schemas/DownloadStatusDto"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"filename",
"status"
],
"type": "object"
},
"Downloads": {
"properties": {
"downloads": {
"items": {
"$ref": "#/components/schemas/DownloadDto"
},
"type": "array"
}
},
"required": [
"downloads"
],
"type": "object"
},
"FileDto": {
"properties": {
"attribs": {
"additionalProperties": false,
"description": "Soulseek attribute codes (0 = bitrate, 1 = duration in seconds).",
"patternProperties": {
"^\\d+$": {
"format": "uint32",
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"name": {
"type": "string"
},
"size": {
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"name",
"size",
"attribs"
],
"type": "object"
},
"IntervalSeconds": {
"properties": {
"seconds": {
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"seconds"
],
"type": "object"
},
"MemberStats": {
"description": "What the server said about each member of a room when it was joined.",
"properties": {
"members": {
"items": {
"$ref": "#/components/schemas/RoomUserStatsDto"
},
"type": "array"
}
},
"required": [
"members"
],
"type": "object"
},
"Members": {
"properties": {
"users": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"users"
],
"type": "object"
},
"MessageParams": {
"properties": {
"message": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"message"
],
"type": "object"
},
"Messages": {
"properties": {
"messages": {
"items": {
"$ref": "#/components/schemas/ChatMessageDto"
},
"type": "array"
}
},
"required": [
"messages"
],
"type": "object"
},
"QueryParams": {
"properties": {
"query": {
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"RoomEventDto": {
"oneOf": [
{
"properties": {
"event": {
"const": "list",
"type": "string"
},
"rooms": {
"items": {
"$ref": "#/components/schemas/RoomInfoDto"
},
"type": "array"
}
},
"required": [
"event",
"rooms"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "joined",
"type": "string"
},
"room": {
"type": "string"
},
"users": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"event",
"room",
"users"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "left",
"type": "string"
},
"room": {
"type": "string"
}
},
"required": [
"event",
"room"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "message",
"type": "string"
},
"message": {
"type": "string"
},
"room": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username",
"message"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "user_joined",
"type": "string"
},
"room": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "user_left",
"type": "string"
},
"room": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username"
],
"type": "object"
},
{
"description": "The ticker board of a room, sent on join.",
"properties": {
"event": {
"const": "tickers",
"type": "string"
},
"room": {
"type": "string"
},
"tickers": {
"items": {
"$ref": "#/components/schemas/RoomTickerDto"
},
"type": "array"
}
},
"required": [
"event",
"room",
"tickers"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "ticker_added",
"type": "string"
},
"room": {
"type": "string"
},
"ticker": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username",
"ticker"
],
"type": "object"
},
{
"properties": {
"event": {
"const": "ticker_removed",
"type": "string"
},
"room": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username"
],
"type": "object"
},
{
"description": "A message from the global room feed; `room` names where it was said.",
"properties": {
"event": {
"const": "global_message",
"type": "string"
},
"message": {
"type": "string"
},
"room": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username",
"message"
],
"type": "object"
},
{
"description": "Who may enter a private room.",
"properties": {
"event": {
"const": "private_members",
"type": "string"
},
"room": {
"type": "string"
},
"users": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"event",
"room",
"users"
],
"type": "object"
},
{
"description": "Who runs a private room.",
"properties": {
"event": {
"const": "private_operators",
"type": "string"
},
"room": {
"type": "string"
},
"users": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"event",
"room",
"users"
],
"type": "object"
},
{
"description": "A private room's member (`members` true) or operator roster changed.",
"properties": {
"added": {
"type": "boolean"
},
"event": {
"const": "private_roster_changed",
"type": "string"
},
"members": {
"type": "boolean"
},
"room": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"event",
"room",
"username",
"members",
"added"
],
"type": "object"
},
{
"description": "Our own membership or operatorship of a private room changed.",
"properties": {
"event": {
"const": "own_standing_changed",
"type": "string"
},
"granted": {
"type": "boolean"
},
"members": {
"type": "boolean"
},
"room": {
"type": "string"
}
},
"required": [
"event",
"room",
"members",
"granted"
],
"type": "object"
},
{
"description": "The room we asked to join could not be created.",
"properties": {
"event": {
"const": "cant_create",
"type": "string"
},
"room": {
"type": "string"
}
},
"required": [
"event",
"room"
],
"type": "object"
}
]
},
"RoomInfoDto": {
"properties": {
"name": {
"type": "string"
},
"user_count": {
"format": "uint32",
"minimum": 0,
"type": "integer"
}
},
"required": [
"name",
"user_count"
],
"type": "object"
},
"RoomRef": {
"properties": {
"room": {
"type": "string"
}
},
"required": [
"room"
],
"type": "object"
},
"RoomTickerDto": {
"description": "One user's ticker in a room.",
"properties": {
"ticker": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"ticker"
],
"type": "object"
},
"RoomUserStatsDto": {
"description": "One member of a room, as the JoinRoom reply described them.",
"properties": {
"average_speed": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"country": {
"type": [
"string",
"null"
]
},
"shared_files": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"shared_folders": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"slots_full": {
"description": "True when the member's upload slots are all occupied.",
"type": "boolean"
},
"status": {
"description": "`online`, `away`, or `offline`.",
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"status",
"average_speed",
"shared_files",
"shared_folders",
"slots_full"
],
"type": "object"
},
"SayParams": {
"properties": {
"message": {
"type": "string"
},
"room": {
"type": "string"
}
},
"required": [
"room",
"message"
],
"type": "object"
},
"SearchResultDto": {
"properties": {
"files": {
"items": {
"$ref": "#/components/schemas/FileDto"
},
"type": "array"
},
"slots": {
"format": "uint8",
"maximum": 255,
"minimum": 0,
"type": "integer"
},
"speed": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"token": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"username": {
"type": "string"
}
},
"required": [
"token",
"username",
"slots",
"speed",
"files"
],
"type": "object"
},
"SearchResults": {
"properties": {
"results": {
"items": {
"$ref": "#/components/schemas/SearchResultDto"
},
"type": "array"
}
},
"required": [
"results"
],
"type": "object"
},
"SearchSummary": {
"description": "One search as the daemon sees it, for a client that did not run it.",
"properties": {
"files": {
"description": "Files found so far, across every peer that has answered.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"query": {
"type": "string"
},
"started_secs_ago": {
"description": "How long ago the query went out. A client compares this with its own\nsearch window to decide whether the search is still collecting.",
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"query",
"files",
"started_secs_ago"
],
"type": "object"
},
"Searches": {
"description": "Every search this session has run, newest last. Shared by all clients, so\na second one attaching sees what the first has been looking for.",
"properties": {
"searches": {
"items": {
"$ref": "#/components/schemas/SearchSummary"
},
"type": "array"
}
},
"required": [
"searches"
],
"type": "object"
},
"Seconds": {
"properties": {
"seconds": {
"default": null,
"format": "uint32",
"minimum": 0,
"type": [
"integer",
"null"
]
}
},
"type": "object"
},
"SessionLossDto": {
"enum": [
"displaced",
"disconnected"
],
"type": "string"
},
"SessionLossEvent": {
"properties": {
"loss": {
"$ref": "#/components/schemas/SessionLossDto"
}
},
"required": [
"loss"
],
"type": "object"
},
"SharedDirectoryDto": {
"properties": {
"files": {
"items": {
"$ref": "#/components/schemas/SharedFileEntryDto"
},
"type": "array"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"files"
],
"type": "object"
},
"SharedFileEntryDto": {
"properties": {
"attributes": {
"description": "`(code, value)` audio attributes the owner advertises.",
"items": {
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"format": "uint32",
"minimum": 0,
"type": "integer"
},
{
"format": "uint32",
"minimum": 0,
"type": "integer"
}
],
"type": "array"
},
"type": "array"
},
"name": {
"description": "Basename; join with the directory to get a downloadable path.",
"type": "string"
},
"size": {
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"name",
"size",
"attributes"
],
"type": "object"
},
"SharesStatus": {
"description": "What the share index holds, from `shares.status` / `shares.reindex`.",
"properties": {
"directories": {
"items": {
"type": "string"
},
"type": "array"
},
"files": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"folders": {
"format": "uint32",
"minimum": 0,
"type": "integer"
}
},
"required": [
"folders",
"files",
"directories"
],
"type": "object"
},
"SlotsParams": {
"properties": {
"slots": {
"format": "uint",
"minimum": 0,
"type": "integer"
}
},
"required": [
"slots"
],
"type": "object"
},
"TransferRef": {
"description": "Names one transfer, which is how both directions are addressed.",
"properties": {
"filename": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"filename"
],
"type": "object"
},
"UploadInfoDto": {
"properties": {
"bytes_sent": {
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"filename": {
"type": "string"
},
"size": {
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"speed_bytes_per_sec": {
"format": "double",
"type": "number"
},
"status": {
"$ref": "#/components/schemas/UploadStatusDto"
},
"username": {
"type": "string"
}
},
"required": [
"username",
"filename",
"size",
"bytes_sent",
"status",
"speed_bytes_per_sec"
],
"type": "object"
},
"UploadStatusDto": {
"oneOf": [
{
"description": "Waiting for a slot, at this 1-based place in the queue.",
"properties": {
"place": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"state": {
"const": "queued",
"type": "string"
}
},
"required": [
"state",
"place"
],
"type": "object"
},
{
"properties": {
"state": {
"const": "in_progress",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"state": {
"const": "completed",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"state": {
"const": "cancelled",
"type": "string"
}
},
"required": [
"state"
],
"type": "object"
},
{
"properties": {
"reason": {
"type": "string"
},
"state": {
"const": "failed",
"type": "string"
}
},
"required": [
"state",
"reason"
],
"type": "object"
}
]
},
"Uploads": {
"properties": {
"uploads": {
"items": {
"$ref": "#/components/schemas/UploadInfoDto"
},
"type": "array"
}
},
"required": [
"uploads"
],
"type": "object"
},
"UserInfoDto": {
"description": "Each half is `None` until its reply lands, so a consumer can tell \"the\nserver said offline\" from \"the server has not answered yet\".",
"properties": {
"presence": {
"anyOf": [
{
"$ref": "#/components/schemas/UserPresenceDto"
},
{
"type": "null"
}
],
"default": null
},
"stats": {
"anyOf": [
{
"$ref": "#/components/schemas/UserStatsDto"
},
{
"type": "null"
}
],
"default": null
},
"username": {
"type": "string"
}
},
"required": [
"username"
],
"type": "object"
},
"UserMessageDto": {
"properties": {
"id": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"new_message": {
"type": "boolean"
},
"timestamp": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"username": {
"type": "string"
}
},
"required": [
"id",
"timestamp",
"username",
"message",
"new_message"
],
"type": "object"
},
"UserPresenceDto": {
"properties": {
"privileged": {
"type": "boolean"
},
"status": {
"description": "`online`, `away`, or `offline`.",
"type": "string"
}
},
"required": [
"status",
"privileged"
],
"type": "object"
},
"UserRef": {
"properties": {
"username": {
"type": "string"
}
},
"required": [
"username"
],
"type": "object"
},
"UserResult": {
"properties": {
"user": {
"anyOf": [
{
"$ref": "#/components/schemas/UserInfoDto"
},
{
"type": "null"
}
],
"default": null
}
},
"type": "object"
},
"UserStatsDto": {
"properties": {
"average_speed": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"shared_files": {
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"shared_folders": {
"format": "uint32",
"minimum": 0,
"type": "integer"
}
},
"required": [
"average_speed",
"shared_files",
"shared_folders"
],
"type": "object"
},
"Watched": {
"description": "Everyone this session is watching, sorted by name.",
"properties": {
"users": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"users"
],
"type": "object"
}
}
},
"info": {
"description": "Control a running soulseek-rs daemon. Newline-delimited JSON-RPC 2.0 over a Unix socket (local, authenticated by socket permissions) or TCP (remote, authenticated by the token in <state-dir>/daemon.token). `auth` must be the first request on a connection. Errors carry the CLI exit status in `error.data.exit`. Entries marked `x-notification` are pushed by the daemon and are never requested.",
"license": {
"name": "MIT"
},
"title": "soulseek-rs daemon",
"version": "2"
},
"methods": [
{
"name": "auth",
"paramStructure": "by-name",
"params": [
{
"name": "protocol",
"required": false,
"schema": {
"default": 0,
"format": "uint32",
"minimum": 0,
"type": "integer"
}
},
{
"name": "token",
"required": false,
"schema": {
"description": "Required on TCP. Omitted on a Unix socket, where the socket's own\npermissions already prove the caller is this user.",
"type": [
"string",
"null"
]
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/AuthResult"
}
},
"summary": "Authenticate. Must be the first request on a connection."
},
{
"name": "daemon.status",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/DaemonStatus"
}
},
"summary": "Who the daemon is logged in as and what its session is doing."
},
{
"name": "daemon.stop",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Ask the daemon to shut down."
},
{
"name": "rpc.discover",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"type": "object"
}
},
"summary": "This document."
},
{
"name": "search.start",
"paramStructure": "by-name",
"params": [
{
"name": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Put a search on the wire and return at once; results accumulate."
},
{
"name": "search.results",
"paramStructure": "by-name",
"params": [
{
"name": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/SearchResults"
}
},
"summary": "Everything that has answered a search so far."
},
{
"name": "search.list",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Searches"
}
},
"summary": "Every search this session has run, shared by all clients."
},
{
"name": "search.forget",
"paramStructure": "by-name",
"params": [
{
"name": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Drop a search and its results, for every client at once."
},
{
"name": "search.wishlist",
"paramStructure": "by-name",
"params": [
{
"name": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Send a query as a wishlist search (server code 103)."
},
{
"name": "search.wishlist_interval",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/IntervalSeconds"
}
},
"summary": "How long the server wants between wishlist searches."
},
{
"name": "download.start",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "metadata",
"required": false,
"schema": {
"$ref": "#/components/schemas/DownloadMetadataDto",
"default": {
"bitrate": null,
"length_seconds": null,
"peer_free_slots": null,
"peer_upload_speed": null
}
}
},
{
"name": "size",
"required": false,
"schema": {
"default": 0,
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/DownloadStarted"
}
},
"summary": "Queue a transfer. Progress arrives as event.download_status."
},
{
"name": "download.list",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Downloads"
}
},
"summary": "Every transfer the daemon knows about."
},
{
"name": "download.pause",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Pause a transfer in progress."
},
{
"name": "download.resume",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Resume a paused transfer."
},
{
"name": "download.remove",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Forget a transfer entirely."
},
{
"name": "download.remove_queued",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Drop a transfer that has not started."
},
{
"name": "download.cancel",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Stop a download, queued or in progress; its partial file is deleted."
},
{
"name": "download.set_dir",
"paramStructure": "by-name",
"params": [
{
"name": "directory",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Land future transfers in a different folder on the daemon's host."
},
{
"name": "upload.list",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Uploads"
}
},
"summary": "Uploads being served, active first."
},
{
"name": "upload.cancel",
"paramStructure": "by-name",
"params": [
{
"name": "filename",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Stop serving an upload in progress."
},
{
"name": "upload.slots",
"paramStructure": "by-name",
"params": [
{
"name": "slots",
"required": true,
"schema": {
"format": "uint",
"minimum": 0,
"type": "integer"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "How many uploads may run at once."
},
{
"name": "privileges.check",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Ask the server for this account's privilege time."
},
{
"name": "privileges.own",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Seconds"
}
},
"summary": "Privilege seconds left, or null if the server has not answered."
},
{
"name": "room.list_request",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Ask the server for the public room list; it arrives as event.room."
},
{
"name": "room.join",
"paramStructure": "by-name",
"params": [
{
"name": "room",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Join a chat room."
},
{
"name": "room.leave",
"paramStructure": "by-name",
"params": [
{
"name": "room",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Leave a chat room."
},
{
"name": "room.say",
"paramStructure": "by-name",
"params": [
{
"name": "message",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "room",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Post a message to a room."
},
{
"name": "room.members",
"paramStructure": "by-name",
"params": [
{
"name": "room",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Members"
}
},
"summary": "Who is currently in a room."
},
{
"name": "room.member_stats",
"paramStructure": "by-name",
"params": [
{
"name": "room",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/MemberStats"
}
},
"summary": "What the server said about each member of a joined room."
},
{
"name": "message.send",
"paramStructure": "by-name",
"params": [
{
"name": "message",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Send a private message."
},
{
"name": "message.history",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Messages"
}
},
"summary": "Private messages the daemon collected, including while nobody was attached."
},
{
"name": "browse.user",
"paramStructure": "by-name",
"params": [
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Ask a peer for its share listing; it arrives as event.browse."
},
{
"name": "user.request",
"paramStructure": "by-name",
"params": [
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Ask the server about a user; poll user.info for the answer."
},
{
"name": "user.info",
"paramStructure": "by-name",
"params": [
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/UserResult"
}
},
"summary": "What the server has said about a user so far."
},
{
"name": "user.watch",
"paramStructure": "by-name",
"params": [
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Watch a user, so the server keeps pushing their status."
},
{
"name": "user.unwatch",
"paramStructure": "by-name",
"params": [
{
"name": "username",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Stop watching a user."
},
{
"name": "user.watched",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Watched"
}
},
"summary": "Everyone this session is watching."
},
{
"name": "shares.status",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/SharesStatus"
}
},
"summary": "What the share index currently holds."
},
{
"name": "shares.set",
"paramStructure": "by-name",
"params": [
{
"name": "directories",
"required": true,
"schema": {
"items": {
"type": "string"
},
"type": "array"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/SharesStatus"
}
},
"summary": "Replace the shared folders and re-index."
},
{
"name": "shares.reindex",
"paramStructure": "by-name",
"params": [],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/SharesStatus"
}
},
"summary": "Re-scan the configured folders."
},
{
"name": "event.room",
"paramStructure": "by-name",
"params": [
{
"name": "payload",
"required": true,
"schema": {
"$ref": "#/components/schemas/RoomEventDto"
}
}
],
"result": {
"name": "result",
"schema": {
"type": "null"
}
},
"summary": "Something happened in a room this session has joined.",
"x-notification": true
},
{
"name": "event.message",
"paramStructure": "by-name",
"params": [
{
"name": "payload",
"required": true,
"schema": {
"$ref": "#/components/schemas/UserMessageDto"
}
}
],
"result": {
"name": "result",
"schema": {
"type": "null"
}
},
"summary": "A private message arrived.",
"x-notification": true
},
{
"name": "event.upload",
"paramStructure": "by-name",
"params": [
{
"name": "payload",
"required": true,
"schema": {
"$ref": "#/components/schemas/UploadInfoDto"
}
}
],
"result": {
"name": "result",
"schema": {
"type": "null"
}
},
"summary": "An upload changed state.",
"x-notification": true
},
{
"name": "event.download_status",
"paramStructure": "by-name",
"params": [
{
"name": "payload",
"required": true,
"schema": {
"$ref": "#/components/schemas/DownloadStatusEvent"
}
}
],
"result": {
"name": "result",
"schema": {
"type": "null"
}
},
"summary": "A transfer moved.",
"x-notification": true
},
{
"name": "event.browse",
"paramStructure": "by-name",
"params": [
{
"name": "payload",
"required": true,
"schema": {
"$ref": "#/components/schemas/BrowseEvent"
}
}
],
"result": {
"name": "result",
"schema": {
"type": "null"
}
},
"summary": "A peer answered a browse request.",
"x-notification": true
},
{
"name": "event.session_loss",
"paramStructure": "by-name",
"params": [
{
"name": "payload",
"required": true,
"schema": {
"$ref": "#/components/schemas/SessionLossEvent"
}
}
],
"result": {
"name": "result",
"schema": {
"type": "null"
}
},
"summary": "The server session was lost. A disconnected session is reconnected on its own and events resume; a displaced one is terminal. Read daemon.status for the live state.",
"x-notification": true
}
],
"openrpc": "1.3.2"
}