Server Side Search
The search API allows clients to perform full text search across events in all rooms that the user has been in, including those that they have left. Only events that the user is allowed to see will be searched, e.g. it won’t include events in rooms that happened after you left.
Client behaviour
There is a single HTTP API for performing server-side search, documented below.
POST
/_matrix/client/v3/search
Performs a full text search across different categories.
| Rate-limited: | Yes |
|---|---|
| Requires authentication: | Yes |
Request
Request parameters
| Name | Type | Description |
|---|---|---|
next_batch |
string |
The point to return events from. If given, this should be a
next_batch result from a previous call to this endpoint. |
Request body
| Name | Type | Description |
|---|---|---|
search_categories |
Categories |
Required: Describes which categories to search in and their criteria. |
| Name | Type | Description |
|---|---|---|
room_events |
Room Events Criteria |
Mapping of category name to search criteria. |
| Name | Type | Description |
|---|---|---|
event_context |
Include Event Context |
Configures whether any context for the events returned are included in the response. |
filter |
Filter |
This takes a filter. |
groupings |
Groupings |
Requests that the server partitions the result set based on the provided list of keys. |
include_state |
Include current state |
Requests the server return the current state for each room returned. |
keys |
[string] |
The keys to search. Defaults to all. |
order_by |
Ordering |
The order in which to search for results.
By default, this is "rank". |
search_term |
string |
Required: The string to search events for |
| Name | Type | Description |
|---|---|---|
after_limit |
After limit |
How many events after the result are
returned. By default, this is 5. |
before_limit |
Before limit |
How many events before the result are
returned. By default, this is 5. |
include_profile |
Return profile information |
Requests that the server returns the
historic profile information for the users
that sent the events that were returned.
By default, this is false. |
| Name | Type | Description |
|---|---|---|
contains_url |
boolean |
If true, includes only events with a url key in their content. If false, excludes those events. If omitted, url key is not considered for filtering. |
include_redundant_members |
boolean |
If true, sends all membership events for all events, even if they have already
been sent to the client. Does not
apply unless lazy_load_members is true. See
Lazy-loading room members
for more information. Defaults to false. |
lazy_load_members |
boolean |
If true, enables lazy-loading of membership events. See
Lazy-loading room members
for more information. Defaults to false. |
limit |
integer |
The maximum number of events to return. |
not_rooms |
[string] |
A list of room IDs to exclude. If this list is absent then no rooms are excluded. A matching room will be excluded even if it is listed in the 'rooms' filter. |
not_senders |
[string] |
A list of sender IDs to exclude. If this list is absent then no senders are excluded. A matching sender will be excluded even if it is listed in the 'senders' filter. |
not_types |
[string] |
A list of event types to exclude. If this list is absent then no event types are excluded. A matching type will be excluded even if it is listed in the 'types' filter. A ‘*’ can be used as a wildcard to match any sequence of characters. |
rooms |
[string] |
A list of room IDs to include. If this list is absent then all rooms are included. |
senders |
[string] |
A list of senders IDs to include. If this list is absent then all senders are included. |
types |
[string] |
A list of event types to include. If this list is absent then all event types are included. A '*' can be used as a wildcard to match any sequence of characters. |
unread_thread_notifications |
boolean |
If true, enables per-thread notification
counts. Only applies to the /sync endpoint. Defaults to false.
Added in |
| Name | Type | Description |
|---|---|---|
group_by |
Groups |
List of groups to request. |
| Name | Type | Description |
|---|---|---|
key |
Group Key |
Key that defines the group. |
Request body example
{
"search_categories": {
"room_events": {
"filter": {
"not_rooms": [
null
],
"not_senders": [
null
],
"not_types": [
null
],
"rooms": [
null
],
"senders": [
null
],
"types": [
null
]
},
"groupings": {
"group_by": [
{
"key": "room_id"
}
]
},
"keys": [
"content.body"
],
"order_by": "recent",
"search_term": "martians and men"
}
}
}
Responses
| Status | Description |
|---|---|
200 |
Results of the search. |
400 |
Part of the request was invalid. |
429 |
This request was rate-limited. |
200 response
| Name | Type | Description |
|---|---|---|
search_categories |
Result Categories |
Required: Describes which categories to search in and their criteria. |
| Name | Type | Description |
|---|---|---|
room_events |
Result Room Events |
Mapping of category name to search criteria. |
| Name | Type | Description |
|---|---|---|
count |
integer |
An approximate count of the total number of results found. |
groups |
{string: Group Key} |
Any groups that were requested. The outer |
highlights |
Highlights |
List of words which should be highlighted, useful for stemming which may change the query terms. |
next_batch |
Next Batch |
Token that can be used to get the next batch of
results, by passing as the next_batch parameter to
the next call. If this field is absent, there are no
more results. |
results |
Results |
List of results in the requested order. |
state |
{string: Room State} |
The current state for every room in the results.
This is included if the request had the
The |
| Name | Type | Description |
|---|---|---|
context |
Event Context |
Context for result, if requested. |
rank |
number |
A number that describes how closely this result matches the search. Higher is closer. |
result |
Event |
The event that matched. |
| Name | Type | Description |
|---|---|---|
end |
End Token |
Pagination token for the end of the chunk |
events_after |
Events After |
Events just after the result. |
events_before |
Events Before |
Events just before the result. |
profile_info |
{string: User Profile} |
The historic profile information of the users that sent the events returned. The |
start |
Start Token |
Pagination token for the start of the chunk |
| Name | Type | Description |
|---|---|---|
content |
object |
Required: The body of this event, as created by the client which sent it. |
event_id |
string |
Required: The globally unique identifier for this event. |
origin_server_ts |
integer |
Required: Timestamp (in milliseconds since the unix epoch) on originating homeserver when this event was sent. |
room_id |
string |
Required: The ID of the room associated with this event. |
sender |
string |
Required: Contains the fully-qualified ID of the user who sent this event. |
state_key |
string |
Present if, and only if, this event is a state event. The key making this piece of state unique in the room. Note that it is often an empty string. State keys starting with an |
type |
string |
Required: The type of the event. |
unsigned |
UnsignedData |
Contains optional extra information about the event. |
| Name | Type | Description |
|---|---|---|
age |
integer |
The time in milliseconds that has elapsed since the event was sent. This field is generated by the local homeserver, and may be incorrect if the local time on at least one of the two servers is out of sync, which can cause the age to either be negative or greater than it actually is. |
prev_content |
EventContent |
The previous content for this event. This field is generated
by the local homeserver, and is only returned if the event is a state event,
and the client has permission to see the previous content.Changed in v1.2:
Previously, this field was specified at the top level of returned
events rather than in unsigned (with the exception of the GET .../notifications
endpoint), though in practice no known server implementations honoured
this.
|
redacted_because |
ClientEvent |
The event that redacted this event, if any. |
transaction_id |
string |
The client-supplied transaction ID, for example, provided via
PUT /_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId},
if the client being given the event is the same one which sent it. |
| Name | Type | Description |
|---|---|---|
avatar_url |
Avatar Url |
|
displayname |
Display name |
{
"search_categories": {
"room_events": {
"count": 1224,
"groups": {
"room_id": {
"!qPewotXpIctQySfjSy:localhost": {
"next_batch": "BdgFsdfHSf-dsFD",
"order": 1,
"results": [
"$144429830826TWwbB:localhost"
]
}
}
},
"highlights": [
"martians",
"men"
],
"next_batch": "5FdgFsd234dfgsdfFD",
"results": [
{
"rank": 0.00424866,
"result": {
"content": {
"body": "This is an example text message",
"format": "org.matrix.custom.html",
"formatted_body": "<b>This is an example text message</b>",
"msgtype": "m.text"
},
"event_id": "$144429830826TWwbB:localhost",
"origin_server_ts": 1432735824653,
"room_id": "!qPewotXpIctQySfjSy:localhost",
"sender": "@example:example.org",
"type": "m.room.message",
"unsigned": {
"age": 1234
}
}
}
]
}
}
}
429 response
| Name | Type | Description |
|---|---|---|
errcode |
string |
Required: The M_LIMIT_EXCEEDED error code |
error |
string |
A human-readable error message. |
retry_after_ms |
integer |
The amount of time in milliseconds the client should wait before trying the request again. |
{
"errcode": "M_LIMIT_EXCEEDED",
"error": "Too many requests",
"retry_after_ms": 2000
}
Search Categories
The search API allows clients to search in different categories of
items. Currently the only specified category is room_events.
room_events
This category covers all events that the user is allowed to see, including events in rooms that they have left. The search is performed on certain keys of certain event types.
The supported keys to search over are:
content.bodyinm.room.messagecontent.nameinm.room.namecontent.topicinm.room.topic
The search will not include rooms that are end to end encrypted.
The results include a rank key that can be used to sort the results by
relevancy. The higher the rank the more relevant the result is.
The value of count gives an approximation of the total number of
results. Homeservers may give an estimate rather than an exact value for
this field.
Ordering
The client can specify the ordering that the server returns results in. The two allowed orderings are:
rank, which returns the most relevant results first.recent, which returns the most recent results first.
The default ordering is rank.
Groups
The client can request that the results are returned along with grouping
information, e.g. grouped by room_id. In this case the response will
contain a group entry for each distinct value of room_id. Each group
entry contains at least a list of the event_ids that are in that
group, as well as potentially other metadata about the group.
The current required supported groupings are:
room_idsender
Pagination
The server may return a next_batch key at various places in the
response. These are used to paginate the results. To fetch more results,
the client should send the same request to the server with a
next_batch query parameter set to that of the token.
The scope of the pagination is defined depending on where the
next_batch token was returned. For example, using a token inside a
group will return more results from within that group.
The currently supported locations for the next_batch token are:
search_categories.<category>.next_batchsearch_categories.<category>.groups.<group_key>.<group_id>.next_batch
A server need not support pagination, even if there are more matching
results. In that case, they must not return a next_batch token in the
response.
Security considerations
The server must only return results that the user has permission to see.