Download OpenAPI specification:
Read API for a personal Matrix state layer. Account-scoped resources nest under /v1/accounts/{account_id}; /v1/rooms is the cross-account aggregate.
Logged-out (deactivated) accounts are included so a client that has lost the
account_id can still discover one to offer re-login (the login verb both
produces and reactivates them). The transient deleting teardown state is
excluded — a row mid-removal isn't something to act on — but any account, in
any state, can still be read by id via [get_account].
{- "data": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "created_at": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "state": "active",
- "sync_state": "connecting",
- "updated_at": "string",
- "user_id": "string",
- "verified": true
}
]
}Unlike login, no homeserver call confirms the token before this returns —
session restore is a purely local SDK operation — so the token (and, if the
homeserver reports one, the device id) is validated with a whoami
round-trip before the account is activated; a mismatched or revoked token is
a 401, same as login's rejected-credential case.
Secret-bearing; gated by the bearer-token auth layer like every /v1/ route
(M7b, ADR 0029).
| access_token required | string The existing Matrix access token to adopt. |
| device_id required | string The device ID the access token belongs to. |
| homeserver_url required | string Homeserver base URL, e.g. |
| username required | string Full Matrix user ID, e.g. |
{- "access_token": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "username": "string"
}{- "data": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "created_at": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "state": "active",
- "sync_state": "connecting",
- "updated_at": "string",
- "user_id": "string",
- "verified": true
}
}homeserver_url is optional: when omitted, the server discovers the
canonical homeserver from the user ID's server name (.well-known/matrix/client,
falling back to the server name itself) — so clients need only username +
password. The URL is a connection endpoint; the Matrix ID keys identity.
A failed discovery is a 502. The username domain is then checked against
the homeserver's own declared server name (best-effort): a user ID written
with the homeserver's hostname (@adam:matrix.example.org) is a 400 whose
message suggests the ID they almost certainly meant (@adam:example.org),
rather than a misleading 401 — and never a silent login as a different
identity.
Secret-bearing; gated by the bearer-token auth layer like every /v1/ route
(M7b, ADR 0029).
| homeserver_url | string or null Homeserver base URL, e.g. |
| password required | string Account password. Consumed once at login; never persisted. |
| username required | string Full Matrix user ID, e.g. |
{- "homeserver_url": "string",
- "password": "string",
- "username": "string"
}{- "data": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "created_at": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "state": "active",
- "sync_state": "connecting",
- "updated_at": "string",
- "user_id": "string",
- "verified": true
}
}| account_id required | string <uuid> Axon account id |
{- "data": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "created_at": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "state": "active",
- "sync_state": "connecting",
- "updated_at": "string",
- "user_id": "string",
- "verified": true
}
}Unlike [logout] this is not reversible: re-adding the same Matrix account
later is a fresh login with a new account_id. Idempotent and crash-safe — a
delete of an account already mid-teardown resumes it, and an interrupted delete
is finished by the next boot's reconcile. An unknown id is a 404. A 409 means
the account's sync task has not finished shutting down; retry shortly. This is
durable by construction — nothing auto-provisions accounts, so a deleted account
never comes back except through an explicit login/import call.
Destructive; gated by the bearer-token auth layer like every /v1/ route
(M7b, ADR 0029).
| account_id required | string <uuid> Axon account id |
{- "error": {
- "code": "string",
- "message": "string"
}
}Secret-bearing / destructive; gated by the bearer-token auth layer like every
/v1/ route (M7b, ADR 0029).
| account_id required | string <uuid> Axon account id |
{- "data": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "created_at": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "state": "active",
- "sync_state": "connecting",
- "updated_at": "string",
- "user_id": "string",
- "verified": true
}
}A 200 means the keys were imported (the recovery succeeded); the returned
verified reflects the freshly-derived cross-signing state, which is true in
the normal case but is a derived observation, not a guaranteed postcondition
(e.g. a partial Secure-Backup that imports the megolm key but not the
cross-signing keys would import successfully yet stay unverified).
The account must be active: a logged-out (deactivated) account is a 409
(log in first), as is one mid-deletion (deleting). A wrong/rotated key, or an
account that never set up Secure Backup, is a 400 (a readable error, not a
silent permanent UTD). An unknown id is a 404.
Secret-bearing; gated by the bearer-token auth layer like every /v1/ route
(M7b, ADR 0029).
| account_id required | string <uuid> Axon account id |
| recovery_key required | string The account's Secure-Storage (4S) recovery key. |
{- "recovery_key": "string"
}{- "data": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "created_at": "string",
- "device_id": "string",
- "homeserver_url": "string",
- "state": "active",
- "sync_state": "connecting",
- "updated_at": "string",
- "user_id": "string",
- "verified": true
}
}| account_id required | string <uuid> Axon account id |
{- "data": {
- "attempted": 0,
- "decrypted": 0,
- "selected": 0,
- "still_pending": 0,
- "timed_out": true
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": {
- "encryption_algorithm": "string",
- "guest_access": "string",
- "history_visibility": "string",
- "join_rule": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": [
- {
- "avatar_url": "string",
- "display_name": "string",
- "membership": "string",
- "user_id": "string"
}
]
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}
]
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id of the space |
{- "data": [
- {
- "avatar_url": "string",
- "name": "string",
- "order": "string",
- "room_id": "string",
- "room_type": "string",
- "suggested": true,
- "via": [
- "string"
]
}
]
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": [
- {
- "avatar_url": "string",
- "canonical": true,
- "name": "string",
- "room_id": "string",
- "room_type": "string",
- "via": [
- "string"
]
}
]
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": [
- {
- "latest_reply_event_id": "string",
- "latest_reply_ts": 0,
- "reply_count": 0,
- "root_event_id": "string"
}
]
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| root_id required | string Matrix event id of the thread root |
| cursor | string Opaque cursor from a previous page's |
| limit | integer <int64> Page size (default 50, max 200). |
{- "data": {
- "events": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}
], - "next_cursor": "string"
}
}An unknown account_id/room_id yields an empty page (200), not a 404 — an
empty timeline and a non-existent room are indistinguishable here and an
empty page is the natural answer.
| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| cursor | string Opaque cursor from a previous page's |
| limit | integer <int64> Page size (default 50, max 200). |
| at_ts | integer <int64> Jump to a specific point in time: Unix milliseconds. Returns the page of
events at or before this timestamp. Mutually exclusive with |
{- "data": {
- "events": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}
], - "next_cursor": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": {
- "tombstoned_to": "string",
- "upgraded_from": "string"
}
}| account_id | string <uuid> Narrow the list to a single account. Omit for all accounts. |
{- "data": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "account_user_id": "string",
- "avatar_url": "string",
- "canonical_alias": "string",
- "highlight_count": 0,
- "last_activity_ts": 0,
- "last_event_id": "string",
- "name": "string",
- "notification_count": 0,
- "room_id": "string",
- "topic": "string"
}
]
}503 when search is disabled (search.enabled = false). A missing/empty q
is allowed only with at least one narrowing filter (account_id, room_id,
sender, from, or to); an unbounded empty query or malformed cursor is
a 400. Results are the resolved read-API event view (latest edited body,
redaction-masked) plus each hit's score.
| q | string The full-text query string. Parsed against message bodies; all terms are required (AND). May be omitted when at least one narrowing filter is present. |
| account_id | string <uuid> Restrict to one account. Omit to search across all accounts. |
| room_id | string Restrict to one room. |
| sender | string Restrict to senders whose Matrix user id contains this substring, case-insensitively. |
| from | integer <int64> Inclusive lower bound on |
| to | integer <int64> Inclusive upper bound on |
| limit | integer <int64> Page size (default 50, max 200). |
| cursor | string Opaque cursor from a previous page's |
{- "data": {
- "next_cursor": "string",
- "results": [
- {
- "event": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}, - "score": 0.1
}
], - "total": 0
}
}{- "data": {
- "backfill": {
- "accounts": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "complete": true,
- "events": 0,
- "rooms_backfilled": 0,
- "rooms_total": 0
}
], - "free_bytes": 0,
- "paused": true,
- "reason": "string"
}, - "build": {
- "build_time": "string",
- "git_hash": "string",
- "profile": "string",
- "rustc_version": "string",
- "version": "string"
}, - "sync": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "since_ms": 0,
- "state": "string"
}
]
}
}| account_id required | string <uuid> Axon account id |
| event_id required | string Matrix event id |
{- "data": {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}
}| account_id required | string <uuid> Axon account id |
| event_id required | string Matrix event id |
{- "data": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}
]
}| account_id required | string <uuid> Axon account id |
| event_id required | string Matrix event id |
{- "data": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}
}| account_id required | string <uuid> Axon account id |
| event_id required | string Matrix event id |
{- "data": [
- {
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "body": "string",
- "content": { },
- "edit_count": 0,
- "edited": true,
- "event_id": "string",
- "latest_edit_ts": 0,
- "origin_ts": 0,
- "prev_content": { },
- "reactions": {
- "property1": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}, - "property2": {
- "count": 0,
- "me": true,
- "my_event_ids": [
- "string"
], - "senders": [
- "string"
]
}
}, - "redacted": true,
- "redaction_event_id": "string",
- "relates_to": { },
- "room_id": "string",
- "sender": "string",
- "sender_trust": "string",
- "state_key": "string",
- "type": "string"
}
]
}| account_id required | string <uuid> Axon account id |
| event_id required | string Matrix event id |
{- "data": {
- "current": {
- "device_cross_signed": true,
- "device_known": true,
- "identity_known": true,
- "identity_verified": true,
- "master_key": "string",
- "previously_verified": true,
- "verification_violation": true
}, - "event_id": "string",
- "sender": "string",
- "snapshot": { }
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| event_id required | string Event id being edited |
| body required | string The new plain-text message body (and formatting fallback). |
| format | string or null Markup name for |
| formatted_body | string or null The rendered HTML body. Must be paired with |
{- "body": "string",
- "format": "string",
- "formatted_body": "string"
}{- "data": {
- "event_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| event_id required | string Event id being redacted |
| reason | string Optional human-readable reason recorded on the redaction. |
{- "data": {
- "event_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| event_id required | string Event id being reacted to |
| key required | string The reaction key — typically an emoji. |
{- "key": "string"
}{- "data": {
- "event_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| body required | string The plain-text message body (and formatting fallback). |
| format | string or null Markup name for |
| formatted_body | string or null The rendered HTML body. Must be paired with |
| reply_to | string or null Send as a reply to this event id ( |
| thread_root | string or null Send into this thread, identified by its root event id
( |
{- "body": "string",
- "format": "string",
- "formatted_body": "string",
- "reply_to": "string",
- "thread_root": "string"
}{- "data": {
- "event_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| caption | string or null Optional media caption. When absent, Axon uses the staged filename as the Matrix event body. |
| reply_to | string or null Send as a reply to this event id ( |
| thread_root | string or null Send into this thread, identified by its root event id
( |
| upload_id required | string <uuid> Server-issued staged upload id returned by |
{- "caption": "string",
- "reply_to": "string",
- "thread_root": "string",
- "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb"
}{- "data": {
- "event_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| event_id required | string The event id to mark as read. |
{- "event_id": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| typing required | boolean Whether the account is now typing in this room. Setting |
{- "typing": true
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| reason | string or null Optional human-readable reason recorded on the membership change. |
| user_id required | string The target user's Matrix id ( |
{- "reason": "string",
- "user_id": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| user_id required | string The invited user's Matrix id ( |
{- "user_id": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| reason | string or null Optional human-readable reason recorded on the membership change. |
| user_id required | string The target user's Matrix id ( |
{- "reason": "string",
- "user_id": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| reason | string or null Optional human-readable reason recorded on the membership change. |
| user_id required | string The target user's Matrix id ( |
{- "reason": "string",
- "user_id": "string"
}{- "data": null
}Not idempotent: Matrix's createRoom endpoint has no idempotency key,
so retrying this call after a client-side timeout can create a second
room upstream if the first attempt actually succeeded after Axon's own
timeout fired (see SdkGateway::create_room).
| account_id required | string <uuid> Axon account id |
| encrypted | boolean When true, an |
| invite | Array of strings Users to invite on creation ( |
| is_direct | boolean Whether to set the |
| name | string or null Room name ( |
null or RoomPresetDto (string) | |
| public | boolean Whether the room is published in the room directory. Defaults to
|
| topic | string or null Room topic ( |
{- "encrypted": true,
- "invite": [
- "string"
], - "is_direct": true,
- "name": "string",
- "preset": { },
- "public": true,
- "topic": "string"
}{- "data": {
- "room_id": "string"
}
}Not idempotent: Matrix's createRoom endpoint has no idempotency key,
so retrying this call after a client-side timeout can create a second DM
room upstream if the first attempt actually succeeded after Axon's own
timeout fired (see SdkGateway::create_dm). This route always creates a
new room; it does not check for or reuse an existing DM with the target
user.
| account_id required | string <uuid> Axon account id |
| user_id required | string The other participant's Matrix id ( |
{- "user_id": "string"
}{- "data": {
- "room_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id_or_alias required | string The room id ( |
| server_names | Array of strings Federation-resolution hints (ruma's |
{- "room_id_or_alias": "string",
- "server_names": [
- "string"
]
}{- "data": {
- "room_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| reason | string or null Optional human-readable reason shown to the room's members. |
| room_id_or_alias required | string The room id ( |
| server_names | Array of strings Federation-resolution hints (ruma's |
{- "reason": "string",
- "room_id_or_alias": "string",
- "server_names": [
- "string"
]
}{- "data": {
- "room_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| upload_id required | string <uuid> Server-issued staged upload id returned by |
{- "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| name required | string |
{- "name": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| tag required | string Tag wire form: m.favourite, m.lowpriority, m.server_notice, or a u.-prefixed custom tag |
| order | number or null <double> Optional sort order among this account's tagged rooms, in |
{- "order": 0
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| tag required | string Tag wire form: m.favourite, m.lowpriority, m.server_notice, or a u.-prefixed custom tag |
{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| topic required | string |
{- "topic": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
{- "data": {
- "ban": 0,
- "events_default": 0,
- "invite": 0,
- "kick": 0,
- "redact": 0,
- "state_default": 0,
- "users": {
- "property1": 0,
- "property2": 0
}, - "users_default": 0
}
}| account_id required | string <uuid> Axon account id |
| room_id required | string Matrix room id |
| acknowledge_self_demotion | boolean Bypasses the self-demotion guardrail: without this, a change that
would drop the caller's own resolved power level below what's
needed to send another |
| ban | integer or null <int64> |
| events_default | integer or null <int64> |
| invite | integer or null <int64> |
| kick | integer or null <int64> |
| redact | integer or null <int64> |
| state_default | integer or null <int64> |
object User id -> requested power level, merged into the room's existing
| |
| users_default | integer or null <int64> |
{- "acknowledge_self_demotion": true,
- "ban": 0,
- "events_default": 0,
- "invite": 0,
- "kick": 0,
- "redact": 0,
- "state_default": 0,
- "users": {
- "property1": 0,
- "property2": 0
}, - "users_default": 0
}{- "data": null
}This account's own profile and ignore list, another user's profile, and public-room directory search
| account_id required | string <uuid> Axon account id |
| server | string Search the directory of this server instead of the account's own homeserver. |
| search_term | string Free-text filter over room name, topic, and canonical alias. |
| limit | integer <int32> >= 0 Maximum rooms to return in this page. |
| since | string Pagination token from a previous page's |
{- "data": {
- "chunk": [
- {
- "avatar_url": "string",
- "canonical_alias": "string",
- "guest_can_join": true,
- "join_rule": "string",
- "name": "string",
- "num_joined_members": 0,
- "room_id": "string",
- "room_type": "string",
- "topic": "string",
- "world_readable": true
}
], - "next_batch": "string",
- "prev_batch": "string",
- "total_room_count_estimate": 0
}
}| account_id required | string <uuid> Axon account id |
| upload_id required | string <uuid> Server-issued staged upload id returned by |
{- "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| display_name required | string |
{- "display_name": "string"
}{- "data": null
}| account_id required | string <uuid> Axon account id |
| user_id required | string Target Matrix user id (@user:server) |
{- "data": {
- "avatar_url": "string",
- "display_name": "string",
- "user_id": "string"
}
}| account_id required | string <uuid> Axon account id |
{- "data": [
- {
- "cancel_reason": "string",
- "decimals": [
- 0
], - "device_id": "string",
- "emoji": [
- {
- "description": "string",
- "symbol": "string"
}
], - "flow_id": "string",
- "stage": "requested",
- "user_id": "string"
}
]
}Trust-bearing; gated by the bearer-token auth layer like every /v1/ route
(M7b, ADR 0029).
| account_id required | string <uuid> Axon account id |
| device_id | string or null The device ID of the trusted device to verify against (self-verification). |
| user_id | string or null The user ID of another user to verify (cross-user verification). |
{- "device_id": "string",
- "user_id": "string"
}{- "data": {
- "flow_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| flow_id required | string Verification transaction id |
{- "data": {
- "cancel_reason": "string",
- "decimals": [
- 0
], - "device_id": "string",
- "emoji": [
- {
- "description": "string",
- "symbol": "string"
}
], - "flow_id": "string",
- "stage": "requested",
- "user_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| flow_id required | string Verification transaction id |
{- "error": {
- "code": "string",
- "message": "string"
}
}| account_id required | string <uuid> Axon account id |
| flow_id required | string Verification transaction id |
{- "error": {
- "code": "string",
- "message": "string"
}
}| account_id required | string <uuid> Axon account id |
| user_id | string Matrix user id to list devices for. Omit to list the account's own devices (self-verification picker); supply to list another user's (cross-user picker, ADR 0040). |
{- "data": {
- "devices": [
- {
- "algorithms": [
- "string"
], - "device_id": "string",
- "display_name": "string",
- "is_cross_signed_by_owner": true,
- "is_verified": true,
- "local_trust_state": "string"
}
], - "user_id": "string"
}
}| account_id required | string <uuid> Axon account id |
| kind required | string (MediaUploadKindDto) Enum: "image" "file" Matrix media message kind the staged bytes are intended to become. |
| filename required | string Original filename. The handler normalizes path-like input down to the basename before storing it. |
Raw media bytes streamed to Axon's durable upload staging area
{- "data": {
- "content_type": "string",
- "expires_at": "string",
- "filename": "string",
- "kind": "image",
- "size_bytes": 0,
- "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb"
}
}The server_name and media_id path segments form the mxc:// URI that
was embedded in a Matrix event's primary or thumbnail media descriptor.
The response body is the raw media bytes, streamed from the on-disk cache
with range-request and conditional-GET support.
| account_id required | string <uuid> Axon account whose credentials are used for the download |
| server_name required | string Server-name component of the MXC URI (the part after |
| media_id required | string Media-ID component of the MXC URI |
{- "error": {
- "code": "string",
- "message": "string"
}
}Shares [get_media]'s event lookup (via [resolve_media_content]) and
conditional-GET/range-serving machinery, but resolves a resized variant
via [MediaProxy::get_thumbnail] instead of the full original, and
corrects Content-Type by sniffing the returned bytes (see
[correct_thumbnail_content_type]) since a homeserver-regenerated
thumbnail may not match the original's declared mimetype. Encrypted media
is rejected with 400 before the proxy is ever called — see
[resolve_thumbnail_spec].
| account_id required | string <uuid> Axon account whose credentials are used for the download |
| server_name required | string Server-name component of the MXC URI (the part after |
| media_id required | string Media-ID component of the MXC URI |
| width required | integer <int32> >= 0 Desired width in pixels. Clamped to a fixed |
| height required | integer <int32> >= 0 Desired height in pixels. Same clamp-and-snap as |
| method | string (ThumbnailMethodDto) Enum: "crop" "scale" Resizing method; defaults to |
{- "error": {
- "code": "string",
- "message": "string"
}
}| device_id required | string <uuid> The calling device (client-supplied UUID) |
| namespace required | string The state namespace, e.g. |
| account_id required | string <uuid> The Axon account this state belongs to. |
{- "data": {
- "entries": {
- "property1": {
- "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
- "updated_at": "string",
- "value": null
}, - "property2": {
- "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
- "updated_at": "string",
- "value": null
}
}, - "namespace": "string"
}
}| device_id required | string <uuid> The writing device (client-supplied UUID; first PUT registers it) |
| namespace required | string The state namespace, e.g. |
| account_id required | string <uuid> The Axon account this state belongs to. |
required | object The entries to write, keyed by the client-chosen key. |
{- "entries": {
- "property1": null,
- "property2": null
}
}{- "data": {
- "updated_at": "string"
}
}