Files
soulseek-rs-modded/soulseek-rs/docs/openrpc.json
T
Michel de Graaf d6d870b39f feat(tui): account settings — stats, password change, and logout
The settings popup opens with an Account block: who the session is logged in
as, how much it shares, the port peers reach it on, and the daemon it borrows
when the window is attached to one. Two rows follow, both confirmed before
they act. A password is typed twice, because the server sends no verdict on a
change and a typo entered once would leave the account with a password nobody
knows. Logging out closes the window and comes back to the login screen with
the stored password deleted, so the next start asks rather than walking
straight back in. A window attached to a daemon offers no logout: the login is
the daemon's.

"Change it on the server, then store it where the login lives" is one function
over the session and the secret store, so the window, the command and the
daemon share the rule rather than each spelling out its own idea of which
process owns the password.

Headless the same two acts are `account password` and `account logout`, and
the daemon answers `account.password` so a routed run is not a dead end —
`whoami` already reported who is logged in and what they share.
2026-09-10 11:10:58 +02:00

2528 lines
59 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"
},
"PasswordParams": {
"description": "A new password for the account the daemon is logged in as. Plain text on\nthe wire, like the token: the transport is the local socket, or TCP behind\nan SSH tunnel (see docs/daemon-protocol.md).",
"properties": {
"password": {
"type": "string"
}
},
"required": [
"password"
],
"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": "account.password",
"paramStructure": "by-name",
"params": [
{
"name": "password",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "result",
"schema": {
"$ref": "#/components/schemas/Ack"
}
},
"summary": "Change the password of the account the daemon is logged in as, and store it on the daemon's host so a restart still logs in."
},
{
"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"
}