{
  "apiVersion": "1.0.0",
  "swaggerVersion": "1.2",
  "basePath": "http://localhost:8008/_matrix/client/api/v1", 
  "resourcePath": "/rooms",
  "produces": [
    "application/json"
  ],
  "consumes": [
    "application/json"
  ],
  "authorizations": {
    "token": []
  },
  "apis": [
    {
      "path": "/rooms/{roomId}/send/{eventType}",
      "operations": [
        {
          "method": "POST",
          "summary": "Send a generic non-state event to this room.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "EventId",
          "nickname": "send_non_state_event",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The event contents",
              "required": true,
              "type": "EventContent",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to send the message in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "eventType",
              "description": "The type of event to send.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/state/{eventType}/{stateKey}",
      "operations": [
        {
          "method": "PUT",
          "summary": "Send a generic state event to this room.",
          "notes": "The state key can be omitted, such that you can PUT to /rooms/{roomId}/state/{eventType}. The state key defaults to a 0 length string in this case.",
          "type": "void",
          "nickname": "send_state_event",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The event contents",
              "required": true,
              "type": "EventContent",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to send the message in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "eventType",
              "description": "The type of event to send.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "stateKey",
              "description": "An identifier used to specify clobbering semantics. State events with the same (roomId, eventType, stateKey) will be replaced.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/send/m.room.message",
      "operations": [
        {
          "method": "POST",
          "summary": "Send a message in this room.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "EventId",
          "nickname": "send_message",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The message contents",
              "required": true,
              "type": "Message",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to send the message in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/state/m.room.topic",
      "operations": [
        {
          "method": "PUT",
          "summary": "Set the topic for this room.",
          "notes": "Set the topic for this room.",
          "type": "void",
          "nickname": "set_topic",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The topic contents",
              "required": true,
              "type": "Topic",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to set the topic in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        },
        {
          "method": "GET",
          "summary": "Get the topic for this room.",
          "notes": "Get the topic for this room.",
          "type": "Topic",
          "nickname": "get_topic",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to get topic in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 404,
              "message": "Topic not found."
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/state/m.room.name",
      "operations": [
        {
          "method": "PUT",
          "summary": "Set the name of this room.",
          "notes": "Set the name of this room.",
          "type": "void",
          "nickname": "set_room_name",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The name contents",
              "required": true,
              "type": "RoomName",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to set the name of.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        },
        {
          "method": "GET",
          "summary": "Get the room's name.",
          "notes": "",
          "type": "RoomName",
          "nickname": "get_room_name",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to get the name of.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 404,
              "message": "Name not found."
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/state/m.room.power_levels",
      "operations": [
        {
          "method": "PUT",
          "summary": "Set the power levels for this room.",
          "notes": "This has to be set atomically. The levels set will clobber what was previously there.",
          "type": "void",
          "nickname": "set_room_power_levels",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The power levels",
              "required": true,
              "type": "RoomPowerLevels",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to set the power levels for.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/send/m.room.message.feedback",
      "operations": [
        {
          "method": "POST",
          "summary": "Send feedback to a message.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "EventId",
          "nickname": "send_feedback",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The feedback contents",
              "required": true,
              "type": "Feedback",
              "paramType": "body"
            },
            {
              "name": "roomId",
              "description": "The room to send the feedback in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad feedback type."
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/invite",
      "operations": [
        {
          "method": "POST",
          "summary": "Invite a user to this room.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "void",
          "nickname": "invite",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "roomId",
              "description": "The room which has this user.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "body",
              "description": "The user to invite.",
              "required": true,
              "type": "InviteRequest",
              "paramType": "body"
            }
          ]
        }  
      ]
    },
    {
      "path": "/rooms/{roomId}/join",
      "operations": [
        {
          "method": "POST",
          "summary": "Join this room.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "void",
          "nickname": "join_room",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to join.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "body",
              "required": true,
              "type": "JoinRequest",
              "paramType": "body"
            }
          ]
        }  
      ]
    },
    {
      "path": "/rooms/{roomId}/leave",
      "operations": [
        {
          "method": "POST",
          "summary": "Leave this room.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "void",
          "nickname": "leave",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to leave.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "body",
              "required": true,
              "type": "LeaveRequest",
              "paramType": "body"
            }
          ]
        }  
      ]
    },
    {
      "path": "/rooms/{roomId}/ban",
      "operations": [
        {
          "method": "POST",
          "summary": "Ban a user in the room.",
          "notes": "This operation can also be done as a PUT by suffixing /{txnId}. The caller must have the required power level to do this operation.",
          "type": "void",
          "nickname": "ban",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "roomId",
              "description": "The room which has the user to ban.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "body",
              "description": "The user to ban.",
              "required": true,
              "type": "BanRequest",
              "paramType": "body"
            }
          ]
        }  
      ]
    },
    {
      "path": "/rooms/{roomId}/state/m.room.member/{userId}",
      "operations": [
        {
          "method": "PUT",
          "summary": "Change the membership state for a user in a room.",
          "notes": "Change the membership state for a user in a room.",
          "type": "void",
          "nickname": "set_membership",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The new membership state",
              "required": true,
              "type": "Member",
              "paramType": "body"
            },
            {
              "name": "userId",
              "description": "The user whose membership is being changed.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "roomId",
              "description": "The room which has this user.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "No membership key."
            },
            {
              "code": 400,
              "message": "Bad membership value."
            },
            {
              "code": 403,
              "message": "When inviting: You are not in the room."
            },
            {
              "code": 403,
              "message": "When inviting: <target> is already in the room."
            },
            {
              "code": 403,
              "message": "When joining: Cannot force another user to join."
            },
            {
              "code": 403,
              "message": "When joining: You are not invited to this room."
            }
          ]
        },
        {
          "method": "GET",
          "summary": "Get the membership state of a user in a room.",
          "notes": "Get the membership state of a user in a room.",
          "type": "Member",
          "nickname": "get_membership",
          "parameters": [
            {
              "name": "userId",
              "description": "The user whose membership state you want to get.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "roomId",
              "description": "The room which has this user.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 404,
              "message": "Member not found."
            }
          ]
        }
      ]
    },
    {
      "path": "/join/{roomAliasOrId}",
      "operations": [
        {
          "method": "POST",
          "summary": "Join a room via a room alias or room ID.",
          "notes": "This endpoint, unlike /rooms/{roomId}/join allows the client to join a room by it's alias. This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "JoinRoomInfo",
          "nickname": "join",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "roomAliasOrId",
              "description": "The room alias or room ID to join.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad room alias."
            }
          ]
        }
      ]
    },
    {
      "path": "/createRoom",
      "operations": [
        {
          "method": "POST",
          "summary": "Create a room.",
          "notes": "Create a room. This operation can also be done as a PUT by suffixing /{txnId}.",
          "type": "RoomInfo",
          "nickname": "create_room",
          "consumes": [
            "application/json"
          ],
          "parameters": [
            {
              "name": "body",
              "description": "The desired configuration for the room.",
              "required": true,
              "type": "RoomConfig",
              "paramType": "body"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Body must be JSON."
            },
            {
              "code": 400,
              "message": "Room alias already taken."
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/messages",
      "operations": [
        {
          "method": "GET",
          "summary": "Get a list of messages for this room.",
          "notes": "Get a list of messages for this room.",
          "type": "MessagePaginationChunk",
          "nickname": "get_messages",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to get messages in.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "from",
              "description": "The token to start getting results from.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "to",
              "description": "The token to stop getting results at.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "limit",
              "description": "The maximum number of messages to return.",
              "required": false,
              "type": "integer",
              "paramType": "query"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/members",
      "operations": [
        {
          "method": "GET",
          "summary": "Get a list of members for this room.",
          "notes": "Get a list of members for this room.",
          "type": "MemberPaginationChunk",
          "nickname": "get_members",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to get a list of members from.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "from",
              "description": "The token to start getting results from.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "to",
              "description": "The token to stop getting results at.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "limit",
              "description": "The maximum number of members to return.",
              "required": false,
              "type": "integer",
              "paramType": "query"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/state",
      "operations": [
        {
          "method": "GET",
          "summary": "Get a list of all the current state events for this room.",
          "notes": "This is equivalent to the events returned under the 'state' key for this room in /initialSync.",
          "type": "array",
          "items": {
            "$ref": "Event"
          },
          "nickname": "get_state_events",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to get a list of current state events from.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/typing/{userId}",
      "operations": [
        {
          "method": "PUT",
          "summary": "Inform the server that this user is typing.",
          "notes": "Only the authorised user can send typing notifications.",
          "type": "void",
          "nickname": "put_typing",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to send the m.typing event into.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "userId",
              "description": "The user ID of the typer.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "body",
              "description": "The typing information.",
              "required": true,
              "type": "Typing",
              "paramType": "body"
            }
          ]
        }
      ]
    },
    {
      "path": "/rooms/{roomId}/initialSync",
      "operations": [
        {
          "method": "GET",
          "summary": "Get all the current information for this room, including messages and state events.",
          "type": "InitialSyncRoomData",
          "nickname": "get_room_sync_data",
          "parameters": [
            {
              "name": "roomId",
              "description": "The room to get information for.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ]
        }
      ]
    }
  ],
  "models": {
    "Topic": {
      "id": "Topic",
      "properties": {
        "topic": {
          "type": "string",
          "description": "The topic text"
        }
      }
    },
    "RoomName": {
      "id": "RoomName",
      "properties": {
        "name": {
          "type": "string",
          "description": "The human-readable name for the room. Can contain spaces."
        }
      }
    },
    "UserPowerLevels": {
        "id": "UserPowerLevels",
        "properties": {
            "__user_id__": {
                "type": "integer",
                "description": "The power level for __user_id__"
            }
        }
    },
    "EventPowerLevels": {
        "id": "UserPowerLevels",
        "properties": {
            "__event_type__": {
                "type": "integer",
                "description": "The power level required in order to send __event_type__ events."
            }
        }
    },
    "RoomPowerLevels": {
      "id": "RoomPowerLevels",
      "properties": {
        "ban": {
          "type": "integer",
          "description": "The minimum level required in order to ban someone."
        },
        "kick": {
          "type": "integer",
          "description": "The minimum level required in order to kick someone."
        },
        "redact": {
          "type": "integer",
          "description": "The minimum level required in order to redact a message."
        },
        "users_default": {
          "type": "integer",
          "description": "The default power level of a user who is not in the 'users' list."
        },
        "state_default": {
          "type": "integer",
          "description": "The default power level required in order to send state events."
        },
        "events_default": {
          "type": "integer",
          "description": "The default power level required in order to send non-state events."
        },
        "users": {
          "type": "UserPowerLevels",
          "description": "Mappings of user ID to power level."
        },
        "events": {
          "type": "EventPowerLevels",
          "description": "Mappings of event type to power level."
        }
      }
    },
    "Message": {
      "id": "Message",
      "properties": {
        "msgtype": {
          "type": "string",
          "description": "The type of message being sent, e.g. \"m.text\"",
          "required": true
        },
        "_msgtype_defined_keys_": {
          "description": "Additional keys as defined by the msgtype, e.g. \"body\""
        }
      }
    },
    "Feedback": {
      "id": "Feedback",
      "properties": {
        "target_event_id": {
          "type": "string",
          "description": "The event ID being acknowledged.",
          "required": true
        },
        "type": {
          "type": "string",
          "description": "The type of feedback. Either 'delivered' or 'read'.",
          "required": true
        }
      }
    },
    "Member": {
      "id": "Member",
      "properties": {
        "membership": {
          "type": "string",
          "description": "Enum: The membership state of this member.",
          "enum": [
            "invite",
            "join",
            "leave",
            "ban"
          ]
        }
      }
    },
    "RoomInfo": {
      "id": "RoomInfo",
      "properties": {
        "room_id": {
          "type": "string",
          "description": "The allocated room ID.",
          "required": true
        },
        "room_alias": {
          "type": "string",
          "description": "The alias for the room.",
          "required": false
        }
      }
    },
    "JoinRoomInfo": {
      "id": "JoinRoomInfo",
      "properties": {
        "room_id": {
          "type": "string",
          "description": "The room ID joined, if joined via a room alias only.",
          "required": true
        }
      }
    },
    "Typing": {
      "id": "Typing",
      "properties": {
        "typing": {
          "type": "boolean",
          "description": "True if the user is currently typing.",
          "required": true
        },
        "timeout": {
            "type": "integer",
            "description": "The length of time until the user should be treated as no longer typing, in milliseconds. Can be omitted if they are no longer typing.",
            "required": true
        }
      }
    },
    "RoomConfig": {
      "id": "RoomConfig",
      "properties": {
        "visibility": {
          "type": "string",
          "description": "Enum: The room visibility. The room_alias_name is required if the visibility is public; without it the room will remain private.",
          "required": false,
          "enum": [
            "public",
            "private"
          ]
        },
        "room_alias_name": {
          "type": "string",
          "description": "Localpart of the alias to give the new room. The home server will attach its domain name after this.",
          "required": false
        },
        "name": {
          "type": "string",
          "description": "Sets the name of the room. Send a m.room.name event after creating the room with the 'name' key specified.",
          "required": false
        },
        "topic": {
          "type": "string",
          "description": "Sets the topic for the room. Send a m.room.topic event after creating the room with the 'topic' key specified.",
          "required": false
        },
        "invite": {
          "type": "array",
          "description": "The list of user IDs to invite. Sends m.room.member events after creating the room.",
          "items": {
            "$ref": "string"
          },
          "required": false
        }
      }
    },
    "PaginationRequest": {
      "id": "PaginationRequest",
      "properties": {
        "from": {
          "type": "string",
          "description": "The token to start getting results from."
        },
        "to": {
          "type": "string",
          "description": "The token to stop getting results at."
        },
        "limit": {
          "type": "integer",
          "description": "The maximum number of entries to return."
        }
      }
    },
    "PaginationChunk": {
      "id": "PaginationChunk",
      "properties": {
        "start": {
          "type": "string",
          "description": "A token which correlates to the first value in \"chunk\" for paginating.",
          "required": true
        },
        "end": {
          "type": "string",
          "description": "A token which correlates to the last value in \"chunk\" for paginating.",
          "required": true
        }
      },
      "subTypes": [
        "MessagePaginationChunk"
      ]
    },
    "MessagePaginationChunk": {
      "id": "MessagePaginationChunk",
      "properties": {
        "chunk": {
          "type": "array",
          "description": "A list of message events.",
          "items": {
            "$ref": "MessageEvent"
          },
          "required": true
        }
      }
    },
    "MemberPaginationChunk": {
      "id": "MemberPaginationChunk",
      "properties": {
        "chunk": {
          "type": "array",
          "description": "A list of member events.",
          "items": {
            "$ref": "MemberEvent"
          },
          "required": true
        }
      }
    },
    "Event": {
      "id": "Event",
      "properties": {
        "event_id": {
          "type": "string",
          "description": "An ID which uniquely identifies this event. This is automatically set by the server.",
          "required": true
        },
        "room_id": {
          "type": "string",
          "description": "The room in which this event occurred. This is automatically set by the server.",
          "required": true
        },
        "type": {
          "type": "string",
          "description": "The event type.",
          "required": true
        }
      },
      "subTypes": [
        "MessageEvent"
      ]
    },
    "EventId": {
      "id": "EventId",
      "properties": {
        "event_id": {
          "type": "string",
          "description": "The allocated event ID for this event.",
          "required": true
        }
      }
    },
    "EventContent": {
      "id": "EventContent",
      "properties": {
        "__event_content_keys__": {
          "type": "string",
          "description": "Event-specific content keys and values.",
          "required": false
        }
      }
    },
    "MessageEvent": {
      "id": "MessageEvent",
      "properties": {
        "content": {
          "type": "Message"
        }
      }
    },
    "MemberEvent": {
      "id": "MemberEvent",
      "properties": {
        "content": {
          "type": "Member"
        }
      }
    },
    "InviteRequest": {
      "id": "InviteRequest",
      "properties": {
        "user_id": {
          "type": "string",
          "description": "The fully-qualified user ID."
        }
      }
    },
    "JoinRequest": {
      "id": "JoinRequest",
      "properties": {}
    },
    "LeaveRequest": {
      "id": "LeaveRequest",
      "properties": {}
    },
    "BanRequest": {
      "id": "BanRequest",
      "properties": {
        "user_id": {
          "type": "string",
          "description": "The fully-qualified user ID."
        },
        "reason": {
          "type": "string",
          "description": "The reason for the ban."
        }
      }
    },
    "InitialSyncRoomData": {
      "id": "InitialSyncRoomData",
      "properties": {
        "membership": {
          "type": "string",
          "description": "This user's membership state in this room.",
          "required": true
        },
        "room_id": {
          "type": "string",
          "description": "The ID of this room.",
          "required": true
        },
        "messages": {
          "type": "MessagePaginationChunk",
          "description": "The most recent messages for this room, governed by the limit parameter.",
          "required": false
        },
        "state": {
          "type": "array",
          "description": "A list of state events representing the current state of the room.",
          "required": false,
          "items": {
            "$ref": "Event"
          }
        },
        "presence": {
          "type": "array",
          "description": "A list of m.presence events representing the current presence state of the room members.",
          "required": false,
          "items": {
            "$ref": "Event"
          }
        }
      }
    }
  }
}