2016-07-12 18:22:33 +02:00
# Copyright 2016 OpenMarket Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
2023-06-07 14:16:29 +02:00
openapi : 3.1 .0
2015-05-29 16:37:44 +02:00
info :
2023-06-07 14:16:29 +02:00
title : Matrix Client-Server Profile API
version : 1.0 .0
2015-05-29 16:37:44 +02:00
paths :
2025-08-12 13:17:57 +02:00
"/profile/{userId}/{keyName}" :
2015-05-29 16:37:44 +02:00
put :
2025-08-12 13:17:57 +02:00
x-changedInMatrixVersion :
2025-09-09 18:02:39 +02:00
"1.16": This endpoint now accepts a variable `keyName` parameter and `m.tz` was added as a defined key. Previously only `displayname` and `avatar_url` were accepted.
2025-08-12 13:17:57 +02:00
summary : Set a profile field for a user.
2015-06-01 15:34:13 +02:00
description : |-
2025-08-12 13:17:57 +02:00
Set or update a profile field for a user. Must be authenticated with an
access token authorised to make changes. Servers MAY impose size limits
on individual fields, and the total profile MUST be under 64 KiB.
Servers MAY reject `null` values. Servers that accept `null` values SHOULD store
them rather than treating `null` as a deletion request. Clients that want to delete a
field, including its key and value, SHOULD use the `DELETE` endpoint instead.
operationId : setProfileField
2015-05-29 16:37:44 +02:00
security :
2024-04-09 18:12:30 +02:00
- accessTokenQuery : [ ]
- accessTokenBearer : [ ]
2015-05-29 16:37:44 +02:00
parameters :
- in : path
name : userId
2025-08-12 13:17:57 +02:00
description : The user whose profile field should be set.
2015-05-29 16:37:44 +02:00
required : true
2023-06-07 14:16:29 +02:00
example : "@alice:example.com"
2015-05-29 16:37:44 +02:00
schema :
2023-06-07 14:16:29 +02:00
type : string
2025-08-12 13:17:57 +02:00
- in : path
name : keyName
description : The name of the profile field to set. This MUST be either
2025-09-09 18:02:39 +02:00
`avatar_url`, `displayname`, `m.tz`, or a custom field following the
2025-08-12 13:17:57 +02:00
[ Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
required : true
example : "displayname"
schema :
type : string
2025-09-09 18:02:39 +02:00
pattern : '^(avatar_url|displayname|m\.tz|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
2023-06-07 14:16:29 +02:00
requestBody :
2025-08-12 13:17:57 +02:00
description : A JSON object containing the property whose name matches
the `keyName` specified in the URL. See `additionalProperties` for
further details.
required : true
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
type : object
2025-08-12 13:17:57 +02:00
minProperties : 1
description : |
An object which contains exactly one property. The key
of that property MUST match the `keyName` specified in the URL.
For `avatar_url`, the value MUST be an MXC URI string.
For `displayname`, the value MUST be a string.
2025-09-09 18:02:39 +02:00
For `m.tz`, the value MUST be a valid identifier from the [IANA Time Zone Database](https://www.iana.org/time-zones).
Servers MAY choose to validate the value. Clients MUST expect unknown or invalid
values.
2025-08-12 13:17:57 +02:00
For custom keys, any JSON type is allowed. Servers MAY not validate
these values, but clients SHOULD follow the format defined for that key.
additionalProperties : true
example : { "displayname": "Alice Wonderland" }
2015-05-29 16:37:44 +02:00
responses :
2023-06-07 14:16:29 +02:00
"200" :
2025-08-12 13:17:57 +02:00
description : The profile field was set.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
2025-08-12 13:17:57 +02:00
type : object # empty JSON object
2023-06-07 14:16:29 +02:00
examples :
response :
value : {}
2025-08-12 13:17:57 +02:00
"400" :
description : |
The input was invalid in some way. This can include one
of the following error codes :
- `M_BAD_JSON` : The provided value is not valid JSON.
- `M_MISSING_PARAM` : The required `keyName` property is
missing from the request body.
- `M_PROFILE_TOO_LARGE` : Storing the supplied value would
make the profile exceed its maximum allowed size of 64 KiB.
- `M_KEY_TOO_LARGE` : The supplied profile key exceeds the
maximum allowed key length of 255 bytes.
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." ,
}
2023-06-07 14:16:29 +02:00
"429" :
2015-05-29 16:48:48 +02:00
description : This request was rate-limited.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
$ref : definitions/errors/rate_limited.yaml
2015-12-07 13:45:13 +01:00
tags :
- User data
2015-05-29 16:37:44 +02:00
get :
2025-08-12 13:17:57 +02:00
x-changedInMatrixVersion :
2025-09-09 18:02:39 +02:00
"1.16": This endpoint now accepts a variable `keyName` parameter and `m.tz` was added as a defined key. Previously only `displayname` and `avatar_url` were accepted.
2025-08-12 13:17:57 +02:00
summary : Get a profile field for a user.
description : Get the value of a profile field for a user.
operationId : getProfileField
2015-05-29 16:37:44 +02:00
parameters :
- in : path
name : userId
2025-08-12 13:17:57 +02:00
description : The user whose profile field should be returned.
2015-05-29 16:37:44 +02:00
required : true
2023-06-07 14:16:29 +02:00
example : "@alice:example.com"
schema :
type : string
2025-08-12 13:17:57 +02:00
- in : path
name : keyName
description : The name of the profile field to retrieve.
required : true
example : "displayname"
schema :
type : string
2025-09-09 18:02:39 +02:00
pattern : '^(avatar_url|displayname|m\.tz|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
2015-05-29 16:37:44 +02:00
responses :
2023-06-07 14:16:29 +02:00
"200" :
2025-08-12 13:17:57 +02:00
description : The profile field value was retrieved.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
type : object
2025-08-12 13:17:57 +02:00
description : |
An object with one property, whose key matches the `keyName` specified
in the URL, and whose value is the current setting of that profile field.
additionalProperties : true
2023-06-07 14:16:29 +02:00
examples :
response :
2025-08-12 13:17:57 +02:00
value : { "displayname": "Alice" }
2024-10-07 11:45:17 +02:00
"403" :
x-addedInMatrixVersion : "1.12"
2025-08-12 13:17:57 +02:00
description : The server is unwilling to disclose whether the user
exists and/or has the specified profile field.
2024-10-07 11:45:17 +02:00
content :
application/json :
schema :
$ref : definitions/errors/error.yaml
examples :
response :
2025-08-12 13:17:57 +02:00
value :
{
"errcode": "M_FORBIDDEN" ,
"error": "Profile lookup is disabled on this homeserver" ,
}
2023-06-07 14:16:29 +02:00
"404" :
2025-08-12 13:17:57 +02:00
description : There is no profile field with this key for this user, or
the user does not exist.
2015-12-07 13:45:13 +01:00
tags :
- User data
2025-08-12 13:17:57 +02:00
delete :
x-addedInMatrixVersion : "1.16"
summary : Remove a profile field from a user.
description : Remove a specific field from a user's profile.
operationId : deleteProfileField
2015-05-29 16:37:44 +02:00
security :
2024-04-09 18:12:30 +02:00
- accessTokenQuery : [ ]
- accessTokenBearer : [ ]
2015-05-29 16:37:44 +02:00
parameters :
- in : path
name : userId
2025-08-12 13:17:57 +02:00
description : The user whose profile field should be deleted.
2015-05-29 16:37:44 +02:00
required : true
2023-06-07 14:16:29 +02:00
example : "@alice:example.com"
2015-05-29 16:37:44 +02:00
schema :
2023-06-07 14:16:29 +02:00
type : string
2015-05-29 16:37:44 +02:00
- in : path
2025-08-12 13:17:57 +02:00
name : keyName
description : The name of the profile field to delete.
2015-05-29 16:37:44 +02:00
required : true
2025-08-12 13:17:57 +02:00
example : "displayname"
2023-06-07 14:16:29 +02:00
schema :
type : string
2025-09-09 18:02:39 +02:00
pattern : '^(avatar_url|displayname|m\.tz|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
2015-05-29 16:37:44 +02:00
responses :
2023-06-07 14:16:29 +02:00
"200" :
2025-08-12 13:17:57 +02:00
description : The profile field was deleted or it doesn't exist.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
type : object
examples :
response :
2025-08-12 13:17:57 +02:00
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." ,
}
2024-10-07 11:45:17 +02:00
"403" :
2025-08-12 13:17:57 +02:00
description : The user is not authorised to delete this profile field.
2024-10-07 11:45:17 +02:00
content :
application/json :
schema :
$ref : definitions/errors/error.yaml
examples :
2025-08-12 13:17:57 +02:00
forbidden :
value :
{
"errcode": "M_FORBIDDEN" ,
"error": "Profile deletion is not permitted." ,
}
"429" :
description : This request was rate-limited.
content :
application/json :
schema :
$ref : definitions/errors/rate_limited.yaml
2015-12-07 13:45:13 +01:00
tags :
- User data
2015-06-01 17:29:19 +02:00
"/profile/{userId}" :
get :
2025-08-12 13:17:57 +02:00
summary : Get all profile information for a user.
2015-06-01 17:29:19 +02:00
description : |-
2025-08-12 13:17:57 +02:00
Get the complete profile for a user.
2017-08-03 01:19:34 +02:00
operationId : getUserProfile
2015-06-01 17:29:19 +02:00
parameters :
- in : path
name : userId
2016-04-11 12:47:40 +02:00
description : The user whose profile information to get.
2015-06-01 17:29:19 +02:00
required : true
2023-06-07 14:16:29 +02:00
example : "@alice:example.com"
schema :
type : string
2015-06-01 17:29:19 +02:00
responses :
2023-06-07 14:16:29 +02:00
"200" :
2022-09-22 17:04:50 +02:00
description : The profile information for this user.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
type : object
properties :
avatar_url :
type : string
2025-08-12 13:17:57 +02:00
format : mx-mxc-uri
2023-06-07 14:16:29 +02:00
description : The user's avatar URL if they have set one, otherwise not present.
displayname :
type : string
description : The user's display name if they have set one, otherwise not
present.
2025-09-09 18:02:39 +02:00
m.tz :
x-addedInMatrixVersion : "1.16"
type : string
description : The user's time zone.
2025-08-12 13:17:57 +02:00
additionalProperties :
x-addedInMatrixVersion : "1.16"
description : Additional profile fields.
2023-06-07 14:16:29 +02:00
examples :
response :
2025-08-12 13:17:57 +02:00
value :
{
"avatar_url": "mxc://matrix.org/SDGdghriugerRg" ,
"displayname": "Alice Margatroid" ,
2025-09-09 18:02:39 +02:00
"m.tz": "Europe/London" ,
2025-08-12 13:17:57 +02:00
"m.example_field": "custom_value" ,
}
2023-06-07 14:16:29 +02:00
"403" :
2021-12-29 19:30:32 +01:00
x-addedInMatrixVersion : "1.2"
2025-08-12 13:17:57 +02:00
description : The server is unwilling to disclose whether the user
exists and/or has profile information.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
$ref : definitions/errors/error.yaml
examples :
response :
2025-08-12 13:17:57 +02:00
value :
{
"errcode": "M_FORBIDDEN" ,
"error": "Profile lookup is disabled on this homeserver" ,
}
2023-06-07 14:16:29 +02:00
"404" :
2025-08-12 13:17:57 +02:00
description : There is no profile information for this user or this
user does not exist.
2023-06-07 14:16:29 +02:00
content :
application/json :
schema :
$ref : definitions/errors/error.yaml
examples :
response :
2025-08-12 13:17:57 +02:00
value :
{ "errcode": "M_NOT_FOUND", "error": "Profile not found" }
2015-12-07 13:45:13 +01:00
tags :
- User data
2023-06-07 14:16:29 +02:00
servers :
- url : "{protocol}://{hostname}{basePath}"
variables :
protocol :
enum :
- http
- https
default : https
hostname :
default : localhost:8008
basePath :
default : /_matrix/client/v3
components :
securitySchemes :
2024-04-09 18:12:30 +02:00
accessTokenQuery :
$ref : definitions/security.yaml#/accessTokenQuery
accessTokenBearer :
$ref : definitions/security.yaml#/accessTokenBearer