Compare commits

...

36 commits

Author SHA1 Message Date
Tom Foster 85dc2a4fab
Merge 6183f2410f into 2c734c3c5b 2025-05-21 17:42:38 +01:00
Johannes Marbach 2c734c3c5b
Clarify the meaning of "public rooms" in the room directory (#2104)
Some checks failed
Spec / 🔎 Validate OpenAPI specifications (push) Has been cancelled
Spec / 🔎 Check Event schema examples (push) Has been cancelled
Spec / 🔎 Check OpenAPI definitions examples (push) Has been cancelled
Spec / 🔎 Check JSON Schemas inline examples (push) Has been cancelled
Spec / ⚙️ Calculate baseURL for later jobs (push) Has been cancelled
Spec / 📢 Run towncrier for changelog (push) Has been cancelled
Spell Check / Spell Check with Typos (push) Has been cancelled
Spec / 🐍 Build OpenAPI definitions (push) Has been cancelled
Spec / 📖 Build the spec (push) Has been cancelled
Spec / 🔎 Validate generated HTML (push) Has been cancelled
Spec / 📖 Build the historical backup spec (push) Has been cancelled
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Kim Brose <2803622+HarHarLinks@users.noreply.github.com>
Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com>
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
2025-05-21 16:43:02 +01:00
Andy Balaam 075d203ecd
Fix typo: as->has (#2144)
Signed-off-by: Andy Balaam <andy.balaam@matrix.org>
2025-05-21 16:34:29 +01:00
Tom Foster 6183f2410f Clarify value validation requirements 2025-02-21 10:32:28 +00:00
Tom Foster dd4ea948b6 Clarify why avatar_url and displayname can't be returned as null 2025-02-21 09:53:43 +00:00
Tom Foster 50eab3501e Standardise line-wrapping and update avatar_url format to mx-mxc-uri 2025-02-21 09:28:46 +00:00
Tom Foster 37b1362bc1 Attempt to describe variable payload content 2025-02-20 18:08:10 +00:00
Tom Foster d8cc250d20 Tag x-addedInMatrixVersion on additionalProperties in entire profile GET 2025-02-20 17:02:23 +00:00
Tom Foster b5e2edf2e5 Add x-addedInMatrixVersion 2025-02-20 16:59:44 +00:00
Tom Foster 7ef1d9d0ec Add x-changedInMatrixVersion 2025-02-20 16:56:53 +00:00
Tom Foster 3a5e5555fa Correct PUT/GET payload definitions 2025-02-20 16:48:20 +00:00
Tom Foster 9889fe3584 Use more accessible terminology than "glob" 2025-02-20 16:40:07 +00:00
Tom Foster 013502b0c0 Mention replacement for m.set_displayname and m.set_avatar_url capability deprecation 2025-02-20 16:35:26 +00:00
Tom Foster 9859e20927 Don't use reference for capability. 2025-02-20 16:31:27 +00:00
Tom Foster 7a3b0c0804 Clarify in change log that m.set_avatar_url and m.set_displayname capabilities are now deprecated 2025-02-14 15:03:17 +00:00
Tom Foster 0b0942d192 Clarify capability lists should support wildcards 2025-02-14 15:00:53 +00:00
Tom Foster 1cc93ec951 Attempt to make descriptions look better in HTML rendered spec 2025-02-14 14:53:29 +00:00
Tom Foster 79af78022e Camel case for endpoint variables 2025-02-14 13:47:49 +00:00
Tom Foster 17af55ddce Fix broken link 2025-02-14 13:30:33 +00:00
Tom Foster 79a1cded02 Remove reference to spec version in m.profile_field capability 2025-02-14 12:57:51 +00:00
Tom Foster 76b48e25d0 Specify CNIG pattern for custom fields 2025-02-14 12:56:16 +00:00
Tom Foster 5d5b561140 Deprecate m.set_displayname and m.set_avatar_url capabilities 2025-02-14 12:47:14 +00:00
Tom Foster 9327793007 Inline information from MSC4133, remove links 2025-02-14 12:39:19 +00:00
Tom Foster f3c269d951 Added capability 2025-02-14 12:20:25 +00:00
Tom Foster 3311b084bf Alphabetise avatar_url and displayname and remove redundant descriptions on displayname 2025-02-14 12:03:49 +00:00
Tom Foster 992cf9dc35 Clarify null behaviour for PUT and DELETE 2025-02-14 11:53:19 +00:00
Tom Foster 4f8999be0a Tweak wording on full profile GET 2025-02-14 11:32:39 +00:00
Tom Foster 82adcec491 Clarify avatar_url should be MXC 2025-02-14 11:21:45 +00:00
Tom Foster 41c64c877b Linkify MSC4133 in change log 2025-02-14 11:16:40 +00:00
Tom Foster 8e9874ad22 Simplify change log 2025-02-14 11:15:00 +00:00
Tom Foster ee9b5ddcca Correct types and errors 2025-02-14 11:02:11 +00:00
Tom Foster 59d2c62d2d Link to MSC4133 in endpoint descriptions 2025-02-14 10:40:09 +00:00
Tom Foster b2e122f308 Update changelog from clarification to feature 2025-02-14 10:12:29 +00:00
Tom Foster 1fc01189f3 2071 change log 2025-02-14 09:59:22 +00:00
Tom Foster 212377e393
Merge branch 'matrix-org:main' into MSC4133 2025-02-14 09:50:59 +00:00
Tom Foster fdc012ac01 Describe MSC4133 profile endpoint changes 2025-02-13 17:54:21 +00:00
17 changed files with 322 additions and 276 deletions

View file

@ -0,0 +1 @@
Feature: Update profile endpoints to become generic to support [MSC4133](https://github.com/matrix-org/matrix-spec-proposals/pull/4133) extended fields. Extended profile fields are now supported via the new `m.profile_fields` capability, which deprecates the previous `m.set_avatar_url` and `m.set_displayname` capabilities. Stabilised keys are explicitly enumerated, and custom keys must conform to the Common Namespaced Identifier Grammar.

View file

@ -0,0 +1 @@
Rooms published in `/publicRooms` don't necessarily have `public` join rules or `world_readable` history visibility.

View file

@ -0,0 +1 @@
Fix typo: as->has.

View file

@ -0,0 +1 @@
Rooms published in `/publicRooms` don't necessarily have `public` join rules or `world_readable` history visibility.

View file

@ -492,10 +492,10 @@ via the query string). It is expected that the application service use
the transactions pushed to it to handle events rather than syncing with the transactions pushed to it to handle events rather than syncing with
the user implied by `sender_localpart`. the user implied by `sender_localpart`.
#### Application service room directories #### Published room directories
Application services can maintain their own room directories for their Application services can maintain their own published room directories for
defined third-party protocols. These room directories may be accessed by their defined third-party protocols. These directories may be accessed by
clients through additional parameters on the `/publicRooms` clients through additional parameters on the `/publicRooms`
client-server endpoint. client-server endpoint.

View file

@ -2846,7 +2846,35 @@ re-invited.
{{% http-api spec="client-server" api="banning" %}} {{% http-api spec="client-server" api="banning" %}}
### Listing rooms ### Published room directory
Homeservers MAY publish a room directory to allow users to discover rooms. A room
can have one of two visibility settings in the directory:
- `public`: The room will be shown in the published room directory.
- `private`: The room will be hidden from the published room directory.
Clients can define a room's initial visibility in the directory via the `visibility`
parameter in [`/createRoom`](#post_matrixclientv3createroom). Irrespective of room
creation, clients can query and change a room's visibility in the directory through
the endpoints listed below, provided that the server permits this.
{{% boxes/warning %}}
The visibility setting merely defines whether a room is included in the published
room directory or not. It doesn't make any guarantees about the room's
[join rule](#mroomjoin_rules) or [history visibility](#room-history-visibility).
In particular, a visibility setting of `public` should not be confused with a `public`
join rule. Rooms with a join rule of `knock`, for instance, could reasonably be published
in the directory, too.
Similarly, a visibility setting of `public` does not necessarily imply a `world_readable`
history visibility.
To increase performance or by preference, servers MAY apply additional filters when listing the
directory, for instance, by automatically excluding rooms with `invite` join rules
that are not `world_readable` regardless of their visibility.
{{% /boxes/warning %}}
{{% http-api spec="client-server" api="list_public_rooms" %}} {{% http-api spec="client-server" api="list_public_rooms" %}}

View file

@ -528,7 +528,7 @@ messages, Alice only sends one request event (an event with type
`m.room.message` with `msgtype: m.key.verification.request`, rather than an `m.room.message` with `msgtype: m.key.verification.request`, rather than an
event with type `m.key.verification.request`), to the room. In addition, Alice event with type `m.key.verification.request`), to the room. In addition, Alice
does not send an `m.key.verification.cancel` event to tell Bob's other devices does not send an `m.key.verification.cancel` event to tell Bob's other devices
that the request as already been accepted; instead, when Bob's other devices that the request has already been accepted; instead, when Bob's other devices
see his `m.key.verification.ready` event, they will know that the request has see his `m.key.verification.ready` event, they will know that the request has
already been accepted, and that they should ignore the request. already been accepted, and that they should ignore the request.

View file

@ -63,7 +63,7 @@ for sending events:
The following API endpoints are allowed to be accessed by guest accounts The following API endpoints are allowed to be accessed by guest accounts
for their own account maintenance: for their own account maintenance:
* [PUT /profile/{userId}/displayname](#put_matrixclientv3profileuseriddisplayname) * [PUT /profile/{userId}/{key_name}](#put_matrixclientv3profileuseridkeyname)
* [GET /devices](#get_matrixclientv3devices) * [GET /devices](#get_matrixclientv3devices)
* [GET /devices/{deviceId}](#get_matrixclientv3devicesdeviceid) * [GET /devices/{deviceId}](#get_matrixclientv3devicesdeviceid)
* [PUT /devices/{deviceId}](#put_matrixclientv3devicesdeviceid) * [PUT /devices/{deviceId}](#put_matrixclientv3devicesdeviceid)

View file

@ -1048,11 +1048,10 @@ user's Matrix ID and the token delivered when the invite was stored,
this verification will prove that the `m.room.member` invite event comes this verification will prove that the `m.room.member` invite event comes
from the user owning the invited third-party identifier. from the user owning the invited third-party identifier.
## Public Room Directory ## Published Room Directory
To complement the [Client-Server To complement the [room directory in the Client-Server API](/client-server-api#published-room-directory),
API](/client-server-api)'s room directory, homeservers need a way to query the published rooms of another server.
homeservers need a way to query the public rooms for another server.
This can be done by making a request to the `/publicRooms` endpoint for This can be done by making a request to the `/publicRooms` endpoint for
the server the room directory should be retrieved for. the server the room directory should be retrieved for.

View file

@ -13,18 +13,21 @@
# limitations under the License. # limitations under the License.
openapi: 3.1.0 openapi: 3.1.0
info: info:
title: Matrix Client-Server Application Service Room Directory API title: Matrix Client-Server Application Service Published Room Directory API
version: 1.0.0 version: 1.0.0
paths: paths:
"/directory/list/appservice/{networkId}/{roomId}": "/directory/list/appservice/{networkId}/{roomId}":
put: put:
summary: Updates a room's visibility in the application service's room directory. summary: |-
description: |- Updates a room's visibility in the application service's published room
Updates the visibility of a given room on the application service's room
directory. directory.
description: |-
Updates the visibility of a given room in the application service's
published room directory.
This API is similar to the room directory visibility API used by clients This API is similar to the
to update the homeserver's more general room directory. [visibility API](/client-server-api#put_matrixclientv3directorylistroomroomid)
used by clients to update the homeserver's more general published room directory.
This API requires the use of an application service access token (`as_token`) This API requires the use of an application service access token (`as_token`)
instead of a typical client's access_token. This API cannot be invoked by instead of a typical client's access_token. This API cannot be invoked by

View file

@ -73,11 +73,17 @@ paths:
- default - default
- available - available
m.set_displayname: m.set_displayname:
deprecated: true
$ref: '#/components/schemas/booleanCapability' $ref: '#/components/schemas/booleanCapability'
description: Capability to indicate if the user can change their display name. description: |
**Deprecated:** Capability to indicate if the user can change their display name.
Please refer to `m.profile_fields` for extended profile management.
m.set_avatar_url: m.set_avatar_url:
deprecated: true
$ref: '#/components/schemas/booleanCapability' $ref: '#/components/schemas/booleanCapability'
description: Capability to indicate if the user can change their avatar. description: |
**Deprecated:** Capability to indicate if the user can change their avatar.
Please refer to `m.profile_fields` for extended profile management.
m.3pid_changes: m.3pid_changes:
$ref: '#/components/schemas/booleanCapability' $ref: '#/components/schemas/booleanCapability'
description: Capability to indicate if the user can change 3PID associations description: Capability to indicate if the user can change 3PID associations
@ -86,6 +92,37 @@ paths:
$ref: '#/components/schemas/booleanCapability' $ref: '#/components/schemas/booleanCapability'
description: Capability to indicate if the user can generate tokens to log further description: Capability to indicate if the user can generate tokens to log further
clients into their account. clients into their account.
m.profile_fields:
x-addedInMatrixVersion: "1.14"
type: object
title: ProfileFieldsCapability
description: Capability to indicate if the user can set or modify extended profile fields.
If absent, clients should assume custom profile fields are supported.
properties:
allowed:
type: array
description: List of allowed additional custom profile field keys. A `*` can be used as a
wildcard to match any sequence of characters. This list takes precedence over the
disallowed list if both are provided.
items:
type: string
example:
- "m.example_field"
- "org.example/job_title"
disallowed:
type: array
description: List of disallowed additional custom profile field keys. A `*` can be used as
a wildcard to match any sequence of characters. Ignored if an allowed list is provided.
items:
type: string
example:
- "org.example.secret_field"
enabled:
type: boolean
description: True if the user can set or modify any extended profile fields, false otherwise.
example: true
required:
- enabled
examples: examples:
response: response:
value: { value: {

View file

@ -87,12 +87,9 @@ paths:
- public - public
- private - private
description: |- description: |-
A `public` visibility indicates that the room will be shown The room's visibility in the server's
in the published room list. A `private` visibility will hide [published room directory](/client-server-api#published-room-directory).
the room from the published room list. Rooms default to Defaults to `private`.
`private` visibility if this key is not included. NB: This
should not be confused with `join_rules` which also uses the
word `public`.
room_alias_name: room_alias_name:
type: string type: string
description: |- description: |-

View file

@ -13,7 +13,7 @@
# limitations under the License. # limitations under the License.
type: object type: object
title: "PublicRoomsChunk" title: "PublishedRoomsChunk"
properties: properties:
canonical_alias: canonical_alias:
type: string type: string

View file

@ -13,28 +13,15 @@
# limitations under the License. # limitations under the License.
type: object type: object
description: A list of the rooms on the server. description: A list of the published rooms on the server.
required: ["chunk"] required: ["chunk"]
properties: properties:
chunk: chunk:
type: array type: array
description: |- description: |-
A paginated chunk of public rooms. A paginated chunk of published rooms.
items: items:
allOf: $ref: "public_rooms_chunk.yaml"
- $ref: "public_rooms_chunk.yaml"
- type: object
title: PublicRoomsChunk
properties:
# Override description of join_rule
join_rule:
type: string
description: |-
The room's join rule. When not present, the room is assumed to
be `public`. Note that rooms with `invite` join rules are not
expected here, but rooms with `knock` rules are given their
near-public nature.
example: "public"
next_batch: next_batch:
type: string type: string
description: |- description: |-
@ -50,7 +37,7 @@ properties:
total_room_count_estimate: total_room_count_estimate:
type: integer type: integer
description: |- description: |-
An estimate on the total number of public rooms, if the An estimate on the total number of published rooms, if the
server has an estimate. server has an estimate.
example: { example: {
"chunk": [ "chunk": [

View file

@ -13,14 +13,15 @@
# limitations under the License. # limitations under the License.
openapi: 3.1.0 openapi: 3.1.0
info: info:
title: Matrix Client-Server Room Directory API title: Matrix Client-Server Published Room Directory API
version: 1.0.0 version: 1.0.0
paths: paths:
"/directory/list/room/{roomId}": "/directory/list/room/{roomId}":
get: get:
summary: Gets the visibility of a room in the directory summary: Gets the visibility of a room in the directory
description: Gets the visibility of a given room on the server's public room description: |-
directory. Gets the visibility of a given room in the server's
published room directory.
operationId: getRoomVisibilityOnDirectory operationId: getRoomVisibilityOnDirectory
parameters: parameters:
- in: path - in: path
@ -32,7 +33,7 @@ paths:
type: string type: string
responses: responses:
"200": "200":
description: The visibility of the room in the directory description: The visibility of the room in the directory.
content: content:
application/json: application/json:
schema: schema:
@ -50,7 +51,7 @@ paths:
"visibility": "public" "visibility": "public"
} }
"404": "404":
description: The room is not known to the server description: The room is not known to the server.
content: content:
application/json: application/json:
schema: schema:
@ -64,14 +65,13 @@ paths:
tags: tags:
- Room discovery - Room discovery
put: put:
summary: Sets the visibility of a room in the room directory summary: Sets the visibility of a room in the directory
description: |- description: |-
Sets the visibility of a given room in the server's public room Sets the visibility of a given room in the server's published room directory.
directory.
Servers may choose to implement additional access control checks Servers MAY implement additional access control checks, for instance,
here, for instance that room visibility can only be changed by to ensure that a room's visibility can only be changed by the room creator
the room creator or a server administrator. or a server administrator.
operationId: setRoomVisibilityOnDirectory operationId: setRoomVisibilityOnDirectory
security: security:
- accessTokenQuery: [] - accessTokenQuery: []
@ -97,11 +97,11 @@ paths:
- public - public
description: |- description: |-
The new visibility setting for the room. The new visibility setting for the room.
Defaults to 'public'. Defaults to `public`.
example: { example: {
"visibility": "public" "visibility": "public"
} }
description: The new visibility for the room on the room directory. description: The new visibility for the room in the published room directory.
required: true required: true
responses: responses:
"200": "200":
@ -114,7 +114,7 @@ paths:
response: response:
value: {} value: {}
"404": "404":
description: The room is not known to the server description: The room is not known to the server.
content: content:
application/json: application/json:
schema: schema:
@ -129,9 +129,9 @@ paths:
- Room discovery - Room discovery
/publicRooms: /publicRooms:
get: get:
summary: Lists the public rooms on the server. summary: Lists a server's published room directory
description: |- description: |-
Lists the public rooms on the server. Lists a server's published room directory.
This API returns paginated responses. The rooms are ordered by the number This API returns paginated responses. The rooms are ordered by the number
of joined members, with the largest rooms first. of joined members, with the largest rooms first.
@ -154,13 +154,13 @@ paths:
- in: query - in: query
name: server name: server
description: |- description: |-
The server to fetch the public room lists from. Defaults to the The server to fetch the published room directory from. Defaults
local server. Case sensitive. to the local server. Case sensitive.
schema: schema:
type: string type: string
responses: responses:
"200": "200":
description: A list of the rooms on the server. description: A list of the published rooms on the server.
content: content:
application/json: application/json:
schema: schema:
@ -168,9 +168,9 @@ paths:
tags: tags:
- Room discovery - Room discovery
post: post:
summary: Lists the public rooms on the server with optional filter. summary: Lists a server's published room directory with an optional filter
description: |- description: |-
Lists the public rooms on the server, with optional filter. Lists a server's published room directory with an optional filter.
This API returns paginated responses. The rooms are ordered by the number This API returns paginated responses. The rooms are ordered by the number
of joined members, with the largest rooms first. of joined members, with the largest rooms first.
@ -182,8 +182,8 @@ paths:
- in: query - in: query
name: server name: server
description: |- description: |-
The server to fetch the public room lists from. Defaults to the The server to fetch the published room directory from. Defaults
local server. Case sensitive. to the local server. Case sensitive.
schema: schema:
type: string type: string
requestBody: requestBody:
@ -253,7 +253,7 @@ paths:
required: true required: true
responses: responses:
"200": "200":
description: A list of the rooms on the server. description: A filtered list of the published rooms on the server.
content: content:
application/json: application/json:
schema: schema:

View file

@ -16,48 +16,105 @@ info:
title: Matrix Client-Server Profile API title: Matrix Client-Server Profile API
version: 1.0.0 version: 1.0.0
paths: paths:
"/profile/{userId}/displayname": "/profile/{userId}/{keyName}":
put: put:
summary: Set the user's display name. x-changedInMatrixVersion:
"1.14": Endpoint now accepts variable `keyName` parameter.
summary: Set a profile field for a user.
description: |- description: |-
This API sets the given user's display name. You must have permission to Set or update a profile field for a user. Must be authenticated with an
set this user's display name, e.g. you need to have their `access_token`. access token authorised to make changes. Servers may impose size limits
operationId: setDisplayName on individual fields, and the total profile must be under 64 KiB.
**Note**: Setting a field to `null` keeps the key but with a `null` value,
which some servers may reject. To remove a field completely, use the
`DELETE` endpoint instead.
operationId: setProfileField
security: security:
- accessTokenQuery: [] - accessTokenQuery: []
- accessTokenBearer: [] - accessTokenBearer: []
parameters: parameters:
- in: path - in: path
name: userId name: userId
description: The user whose display name to set. description: The user whose profile field to set.
required: true required: true
example: "@alice:example.com" example: "@alice:example.com"
schema: schema:
type: string type: string
- in: path
name: keyName
description: The profile field key name to set. It must be either
`avatar_url`, `displayname`, or a custom field following the
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
required: true
example: "displayname"
schema:
type: string
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
requestBody: requestBody:
description: A JSON object containing the property whose name matches
the `keyName` specified in the URL. See `additionalProperties` for
further details.
required: true
content: content:
application/json: application/json:
schema: schema:
type: object type: object
example: { minProperties: 1
"displayname": "Alice Margatroid" additionalProperties:
} description: The JSON object must include a property whose key
properties: matches the `keyName` specified in the URL. For `avatar_url`,
displayname: the value must be an MXC URI string. For `displayname`, the value
type: string must be a string. For custom keys, any JSON type is allowed -
description: The new display name for this user. servers may not validate these values, but clients should follow
description: The new display name information. the format defined for that key.
required: true example: { "displayname": "Alice Wonderland" }
responses: responses:
"200": "200":
description: The display name was set. description: The profile field was set.
content: content:
application/json: application/json:
schema: schema:
type: object # empty json object type: object # empty JSON object
examples: examples:
response: response:
value: {} value: {}
"400":
description: The request is malformed, contains invalid JSON, missing
a required parameter, specifies an invalid key, or exceeds allowed
size limits.
content:
application/json:
schema:
$ref: definitions/errors/error.yaml
examples:
bad_json:
value:
{
"errcode": "M_BAD_JSON",
"error": "Malformed JSON payload.",
}
invalid_key:
value:
{
"errcode": "M_INVALID_PARAM",
"error": "Invalid profile key.",
}
"403":
description: The server is unwilling to perform the operation, either
due to insufficient permissions or because profile modifications
are disabled.
content:
application/json:
schema:
$ref: definitions/errors/error.yaml
examples:
forbidden:
value:
{
"errcode": "M_FORBIDDEN",
"error": "Profile modification is not permitted.",
}
"429": "429":
description: This request was rate-limited. description: This request was rate-limited.
content: content:
@ -67,98 +124,133 @@ paths:
tags: tags:
- User data - User data
get: get:
summary: Get the user's display name. x-changedInMatrixVersion:
description: |- "1.14": Endpoint now accepts variable `keyName` parameter.
Get the user's display name. This API may be used to fetch the user's summary: Get a profile field for a user.
own displayname or to query the name of other users; either locally or description: Get the value of a profile field for a user. Any individual
on remote homeservers. field must be within the total profile limit of 64 KiB.
operationId: getDisplayName operationId: getProfileField
parameters: parameters:
- in: path - in: path
name: userId name: userId
description: The user whose display name to get. description: The user whose profile field to get.
required: true required: true
example: "@alice:example.com" example: "@alice:example.com"
schema: schema:
type: string type: string
- in: path
name: keyName
description: The profile field key name to retrieve. It must be either
`avatar_url`, `displayname`, or a custom field following the
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
required: true
example: "displayname"
schema:
type: string
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
responses: responses:
"200": "200":
description: The display name for this user. description: The profile field value was retrieved.
content: content:
application/json: application/json:
schema: schema:
type: object type: object
properties: minProperties: 1
displayname: additionalProperties:
type: string description: The JSON response includes a property whose key
description: The user's display name if they have set one, otherwise not matches the `keyName` specified in the URL. For `avatar_url`,
present. the value will be an MXC URI string. For `displayname`, the
value will be a string. For custom keys, any JSON type is
possible - clients should expect the format defined for that key.
examples: examples:
response: response:
value: { value: { "displayname": "Alice" }
"displayname": "Alice Margatroid"
}
"403": "403":
x-addedInMatrixVersion: "1.12" x-addedInMatrixVersion: "1.12"
description: The server is unwilling to disclose whether the user exists and/or description: The server is unwilling to disclose whether the user
has a display name. exists and/or has the specified profile field.
content: content:
application/json: application/json:
schema: schema:
$ref: definitions/errors/error.yaml $ref: definitions/errors/error.yaml
examples: examples:
response: response:
value: { value:
{
"errcode": "M_FORBIDDEN", "errcode": "M_FORBIDDEN",
"error": "Profile lookup is disabled on this homeserver" "error": "Profile lookup is disabled on this homeserver",
} }
"404": "404":
description: There is no display name for this user or this user does not exist. description: There is no profile field with this key for this user, or
the user does not exist.
tags: tags:
- User data - User data
"/profile/{userId}/avatar_url": delete:
put: x-addedInMatrixVersion: "1.14"
summary: Set the user's avatar URL. summary: Remove a profile field from a user.
description: |- description: Remove a specific field from a user's profile.
This API sets the given user's avatar URL. You must have permission to operationId: deleteProfileField
set this user's avatar URL, e.g. you need to have their `access_token`.
operationId: setAvatarUrl
security: security:
- accessTokenQuery: [] - accessTokenQuery: []
- accessTokenBearer: [] - accessTokenBearer: []
parameters: parameters:
- in: path - in: path
name: userId name: userId
description: The user whose avatar URL to set. description: The user whose profile field to delete.
required: true required: true
example: "@alice:example.com" example: "@alice:example.com"
schema: schema:
type: string type: string
requestBody: - in: path
name: keyName
description: The profile field key name to delete. It must be either
`avatar_url`, `displayname`, or a custom field following the
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
required: true
example: "displayname"
schema:
type: string
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
responses:
"200":
description: The profile field was deleted.
content: content:
application/json: application/json:
schema: schema:
type: object type: object
example: {
"avatar_url": "mxc://matrix.org/wefh34uihSDRGhw34"
}
properties:
avatar_url:
type: string
format: uri
description: The new avatar URL for this user.
description: The new avatar information.
required: true
responses:
"200":
description: The avatar URL was set.
content:
application/json:
schema:
type: object # empty json object
examples: examples:
response: response:
value: {} value: {}
"400":
description: The request is malformed, contains invalid JSON, or
specifies an invalid key.
content:
application/json:
schema:
$ref: definitions/errors/error.yaml
examples:
bad_json:
value:
{ "errcode": "M_BAD_JSON", "error": "Malformed request." }
invalid_key:
value:
{
"errcode": "M_INVALID_PARAM",
"error": "Invalid profile key.",
}
"403":
description: The user is not authorised to delete this profile field.
content:
application/json:
schema:
$ref: definitions/errors/error.yaml
examples:
forbidden:
value:
{
"errcode": "M_FORBIDDEN",
"error": "Profile deletion is not permitted.",
}
"429": "429":
description: This request was rate-limited. description: This request was rate-limited.
content: content:
@ -167,63 +259,15 @@ paths:
$ref: definitions/errors/rate_limited.yaml $ref: definitions/errors/rate_limited.yaml
tags: tags:
- User data - User data
get:
summary: Get the user's avatar URL.
description: |-
Get the user's avatar URL. This API may be used to fetch the user's
own avatar URL or to query the URL of other users; either locally or
on remote homeservers.
operationId: getAvatarUrl
parameters:
- in: path
name: userId
description: The user whose avatar URL to get.
required: true
example: "@alice:example.com"
schema:
type: string
responses:
"200":
description: The avatar URL for this user.
content:
application/json:
schema:
type: object
properties:
avatar_url:
type: string
format: uri
description: The user's avatar URL if they have set one, otherwise not present.
examples:
response:
value: {
"avatar_url": "mxc://matrix.org/SDGdghriugerRg"
}
"403":
x-addedInMatrixVersion: "1.12"
description: The server is unwilling to disclose whether the user exists and/or
has an avatar URL.
content:
application/json:
schema:
$ref: definitions/errors/error.yaml
examples:
response:
value: {
"errcode": "M_FORBIDDEN",
"error": "Profile lookup is disabled on this homeserver"
}
"404":
description: There is no avatar URL for this user or this user does not exist.
tags:
- User data
"/profile/{userId}": "/profile/{userId}":
get: get:
summary: Get this user's profile information. summary: Get all profile information for a user.
description: |- description: |-
Get the combined profile information for this user. This API may be used Get the complete profile for a user. The response includes `avatar_url`
to fetch the user's own profile information or other users; either and `displayname` (unless set to `null`, as they can only be strings)
locally or on remote homeservers. plus any custom profile fields.
**Note**: The complete profile must be under 64 KiB.
operationId: getUserProfile operationId: getUserProfile
parameters: parameters:
- in: path - in: path
@ -243,45 +287,49 @@ paths:
properties: properties:
avatar_url: avatar_url:
type: string type: string
format: uri format: mx-mxc-uri
description: The user's avatar URL if they have set one, otherwise not present. description: "Avatar URL value (MXC URI format)."
displayname: displayname:
type: string type: string
description: The user's display name if they have set one, otherwise not additionalProperties:
present. x-addedInMatrixVersion: "1.14"
description: Any additional profile field value; may be any
valid JSON type, with keys following the
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
examples: examples:
response: response:
value: { value:
{
"avatar_url": "mxc://matrix.org/SDGdghriugerRg", "avatar_url": "mxc://matrix.org/SDGdghriugerRg",
"displayname": "Alice Margatroid" "displayname": "Alice Margatroid",
"m.example_field": "custom_value",
} }
"403": "403":
x-addedInMatrixVersion: "1.2" x-addedInMatrixVersion: "1.2"
description: The server is unwilling to disclose whether the user exists and/or description: The server is unwilling to disclose whether the user
has profile information. exists and/or has profile information.
content: content:
application/json: application/json:
schema: schema:
$ref: definitions/errors/error.yaml $ref: definitions/errors/error.yaml
examples: examples:
response: response:
value: { value:
{
"errcode": "M_FORBIDDEN", "errcode": "M_FORBIDDEN",
"error": "Profile lookup is disabled on this homeserver" "error": "Profile lookup is disabled on this homeserver",
} }
"404": "404":
description: There is no profile information for this user or this user does not description: There is no profile information for this user or this
exist. user does not exist.
content: content:
application/json: application/json:
schema: schema:
$ref: definitions/errors/error.yaml $ref: definitions/errors/error.yaml
examples: examples:
response: response:
value: { value:
"errcode": "M_NOT_FOUND", { "errcode": "M_NOT_FOUND", "error": "Profile not found" }
"error": "Profile not found"
}
tags: tags:
- User data - User data
servers: servers:

View file

@ -13,16 +13,20 @@
# limitations under the License. # limitations under the License.
openapi: 3.1.0 openapi: 3.1.0
info: info:
title: Matrix Federation Public Rooms API title: Matrix Federation Published Room Directory API
version: 1.0.0 version: 1.0.0
paths: paths:
/publicRooms: /publicRooms:
get: get:
summary: Get all the public rooms for a homeserver summary: Lists the server's published room directory
description: |- description: |-
Gets all the public rooms for the homeserver. This should not return Lists the server's published room directory.
rooms that are listed on another homeserver's directory, just those
listed on the receiving homeserver's directory. This API returns paginated responses. The rooms are ordered by the number
of joined members, with the largest rooms first.
This SHOULD not return rooms that are listed on another homeserver's directory,
just those listed on the receiving homeserver's directory.
operationId: getPublicRooms operationId: getPublicRooms
security: security:
- signedRequest: [] - signedRequest: []
@ -62,21 +66,18 @@ paths:
type: string type: string
responses: responses:
"200": "200":
description: The public room list for the homeserver. description: A list of the published rooms on the server.
content: content:
application/json: application/json:
schema: schema:
$ref: ../client-server/definitions/public_rooms_response.yaml $ref: ../client-server/definitions/public_rooms_response.yaml
post: post:
summary: Gets the public rooms on the server with optional filter. summary: Lists the server's published room directory with an optional filter
description: |- description: |-
Lists the public rooms on the server, with optional filter. Lists the server's published room directory with an optional filter.
This API returns paginated responses. The rooms are ordered by the number This API returns paginated responses. The rooms are ordered by the number
of joined members, with the largest rooms first. of joined members, with the largest rooms first.
Note that this endpoint receives and returns the same format that is seen
in the Client-Server API's `POST /publicRooms` endpoint.
operationId: queryPublicRooms operationId: queryPublicRooms
security: security:
- signedRequest: [] - signedRequest: []
@ -147,69 +148,11 @@ paths:
required: true required: true
responses: responses:
"200": "200":
description: A list of the rooms on the server. description: A filtered list of the published rooms on the server.
content: content:
application/json: application/json:
schema: schema:
type: object $ref: ../client-server/definitions/public_rooms_response.yaml
description: A list of the rooms on the server.
required:
- chunk
properties:
chunk:
title: PublicRoomsChunks
type: array
description: A paginated chunk of public rooms.
items:
allOf:
- $ref: ../client-server/definitions/public_rooms_chunk.yaml
- type: object
properties:
# Override description of join_rule
join_rule:
type: string
description: |-
The room's join rule. When not present, the room is assumed to
be `public`. Note that rooms with `invite` join rules are not
expected here, but rooms with `knock` rules are given their
near-public nature.
next_batch:
type: string
description: |-
A pagination token for the response. The absence of this token
means there are no more results to fetch and the client should
stop paginating.
prev_batch:
type: string
description: |-
A pagination token that allows fetching previous results. The
absence of this token means there are no results before this
batch, i.e. this is the first batch.
total_room_count_estimate:
type: integer
description: |-
An estimate on the total number of public rooms, if the
server has an estimate.
examples:
response:
value: {
"chunk": [
{
"avatar_url": "mxc://bleecker.street/CHEDDARandBRIE",
"guest_can_join": false,
"name": "CHEESE",
"num_joined_members": 37,
"room_id": "!ol19s:bleecker.street",
"topic": "Tasty tasty cheese",
"world_readable": true,
"join_rule": "public",
"room_type": "m.space"
}
],
"next_batch": "p190q",
"prev_batch": "p1902",
"total_room_count_estimate": 115
}
servers: servers:
- url: "{protocol}://{hostname}{basePath}" - url: "{protocol}://{hostname}{basePath}"
variables: variables: