{"openapi":"3.1.0","info":{"title":"Liveblocks API","version":"2.0","description":"The Liveblocks REST API lets you read and modify rooms, threads, notifications, users, permissions, and schemas programmatically. Authenticate requests with a secret key using the `Authorization: Bearer` header."},"servers":[{"url":"https://api.liveblocks.io/v2"}],"paths":{"/rooms":{"get":{"summary":"Get rooms","description":"This endpoint returns a list of your rooms. The rooms are returned sorted by creation date, from newest to oldest. You can filter rooms by room ID prefixes, metadata, users accesses, and groups accesses. Corresponds to [`liveblocks.getRooms`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms).\n\nThere is a pagination system where the cursor to the next page is returned in the response as `nextCursor`, which can be combined with `startingAfter`.\nYou can also limit the number of rooms by query.\n\nFiltering by metadata works by giving key values like `metadata.color=red`. Of course you can combine multiple metadata clauses to refine the response like `metadata.color=red&metadata.type=text`. Notice here the operator AND is applied between each clauses.\n\nFiltering by groups or userId works by giving a list of groups like `groupIds=marketing,GZo7tQ,product` or/and a userId like `userId=user1`.\nNotice here the operator OR is applied between each `groupIds` and the `userId`.\n","tags":["Room"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of rooms to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"},{"schema":{"type":"string","description":"A filter on organization ID.","example":"org_123456789"},"in":"query","name":"organizationId"},{"schema":{"type":"string","description":"Query to filter rooms. You can filter by `roomId` and `metadata`, for example, `metadata[\"roomType\"]:\"whiteboard\" AND roomId^\"liveblocks:engineering\"`. Learn more about [filtering rooms with query language](https://liveblocks.io/docs/guides/how-to-filter-rooms-using-query-language).","example":"metadata[\"color\"]:\"blue\""},"in":"query","name":"query"},{"schema":{"type":"string","description":"A filter on users accesses.","example":"user-123"},"in":"query","name":"userId"},{"schema":{"type":"string","description":"A filter on groups accesses. Multiple groups can be used.","example":"group1,group2"},"in":"query","name":"groupIds"}],"responses":{"200":{"description":"Success. Returns the list of rooms, the next page cursor, and the next page URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRoomsResponse"},"examples":{"example":{"value":{"nextCursor":"W1siaWQiLCJVRzhWYl82SHRUS0NzXzFvci1HZHQiXSxbImNyZWF0ZWRBdCIsMTY2MDAwMDk4ODEzN11d","data":[{"type":"room","id":"HTOGSiXcORTECjfNBBLii","lastConnectionAt":"2022-08-08T23:23:15.281Z","createdAt":"2022-08-08T23:23:15.281Z","organizationId":"org_123456789","metadata":{"name":["My room"],"type":["whiteboard"]},"defaultAccesses":["*:write"],"groupsAccesses":{"product":["*:write"]},"usersAccesses":{"vinod":["*:write"]}}]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"get-rooms"},"post":{"summary":"Create room","description":"This endpoint creates a new room. `id` and `defaultAccesses` are required. When provided with a `?idempotent` query argument, will not return a 409 when the room already exists, but instead return the existing room as-is. Corresponds to [`liveblocks.createRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms), or to [`liveblocks.getOrCreateRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-or-create-rooms-roomId) when `?idempotent` is provided. \n- `defaultAccesses` is the default room permission list, for example `[]`, `[\"*:read\"]`, `[\"*:write\"]`, or a more granular permission list. \n- `metadata` could be key/value as `string` or `string[]`. `metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 256 characters maximum. `metadata` is optional field.\n- `usersAccesses` contains user-specific permission lists. It can contain 1000 ids maximum. Id length has a limit of 256 characters. `usersAccesses` is optional field.\n- `groupsAccesses` contains group-specific permission lists and is optional.\n","tags":["Room"],"parameters":[{"schema":{"type":"boolean","description":"When provided, will not return a 409 when the room already exists, but instead return the existing room as-is. Corresponds to [`liveblocks.getOrCreateRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-or-create-rooms-roomId).","example":true},"in":"query","name":"idempotent"}],"responses":{"200":{"description":"Success. Returns the created room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"},"examples":{"example":{"value":{"type":"room","id":"my-room-3ebc26e2bf96","lastConnectionAt":"2022-08-22T15:10:25.225Z","createdAt":"2022-08-22T15:10:25.225Z","organizationId":"org_123456789","metadata":{"color":"blue"},"defaultAccesses":["*:write"],"groupsAccesses":{"product":["*:write"]},"usersAccesses":{"alice":["*:write"]}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"409":{"$ref":"#/components/responses/409"},"422":{"$ref":"#/components/responses/422"}},"operationId":"create-room","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoomRequestBody"},"examples":{"example":{"value":{"id":"my-room-3ebc26e2bf96","defaultAccesses":["*:write"],"metadata":{"color":"blue"},"usersAccesses":{"alice":["*:write"]},"groupsAccesses":{"product":["*:write"]}}}}}}}}},"/rooms/{roomId}":{"get":{"summary":"Get room","tags":["Room"],"operationId":"get-room","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"},"examples":{"example":{"value":{"type":"room","id":"react-todo-list","lastConnectionAt":"2022-08-04T21:07:09.380Z","createdAt":"2022-07-13T14:32:50.697Z","organizationId":"org_123456789","metadata":{"color":"blue","size":"10","target":["abc","def"]},"defaultAccesses":["*:write"],"groupsAccesses":{"marketing":["*:write"]},"usersAccesses":{"alice":["*:write"],"vinod":["*:write"]}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"description":"This endpoint returns a room by its ID. Corresponds to [`liveblocks.getRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomid)."},"post":{"summary":"Update room","tags":["Room"],"parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"},"examples":{"example":{"value":{"type":"room","id":"react-todo-list","lastConnectionAt":"2022-08-04T21:07:09.380Z","createdAt":"2022-07-13T14:32:50.697Z","organizationId":"org_123456789","metadata":{"color":"blue","size":"10","target":["abc","def"]},"defaultAccesses":["*:write"],"groupsAccesses":{"marketing":["*:write"]},"usersAccesses":{"alice":["*:write"],"vinod":["*:write"]}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"update-room","description":"This endpoint updates specific properties of a room. Corresponds to [`liveblocks.updateRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomid). \n\nIt’s not necessary to provide the entire room’s information. \nSetting a property to `null` means to delete this property. For example, if you want to remove access to a specific user without losing other users: \n``{\n    \"usersAccesses\": {\n        \"john\": null\n    }\n}``\n`defaultAccesses`, `metadata`, `usersAccesses`, `groupsAccesses` can be updated.\n\n- `defaultAccesses` is the default room permission list, for example `[]`, `[\"*:read\"]`, `[\"*:write\"]`, or a more granular permission list.\n- `metadata` could be key/value as `string` or `string[]`. `metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 256 characters maximum. `metadata` is optional field.\n- `usersAccesses` contains user-specific permission lists. It can contain 1000 ids maximum. Id length has a limit of 256 characters. `usersAccesses` is optional field.\n- `groupsAccesses` contains group-specific permission lists and is optional.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoomRequestBody"},"examples":{"example":{"value":{"defaultAccesses":["*:write"],"usersAccesses":{"vinod":["*:write"],"alice":["*:write"]},"groupsAccesses":{"marketing":["*:write"]},"metadata":{"color":"blue"}}}}}}}},"delete":{"summary":"Delete room","tags":["Room"],"responses":{"204":{"description":"Success. The room was deleted"},"401":{"description":"Missing or wrong credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"WRONG_KEY_USED":{"value":{"error":"WRONG_KEY_USED","message":"Public key instead of the secret key.","suggestion":"Please use your secret key instead of the public key, the secret key is available in the dashboard: https://liveblocks.io/dashboard/apikeys.","docs":""}},"MISSING_SECRET_KEY":{"value":{"error":"MISSING_SECRET_KEY","message":"Missing secret key in authentication header","suggestion":"Please use a secret key, the secret key is available in the dashboard: https://liveblocks.io/dashboard/apikeys","docs":""}}}}}},"403":{"description":"Unauthorized access.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"INVALID_SECRET_KEY":{"value":{"error":"INVALID_SECRET_KEY","message":"Invalid secret key.","suggestion":"Please use a valid secret key, the secret key is available in the dashboard: https://liveblocks.io/dashboard/apikeys.","docs":""}},"INVALID_PUBLIC_KEY":{"value":{"error":"INVALID_PUBLIC_KEY","message":"Invalid public key","suggestion":"Please use a valid public key, the public key is available in the dashboard: https://liveblocks.io/dashboard/apikeys","docs":""}},"UNAUTHORIZED_ROOM_ACCESS":{"value":{"error":"UNAUTHORIZED_ROOM_ACCESS","message":"The user does not have permission to access the room.","suggestion":"Please add the user’s ID or one of the user’s group IDs to the room first.","docs":""}}}}}},"422":{"description":"Unprocessable entity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"UNPROCESSABLE_ENTITY":{"value":{"error":"UNPROCESSABLE_ENTITY","message":"Missing key: 'defaultAccesses'.","suggestion":"Please ensure the data follows the correct format.","docs":""}}}}}}},"parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"operationId":"delete-room","description":"This endpoint deletes a room. A deleted room is no longer accessible from the API or the dashboard and it cannot be restored. Corresponds to [`liveblocks.deleteRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomid)."}},"/rooms/{roomId}/prewarm":{"get":{"summary":"Prewarm room","tags":["Room"],"operationId":"prewarm-room","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"204":{"description":"Success. Room has been prewarmed for faster connectivity."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"description":"Speeds up connecting to a room for the next 10 seconds. Use this when you know a user will be connecting to a room with [`RoomProvider`](https://liveblocks.io/docs/api-reference/liveblocks-react#RoomProvider) or [`enterRoom`](https://liveblocks.io/docs/api-reference/liveblocks-client#Client.enterRoom) within 10 seconds, and the room will load quicker. Corresponds to [`liveblocks.prewarmRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomid-prewarm)."}},"/rooms/{roomId}/upsert":{"post":{"summary":"Upsert (update or create) room","tags":["Room"],"parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated or created room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"},"examples":{"example":{"value":{"type":"room","id":"react-todo-list","lastConnectionAt":"2022-08-04T21:07:09.380Z","createdAt":"2022-07-13T14:32:50.697Z","organizationId":"org_123456789","metadata":{"color":"blue","size":"10","target":["abc","def"]},"defaultAccesses":["*:write"],"groupsAccesses":{"marketing":["*:write"]},"usersAccesses":{"alice":["*:write"],"vinod":["*:write"]}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"upsert-room","description":"This endpoint updates specific properties of a room. Corresponds to [`liveblocks.upsertRoom`](https://liveblocks.io/docs/api-reference/liveblocks-node#upsert-rooms-roomId). \n\nIt’s not necessary to provide the entire room’s information. \nSetting a property to `null` means to delete this property. For example, if you want to remove access to a specific user without losing other users: \n``{\n    \"usersAccesses\": {\n        \"john\": null\n    }\n}``\n`defaultAccesses`, `metadata`, `usersAccesses`, `groupsAccesses` can be updated.\n\n- `defaultAccesses` is the default room permission list, for example `[]`, `[\"*:read\"]`, `[\"*:write\"]`, or a more granular permission list.\n- `metadata` could be key/value as `string` or `string[]`. `metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 256 characters maximum. `metadata` is optional field.\n- `usersAccesses` contains user-specific permission lists. It can contain 1000 ids maximum. Id length has a limit of 256 characters. `usersAccesses` is optional field.\n- `groupsAccesses` contains group-specific permission lists and is optional.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertRoomRequestBody"},"examples":{"example":{"value":{"update":{"usersAccesses":{"vinod":["*:write"],"alice":["*:write"]},"groupsAccesses":{"marketing":["*:write"]},"metadata":{"color":"blue"}},"create":{"defaultAccesses":["*:write"]}}}}}}}}},"/rooms/{roomId}/update-room-id":{"post":{"summary":"Update room ID","tags":["Room"],"parameters":[{"schema":{"type":"string","description":"The new ID for the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated room with the new ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"},"examples":{"example":{"value":{"type":"room","id":"react-todo-list","lastConnectionAt":"2022-08-04T21:07:09.380Z","createdAt":"2022-07-13T14:32:50.697Z","organizationId":"org_123456789","metadata":{"color":"blue","size":"10","target":["abc","def"]},"defaultAccesses":["*:write"],"groupsAccesses":{"marketing":["*:write"]},"usersAccesses":{"alice":["*:write"],"vinod":["*:write"]}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"update-room-id","description":"This endpoint permanently updates the room’s ID. All existing references to the old room ID will need to be updated. Returns the updated room. Corresponds to [`liveblocks.updateRoomId`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomid-update-room-id).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoomIdRequestBody"},"examples":{"example":{"value":{"newRoomId":"new-room-id"}}}}}}}},"/rooms/{roomId}/update-organization-id":{"post":{"summary":"Update room organization ID","tags":["Room"],"parameters":[{"schema":{"type":"string","description":"The ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated room with the new organization ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"},"examples":{"example":{"value":{"type":"room","id":"react-todo-list","lastConnectionAt":"2022-08-04T21:07:09.380Z","createdAt":"2022-07-13T14:32:50.697Z","organizationId":"org_987654321","metadata":{"color":"blue","size":"10","target":["abc","def"]},"defaultAccesses":["*:write"],"groupsAccesses":{"marketing":["*:write"]},"usersAccesses":{"alice":["*:write"],"vinod":["*:write"]}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"update-room-organization-id","description":"This endpoint updates the room's organization ID. The `fromOrganizationId` must match the room's current organization ID. Returns the updated room.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoomOrganizationIdRequestBody"},"examples":{"example":{"value":{"fromOrganizationId":"org_123456789","toOrganizationId":"org_987654321"}}}}}}}},"/rooms/{roomId}/active-users":{"get":{"summary":"Get active users","tags":["Room"],"operationId":"get-active-users","description":"This endpoint returns a list of users currently present in the requested room. Corresponds to [`liveblocks.getActiveUsers`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomid-active-users). \n\nFor optimal performance, we recommend calling this endpoint no more than once every 10 seconds. \nDuplicates can occur if a user is in the requested room with multiple browser tabs opened.","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the list of active users for the specified room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveUsersResponse"},"examples":{"example":{"value":{"data":[{"type":"user","connectionId":16,"id":"alice","info":{}},{"type":"user","connectionId":20,"id":"bob","info":{}}]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/presence":{"post":{"summary":"Set ephemeral presence","description":"This endpoint sets ephemeral presence for a user in a room without requiring a WebSocket connection. The presence data will automatically expire after the specified TTL (time-to-live). This is useful for scenarios like showing an AI agent's presence in a room. The presence will be broadcast to all connected users in the room. Corresponds to [`liveblocks.setPresence`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-presence).","tags":["Room"],"operationId":"set-presence","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPresenceRequestBody"},"examples":{"example":{"value":{"userId":"agent-123","data":{"status":"active","cursor":{"x":100,"y":200}},"userInfo":{"name":"AI Assistant","avatar":"https://example.org/images/agent123.jpg"},"ttl":60}}}}}},"responses":{"204":{"description":"Success. Presence was set for the user in the room."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}}}},"/rooms/{roomId}/broadcast-event":{"post":{"summary":"Broadcast event to a room","description":"This endpoint enables the broadcast of an event to a room without having to connect to it via the `client` from `@liveblocks/client`. It takes any valid JSON as a request body. The `connectionId` passed to event listeners is `-1` when using this API. Corresponds to [`liveblocks.broadcastEvent`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-broadcast-event).","tags":["Room"],"parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"operationId":"broadcast-event","responses":{"204":{"description":"Success. An event was broadcast to the room."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"requestBody":{"required":true,"description":"Any valid JSON.","content":{"application/json":{"schema":{},"examples":{"example":{"value":{"type":"EMOJI","emoji":"🔥"}}}}}}}},"/rooms/{roomId}/storage":{"get":{"summary":"Get Storage document","description":"Returns the contents of the room’s Storage tree. Corresponds to [`liveblocks.getStorageDocument`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-storage). \n\nThe default outputted format is called “plain LSON”, which includes information on the Live data structures in the tree. These nodes show up in the output as objects with two properties, for example:\n\n```json\n{\n  \"liveblocksType\": \"LiveObject\",\n  \"data\": ...\n}\n```\n\nIf you’re not interested in this information, you can use the simpler `?format=json` query param, see below.","tags":["Storage"],"parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","enum":["plain-lson","json"],"description":"Use the `json` format to output a simplified JSON representation of the Storage tree. In that format, each LiveObject and LiveMap becomes a simple JSON object, each LiveList becomes a simple JSON array, and each LiveFile becomes its metadata object. This is a lossy format because information about the original data structures is not retained, but it may be easier to work with.","example":"json"},"name":"format","in":"query","required":false}],"responses":{"200":{"description":"Success. Returns the room’s Storage as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStorageDocumentResponse"},"examples":{"example":{"value":{"liveblocksType":"LiveObject","data":{"aLiveObject":{"liveblocksType":"LiveObject","data":{"a":1}},"aLiveList":{"liveblocksType":"LiveList","data":["a","b"]},"aLiveMap":{"liveblocksType":"LiveMap","data":{"a":1,"b":2}},"aLiveFile":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-storage-document"},"post":{"summary":"Initialize Storage document","tags":["Storage"],"operationId":"initialize-storage-document","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. The Storage is initialized. Returns the room’s Storage as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitializeStorageDocumentResponse"},"examples":{"example":{"value":{"liveblocksType":"LiveObject","data":{"aLiveObject":{"liveblocksType":"LiveObject","data":{"a":1}},"aLiveList":{"liveblocksType":"LiveList","data":["a","b"]},"aLiveMap":{"liveblocksType":"LiveMap","data":{"a":1,"b":2}},"aLiveFile":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"Storage already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"CANNOT_UPDATE_EXISTING_STORAGE":{"value":{"error":"CANNOT_UPDATE_EXISTING_STORAGE","message":"The room already has storage data. It's only possible to initialize the storage for an empty room.","suggestion":"Create another room or clear this room storage first.","docs":""}}}}}}},"description":"This endpoint initializes or reinitializes a room’s Storage. The room must already exist. Calling this endpoint will disconnect all users from the room if there are any, triggering a reconnect. Corresponds to [`liveblocks.initializeStorageDocument`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-storage).\n\nThe format of the request body is the same as what’s returned by the get Storage endpoint.\n\nFor each Liveblocks data structure that you want to create, you need a JSON element having two properties:\n- `\"liveblocksType\"` => `\"LiveObject\" | \"LiveList\" | \"LiveMap\" | \"LiveFile\"`\n- `\"data\"` => contains the nested data structures (children) and data.\n\nThe root’s type can only be LiveObject.\n\nA utility function, `toPlainLson` is included in `@liveblocks/client` from `1.0.9` to help convert `LiveObject`, `LiveList`, `LiveMap`, and `LiveFile` to the structure expected by the endpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"liveblocksType":{"type":"string","const":"LiveObject"},"data":{"type":"object","additionalProperties":true}},"required":["liveblocksType","data"]},"examples":{"example":{"value":{"liveblocksType":"LiveObject","data":{"aLiveObject":{"liveblocksType":"LiveObject","data":{"a":1}},"aLiveList":{"liveblocksType":"LiveList","data":["a","b"]},"aLiveMap":{"liveblocksType":"LiveMap","data":{"a":1,"b":2}},"aLiveFile":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}}}}}}}}},"delete":{"summary":"Delete Storage document","tags":["Storage"],"operationId":"delete-storage-document","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"responses":{"200":{"description":"Success. The room has no more Storage."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"description":"This endpoint deletes all of the room’s Storage data. Calling this endpoint will disconnect all users from the room if there are any. Corresponds to [`liveblocks.deleteStorageDocument`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomId-storage).\n"}},"/rooms/{roomId}/storage/json-patch":{"patch":{"summary":"Apply JSON Patch to Storage","description":"Applies a sequence of [JSON Patch](https://datatracker.ietf.org/doc/html/rfc6902) operations to the room's Storage document, useful for modifying Storage. Operations are applied in order; if any operation fails, the document is not changed and a 422 response with a helpful message is returned.\n\n**Paths and data types:** Be as specific as possible with your target path. Every parent in the chain of path segments must be a LiveObject, LiveList, or LiveMap. Complex nested objects passed in `add` or `replace` operations are automatically converted to LiveObjects and LiveLists. LiveText is a leaf node: only the LiveText node itself is addressable, not fields under its serialized `data`. Use `replace` with a string or a LiveTextData array to replace the whole node, for example `/text` with `[[\"Hello\"]]`; use `remove` on `/text` to remove the node. LiveText versioning is internal and is not part of this API.\n\n**Performance:** For large Storage documents, applying a patch can be expensive because the full state is reconstructed on the server to apply the operations. Very large documents may not be suitable for this endpoint.\n\nFor a **full guide with examples**, see [Modifying storage via REST API with JSON Patch](https://liveblocks.io/docs/guides/modifying-storage-via-rest-api-with-json-patch).","tags":["Storage"],"operationId":"patch-storage-document","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchStorageDocumentRequestBody"},"examples":{"addAndRemove":{"summary":"Add and remove","value":[{"op":"add","path":"/score","value":42},{"op":"remove","path":"/oldKey"}]},"appendToList":{"summary":"Append to LiveList","value":[{"op":"add","path":"/layers/-","value":"newLayer"}]},"addLiveFile":{"summary":"Add a LiveFile","value":[{"op":"add","path":"/photo","value":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}}]}}}}},"responses":{"200":{"description":"Success. All operations were applied; the Storage document was updated."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"description":"Patch failed. The document was not changed. The response body includes an error code and a helpful message (e.g. invalid path, test failed, index out of bounds).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"INVALID_STORAGE_MUTATION_REQUEST":{"value":{"error":"INVALID_STORAGE_MUTATION_REQUEST","message":"Test failed: value at path \"/name\" does not match.","suggestion":"Ensure the test value matches the current document value.","docs":""}},"UNPROCESSABLE_ENTITY":{"value":{"error":"UNPROCESSABLE_ENTITY","message":"Invalid JSON pointer: path must start with \"/\".","suggestion":"Please ensure the data follows the correct format.","docs":""}}}}}}}}},"/rooms/{roomId}/storage/files/{fileId}":{"get":{"summary":"Get Storage file","description":"Returns an uploaded Storage file's metadata and a presigned download URL. The URL expires after one hour.","tags":["Storage"],"operationId":"get-storage-file","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID of the Storage file","example":"fl_abc123456789012345678"},"name":"fileId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the file metadata and presigned download URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageFileWithUrl"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/storage/files/{fileId}/upload/{name}":{"put":{"summary":"Upload Storage file","description":"Uploads a file's bytes to a room and returns the metadata needed to create a LiveFile. For large files, use the multipart upload operations instead. Repeating the request with the same file ID, name, and file size returns the existing upload.","tags":["Storage"],"operationId":"upload-storage-file","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID for the Storage file","example":"fl_abc123456789012345678"},"name":"fileId","in":"path","required":true},{"schema":{"type":"string","description":"Name of the file","example":"photo.png"},"name":"name","in":"path","required":true},{"schema":{"type":"integer","minimum":0,"description":"Expected file size in bytes.","example":12345},"name":"fileSize","in":"query","required":false}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Success. Returns the uploaded file metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveFileData"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"A file with this ID already exists with different metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"The file exceeds the project's per-file upload limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rooms/{roomId}/storage/files/{fileId}/multipart/{name}":{"post":{"summary":"Create Storage file multipart upload","description":"Starts a multipart upload for a Storage file.","tags":["Storage"],"operationId":"create-storage-file-multipart-upload","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID for the Storage file","example":"fl_abc123456789012345678"},"name":"fileId","in":"path","required":true},{"schema":{"type":"string","description":"Name of the file","example":"video.mp4"},"name":"name","in":"path","required":true},{"schema":{"type":"integer","minimum":0,"description":"Expected file size in bytes","example":10485760},"name":"fileSize","in":"query","required":false}],"responses":{"200":{"description":"Success. Returns identifiers for the multipart upload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageFileMultipartUpload"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"A file with this ID already exists."},"413":{"description":"The file exceeds the project's per-file upload limit."}}}},"/rooms/{roomId}/storage/files/{fileId}/multipart/{uploadId}/{partNumber}":{"put":{"summary":"Upload Storage file multipart part","description":"Uploads one part of a Storage file multipart upload.","tags":["Storage"],"operationId":"upload-storage-file-multipart-part","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID of the Storage file","example":"fl_abc123456789012345678"},"name":"fileId","in":"path","required":true},{"schema":{"type":"string","description":"ID returned when the multipart upload was created"},"name":"uploadId","in":"path","required":true},{"schema":{"type":"integer","minimum":1,"description":"One-based part number","example":1},"name":"partNumber","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Success. Returns the uploaded part's number and ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageFileMultipartPart"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/storage/files/{fileId}/multipart/{uploadId}/complete":{"post":{"summary":"Complete Storage file multipart upload","description":"Completes a multipart upload and returns the metadata needed to create a LiveFile.","tags":["Storage"],"operationId":"complete-storage-file-multipart-upload","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID of the Storage file","example":"fl_abc123456789012345678"},"name":"fileId","in":"path","required":true},{"schema":{"type":"string","description":"ID returned when the multipart upload was created"},"name":"uploadId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteStorageFileMultipartUploadRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the uploaded file metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveFileData"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"413":{"description":"The completed file exceeds the project's per-file upload limit."}}}},"/rooms/{roomId}/storage/files/{fileId}/multipart/{uploadId}":{"delete":{"summary":"Abort Storage file multipart upload","description":"Aborts a multipart upload and discards its uploaded parts.","tags":["Storage"],"operationId":"abort-storage-file-multipart-upload","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID of the Storage file","example":"fl_abc123456789012345678"},"name":"fileId","in":"path","required":true},{"schema":{"type":"string","description":"ID returned when the multipart upload was created"},"name":"uploadId","in":"path","required":true}],"responses":{"204":{"description":"Success. The multipart upload was aborted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/ydoc":{"get":{"summary":"Get Yjs document","description":"This endpoint returns a JSON representation of the room’s Yjs document. Corresponds to [`liveblocks.getYjsDocument`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-ydoc).","tags":["Yjs"],"parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"schema":{"type":"boolean","description":"If present, YText will return formatting."},"name":"formatting","in":"query","allowEmptyValue":true,"required":false},{"schema":{"type":"string","description":"Returns only a single key’s value, e.g. `doc.get(key).toJSON()`.","example":"root"},"name":"key","in":"query","required":false},{"schema":{"type":"string","enum":["ymap","ytext","yxmltext","yxmlfragment","yarray"],"description":"Used with key to override the inferred type, i.e. `\"ymap\"` will return `doc.get(key, Y.Map)`.","example":"ymap"},"name":"type","in":"query","required":false}],"responses":{"200":{"description":"Success. Returns the room’s Yjs document as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetYjsDocumentResponse"},"examples":{"example":{"value":{"someYText":"Contents of YText"}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-yjs-document"},"put":{"summary":"Send a binary Yjs update","tags":["Yjs"],"parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"name":"guid","in":"query","required":false,"schema":{"type":"string","description":"ID of the subdocument","example":"subdoc-guid-123"}}],"responses":{"200":{"description":"Success. The given room’s Yjs doc has been updated."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"send-yjs-binary-update","description":"This endpoint is used to send a Yjs binary update to the room’s Yjs document. You can use this endpoint to initialize Yjs data for the room or to update the room’s Yjs document. To send an update to a subdocument instead of the main document, pass its `guid`. Corresponds to [`liveblocks.sendYjsBinaryUpdate`](https://liveblocks.io/docs/api-reference/liveblocks-node#put-rooms-roomId-ydoc).\n\nThe update is typically obtained by calling `Y.encodeStateAsUpdate(doc)`. See the [Yjs documentation](https://docs.yjs.dev/api/document-updates) for more details. When manually making this HTTP call, set the HTTP header `Content-Type` to `application/octet-stream`, and send the binary update (a `Uint8Array`) in the body of the HTTP request. This endpoint does not accept JSON, unlike most other endpoints.","requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}},"/rooms/{roomId}/ydoc-binary":{"get":{"summary":"Get Yjs document encoded as a binary Yjs update","description":"This endpoint returns the room's Yjs document encoded as a single binary update. This can be used by `Y.applyUpdate(responseBody)` to get a copy of the document in your back end. See [Yjs documentation](https://docs.yjs.dev/api/document-updates) for more information on working with updates. To return a subdocument instead of the main document, pass its `guid`. Corresponds to [`liveblocks.getYjsDocumentAsBinaryUpdate`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-ydoc-binary).","tags":["Yjs"],"parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"guid","in":"query","required":false,"schema":{"type":"string","description":"ID of the subdocument","example":"subdoc-guid-123"}}],"responses":{"200":{"description":"Success. Returns the room's Yjs document encoded as a binary Yjs update.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-yjs-document-as-binary-update"}},"/rooms/{roomId}/versions":{"get":{"summary":"Get Version History","description":"This endpoint returns a list of version history snapshots for the room. The versions are returned sorted by creation date, from newest to oldest. Corresponds to [`liveblocks.getVersionHistory`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-version-history).","tags":["Version History"],"operationId":"get-version-history","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of versions to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"cursor"}],"responses":{"200":{"description":"Success. Returns the list of version history snapshots and the next page cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVersionHistoryResponse"},"examples":{"example":{"value":{"data":[{"id":"vh_abc123","createdAt":"2024-10-15T10:30:00.000Z","authors":[{"id":"user-123"},{"id":"user-456"}]}],"nextCursor":"eyJjcmVhdGVkQXQiOiIyMDI0LTEwLTE1VDEwOjMwOjAwLjAwMFoifQ=="}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}},"post":{"summary":"Create version history snapshot","description":"This endpoint creates a new version history snapshot of the room, capturing both its Storage and Yjs documents. Corresponds to [`liveblocks.createVersionHistorySnapshot`](https://liveblocks.io/docs/api-reference/liveblocks-node#create-version-history-snapshot).","tags":["Version History"],"operationId":"create-version-history-snapshot","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}}],"responses":{"200":{"description":"Success. Returns the created version ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVersionHistorySnapshotResponse"},"examples":{"example":{"value":{"data":{"id":"vh_abc123"}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/versions/{versionId}/yjs":{"get":{"summary":"Get Yjs document version","description":"This endpoint returns a specific version of the room's Yjs document encoded as a binary Yjs update. Corresponds to [`liveblocks.getYjsVersion`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-yjs-version).","tags":["Version History"],"operationId":"get-yjs-version","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string","description":"ID of the version","example":"vh_abc123"}}],"responses":{"200":{"description":"Success. Returns the Yjs document version as a binary stream.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/versions/{versionId}":{"delete":{"summary":"Delete a version","description":"This endpoint permanently deletes a version from the room's history. Corresponds to [`liveblocks.deleteVersion`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-version).","tags":["Version History"],"operationId":"delete-version","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string","description":"ID of the version","example":"vh_abc123"}}],"responses":{"204":{"description":"Success. The version was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/threads":{"get":{"summary":"Get room threads","description":"This endpoint returns the threads in the requested room. Corresponds to [`liveblocks.getThreads`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-threads).","tags":["Comments"],"parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"schema":{"type":"string","description":"Query to filter threads. You can filter by `metadata`, `resolved`, and `visibility`, for example, `metadata[\"status\"]:\"open\" AND metadata[\"color\"]:\"red\" AND resolved:true AND visibility:\"private\"`. Learn more about [filtering threads with query language](https://liveblocks.io/docs/guides/how-to-filter-threads-using-query-language).","example":"metadata[\"color\"]:\"blue\""},"in":"query","name":"query"}],"operationId":"get-threads","responses":{"200":{"description":"Success. Returns list of threads in a room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetThreadsResponse"},"examples":{"Success":{"value":{"data":[{"type":"thread","id":"thread-id","roomId":"room-id","comments":[{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"string","createdAt":"2019-08-24T14:15:22Z","editedAt":"2019-08-24T14:15:22Z","deletedAt":"2019-08-24T14:15:22Z","body":{},"metadata":{},"reactions":[],"attachments":[]}],"createdAt":"2019-08-24T14:15:22Z","metadata":{},"resolved":false,"visibility":"public","updatedAt":"2019-08-24T14:15:22Z"}]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}},"post":{"summary":"Create thread","description":"This endpoint creates a new thread and the first comment in the thread. Corresponds to [`liveblocks.createThread`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads).\n\nA comment’s body is an array of paragraphs, each containing child nodes. Here’s an example of how to construct a comment’s body, which can be submitted under `comment.body`.\n\n```json\n{\n  \"version\": 1,\n  \"content\": [\n    {\n      \"type\": \"paragraph\",\n      \"children\": [{ \"text\": \"Hello \" }, { \"text\": \"world\", \"bold\": true }]\n    }\n  ]\n}\n```\n\n`metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 4000 characters maximum for strings.","tags":["Comments"],"operationId":"create-thread","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}}],"responses":{"200":{"description":"Success. Returns the created thread.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Thread"},"examples":{"example":{"value":{"type":"thread","id":"thread-id","roomId":"room-id","comments":[{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{},"metadata":{},"reactions":[],"attachments":[]}],"createdAt":"2022-07-13T14:32:50.697Z","updatedAt":"2022-07-13T14:32:50.697Z","metadata":{"color":"blue"},"resolved":false,"visibility":"public"}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"409":{"$ref":"#/components/responses/409-thread"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateThreadRequestBody"},"examples":{"example":{"value":{"comment":{"userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{"tag":"important","spam":false}},"metadata":{"color":"blue"}}}}}}}}},"/rooms/{roomId}/threads/{threadId}":{"get":{"summary":"Get thread","tags":["Comments"],"description":"This endpoint returns a thread by its ID. Corresponds to [`liveblocks.getThread`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-threads-threadId).","operationId":"get-thread","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"200":{"description":"Success. Returns requested thread.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Thread"},"examples":{"Success":{"value":{"type":"thread","id":"thread-id","roomId":"room-id","comments":[{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"string","createdAt":"2019-08-24T14:15:22Z","editedAt":"2019-08-24T14:15:22Z","deletedAt":"2019-08-24T14:15:22Z","body":{},"metadata":{},"reactions":[],"attachments":[]}],"createdAt":"2019-08-24T14:15:22Z","metadata":{},"resolved":false,"visibility":"public","updatedAt":"2019-08-24T14:15:22Z"}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}},"delete":{"summary":"Delete thread","tags":["Comments"],"description":"This endpoint deletes a thread by its ID. Corresponds to [`liveblocks.deleteThread`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomId-threads-threadId).","operationId":"delete-thread","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"204":{"description":"Success. The thread has been deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}}},"/rooms/{roomId}/threads/{threadId}/participants":{"get":{"summary":"Get thread participants","tags":["Comments"],"deprecated":true,"description":"**Deprecated.** Prefer using [thread subscriptions](#get-rooms-roomId-threads-threadId-subscriptions) instead.\n\nThis endpoint returns the list of thread participants. It is a list of unique user IDs representing all the thread comment authors and mentioned users in comments. Corresponds to [`liveblocks.getThreadParticipants`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-threads-threadId-participants).","operationId":"get-thread-participants","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"200":{"description":"Success. Returns the thread’s participants","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetThreadParticipantsResponse"},"examples":{"Success":{"value":{"participantIds":["user-1","user-2"]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}}},"/rooms/{roomId}/threads/{threadId}/metadata":{"post":{"summary":"Edit thread metadata","tags":["Comments"],"description":"This endpoint edits the metadata of a thread. The metadata is a JSON object that can be used to store any information you want about the thread, in `string`, `number`, or `boolean` form. Set a property to `null` to remove it. Corresponds to [`liveblocks.editThreadMetadata`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-metadata).\n\n`metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 4000 characters maximum for strings.","operationId":"edit-thread-metadata","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"200":{"description":"Success. Returns the updated metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadMetadata"},"examples":{"Success":{"value":{"color":"yellow"}}}}}},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditThreadMetadataRequestBody"},"examples":{"example":{"value":{"metadata":{"color":"yellow"},"userId":"alice","createdAt":"2023-07-13T14:32:50.697Z"}}}}}}}},"/rooms/{roomId}/threads/{threadId}/mark-as-resolved":{"post":{"summary":"Mark thread as resolved","tags":["Comments"],"description":"This endpoint marks a thread as resolved. The request body must include a `userId` to identify who resolved the thread. Returns the updated thread. Corresponds to [`liveblocks.markThreadAsResolved`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-mark-as-resolved).","operationId":"mark-thread-as-resolved","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkThreadAsResolvedRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the updated thread.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Thread"}}}},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}}},"/rooms/{roomId}/threads/{threadId}/mark-as-unresolved":{"post":{"summary":"Mark thread as unresolved","tags":["Comments"],"description":"This endpoint marks a thread as unresolved. The request body must include a `userId` to identify who unresolved the thread. Returns the updated thread. Corresponds to [`liveblocks.markThreadAsUnresolved`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-mark-as-unresolved).","operationId":"mark-thread-as-unresolved","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkThreadAsUnresolvedRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the updated thread.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Thread"}}}},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}}},"/rooms/{roomId}/threads/{threadId}/subscribe":{"post":{"summary":"Subscribe to thread","tags":["Comments"],"description":"This endpoint subscribes to a thread. Corresponds to [`liveblocks.subscribeToThread`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-subscribe).","operationId":"subscribe-to-thread","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeToThreadRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the thread subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}},"parameters":[{"schema":{"type":"string","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","example":"th_abc123"},"name":"threadId","in":"path","required":true}]},"/rooms/{roomId}/threads/{threadId}/unsubscribe":{"post":{"summary":"Unsubscribe from thread","tags":["Comments"],"description":"This endpoint unsubscribes from a thread. Corresponds to [`liveblocks.unsubscribeFromThread`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-unsubscribe).","operationId":"unsubscribe-from-thread","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeFromThreadRequestBody"}}}},"responses":{"200":{"description":"Success."},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}},"parameters":[{"schema":{"type":"string","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","example":"th_abc123"},"name":"threadId","in":"path","required":true}]},"/rooms/{roomId}/threads/{threadId}/subscriptions":{"get":{"summary":"Get thread subscriptions","tags":["Comments"],"description":"This endpoint gets the list of subscriptions to a thread. Corresponds to [`liveblocks.getThreadSubscriptions`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-threads-threadId-subscriptions).","operationId":"get-thread-subscriptions","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetThreadSubscriptionsResponse"}}}},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}},"parameters":[{"schema":{"type":"string","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","example":"th_abc123"},"name":"threadId","in":"path","required":true}]},"/rooms/{roomId}/threads/{threadId}/comments":{"post":{"summary":"Create comment","description":"This endpoint creates a new comment, adding it as a reply to a thread. Corresponds to [`liveblocks.createComment`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-comments).\n\nA comment’s body is an array of paragraphs, each containing child nodes. Here’s an example of how to construct a comment’s body, which can be submitted under `body`.\n\n```json\n{\n  \"version\": 1,\n  \"content\": [\n    {\n      \"type\": \"paragraph\",\n      \"children\": [{ \"text\": \"Hello \" }, { \"text\": \"world\", \"bold\": true }]\n    }\n  ]\n}\n```\n\n`metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 4000 characters maximum for strings.","tags":["Comments"],"operationId":"create-comment","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"200":{"description":"Success. Returns the created comment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"},"examples":{"example":{"value":{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{},"metadata":{},"reactions":[],"attachments":[]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"},"409":{"$ref":"#/components/responses/409-comment"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentRequestBody"},"examples":{"example":{"value":{"userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{"tag":"important","spam":false}}}}}}}}},"/rooms/{roomId}/threads/{threadId}/comments/{commentId}":{"get":{"summary":"Get comment","tags":["Comments"],"description":"This endpoint returns a comment by its ID. Corresponds to [`liveblocks.getComment`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-threads-threadId-comments-commentId).","operationId":"get-comment","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the comment","example":"cm_abc123"}}],"responses":{"200":{"description":"Success. Returns the requested comment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"},"examples":{"Success":{"value":{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"alice","createdAt":"2019-08-24T14:15:22Z","editedAt":"2019-08-24T14:15:22Z","deletedAt":"2019-08-24T14:15:22Z","body":{},"metadata":{},"reactions":[],"attachments":[]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"}}},"post":{"summary":"Edit comment","description":"This endpoint edits the specified comment. Corresponds to [`liveblocks.editComment`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-comments-commentId).\n\nA comment’s body is an array of paragraphs, each containing child nodes. Here’s an example of how to construct a comment’s body, which can be submitted under `body`.\n\n```json\n{\n  \"version\": 1,\n  \"content\": [\n    {\n      \"type\": \"paragraph\",\n      \"children\": [{ \"text\": \"Hello \" }, { \"text\": \"world\", \"bold\": true }]\n    }\n  ]\n}\n```","tags":["Comments"],"operationId":"edit-comment","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the comment","example":"cm_abc123"}}],"responses":{"200":{"description":"Success. Returns the edited comment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"},"examples":{"example":{"value":{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"alice","createdAt":"2023-07-13T14:32:50.697Z","body":{},"metadata":{},"reactions":[],"attachments":[]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-thread"},"409":{"$ref":"#/components/responses/409-comment"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditCommentRequestBody"},"examples":{"example":{"value":{"editedAt":"2023-07-13T14:32:50.697Z","body":{"version":1,"content":[]}}}}}}}},"delete":{"summary":"Delete comment","tags":["Comments"],"parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the comment","example":"cm_abc123"}}],"responses":{"204":{"description":"Success. The comment was deleted"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-comment"}},"operationId":"delete-comment","description":"This endpoint deletes a comment. A deleted comment is no longer accessible from the API or the dashboard and it cannot be restored. Corresponds to [`liveblocks.deleteComment`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-comments-commentId)."}},"/rooms/{roomId}/threads/{threadId}/comments/{commentId}/add-reaction":{"post":{"summary":"Add comment reaction","description":"This endpoint adds a reaction to a comment. Corresponds to [`liveblocks.addCommentReaction`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-comments-commentId-add-reaction).","tags":["Comments"],"operationId":"add-comment-reaction","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the comment","example":"cm_abc123"}}],"responses":{"200":{"description":"Success. Returns the created reaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentReaction"},"examples":{"example":{"value":{"emoji":"👨‍👩‍👧","createdAt":"2022-07-13T14:32:50.697Z","userId":"alice"}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-comment"},"409":{"$ref":"#/components/responses/409-comment-reaction"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCommentReactionRequestBody"},"examples":{"example":{"value":{"emoji":"👨‍👩‍👧","createdAt":"2022-07-13T14:32:50.697Z","userId":"alice"}}}}}}}},"/rooms/{roomId}/threads/{threadId}/comments/{commentId}/remove-reaction":{"post":{"summary":"Remove comment reaction","description":"This endpoint removes a comment reaction. A deleted comment reaction is no longer accessible from the API or the dashboard and it cannot be restored. Corresponds to [`liveblocks.removeCommentReaction`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-comments-commentId-add-reaction).","tags":["Comments"],"operationId":"remove-comment-reaction","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the comment","example":"cm_abc123"}}],"responses":{"204":{"description":"Success. The comment reaction was deleted"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-comment-reaction"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveCommentReactionRequestBody"},"examples":{"example":{"value":{"emoji":"👨‍👩‍👧","userId":"alice","removedAt":"2022-07-13T14:32:50.697Z"}}}}}}}},"/rooms/{roomId}/attachments/{attachmentId}":{"get":{"summary":"Get attachment","description":"Gets an attachment's metadata and a presigned download URL. The URL expires after 1 hour.","tags":["Comments"],"operationId":"get-attachment","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the attachment","example":"at_abc123"}}],"responses":{"200":{"description":"Success. Returns the attachment metadata with a presigned download URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentWithUrl"},"examples":{"Success":{"value":{"type":"attachment","id":"at_abc123","mimeType":"image/png","name":"screenshot.png","size":12345,"url":"https://example.com/at_abc123?X-Amz-Expires=3600&X-Amz-Signature=...","expiresAt":"2026-03-16T14:00:00.000Z"}}}}}},"401":{"$ref":"#/components/responses/401"},"404":{"description":"Attachment not found"}}}},"/rooms/{roomId}/attachments/{attachmentId}/upload/{name}":{"put":{"summary":"Upload attachment","description":"Uploads a file's bytes and returns a draft comment attachment. Pass the returned attachment ID in the comment's attachment IDs when creating or editing a comment. For large files, use the multipart upload operations instead.","tags":["Comments"],"operationId":"upload-attachment","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string","pattern":"^at_[A-Za-z0-9_-]{21}$","description":"ID for the attachment","example":"at_abc123456789012345678"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","description":"Name of the file","example":"screenshot.png"}},{"name":"userId","in":"query","required":true,"schema":{"type":"string","description":"ID of the user uploading the attachment","example":"alice"}},{"name":"fileSize","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Expected file size in bytes","example":12345}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Success. Returns the uploaded draft attachment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentAttachment"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"An attachment with this ID already exists."},"413":{"description":"The attachment exceeds the project's per-file upload limit."},"422":{"$ref":"#/components/responses/422"}}}},"/rooms/{roomId}/attachments/{attachmentId}/multipart/{name}":{"post":{"summary":"Create attachment multipart upload","description":"Starts a multipart upload for a draft comment attachment.","tags":["Comments"],"operationId":"create-attachment-multipart-upload","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string","pattern":"^at_[A-Za-z0-9_-]{21}$","description":"ID for the attachment","example":"at_abc123456789012345678"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","description":"Name of the file","example":"recording.mp4"}},{"name":"fileSize","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Expected file size in bytes","example":10485760}}],"responses":{"200":{"description":"Success. Returns identifiers for the multipart upload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentMultipartUpload"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"An attachment with this ID already exists."},"413":{"description":"The attachment exceeds the project's per-file upload limit."},"422":{"$ref":"#/components/responses/422"}}}},"/rooms/{roomId}/attachments/{attachmentId}/multipart/{uploadId}/{partNumber}":{"put":{"summary":"Upload attachment multipart part","description":"Uploads one part of an attachment multipart upload.","tags":["Comments"],"operationId":"upload-attachment-multipart-part","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string","pattern":"^at_[A-Za-z0-9_-]{21}$","description":"ID of the attachment","example":"at_abc123456789012345678"}},{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","description":"ID returned when the multipart upload was created"}},{"name":"partNumber","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"One-based part number","example":1}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Success. Returns the uploaded part's number and ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentMultipartPart"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"The multipart upload belongs to a different project or room."}}}},"/rooms/{roomId}/attachments/{attachmentId}/multipart/{uploadId}/complete":{"post":{"summary":"Complete attachment multipart upload","description":"Completes a multipart upload and returns a draft comment attachment. Pass the returned attachment ID in the comment's attachment IDs when creating or editing a comment.","tags":["Comments"],"operationId":"complete-attachment-multipart-upload","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string","pattern":"^at_[A-Za-z0-9_-]{21}$","description":"ID of the attachment","example":"at_abc123456789012345678"}},{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","description":"ID returned when the multipart upload was created"}},{"name":"userId","in":"query","required":true,"schema":{"type":"string","description":"ID of the user uploading the attachment","example":"alice"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteAttachmentMultipartUploadRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the uploaded draft attachment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentAttachment"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"The multipart upload belongs to a different project or room."},"413":{"description":"The completed attachment exceeds the project's per-file upload limit."},"422":{"$ref":"#/components/responses/422"}}}},"/rooms/{roomId}/attachments/{attachmentId}/multipart/{uploadId}":{"delete":{"summary":"Abort attachment multipart upload","description":"Aborts a multipart upload and discards its uploaded parts.","tags":["Comments"],"operationId":"abort-attachment-multipart-upload","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string","pattern":"^at_[A-Za-z0-9_-]{21}$","description":"ID of the attachment","example":"at_abc123456789012345678"}},{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","description":"ID returned when the multipart upload was created"}}],"responses":{"204":{"description":"Success. The multipart upload was aborted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"409":{"description":"The multipart upload belongs to a different project or room."}}}},"/rooms/{roomId}/threads/{threadId}/comments/{commentId}/metadata":{"post":{"summary":"Edit comment metadata","tags":["Comments"],"description":"This endpoint edits the metadata of a comment. The metadata is a JSON object that can be used to store any information you want about the comment, in `string`, `number`, or `boolean` form. Set a property to `null` to remove it. Corresponds to [`liveblocks.editCommentMetadata`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-threads-threadId-comments-commentId-metadata).\n\n`metadata` supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 4000 characters maximum for strings.","operationId":"edit-comment-metadata","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","description":"ID of the comment","example":"cm_abc123"}}],"responses":{"200":{"description":"Success. Returns the updated metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentMetadata"},"examples":{"Success":{"value":{"tag":"important","reviewed":false}}}}}},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404-comment"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditCommentMetadataRequestBody"},"examples":{"example":{"value":{"metadata":{"tag":null,"reviewed":true},"userId":"alice","updatedAt":"2023-07-13T14:32:50.697Z"}}}}}}}},"/rooms/{roomId}/threads/{threadId}/inbox-notifications":{"get":{"summary":"Get thread inbox notifications","tags":["Comments"],"description":"This endpoint returns the inbox notifications associated with a specific thread. Because this endpoint is not user-scoped, each notification includes a `userId` field identifying which user the notification belongs to. Only thread-kind notifications are returned.","operationId":"get-thread-inbox-notifications","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"threadId","in":"path","required":true,"schema":{"type":"string","description":"ID of the thread","example":"th_abc123"}}],"responses":{"200":{"description":"Success. Returns the inbox notifications for the thread.","content":{"application/json":{"schema":{"type":"object","title":"Response","properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/InboxNotificationThreadData"},{"type":"object","properties":{"userId":{"type":"string","description":"The user ID this notification belongs to."}},"required":["userId"]}]}}}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"parameters":[{"schema":{"type":"string","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","example":"th_abc123"},"name":"threadId","in":"path","required":true}]},"/rooms/{roomId}/feeds":{"get":{"summary":"Get room feeds","description":"This endpoint returns the feeds in the requested room. Corresponds to [`liveblocks.getFeeds`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-feeds).","tags":["Feeds"],"operationId":"get-feeds","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"cursor","in":"query","schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"}},{"name":"since","in":"query","schema":{"type":"integer","description":"Only return feeds with `createdAt` greater than this Unix timestamp in milliseconds.","example":1660000988137}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of feeds to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20}}],"responses":{"200":{"description":"Success. Returns list of feeds in a room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFeedsResponse"},"examples":{"example":{"value":{"nextCursor":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9","data":[{"feedId":"my-feed-id","metadata":{"type":"chat","name":"General Discussion"},"createdAt":1660000988137,"updatedAt":1660000988137}]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}},"post":{"summary":"Create feed","description":"This endpoint creates a new feed in a room. Corresponds to [`liveblocks.createFeed`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-feeds).","tags":["Feeds"],"operationId":"create-feed","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeedRequestBody"},"examples":{"example":{"value":{"feedId":"my-feed-id","metadata":{"type":"chat","name":"General Discussion"}}}}}}},"responses":{"200":{"description":"Success. Returns the created feed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feed"},"examples":{"example":{"value":{"feedId":"my-feed-id","metadata":{"type":"chat","name":"General Discussion"},"createdAt":1660000988137,"updatedAt":1660000988137}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}}}},"/rooms/{roomId}/feeds/{feedId}":{"get":{"summary":"Get feed","description":"This endpoint returns a feed by its ID. Corresponds to [`liveblocks.getFeed`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-feeds-feedId).","tags":["Feeds"],"operationId":"get-feed","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}}],"responses":{"200":{"description":"Success. Returns the feed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feed"},"examples":{"example":{"value":{"feedId":"my-feed-id","metadata":{"type":"chat","name":"General Discussion"},"createdAt":1660000988137,"updatedAt":1660000988137}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}},"patch":{"summary":"Update feed","description":"This endpoint updates the metadata of a feed. Corresponds to [`liveblocks.updateFeed`](https://liveblocks.io/docs/api-reference/liveblocks-node#patch-rooms-roomId-feeds-feedId).","tags":["Feeds"],"operationId":"update-feed","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeedRequestBody"},"examples":{"example":{"value":{"metadata":{"type":"chat","name":"Updated Discussion"}}}}}}},"responses":{"200":{"description":"Success. Returns the updated feed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feed"},"examples":{"example":{"value":{"feedId":"my-feed-id","metadata":{"type":"chat","name":"Updated Discussion"},"createdAt":1660000988137,"updatedAt":1660001000000}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}}},"delete":{"summary":"Delete feed","description":"This endpoint deletes a feed. Corresponds to [`liveblocks.deleteFeed`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomId-feeds-feedId).","tags":["Feeds"],"operationId":"delete-feed","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}}],"responses":{"204":{"description":"Success. The feed was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/rooms/{roomId}/feeds/{feedId}/messages":{"get":{"summary":"Get feed messages","description":"This endpoint returns the messages in a feed. Corresponds to [`liveblocks.getFeedMessages`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-feeds-feedId-messages).","tags":["Feeds"],"operationId":"get-feed-messages","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}},{"name":"cursor","in":"query","schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"}},{"name":"since","in":"query","schema":{"type":"integer","description":"Only return messages with `createdAt` greater than this Unix timestamp in milliseconds.","example":1660000988137}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of messages to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20}}],"responses":{"200":{"description":"Success. Returns list of messages in a feed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFeedMessagesResponse"},"examples":{"example":{"value":{"nextCursor":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9","data":[{"id":"msg_xyz789","data":{"type":"text","content":"Hello, world!"},"createdAt":1660000988137,"updatedAt":1660000988137}]}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}},"post":{"summary":"Create feed message","description":"This endpoint creates a new message in a feed. Corresponds to [`liveblocks.createFeedMessage`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-feeds-feedId-messages).","tags":["Feeds"],"operationId":"create-feed-message","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeedMessageRequestBody"},"examples":{"example":{"value":{"id":"msg_xyz789","data":{"type":"text","content":"Hello, world!"}}}}}}},"responses":{"200":{"description":"Success. Returns the created feed message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedMessage"},"examples":{"example":{"value":{"id":"msg_xyz789","data":{"type":"text","content":"Hello, world!"},"createdAt":1660000988137,"updatedAt":1660000988137}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}}}},"/rooms/{roomId}/feeds/{feedId}/messages/{messageId}":{"patch":{"summary":"Update feed message","description":"This endpoint updates a feed message. Corresponds to [`liveblocks.updateFeedMessage`](https://liveblocks.io/docs/api-reference/liveblocks-node#patch-rooms-roomId-feeds-feedId-messages-messageId).","tags":["Feeds"],"operationId":"update-feed-message","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string","description":"ID of the message","example":"msg_xyz789"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeedMessageRequestBody"},"examples":{"example":{"value":{"data":{"type":"text","content":"Updated message content"}}}}}}},"responses":{"200":{"description":"Success. Returns the updated feed message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedMessage"},"examples":{"example":{"value":{"id":"msg_xyz789","data":{"type":"text","content":"Updated message content"},"createdAt":1660000988137,"updatedAt":1660001000000}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}}},"delete":{"summary":"Delete feed message","description":"This endpoint deletes a feed message. Corresponds to [`liveblocks.deleteFeedMessage`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomId-feeds-feedId-messages-messageId).","tags":["Feeds"],"operationId":"delete-feed-message","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string","description":"ID of the room","example":"my-room-id"}},{"name":"feedId","in":"path","required":true,"schema":{"type":"string","description":"ID of the feed","example":"fd_abc123"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string","description":"ID of the message","example":"msg_xyz789"}}],"responses":{"204":{"description":"Success. The feed message was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}}}},"/authorize-user":{"post":{"summary":"Get access token with secret key","tags":["Auth"],"operationId":"authorize-user","responses":{"200":{"description":"Success. Returns an access token that can be used to enter one or more rooms.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeUserResponse"},"examples":{"example":{"value":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIi..."}}}}}},"403":{"$ref":"#/components/responses/403"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeUserRequestBody"},"examples":{"example":{"value":{"userId":"user-123","userInfo":{"name":"bob","avatar":"https://example.org/images/user123.jpg"},"organizationId":"acme-corp","permissions":{"my-room-1":["*:write"],"my-room-2":["*:write"],"my-room-*":["*:read"]}}}}}}},"description":"This endpoint lets your application server (your back end) obtain a token that one of its clients (your frontend) can use to enter a Liveblocks room. You use this endpoint to implement your own application’s custom authentication endpoint. When making this request, you’ll have to use your secret key.\n\n**Important:** The difference with an [ID token](#post-identify-user) is that an access token holds all the permissions, and is the source of truth. With ID tokens, permissions are set in the Liveblocks back end (through REST API calls) and \"checked at the door\" every time they are used to enter a room.\n\n**Note:** When using the `@liveblocks/node` package, you can use [`Liveblocks.prepareSession`](https://liveblocks.io/docs/api-reference/liveblocks-node#access-tokens) in your back end to build this request.\n\nYou can pass the property `userId` in the request’s body. This can be whatever internal identifier you use for your user accounts as long as it uniquely identifies an account. The property `userId` is used by Liveblocks to calculate your account’s Monthly Active Users. One unique `userId` corresponds to one MAU.\n\nAdditionally, you can set custom metadata to the token, which will be publicly accessible by other clients through the `user.info` property. This is useful for storing static data like avatar images or the user’s display name.\n\nLastly, you’ll specify the exact permissions to give to the user using the `permissions` field. This is done in an object where the keys are room names, or room name patterns (ending in a `*`), and a list of permissions to assign the user for any room that matches that name exactly (or starts with the pattern’s prefix). For tips, see [Manage permissions with access tokens](https://liveblocks.io/docs/api-reference/authentication/access-token)."}},"/identify-user":{"post":{"summary":"Get ID token with secret key","tags":["Auth"],"operationId":"identify-user","responses":{"200":{"description":"Success. Returns an ID token that can be used to enter one or more rooms.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifyUserResponse"},"examples":{"example":{"value":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIi..."}}}}}},"403":{"$ref":"#/components/responses/403"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifyUserRequestBody"},"examples":{"example":{"value":{"userId":"user-123","organizationId":"acme-corp","groupIds":["marketing","engineering"],"userInfo":{"name":"bob","avatar":"https://example.org/images/user123.jpg"}}}}}}},"description":"This endpoint lets your application server (your back end) obtain a token that one of its clients (your frontend) can use to enter a Liveblocks room. You use this endpoint to implement your own application’s custom authentication endpoint. When using this endpoint to obtain ID tokens, you should manage your permissions by assigning user and/or group permissions to rooms explicitly, see our [Manage permissions with ID tokens](https://liveblocks.io/docs/api-reference/authentication#id-token-room-permissions) section.\n\n**Important:** The difference with an [access token](#post-authorize-user) is that an ID token doesn’t hold any permissions itself. With ID tokens, permissions are set in the Liveblocks back end (through REST API calls) and \"checked at the door\" every time they are used to enter a room. With access tokens, all permissions are set in the token itself, and thus controlled from your back end entirely.\n\n**Note:** When using the `@liveblocks/node` package, you can use [`Liveblocks.identifyUser`](https://liveblocks.io/docs/api-reference/liveblocks-node) in your back end to build this request.\n\nYou can pass the property `userId` in the request’s body. This can be whatever internal identifier you use for your user accounts as long as it uniquely identifies an account. The property `userId` is used by Liveblocks to calculate your account’s Monthly Active Users. One unique `userId` corresponds to one MAU.\n\nIf you want to use group permissions, you can also declare which `groupIds` this user belongs to. The group ID values are yours, but they will have to match the group IDs you assign permissions to when assigning permissions to rooms, see [Manage permissions with ID tokens](https://liveblocks.io/docs/api-reference/authentication#id-token-room-permissions)).\n\nAdditionally, you can set custom metadata to the token, which will be publicly accessible by other clients through the `user.info` property. This is useful for storing static data like avatar images or the user’s display name."}},"/users/{userId}/inbox-notifications/{inboxNotificationId}":{"parameters":[{"schema":{"type":"string","example":"user-123"},"name":"userId","in":"path","required":true},{"schema":{"type":"string","example":"in_abc123"},"name":"inboxNotificationId","in":"path","required":true}],"get":{"summary":"Get inbox notification","tags":["Notifications"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","description":"ID of the user","example":"user-123"}},{"name":"inboxNotificationId","in":"path","required":true,"schema":{"type":"string","description":"ID of the inbox notification","example":"in_abc123"}}],"operationId":"get-inbox-notification","description":"This endpoint returns a user’s inbox notification by its ID. Corresponds to [`liveblocks.getInboxNotification`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-users-userId-inboxNotifications-inboxNotificationId).","responses":{"200":{"description":"Success. Returns the inbox notification.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/InboxNotificationThreadData"},{"$ref":"#/components/schemas/InboxNotificationCustomData"}]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"delete":{"summary":"Delete inbox notification","tags":["Notifications"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","description":"ID of the user","example":"user-123"}},{"name":"inboxNotificationId","in":"path","required":true,"schema":{"type":"string","description":"ID of the inbox notification","example":"in_abc123"}}],"operationId":"delete-inbox-notification","description":"This endpoint deletes a user’s inbox notification by its ID. Corresponds to [`liveblocks.deleteInboxNotification`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-users-userId-inbox-notifications-inboxNotificationId).","responses":{"204":{"description":"Success. The inbox notification has been deleted."},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/users/{userId}/inbox-notifications":{"parameters":[{"schema":{"type":"string","example":"user-123"},"name":"userId","in":"path","required":true}],"delete":{"summary":"Delete all inbox notifications","tags":["Notifications"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","description":"ID of the user","example":"user-123"}}],"operationId":"delete-all-inbox-notifications","description":"This endpoint deletes all the user’s inbox notifications. Corresponds to [`liveblocks.deleteAllInboxNotifications`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-users-userId-inbox-notifications).","responses":{"204":{"description":"Success. All inbox notifications for the user have been deleted."},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"get":{"summary":"Get all inbox notifications","tags":["Notifications"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","description":"ID of the user","example":"user-123"}},{"schema":{"type":"string","description":"The organization ID to filter notifications for.","example":"org_123456789"},"in":"query","name":"organizationId"},{"schema":{"type":"string","description":"Query to filter notifications. You can filter by `unread`, for example, `unread:true`.","example":"metadata[\"color\"]:\"blue\""},"in":"query","name":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":50,"description":"A limit on the number of inbox notifications to be returned. The limit can range between 1 and 50, and defaults to 50.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"}],"operationId":"get-inbox-notifications","description":"This endpoint returns all the user’s inbox notifications. Corresponds to [`liveblocks.getInboxNotifications`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-users-userId-inboxNotifications).","responses":{"200":{"description":"Success. Returns the list of inbox notifications for the user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetInboxNotificationsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}},"/users/{userId}/notification-settings":{"parameters":[{"schema":{"type":"string","example":"user-123"},"name":"userId","in":"path","required":true}],"get":{"summary":"Get notification settings","tags":["Notifications"],"operationId":"get-notification-settings","description":"This endpoint returns a user's notification settings for the project. Corresponds to [`liveblocks.getNotificationSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-users-userId-notification-settings).","parameters":[{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the user's notification settings for the project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettings"},"examples":{"example":{"value":{"email":{"thread":true,"textMention":false,"$customNotification":true},"slack":{"thread":true,"textMention":true,"$customNotification":false},"teams":{"thread":false,"textMention":true,"$customNotification":true},"webPush":{"thread":true,"textMention":true,"$customNotification":false}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"}}},"post":{"summary":"Update notification settings","tags":["Notifications"],"operationId":"update-notification-settings","description":"This endpoint updates a user's notification settings for the project. Corresponds to [`liveblocks.updateNotificationSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-users-userId-notification-settings).","parameters":[{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNotificationSettingsRequestBody"},"examples":{"example":{"value":{"email":{"thread":true,"textMention":false},"slack":{"textMention":false},"webPush":{"thread":true}}}}}}},"responses":{"200":{"description":"Success. Returns the updated notification settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettings"},"examples":{"example":{"value":{"email":{"thread":true,"textMention":false,"$customNotification":true},"slack":{"thread":true,"textMention":true,"$customNotification":false},"teams":{"thread":false,"textMention":true,"$customNotification":true},"webPush":{"thread":true,"textMention":true,"$customNotification":false}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}}},"delete":{"summary":"Delete notification settings","tags":["Notifications"],"operationId":"delete-notification-settings","description":"This endpoint deletes a user's notification settings for the project. Corresponds to [`liveblocks.deleteNotificationSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-users-userId-notification-settings).","parameters":[{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"204":{"description":"No Content"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"}}}},"/rooms/{roomId}/users/{userId}/subscription-settings":{"parameters":[{"schema":{"type":"string","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","example":"user-123"},"name":"userId","in":"path","required":true}],"get":{"summary":"Get room subscription settings","tags":["Notifications"],"operationId":"get-room-subscription-settings","description":"This endpoint returns a user’s subscription settings for a specific room. Corresponds to [`liveblocks.getRoomSubscriptionSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-users-userId-subscription-settings).","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the user's subscription settings for the specified room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomSubscriptionSettings"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"post":{"summary":"Update room subscription settings","tags":["Notifications"],"operationId":"update-room-subscription-settings","description":"This endpoint updates a user’s subscription settings for a specific room. Corresponds to [`liveblocks.updateRoomSubscriptionSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-users-userId-subscription-settings).","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated room subscription settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomSubscriptionSettings"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"},"422":{"description":"Unprocessable Entity"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoomSubscriptionSettingsRequestBody"}}}}},"delete":{"summary":"Delete room subscription settings","tags":["Notifications"],"operationId":"delete-room-subscription-settings","description":"This endpoint deletes a user’s subscription settings for a specific room. Corresponds to [`liveblocks.deleteRoomSubscriptionSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomId-users-userId-subscription-settings).","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"204":{"description":"No Content"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/users/{userId}/room-subscription-settings":{"parameters":[{"schema":{"type":"string","example":"user-123"},"name":"userId","in":"path","required":true}],"get":{"summary":"Get user room subscription settings","tags":["Notifications"],"operationId":"get-user-room-subscription-settings","description":"This endpoint returns the list of a user's room subscription settings. Corresponds to [`liveblocks.getUserRoomSubscriptionSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-users-userId-room-subscription-settings).","parameters":[{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":50,"description":"A limit on the number of elements to be returned. The limit can range between 1 and 50, and defaults to 50.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"The organization ID to filter room subscription settings for.","example":"org_123456789"},"in":"query","name":"organizationId"}],"responses":{"200":{"description":"Success. Returns the list of the user's room subscription settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRoomSubscriptionSettingsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/rooms/{roomId}/users/{userId}/notification-settings":{"parameters":[{"schema":{"type":"string","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","example":"user-123"},"name":"userId","in":"path","required":true}],"get":{"summary":"Get room notification settings","operationId":"get-room-notification-settings","tags":["Notifications"],"deprecated":true,"description":"**Deprecated.** Renamed to [`/subscription-settings`](#get-room-subscription-settings). Read more in our [migration guide](https://liveblocks.io/docs/api-reference/upgrading/2.24).\n\nThis endpoint returns a user’s subscription settings for a specific room. Corresponds to [`liveblocks.getRoomNotificationSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-rooms-roomId-users-userId-notification-settings).","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the user's notification settings for the specified room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomSubscriptionSettings"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"post":{"summary":"Update room notification settings","operationId":"update-room-notification-settings","tags":["Notifications"],"deprecated":true,"description":"**Deprecated.** Renamed to [`/subscription-settings`](#update-room-subscription-settings). Read more in our [migration guide](https://liveblocks.io/docs/api-reference/upgrading/2.24).\n\nThis endpoint updates a user’s notification settings for a specific room. Corresponds to [`liveblocks.updateRoomNotificationSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-rooms-roomId-users-userId-notification-settings).","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated room notification settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomSubscriptionSettings"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"},"422":{"description":"Unprocessable Entity"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoomSubscriptionSettingsRequestBody"}}}}},"delete":{"summary":"Delete room notification settings","operationId":"delete-room-notification-settings","tags":["Notifications"],"deprecated":true,"description":"**Deprecated.** Renamed to [`/subscription-settings`](#delete-room-subscription-settings). Read more in our [migration guide](https://liveblocks.io/docs/api-reference/upgrading/2.24).\n\nThis endpoint deletes a user’s notification settings for a specific room. Corresponds to [`liveblocks.deleteRoomNotificationSettings`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-rooms-roomId-users-userId-notification-settings).","parameters":[{"schema":{"type":"string","description":"ID of the room","example":"my-room-id"},"name":"roomId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the user","example":"user-123"},"name":"userId","in":"path","required":true}],"responses":{"204":{"description":"No Content"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/inbox-notifications/trigger":{"parameters":[],"post":{"summary":"Trigger inbox notification","tags":["Notifications"],"operationId":"trigger-inbox-notification","description":"This endpoint triggers an inbox notification. Corresponds to [`liveblocks.triggerInboxNotification`](https://liveblocks.io/docs/api-reference/liveblocks-node#post-inbox-notifications-trigger).","responses":{"200":{"description":"No Content"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"},"422":{"description":"Unprocessable Entity"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerInboxNotificationRequestBody"}}}}}},"/inbox-notifications/{inboxNotificationId}/read":{"parameters":[{"schema":{"type":"string","example":"in_abc123"},"name":"inboxNotificationId","in":"path","required":true}],"post":{"summary":"Mark inbox notification as read","tags":["Notifications"],"operationId":"mark-inbox-notification-as-read","description":"This endpoint marks a specific inbox notification as read.","parameters":[{"name":"inboxNotificationId","in":"path","required":true,"schema":{"type":"string","description":"ID of the inbox notification","example":"in_abc123"}}],"responses":{"200":{"description":"Success. The inbox notification has been marked as read. This endpoint does not return any content."},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/groups":{"post":{"summary":"Create group","description":"This endpoint creates a new group. Corresponds to [`liveblocks.createGroup`](https://liveblocks.io/docs/api-reference/liveblocks-node#create-group).","tags":["Groups"],"operationId":"create-group","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the created group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"409":{"description":"Conflict - Group already exists"}}},"get":{"summary":"Get groups","description":"This endpoint returns a list of all groups in your project. Corresponds to [`liveblocks.getGroups`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-groups).","tags":["Groups"],"operationId":"get-groups","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of groups to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"}],"responses":{"200":{"description":"Success. Returns the list of groups and the next page cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetGroupsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}},"/groups/{groupId}":{"get":{"summary":"Get group","description":"This endpoint returns a specific group by ID. Corresponds to [`liveblocks.getGroup`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-group).","tags":["Groups"],"operationId":"get-group","parameters":[{"schema":{"type":"string","description":"The ID of the group to retrieve.","example":"engineering"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Success. Returns the group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found - Group not found"}}},"delete":{"summary":"Delete group","description":"This endpoint deletes a group. Corresponds to [`liveblocks.deleteGroup`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-group).","tags":["Groups"],"operationId":"delete-group","parameters":[{"schema":{"type":"string","description":"The ID of the group to delete.","example":"engineering"},"in":"path","name":"groupId","required":true}],"responses":{"204":{"description":"No Content - Group deleted successfully"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found - Group not found"}}}},"/groups/{groupId}/add-members":{"post":{"summary":"Add group members","description":"This endpoint adds new members to an existing group. Corresponds to [`liveblocks.addGroupMembers`](https://liveblocks.io/docs/api-reference/liveblocks-node#add-group-members).","tags":["Groups"],"operationId":"add-group-members","parameters":[{"schema":{"type":"string","description":"The ID of the group to add members to.","example":"engineering"},"in":"path","name":"groupId","required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddGroupMembersRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the updated group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found - Group not found"}}}},"/groups/{groupId}/remove-members":{"post":{"summary":"Remove group members","description":"This endpoint removes members from an existing group. Corresponds to [`liveblocks.removeGroupMembers`](https://liveblocks.io/docs/api-reference/liveblocks-node#remove-group-members).","tags":["Groups"],"operationId":"remove-group-members","parameters":[{"schema":{"type":"string","description":"The ID of the group to remove members from.","example":"engineering"},"in":"path","name":"groupId","required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveGroupMembersRequestBody"}}}},"responses":{"200":{"description":"Success. Returns the updated group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found - Group not found"}}}},"/users/{userId}/groups":{"get":{"summary":"Get user groups","description":"This endpoint returns all groups that a specific user is a member of. Corresponds to [`liveblocks.getUserGroups`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-user-groups).","tags":["Groups"],"operationId":"get-user-groups","parameters":[{"schema":{"type":"string","description":"The ID of the user to get groups for.","example":"user-123"},"in":"path","name":"userId","required":true},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of groups to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"}],"responses":{"200":{"description":"Success. Returns the list of groups the user belongs to and the next page cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUserGroupsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found - User not found"}}}},"/ai/copilots":{"get":{"summary":"Get AI copilots","description":"This endpoint returns a paginated list of AI copilots. The copilots are returned sorted by creation date, from newest to oldest. Corresponds to [`liveblocks.getAiCopilots`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-ai-copilots).","tags":["AI"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of copilots to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"}],"responses":{"200":{"description":"Success. Returns the list of AI copilots.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAiCopilotsResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"}},"operationId":"get-ai-copilots"},"post":{"summary":"Create AI copilot","description":"This endpoint creates a new AI copilot with the given configuration. Corresponds to [`liveblocks.createAiCopilot`](https://liveblocks.io/docs/api-reference/liveblocks-node#create-ai-copilot).","tags":["AI"],"responses":{"201":{"description":"Created. Returns the created AI copilot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiCopilot"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"create-ai-copilot","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAiCopilotRequestBody"}}}}}},"/ai/copilots/{copilotId}":{"get":{"summary":"Get AI copilot","description":"This endpoint returns an AI copilot by its ID. Corresponds to [`liveblocks.getAiCopilot`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-ai-copilot).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the AI copilot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiCopilot"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-ai-copilot"},"post":{"summary":"Update AI copilot","description":"This endpoint updates an existing AI copilot's configuration. Corresponds to [`liveblocks.updateAiCopilot`](https://liveblocks.io/docs/api-reference/liveblocks-node#update-ai-copilot).\n\nThis endpoint returns a 422 response if the update doesn't apply due to validation failures. For example, if the existing copilot uses the \"openai\" provider and you attempt to update the provider model to an incompatible value for the provider, like \"gemini-2.5-pro\", you'll receive a 422 response with an error message explaining where the validation failed.","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the updated AI copilot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiCopilot"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"update-ai-copilot","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAiCopilotRequestBody"}}}}},"delete":{"summary":"Delete AI copilot","description":"This endpoint deletes an AI copilot by its ID. A deleted copilot is no longer accessible and cannot be restored. Corresponds to [`liveblocks.deleteAiCopilot`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-ai-copilot).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true}],"responses":{"204":{"description":"Success. The AI copilot was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"delete-ai-copilot"}},"/ai/copilots/{copilotId}/knowledge":{"get":{"summary":"Get knowledge sources","description":"This endpoint returns a paginated list of knowledge sources for a specific AI copilot. Corresponds to [`liveblocks.getKnowledgeSources`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-knowledge-sources).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of knowledge sources to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"}],"responses":{"200":{"description":"Success. Returns the list of knowledge sources.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetKnowledgeSourcesResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-knowledge-sources"}},"/ai/copilots/{copilotId}/knowledge/{knowledgeSourceId}":{"get":{"summary":"Get knowledge source","description":"This endpoint returns a specific knowledge source by its ID. Corresponds to [`liveblocks.getKnowledgeSource`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-knowledge-source).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the knowledge source","example":"ks_abc123"},"name":"knowledgeSourceId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the knowledge source.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSource"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-knowledge-source"}},"/ai/copilots/{copilotId}/knowledge/web":{"post":{"summary":"Create web knowledge source","description":"This endpoint creates a web knowledge source for an AI copilot. This allows the copilot to access and learn from web content. Corresponds to [`liveblocks.createWebKnowledgeSource`](https://liveblocks.io/docs/api-reference/liveblocks-node#create-web-knowledge-source).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the ID of the created knowledge source.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebKnowledgeSourceResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"create-web-knowledge-source","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebKnowledgeSourceRequestBody"}}}}}},"/ai/copilots/{copilotId}/knowledge/file/{name}":{"put":{"summary":"Create file knowledge source","description":"This endpoint creates a file knowledge source for an AI copilot by uploading a file. The copilot can then reference the content of the file when responding. Corresponds to [`liveblocks.createFileKnowledgeSource`](https://liveblocks.io/docs/api-reference/liveblocks-node#create-file-knowledge-source).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"string","description":"Name of the file","example":"document.pdf"},"name":"name","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the ID of the created knowledge source.","content":{"application/json":{"schema":{"type":"object","title":"Response","properties":{"id":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"create-file-knowledge-source","requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}},"/ai/copilots/{copilotId}/knowledge/file/{knowledgeSourceId}":{"get":{"summary":"Get file knowledge source content","description":"This endpoint returns the content of a file knowledge source as markdown. This allows you to see what content the AI copilot has access to from uploaded files. Corresponds to [`liveblocks.getFileKnowledgeSourceMarkdown`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-file-knowledge-source-markdown).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the knowledge source","example":"ks_abc123"},"name":"knowledgeSourceId","in":"path","required":true}],"responses":{"200":{"description":"Success. Returns the content of the file knowledge source as markdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFileKnowledgeSourceMarkdownResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-file-knowledge-source-markdown"},"delete":{"summary":"Delete file knowledge source","description":"This endpoint deletes a file knowledge source from an AI copilot. The copilot will no longer have access to the content from this file. Corresponds to [`liveblocks.deleteFileKnowledgeSource`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-file-knowledge-source).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the knowledge source","example":"ks_abc123"},"name":"knowledgeSourceId","in":"path","required":true}],"responses":{"204":{"description":"Success. The file knowledge source was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"delete-file-knowledge-source"}},"/ai/copilots/{copilotId}/knowledge/web/{knowledgeSourceId}":{"delete":{"summary":"Delete web knowledge source","description":"This endpoint deletes a web knowledge source from an AI copilot. The copilot will no longer have access to the content from this source. Corresponds to [`liveblocks.deleteWebKnowledgeSource`](https://liveblocks.io/docs/api-reference/liveblocks-node#delete-web-knowledge-source).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the knowledge source","example":"ks_abc123"},"name":"knowledgeSourceId","in":"path","required":true}],"responses":{"204":{"description":"Success. The web knowledge source was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"delete-web-knowledge-source"}},"/ai/copilots/{copilotId}/knowledge/web/{knowledgeSourceId}/links":{"get":{"summary":"Get web knowledge source links","description":"This endpoint returns a paginated list of links that were indexed from a web knowledge source. This is useful for understanding what content the AI copilot has access to from web sources. Corresponds to [`liveblocks.getWebKnowledgeSourceLinks`](https://liveblocks.io/docs/api-reference/liveblocks-node#get-web-knowledge-source-links).","tags":["AI"],"parameters":[{"schema":{"type":"string","description":"ID of the AI copilot","example":"cp_abc123"},"name":"copilotId","in":"path","required":true},{"schema":{"type":"string","description":"ID of the knowledge source","example":"ks_abc123"},"name":"knowledgeSourceId","in":"path","required":true},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of links to be returned. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"startingAfter"}],"responses":{"200":{"description":"Success. Returns the list of web knowledge source links.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetWebKnowledgeSourceLinksResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-web-knowledge-source-links"}},"/management/projects":{"get":{"summary":"List projects","description":"Returns a paginated list of projects. You can filter by exact, case-sensitive project name using the `query` parameter. Project names are not unique, so multiple projects can match. You can limit the number of projects returned per page and use the provided `nextCursor` for pagination. This endpoint requires the `read:all` scope.","tags":["Management"],"parameters":[{"schema":{"type":"string","description":"A query to filter projects by exact, case-sensitive name.","example":"name:\"Frimousse\""},"in":"query","name":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of projects to return. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"cursor"}],"responses":{"200":{"description":"Success. Returns the list of projects and the next page cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetManagementProjectsResponse"},"examples":{"example":{"value":{"projects":[{"id":"683d49ed6b4d1cec5a597b13","teamId":"team_123","type":"dev","name":"Frimousse","description":"A lightweight, unstyled, and composable emoji picker for React.","createdAt":"2024-09-03T12:34:56.000Z","updatedAt":"2024-09-03T12:34:56.000Z","publicKey":{"activated":true,"createdAt":"2024-09-03T12:34:56.000Z","value":"pk_dev_123"},"secretKey":{"createdAt":"2024-09-03T12:34:56.000Z","value":"sk_dev_123"},"region":"earth","versionCreationTimeout":false}],"nextCursor":"eyJpZCI6IjY4M2Q0OWVkNmI0ZDFjZWM1YTU5N2IxMyIsImNyZWF0ZWRBdCI6MTcyNTI4NzcwMDAwMH0="}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"get-management-projects"},"post":{"summary":"Create project","description":"Creates a new project within your account. This endpoint requires the `write:all` scope. You can specify the project type, name, region, and version creation timeout. Upon success, returns information about the newly created project, including its ID, keys, region, and settings.","tags":["Management"],"responses":{"200":{"description":"Success. Returns the created project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementProject"},"examples":{"example":{"value":{"project":{"id":"683d49ed6b4d1cec5a597b13","teamId":"team_123","type":"dev","name":"Frimousse","createdAt":"2024-09-03T12:34:56.000Z","updatedAt":"2024-09-03T12:34:56.000Z","publicKey":{"activated":true,"createdAt":"2024-09-03T12:34:56.000Z","value":"pk_dev_123"},"secretKey":{"createdAt":"2024-09-03T12:34:56.000Z","value":"sk_dev_123"},"region":"earth","versionCreationTimeout":false}}}}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"422":{"$ref":"#/components/responses/422"}},"operationId":"create-management-project","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateManagementProjectRequestBody"},"examples":{"example":{"value":{"name":"Frimousse","description":"A lightweight, unstyled, and composable emoji picker for React.","type":"dev","region":"earth","versionCreationTimeout":false}}}}}}}},"/management/projects/{projectId}":{"get":{"summary":"Get project","description":"Returns a single project specified by its ID. This endpoint requires the `read:all` scope. If the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. Returns the project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementProject"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"get-management-project"},"post":{"summary":"Update project","description":"Updates an existing project specified by its ID. This endpoint allows you to modify project details such as the project name and the version creation timeout. The `versionCreationTimeout` can be set to `false` to disable the timeout or to a number of seconds between 30 and 300. Fields omitted from the request body will not be updated. Requires the `write:all` scope.\n\nIf the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. Returns the updated project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementProject"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"update-management-project","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateManagementProjectRequestBody"},"examples":{"example":{"value":{"name":"Valleys","description":"A lightweight TypeScript library for assertion-based runtime data validation.","versionCreationTimeout":false}}}}}}},"delete":{"summary":"Delete project","description":"Soft deletes the project specified by its ID. This endpoint requires the `write:all` scope. If the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. The project was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"delete-management-project"}},"/management/projects/{projectId}/api-keys/public/activate":{"post":{"summary":"Activate public key","description":"Activates the public API key associated with the specified project. This endpoint requires the `write:all` scope. If the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. The public key was activated."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"activate-project-public-api-key"}},"/management/projects/{projectId}/api-keys/public/deactivate":{"post":{"summary":"Deactivate public key","description":"Deactivates the public API key associated with the specified project. This endpoint requires the `write:all` scope. If the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. The public key was deactivated."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"deactivate-project-public-api-key"}},"/management/projects/{projectId}/api-keys/public/roll":{"post":{"summary":"Roll public key","description":"Rolls (rotates) the public API key associated with the specified project, generating a new key value while deprecating the previous one. The new key becomes immediately active. This endpoint requires the `write:all` scope.\n\nIf the public key is not currently enabled for the project, a 403 error response is returned. If the project cannot be found, a 404 error response is returned. An optional `expirationIn` parameter can be provided in the request body to set when the previous key should expire.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. Returns the rolled public key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollProjectPublicApiKeyResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"roll-project-public-api-key","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollProjectPublicApiKeyRequestBody"},"examples":{"example":{"value":{"expirationIn":"1 hour"}}}}}}}},"/management/projects/{projectId}/api-keys/secret/roll":{"post":{"summary":"Roll secret key","description":"Rolls (rotates) the secret API key associated with the specified project, generating a new key value while deprecating the previous one. The new key becomes immediately active. This endpoint requires the `write:all` scope.\n\nIf the project cannot be found, a 404 error response is returned. An optional `expirationIn` parameter can be provided in the request body to set when the previous key should expire.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. Returns the rolled secret key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollProjectSecretApiKeyResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"roll-project-secret-api-key","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollProjectSecretApiKeyRequestBody"},"examples":{"example":{"value":{"expirationIn":"3 days","newKeyExpirationIn":"30 days"}}}}}}}},"/management/projects/{projectId}/webhooks":{"get":{"summary":"List webhooks","description":"Returns a paginated list of webhooks for a project. This endpoint requires the `read:all` scope. The response includes an array of webhook objects associated with the specified project, as well as a `nextCursor` property for pagination. Use the `limit` query parameter to specify the maximum number of webhooks to return (1-100, default 20). If the result is paginated, use the `cursor` parameter from the `nextCursor` value in the previous response to fetch subsequent pages. If the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"A limit on the number of webhooks to return. The limit can range between 1 and 100, and defaults to 20.","example":20},"in":"query","name":"limit"},{"schema":{"type":"string","description":"A cursor used for pagination. Get the value from the `nextCursor` response of the previous page.","example":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9"},"in":"query","name":"cursor"}],"responses":{"200":{"description":"Success. Returns the list of webhooks and the next page cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetManagementWebhooksResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"get-management-webhooks"},"post":{"summary":"Create webhook","description":"Creates a new webhook for a project. This endpoint requires the `write:all` scope. If the project cannot be found, a 404 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}}],"responses":{"200":{"description":"Success. Returns the created webhook.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementWebhook"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"create-management-webhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateManagementWebhookRequestBody"},"examples":{"example":{"value":{"url":"https://example.com/webhooks","subscribedEvents":["storageUpdated","userEntered"],"rateLimit":100,"additionalHeaders":{"LB-X-FOO":"bar"},"storageUpdatedThrottleSeconds":10,"yDocUpdatedThrottleSeconds":10}}}}}}}},"/management/projects/{projectId}/webhooks/{webhookId}":{"get":{"summary":"Get webhook","description":"Get one webhook by `webhookId` for a project. Returns webhook settings such as URL, subscribed events, disabled state, throttling, and additional headers. Returns `404` if the project or webhook does not exist. This endpoint requires the `read:all` scope.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the webhook.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementWebhook"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-management-webhook"},"post":{"summary":"Update webhook","description":"Update one webhook by `webhookId` for a project. Send only fields you want to change; omitted fields stay unchanged. Returns `404` if the project or webhook does not exist and `422` for validation errors. This endpoint requires the `write:all` scope.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the updated webhook.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementWebhook"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"update-management-webhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateManagementWebhookRequestBody"},"examples":{"example":{"value":{"url":"https://example.com/webhooks","subscribedEvents":["storageUpdated","userEntered"],"rateLimit":100,"storageUpdatedThrottleSeconds":10,"yDocUpdatedThrottleSeconds":10,"disabled":false}}}}}}},"delete":{"summary":"Delete webhook","description":"Delete one webhook by `webhookId` for a project. Returns `200` with an empty body on success, or `404` if the project or webhook does not exist. Requires `write:all`.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. The webhook was deleted."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"delete-management-webhook"}},"/management/projects/{projectId}/webhooks/{webhookId}/secret/roll":{"post":{"summary":"Roll webhook secret","description":"Rotate a webhook signing secret and return the new secret. The previous secret remains valid for 24 hours. Returns `404` if the project or webhook does not exist. This endpoint requires the `write:all` scope.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the rotated secret key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateManagementWebhookSecretResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"roll-management-webhook-secret"}},"/management/projects/{projectId}/webhooks/{webhookId}/additional-headers":{"post":{"summary":"Patch webhook headers","description":"Upsert additional headers for a webhook. Provided headers are merged with existing headers, and existing values are overwritten when names match. Returns updated headers, or `404` if the project or webhook does not exist. This endpoint requires the `write:all` scope.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the updated headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertManagementWebhookHeadersResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"upsert-management-webhook-additional-headers","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertManagementWebhookHeadersRequestBody"},"examples":{"example":{"value":{"headers":{"X-Custom-Header":"value"}}}}}}}},"get":{"summary":"Get webhook headers","description":"Get a webhook's additional headers. Returns `404` if the project or webhook does not exist. Requires `read:all`.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetManagementWebhookHeadersResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"}},"operationId":"get-management-webhook-additional-headers"}},"/management/projects/{projectId}/webhooks/{webhookId}/delete-additional-headers":{"post":{"summary":"Delete webhook headers","description":"Remove selected additional headers from a webhook. Send header names in `headers` field; other headers are unchanged. Returns updated headers, or `404` if the project or webhook does not exist. This endpoint requires the `write:all` scope. At least one header name must be provided; otherwise, a 422 error response is returned.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the updated headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteManagementWebhookHeadersResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"delete-management-webhook-additional-headers","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteManagementWebhookHeadersRequestBody"},"examples":{"example":{"value":{"headers":["X-Custom-Header","X-Another-Header"]}}}}}}}},"/management/projects/{projectId}/webhooks/{webhookId}/recover-failed-messages":{"post":{"summary":"Recover failed webhook messages","description":"Requeue failed deliveries for a webhook from the given `since` timestamp. Returns `200` with an empty body when recovery starts, an `404` if the project or webhook does not exist. This endpoint requires the `write:all` scope.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. The recover task was started."},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"recover-failed-webhook-messages","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverManagementWebhookFailedMessagesRequestBody"},"examples":{"example":{"value":{"since":"2026-01-21T00:00:00.000Z"}}}}}}}},"/management/projects/{projectId}/webhooks/{webhookId}/test":{"post":{"summary":"Send test webhook","description":"Send a test event to a webhook and return the created message metadata. `subscribedEvent` must be one of the webhook's subscribed events, otherwise the endpoint returns `422`. Returns `404` if the project or webhook does not exist. This endpoint requires the `write:all` scope.","tags":["Management"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","description":"ID of the project","example":"683d49ed6b4d1cec5a597b13"}},{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","description":"ID of the webhook","example":"wh_abc123"}}],"responses":{"200":{"description":"Success. Returns the test message ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestManagementWebhookResponse"}}}},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"}},"operationId":"send-test-webhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestManagementWebhookRequestBody"},"examples":{"example":{"value":{"subscribedEvent":"storageUpdated"}}}}}}}}},"components":{"schemas":{"Room":{"title":"Room","type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["room"]},"organizationId":{"type":"string","description":"The organization ID associated with this room."},"lastConnectionAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"defaultAccesses":{"$ref":"#/components/schemas/RoomPermission"},"usersAccesses":{"$ref":"#/components/schemas/RoomAccesses"},"groupsAccesses":{"$ref":"#/components/schemas/RoomAccesses"},"metadata":{"$ref":"#/components/schemas/RoomMetadata"}},"additionalProperties":false,"required":["id","type","createdAt","defaultAccesses","usersAccesses","groupsAccesses","metadata","organizationId"],"example":{"type":"room","id":"my-room-id","lastConnectionAt":"2022-08-04T21:07:09.380Z","createdAt":"2022-07-13T14:32:50.697Z","organizationId":"org_123456789","metadata":{"color":"blue","type":"whiteboard"},"defaultAccesses":["*:write"],"groupsAccesses":{"marketing":["*:write"]},"usersAccesses":{"alice":["*:write"]}}},"RoomMetadata":{"title":"RoomMetadata","type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"example":{"color":"blue","type":"whiteboard"}},"RoomPermissionItem":{"title":"RoomPermissionItem","type":"string","enum":["*:read","*:write","room:write","room:read","room:presence:write","storage:read","storage:write","storage:none","comments:read","comments:write","comments:none","comments:public:read","comments:public:write","comments:public:none","comments:private:read","comments:private:write","comments:private:none","feeds:read","feeds:write","feeds:none"]},"RoomPermission":{"type":"array","items":{"$ref":"#/components/schemas/RoomPermissionItem"},"uniqueItems":true,"example":["*:read"]},"RoomAccesses":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/RoomPermissionItem"}},"example":{"alice":["*:write"],"bob":["*:read"]}},"GetRoomsResponse":{"title":"GetRoomsResponse","type":"object","additionalProperties":false,"required":["nextCursor","data"],"properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Room"}}},"example":{"nextCursor":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9","data":[{"type":"room","id":"my-room-id","lastConnectionAt":"2022-08-08T23:23:15.281Z","createdAt":"2022-08-08T23:23:15.281Z","organizationId":"org_123456789","metadata":{"color":"blue"},"defaultAccesses":["*:write"],"groupsAccesses":{"product":["*:write"]},"usersAccesses":{"alice":["*:write"]}}]}},"CreateRoomRequestBody":{"title":"CreateRoomRequestBody","type":"object","properties":{"id":{"type":"string"},"organizationId":{"type":"string","description":"The organization ID to associate with the room. Defaults to \"default\" if not provided."},"defaultAccesses":{"$ref":"#/components/schemas/RoomPermission"},"usersAccesses":{"$ref":"#/components/schemas/RoomAccesses"},"groupsAccesses":{"$ref":"#/components/schemas/RoomAccesses"},"metadata":{"$ref":"#/components/schemas/RoomMetadata"},"engine":{"type":"integer","enum":[1,2],"description":"Preferred storage engine version to use when creating new rooms. The v2 Storage engine supports larger documents, is more performant, has native streaming support, and will become the default in the future."}},"required":["id","defaultAccesses"],"additionalProperties":false,"example":{"id":"my-room-id","defaultAccesses":["*:write"],"metadata":{"color":"blue"},"usersAccesses":{"alice":["*:write"]},"groupsAccesses":{"product":["*:write"]}}},"UpdateRoomRequestBody":{"type":"object","title":"UpdateRoomRequestBody","additionalProperties":false,"properties":{"defaultAccesses":{"oneOf":[{"$ref":"#/components/schemas/RoomPermission"},{"type":"null"}]},"usersAccesses":{"type":"object","description":"A map of user identifiers to permissions list. Setting the value as `null` will clear all users’ accesses. Setting one user identifier as `null` will clear this user’s accesses.","additionalProperties":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoomPermissionItem"}},{"type":"null"}]}},"groupsAccesses":{"type":"object","description":"A map of group identifiers to permissions list. Setting the value as `null` will clear all groups’ accesses. Setting one group identifier as `null` will clear this group’s accesses.","additionalProperties":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoomPermissionItem"}},{"type":"null"}]}},"metadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"null"}]}}},"example":{"defaultAccesses":["*:write"],"usersAccesses":{"alice":["*:write"]},"groupsAccesses":{"marketing":["*:write"]},"metadata":{"color":"blue"}}},"UpsertRoomRequestBody":{"type":"object","title":"UpsertRoomRequestBody","properties":{"update":{"$ref":"#/components/schemas/UpdateRoomRequestBody"},"create":{"type":"object","description":"Fields to use when creating the room if it does not exist. Unlike the create-room endpoint, `id` is not included here because it is provided in the URL path.","properties":{"organizationId":{"type":"string","description":"The organization ID to associate with the room. Defaults to \"default\" if not provided."},"defaultAccesses":{"$ref":"#/components/schemas/RoomPermission"},"usersAccesses":{"$ref":"#/components/schemas/RoomAccesses"},"groupsAccesses":{"$ref":"#/components/schemas/RoomAccesses"},"metadata":{"$ref":"#/components/schemas/RoomMetadata"}},"required":["defaultAccesses"],"additionalProperties":false}},"required":["update"],"additionalProperties":false,"example":{"update":{"usersAccesses":{"alice":["*:write"]},"groupsAccesses":{"marketing":["*:write"]},"metadata":{"color":"blue"}},"create":{"defaultAccesses":["*:write"]}}},"UpdateRoomIdRequestBody":{"type":"object","title":"UpdateRoomIdRequestBody","additionalProperties":false,"properties":{"newRoomId":{"type":"string","description":"The new room ID"}},"required":["newRoomId"],"example":{"newRoomId":"new-room-id"}},"UpdateRoomOrganizationIdRequestBody":{"type":"object","title":"UpdateRoomOrganizationIdRequestBody","additionalProperties":false,"properties":{"fromOrganizationId":{"type":"string","description":"The current organization ID of the room. Must match the room's current organization ID."},"toOrganizationId":{"type":"string","description":"The new organization ID to assign to the room."}},"required":["fromOrganizationId","toOrganizationId"],"example":{"fromOrganizationId":"org_123456789","toOrganizationId":"org_987654321"}},"ActiveUsersResponse":{"title":"ActiveUsersResponse","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"user"},"id":{"oneOf":[{"type":"string"},{"type":"null"}]},"info":{"type":"object","additionalProperties":true},"connectionId":{"type":"integer"}},"required":["type","id","info","connectionId"]}}},"required":["data"],"example":{"data":[{"type":"user","connectionId":16,"id":"alice","info":{}},{"type":"user","connectionId":20,"id":"bob","info":{}}]}},"SetPresenceRequestBody":{"title":"SetPresenceRequestBody","type":"object","properties":{"userId":{"type":"string","description":"ID of the user to set presence for"},"data":{"type":"object","description":"Presence data as a JSON object","additionalProperties":true},"userInfo":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Optional name for the user or agent"},"avatar":{"type":"string","format":"uri","description":"Optional avatar URL for the user"},"color":{"type":"string","description":"Optional color for the user"}},"description":"Metadata about the user or agent","additionalProperties":true},"ttl":{"type":"integer","minimum":2,"maximum":3599,"description":"Time-to-live in seconds (minimum: 2, maximum: 3599). After this duration, the presence will automatically expire."}},"required":["userId","data","userInfo"],"additionalProperties":false,"example":{"userId":"agent-123","data":{"status":"active","cursor":{"x":100,"y":200}},"userInfo":{"name":"AI Assistant","avatar":"https://example.org/images/agent123.jpg"},"ttl":60}},"LiveFileData":{"title":"LiveFileData","description":"Immutable reference to a file from Storage stored inside a LiveFile node.","type":"object","properties":{"id":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$","description":"ID of the uploaded Storage file","example":"fl_abc123456789012345678"},"name":{"type":"string","description":"Original file name","example":"photo.png"},"size":{"type":"integer","minimum":0,"description":"File size in bytes","example":12345},"mimeType":{"type":"string","description":"File MIME type","example":"image/png"}},"required":["id","name","size","mimeType"],"additionalProperties":false},"LiveFile":{"title":"LiveFile","description":"Plain LSON representation of an immutable LiveFile node.","type":"object","properties":{"liveblocksType":{"type":"string","const":"LiveFile"},"data":{"$ref":"#/components/schemas/LiveFileData"}},"required":["liveblocksType","data"],"additionalProperties":false,"example":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}},"StorageFileWithUrl":{"title":"StorageFileWithUrl","description":"Uploaded Storage file metadata with a temporary download URL.","type":"object","properties":{"id":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$"},"name":{"type":"string"},"size":{"type":"integer","minimum":0},"mimeType":{"type":"string"},"url":{"type":"string","format":"uri","description":"Presigned download URL"},"expiresAt":{"type":"string","format":"date-time","description":"Expiration time of the presigned URL"}},"required":["id","name","size","mimeType","url","expiresAt"],"additionalProperties":false},"StorageFileMultipartUpload":{"title":"StorageFileMultipartUpload","type":"object","properties":{"fileId":{"type":"string","pattern":"^fl_[A-Za-z0-9_-]{21}$"},"uploadId":{"type":"string"}},"required":["fileId","uploadId"],"additionalProperties":false},"StorageFileMultipartPart":{"title":"StorageFileMultipartPart","type":"object","properties":{"partNumber":{"type":"integer","minimum":1},"etag":{"type":"string"}},"required":["partNumber","etag"],"additionalProperties":false},"CompleteStorageFileMultipartUploadRequestBody":{"title":"CompleteStorageFileMultipartUploadRequestBody","type":"object","properties":{"parts":{"type":"array","items":{"$ref":"#/components/schemas/StorageFileMultipartPart"}}},"required":["parts"],"additionalProperties":false},"GetStorageDocumentResponse":{"title":"GetStorageDocumentResponse","type":"object","additionalProperties":true,"example":{"liveblocksType":"LiveObject","data":{"aLiveObject":{"liveblocksType":"LiveObject","data":{"a":1}},"aLiveList":{"liveblocksType":"LiveList","data":["a","b"]},"aLiveMap":{"liveblocksType":"LiveMap","data":{"a":1,"b":2}},"aLiveFile":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}}}},"InitializeStorageDocumentResponse":{"title":"InitializeStorageDocumentResponse","type":"object","properties":{"liveblocksType":{"type":"string","const":"LiveObject"},"data":{"type":"object","additionalProperties":true}},"example":{"liveblocksType":"LiveObject","data":{"aLiveObject":{"liveblocksType":"LiveObject","data":{"a":1}},"aLiveList":{"liveblocksType":"LiveList","data":["a","b"]},"aLiveFile":{"liveblocksType":"LiveFile","data":{"id":"fl_abc123456789012345678","name":"photo.png","size":12345,"mimeType":"image/png"}}}}},"PatchStorageDocumentRequestBody":{"title":"PatchStorageDocumentRequestBody","type":"array","items":{"oneOf":[{"title":"AddJsonPatchOperation","type":"object","properties":{"op":{"type":"string","const":"add"},"path":{"type":"string","description":"A JSON Pointer to the target location (RFC 6901). Must start with \"/\"."},"value":{}},"required":["op","path","value"],"additionalProperties":false},{"title":"RemoveJsonPatchOperation","type":"object","properties":{"op":{"type":"string","const":"remove"},"path":{"type":"string","description":"A JSON Pointer to the target location (RFC 6901). Must start with \"/\"."}},"required":["op","path"],"additionalProperties":false},{"title":"ReplaceJsonPatchOperation","type":"object","properties":{"op":{"type":"string","const":"replace"},"path":{"type":"string","description":"A JSON Pointer to the target location (RFC 6901). Must start with \"/\"."},"value":{}}},{"title":"CopyJsonPatchOperation","type":"object","properties":{"op":{"type":"string","const":"copy"},"from":{"type":"string","description":"A JSON Pointer to the source location (RFC 6901). Must start with \"/\"."},"path":{"type":"string","description":"A JSON Pointer to the target location (RFC 6901). Must start with \"/\"."}},"required":["op","from","path"],"additionalProperties":false},{"title":"MoveJsonPatchOperation","type":"object","properties":{"op":{"type":"string","const":"move"},"from":{"type":"string","description":"A JSON Pointer to the source location (RFC 6901). Must start with \"/\"."},"path":{"type":"string","description":"A JSON Pointer to the target location (RFC 6901). Must start with \"/\"."}},"required":["op","from","path"],"additionalProperties":false},{"title":"TestJsonPatchOperation","type":"object","properties":{"op":{"type":"string","const":"test"},"path":{"type":"string","description":"A JSON Pointer to the target location (RFC 6901). Must start with \"/\"."},"value":{}},"required":["op","path","value"],"additionalProperties":false}]},"example":[{"op":"add","path":"/score","value":42},{"op":"remove","path":"/oldKey"}]},"GetYjsDocumentResponse":{"title":"GetYjsDocumentResponse","type":"object","additionalProperties":true,"example":{"someYText":"Contents of YText"}},"Error":{"title":"Error","type":"object","properties":{"error":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Message explaining the error"},"suggestion":{"type":"string","description":"A suggestion on how to fix the error"},"docs":{"type":"string","description":"A link to the documentation"}}},"Authorization":{"title":"Authorization","type":"object","properties":{"token":{"type":"string"}},"example":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIi..."}},"AuthorizeUserResponse":{"title":"AuthorizeUserResponse","type":"object","properties":{"token":{"type":"string"}},"required":["token"],"additionalProperties":false,"example":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIi..."}},"IdentifyUserResponse":{"title":"IdentifyUserResponse","type":"object","properties":{"token":{"type":"string"}},"required":["token"],"additionalProperties":false,"example":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIi..."}},"AuthorizeUserRequestBody":{"title":"AuthorizeUserRequestBody","type":"object","properties":{"userId":{"type":"string"},"userInfo":{"type":"object"},"organizationId":{"type":"string"},"permissions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["userId","permissions"],"additionalProperties":false,"example":{"userId":"user-123","userInfo":{"name":"bob","avatar":"https://example.org/images/user123.jpg"},"organizationId":"acme-corp","permissions":{"my-room-1":["*:write"],"my-room-2":["*:write"],"my-room-*":["*:read"]}}},"IdentifyUserRequestBody":{"title":"IdentifyUserRequestBody","type":"object","properties":{"userId":{"type":"string"},"organizationId":{"type":"string"},"groupIds":{"type":"array","items":{"type":"string"}},"userInfo":{"type":"object"}},"required":["userId"],"additionalProperties":false,"example":{"userId":"user-123","organizationId":"acme-corp","groupIds":["marketing","engineering"],"userInfo":{"name":"bob","avatar":"https://example.org/images/user123.jpg"}}},"HistoryVersion":{"title":"HistoryVersion","type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the version"},"createdAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the version was created"},"authors":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"User ID of the author"}}},"description":"List of users who contributed to this version"}},"required":["id","createdAt","authors"],"example":{"id":"vh_abc123","createdAt":"2024-10-15T10:30:00.000Z","authors":[{"id":"user-123"},{"id":"user-456"}]}},"GetVersionHistoryResponse":{"title":"GetVersionHistoryResponse","type":"object","properties":{"nextCursor":{"description":"Cursor for pagination to get the next page of results","oneOf":[{"type":"string"},{"type":"null"}]},"data":{"type":"array","items":{"$ref":"#/components/schemas/HistoryVersion"}}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"data":[{"id":"vh_abc123","createdAt":"2024-10-15T10:30:00.000Z","authors":[{"id":"user-123"}]}],"nextCursor":"eyJjcmVhdGVkQXQiOiIyMDI0LTEwLTE1VDEwOjMwOjAwLjAwMFoifQ=="}},"CreateVersionHistorySnapshotResponse":{"title":"CreateVersionHistorySnapshotResponse","type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the created version"}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"example":{"data":{"id":"vh_abc123"}}},"GetThreadsResponse":{"title":"GetThreadsResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Thread"}}},"required":["data"],"additionalProperties":false,"example":{"data":[{"type":"thread","id":"th_abc123","roomId":"my-room-id","comments":[{"type":"comment","threadId":"th_abc123","roomId":"my-room-id","id":"cm_abc123","userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{},"reactions":[],"attachments":[]}],"createdAt":"2022-07-13T14:32:50.697Z","updatedAt":"2022-07-13T14:32:50.697Z","metadata":{},"resolved":false,"visibility":"public"}]}},"Thread":{"type":"object","title":"Thread","properties":{"type":{"const":"thread"},"id":{"type":"string"},"roomId":{"type":"string"},"comments":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"createdAt":{"type":"string","format":"date-time"},"metadata":{"$ref":"#/components/schemas/ThreadMetadata"},"resolved":{"type":"boolean"},"visibility":{"type":"string","enum":["public","private"]},"updatedAt":{"type":"string","format":"date-time"}},"required":["type","id","roomId","comments","createdAt","updatedAt","metadata","resolved","visibility"],"example":{"type":"thread","id":"th_abc123","roomId":"my-room-id","comments":[{"type":"comment","threadId":"th_abc123","roomId":"my-room-id","id":"cm_abc123","userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{},"reactions":[],"attachments":[]}],"createdAt":"2022-07-13T14:32:50.697Z","updatedAt":"2022-07-13T14:32:50.697Z","metadata":{"color":"blue"},"resolved":false,"visibility":"public"}},"Feed":{"type":"object","title":"Feed","description":"Feed objects returned by the API use `createdAt` and `updatedAt` (Unix time in milliseconds).","properties":{"feedId":{"type":"string"},"metadata":{"type":"object"},"createdAt":{"type":"number","description":"Unix timestamp in milliseconds when the feed was created."},"updatedAt":{"type":"number","description":"Unix timestamp in milliseconds when the feed was last updated."}},"required":["feedId","metadata","createdAt","updatedAt"]},"FeedMessage":{"type":"object","title":"FeedMessage","description":"Message objects returned by the API use `createdAt` and `updatedAt` (Unix time in milliseconds). Request bodies for create/update use `timestamp` for optional custom times.","properties":{"id":{"type":"string"},"createdAt":{"type":"number","description":"Unix timestamp in milliseconds when the message was created."},"updatedAt":{"type":"number","description":"Unix timestamp in milliseconds when the message was last updated."},"data":{"type":"object"}},"required":["id","createdAt","updatedAt","data"]},"CreateFeedRequestBody":{"type":"object","title":"CreateFeedRequestBody","description":"Request body for `POST /v2/rooms/{roomId}/feeds`. Optional creation time is sent as `timestamp` (milliseconds), not `createdAt`.","properties":{"feedId":{"type":"string"},"metadata":{"type":"object"},"timestamp":{"type":"number","description":"Optional. Unix timestamp in milliseconds for the feed's creation time. If omitted, the server uses the current time."}},"required":["feedId"]},"UpdateFeedRequestBody":{"type":"object","title":"UpdateFeedRequestBody","properties":{"metadata":{"type":"object"}},"required":["metadata"]},"CreateFeedMessageRequestBody":{"type":"object","title":"CreateFeedMessageRequestBody","description":"Request body for `POST /v2/rooms/{roomId}/feeds/{feedId}/messages`. Optional message time is sent as `timestamp` (milliseconds), not `createdAt`.","properties":{"id":{"type":"string","description":"Optional client-provided message id. If omitted, the server generates one."},"timestamp":{"type":"number","description":"Optional. Unix timestamp in milliseconds for the message's creation time. If omitted, the server uses the current time."},"data":{"type":"object"}},"required":["data"]},"UpdateFeedMessageRequestBody":{"type":"object","title":"UpdateFeedMessageRequestBody","description":"Request body for `PATCH /v2/rooms/{roomId}/feeds/{feedId}/messages/{messageId}`. Optional update time is sent as `timestamp` (milliseconds), not `updatedAt`.","properties":{"data":{"type":"object"},"timestamp":{"type":"number","description":"Optional. Unix timestamp in milliseconds to record as the update time. If omitted, the server uses the current time."}},"required":["data"]},"GetFeedsResponse":{"title":"GetFeedsResponse","type":"object","additionalProperties":false,"required":["nextCursor","data"],"properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}],"description":"Pass as `cursor` to fetch the next page, or null when there are no more results."},"data":{"type":"array","items":{"$ref":"#/components/schemas/Feed"}}},"example":{"nextCursor":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9","data":[{"feedId":"my-feed-id","metadata":{"type":"chat","name":"General Discussion"},"createdAt":1660000988137,"updatedAt":1660000988137}]}},"GetFeedMessagesResponse":{"title":"GetFeedMessagesResponse","type":"object","additionalProperties":false,"required":["nextCursor","data"],"properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}],"description":"Pass as `cursor` to fetch the next page, or null when there are no more results."},"data":{"type":"array","items":{"$ref":"#/components/schemas/FeedMessage"}}},"example":{"nextCursor":"eyJjcmVhdGVkQXQiOjE2NjAwMDA5ODgxMzd9","data":[{"id":"msg_xyz789","data":{"type":"text","content":"Hello, world!"},"createdAt":1660000988137,"updatedAt":1660000988137}]}},"CreateThreadRequestBody":{"title":"CreateThreadRequestBody","type":"object","properties":{"comment":{"type":"object","properties":{"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"body":{"$ref":"#/components/schemas/CommentBody"},"metadata":{"$ref":"#/components/schemas/CommentMetadata"},"attachmentIds":{"type":"array","items":{"type":"string"},"maxItems":10}},"required":["userId","body"],"additionalProperties":false},"metadata":{"$ref":"#/components/schemas/ThreadMetadata"},"visibility":{"type":"string","enum":["public","private"],"default":"public"}},"required":["comment"],"examples":[{"comment":{"userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{"tag":"important","spam":false}},"metadata":{"color":"blue"},"visibility":"private"}]},"GetThreadParticipantsResponse":{"title":"GetThreadParticipantsResponse","type":"object","properties":{"participantIds":{"type":"array","items":{"type":"string"}}},"required":["participantIds"],"additionalProperties":false,"example":{"participantIds":["user-1","user-2"]}},"EditThreadMetadataRequestBody":{"title":"EditThreadMetadataRequestBody","type":"object","properties":{"metadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}},"userId":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["metadata","userId"],"examples":[{"metadata":{"color":"blue"},"userId":"alice","createdAt":"2023-07-13T14:32:50.697Z"}]},"ThreadMetadata":{"type":"object","title":"ThreadMetadata","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"boolean"}]},"required":[],"examples":[{"color":"blue","age":25}],"description":"Custom metadata attached to a thread. Supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 4000 characters maximum for strings.","maxProperties":50,"propertyNames":{"maxLength":40}},"CommentBody":{"type":"object","title":"CommentBody","properties":{"version":{"type":"integer"},"content":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["version","content"],"additionalProperties":false,"example":{"version":1,"content":[{"type":"paragraph","children":[{"text":"Hello "},{"text":"world","bold":true}]}]}},"CommentMetadata":{"type":"object","title":"CommentMetadata","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"boolean"}]},"required":[],"examples":[{"tag":"important","spam":false}],"description":"Custom metadata attached to a comment. Supports maximum 50 entries. Key length has a limit of 40 characters maximum. Value length has a limit of 4000 characters maximum for strings.","maxProperties":50,"propertyNames":{"maxLength":40}},"EditCommentMetadataRequestBody":{"title":"EditCommentMetadataRequestBody","type":"object","properties":{"metadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}},"userId":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["metadata","userId"],"additionalProperties":false,"examples":[{"metadata":{"tag":"important"},"userId":"alice","updatedAt":"2023-07-13T14:32:50.697Z"}]},"Comment":{"type":"object","title":"Comment","properties":{"type":{"const":"comment"},"threadId":{"type":"string"},"roomId":{"type":"string"},"id":{"type":"string"},"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"editedAt":{"type":"string","format":"date-time"},"deletedAt":{"type":"string","format":"date-time"},"body":{"$ref":"#/components/schemas/CommentBody"},"metadata":{"$ref":"#/components/schemas/CommentMetadata"},"reactions":{"type":"array","items":{"$ref":"#/components/schemas/CommentReaction"}},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/CommentAttachment"}}},"required":["type","threadId","roomId","id","userId","createdAt","metadata","reactions","attachments"],"examples":[{"type":"comment","threadId":"thread-id","roomId":"room-id","id":"comment-id","userId":"string","createdAt":"2019-08-24T14:15:22Z","editedAt":"2019-08-24T14:15:22Z","deletedAt":"2019-08-24T14:15:22Z","body":{},"metadata":{},"reactions":[],"attachments":[]}]},"CreateCommentRequestBody":{"title":"CreateCommentRequestBody","type":"object","properties":{"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"body":{"$ref":"#/components/schemas/CommentBody"},"metadata":{"$ref":"#/components/schemas/CommentMetadata"},"attachmentIds":{"type":"array","items":{"type":"string"},"maxItems":10}},"additionalProperties":false,"required":["userId","body"],"examples":[{"userId":"alice","createdAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{"tag":"important","spam":false}}]},"EditCommentRequestBody":{"title":"EditCommentRequestBody","type":"object","properties":{"editedAt":{"type":"string","format":"date-time"},"body":{"$ref":"#/components/schemas/CommentBody"},"metadata":{"$ref":"#/components/schemas/CommentMetadata"},"attachmentIds":{"type":"array","items":{"type":"string"},"maxItems":10}},"required":["body"],"additionalProperties":false,"examples":[{"editedAt":"2022-07-13T14:32:50.697Z","body":{"version":1,"content":[]},"metadata":{"tag":"important","spam":false}}]},"MarkThreadAsResolvedRequestBody":{"type":"object","title":"MarkThreadAsResolvedRequestBody","required":["userId"],"properties":{"userId":{"type":"string","description":"The user ID of the user who marked the thread as resolved."}},"additionalProperties":false,"example":{"userId":"alice"}},"MarkThreadAsUnresolvedRequestBody":{"type":"object","title":"MarkThreadAsUnresolvedRequestBody","required":["userId"],"properties":{"userId":{"type":"string","description":"The user ID of the user who marked the thread as unresolved."}},"additionalProperties":false,"example":{"userId":"alice"}},"SubscribeToThreadRequestBody":{"type":"object","title":"SubscribeToThreadRequestBody","required":["userId"],"properties":{"userId":{"type":"string"}},"additionalProperties":false,"example":{"userId":"alice"}},"UnsubscribeFromThreadRequestBody":{"type":"object","title":"UnsubscribeFromThreadRequestBody","required":["userId"],"properties":{"userId":{"type":"string"}},"additionalProperties":false,"example":{"userId":"alice"}},"GetThreadSubscriptionsResponse":{"type":"object","title":"GetThreadSubscriptionsResponse","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserSubscription"}}},"required":["data"],"additionalProperties":false,"example":{"data":[{"kind":"thread","subjectId":"th_abc123","createdAt":"2022-07-13T14:32:50.697Z","userId":"alice"}]}},"CommentReaction":{"type":"object","title":"CommentReaction","properties":{"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"emoji":{"type":"string"}},"required":["userId","emoji","createdAt"],"additionalProperties":false,"examples":[{"emoji":"👨‍👩‍👧","createdAt":"2022-07-13T14:32:50.697Z","userId":"alice"}]},"CommentAttachment":{"type":"object","title":"CommentAttachment","properties":{"type":{"type":"string","const":"attachment"},"id":{"type":"string"},"mimeType":{"type":"string"},"name":{"type":"string"},"size":{"type":"integer"}},"required":["type","id","mimeType","name","size"],"additionalProperties":false,"example":{"type":"attachment","id":"at_abc123","mimeType":"image/png","name":"screenshot.png","size":12345}},"AttachmentMultipartUpload":{"type":"object","title":"AttachmentMultipartUpload","properties":{"attachmentId":{"type":"string","pattern":"^at_[A-Za-z0-9_-]{21}$"},"uploadId":{"type":"string"}},"required":["attachmentId","uploadId"],"additionalProperties":false},"AttachmentMultipartPart":{"type":"object","title":"AttachmentMultipartPart","properties":{"partNumber":{"type":"integer","minimum":1},"etag":{"type":"string"}},"required":["partNumber","etag"],"additionalProperties":false},"CompleteAttachmentMultipartUploadRequestBody":{"type":"object","title":"CompleteAttachmentMultipartUploadRequestBody","properties":{"parts":{"type":"array","items":{"$ref":"#/components/schemas/AttachmentMultipartPart"}}},"required":["parts"],"additionalProperties":false},"AttachmentWithUrl":{"type":"object","title":"AttachmentWithUrl","properties":{"type":{"type":"string","const":"attachment"},"id":{"type":"string"},"mimeType":{"type":"string"},"name":{"type":"string"},"size":{"type":"integer"},"url":{"type":"string","description":"Presigned download URL for the attachment"},"expiresAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when the presigned URL expires"}},"required":["type","id","mimeType","name","size","url","expiresAt"],"additionalProperties":false,"example":{"type":"attachment","id":"at_abc123","mimeType":"image/png","name":"screenshot.png","size":12345,"url":"https://example.com/at_abc123?X-Amz-Expires=3600&X-Amz-Signature=...","expiresAt":"2026-03-16T14:00:00.000Z"}},"AddCommentReactionRequestBody":{"type":"object","title":"AddCommentReactionRequestBody","properties":{"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"emoji":{"type":"string"}},"required":["userId","emoji"],"additionalProperties":false,"examples":[{"emoji":"👨‍👩‍👧","createdAt":"2022-07-13T14:32:50.697Z","userId":"alice"}]},"RemoveCommentReactionRequestBody":{"type":"object","title":"RemoveCommentReactionRequestBody","properties":{"userId":{"type":"string"},"removedAt":{"type":"string","format":"date-time"},"emoji":{"type":"string"}},"required":["userId","emoji"],"additionalProperties":false,"examples":[{"emoji":"👨‍👩‍👧","removedAt":"2022-07-13T14:32:50.697Z","userId":"alice"}]},"GetInboxNotificationsResponse":{"type":"object","properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}],"description":"A cursor to use for pagination. Pass this value as `startingAfter` to get the next page of results. `null` if there are no more results."},"data":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/InboxNotificationThreadData"},{"$ref":"#/components/schemas/InboxNotificationCustomData"}]}}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"nextCursor":null,"data":[{"kind":"thread","id":"in_abc123","roomId":"my-room-id","threadId":"th_abc123","notifiedAt":"2024-01-15T10:30:00.000Z","readAt":null}]}},"InboxNotificationThreadData":{"title":"InboxNotificationThreadData","type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string"},"threadId":{"type":"string"},"roomId":{"type":"string"},"organizationId":{"type":"string"},"readAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"notifiedAt":{"type":"string","format":"date-time"}},"required":["kind","id","roomId","threadId","notifiedAt","readAt"],"example":{"kind":"thread","id":"in_abc123","roomId":"my-room-id","organizationId":"org_123456789","threadId":"th_abc123","notifiedAt":"2024-01-15T10:30:00.000Z","readAt":null}},"InboxNotificationActivity":{"title":"InboxNotificationActivity","type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"data":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"boolean"},{"type":"number"}]}}},"required":["id","createdAt","data"],"additionalProperties":false,"example":{"id":"act_abc123","createdAt":"2024-01-15T10:30:00.000Z","data":{"url":"url-to-file"}}},"InboxNotificationCustomData":{"title":"InboxNotificationCustomData","type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","const":"custom"},"subjectId":{"type":"string"},"roomId":{"oneOf":[{"type":"string"},{"type":"null"}]},"readAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"notifiedAt":{"type":"string","format":"date-time"},"activities":{"type":"array","items":{"$ref":"#/components/schemas/InboxNotificationActivity"}}},"required":["kind","id","subjectId","notifiedAt","readAt","activities"],"additionalProperties":false,"example":{"kind":"custom","id":"in_xyz789","subjectId":"file123","roomId":null,"notifiedAt":"2024-01-15T10:30:00.000Z","readAt":null,"activities":[{"id":"act_abc123","createdAt":"2024-01-15T10:30:00.000Z","data":{"url":"url-to-file"}}]}},"NotificationChannelSettings":{"type":"object","properties":{"thread":{"type":"boolean"},"textMention":{"type":"boolean"}},"additionalProperties":{"type":"boolean","description":"Custom notification kinds prefixed by a '$'"},"example":{"thread":true,"textMention":false,"$customNotification":true}},"NotificationSettings":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/NotificationChannelSettings"},"slack":{"$ref":"#/components/schemas/NotificationChannelSettings"},"teams":{"$ref":"#/components/schemas/NotificationChannelSettings"},"webPush":{"$ref":"#/components/schemas/NotificationChannelSettings"}},"additionalProperties":false,"description":"Notification settings for each supported channel","example":{"email":{"thread":true,"textMention":false,"$customNotification":true},"slack":{"thread":true,"textMention":true,"$customNotification":false},"teams":{"thread":false,"textMention":true,"$customNotification":true},"webPush":{"thread":true,"textMention":true,"$customNotification":false}}},"UpdateNotificationSettingsRequestBody":{"title":"UpdateNotificationSettingsRequestBody","type":"object","properties":{"email":{"$ref":"#/components/schemas/NotificationChannelSettings"},"slack":{"$ref":"#/components/schemas/NotificationChannelSettings"},"teams":{"$ref":"#/components/schemas/NotificationChannelSettings"},"webPush":{"$ref":"#/components/schemas/NotificationChannelSettings"}},"additionalProperties":false,"description":"Partial notification settings - all properties are optional","example":{"email":{"thread":true,"textMention":false},"slack":{"textMention":false},"webPush":{"thread":true}}},"GetRoomSubscriptionSettingsResponse":{"type":"object","properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}],"description":"A cursor to use for pagination. Pass this value as `startingAfter` to get the next page of results. `null` if there are no more results."},"data":{"type":"array","items":{"$ref":"#/components/schemas/UserRoomSubscriptionSettings"}}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"nextCursor":null,"data":[{"threads":"all","textMentions":"mine","roomId":"my-room-id"}]}},"RoomSubscriptionSettings":{"title":"RoomSubscriptionSettings","type":"object","properties":{"threads":{"enum":["all","replies_and_mentions","none"]},"textMentions":{"enum":["mine","none"]}},"required":["threads","textMentions"],"additionalProperties":false,"example":{"threads":"all","textMentions":"mine"}},"UpdateRoomSubscriptionSettingsRequestBody":{"title":"UpdateRoomSubscriptionSettingsRequestBody","type":"object","properties":{"threads":{"enum":["all","replies_and_mentions","none"]},"textMentions":{"enum":["mine","none"]}},"additionalProperties":false,"description":"Partial room subscription settings - all properties are optional","example":{"threads":"replies_and_mentions","textMentions":"none"}},"UserRoomSubscriptionSettings":{"title":"UserRoomSubscriptionSettings","type":"object","properties":{"threads":{"type":"string","enum":["all","replies_and_mentions","none"]},"textMentions":{"enum":["mine","none"]},"roomId":{"type":"string"}},"required":["threads","textMentions","roomId"],"additionalProperties":false,"example":{"threads":"all","textMentions":"mine","roomId":"my-room-id"}},"TriggerInboxNotificationRequestBody":{"title":"TriggerInboxNotificationRequestBody","type":"object","properties":{"userId":{"type":"string"},"kind":{"type":"string","pattern":"^\\$[a-zA-Z_]{1,128}$","description":"A custom notification kind. Must start with '$' and contain only letters and underscores (max 128 characters)."},"subjectId":{"type":"string"},"roomId":{"type":"string"},"activityData":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"organizationId":{"type":"string"}},"required":["userId","kind","subjectId","activityData"],"example":{"userId":"alice","kind":"$fileUploaded","subjectId":"file123","activityData":{"url":"url-to-file"}}},"Subscription":{"title":"Subscription","type":"object","properties":{"kind":{"type":"string"},"subjectId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["kind","subjectId","createdAt"],"additionalProperties":false,"example":{"kind":"thread","subjectId":"th_abc123","createdAt":"2022-07-13T14:32:50.697Z"}},"UserSubscription":{"title":"UserSubscription","allOf":[{"$ref":"#/components/schemas/Subscription"},{"type":"object","properties":{"userId":{"type":"string"}}}],"example":{"kind":"thread","subjectId":"th_abc123","createdAt":"2022-07-13T14:32:50.697Z","userId":"alice"}},"AiCopilotBase":{"type":"object","required":["type","id","name","systemPrompt","alwaysUseKnowledge","createdAt","updatedAt"],"properties":{"type":{"type":"string","const":"copilot"},"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"systemPrompt":{"type":"string"},"knowledgePrompt":{"type":"string"},"alwaysUseKnowledge":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time"},"settings":{"$ref":"#/components/schemas/AiCopilotProviderSettings"}},"additionalProperties":false,"example":{"type":"copilot","id":"cp_abc123","name":"My Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":true,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","settings":{"maxTokens":4096,"temperature":0.7}}},"AiCopilotOpenAi":{"title":"AiCopilotOpenAi","allOf":[{"$ref":"#/components/schemas/AiCopilotBase"},{"type":"object","properties":{"provider":{"type":"string","const":"openai"},"providerModel":{"$ref":"#/components/schemas/OpenAiModel"}},"required":["provider","providerModel"]}],"additionalProperties":false,"example":{"type":"copilot","id":"cp_abc123","name":"My Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":true,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","provider":"openai","providerModel":"gpt-4o","settings":{"maxTokens":4096,"temperature":0.7}}},"AiCopilotAnthropic":{"title":"AiCopilotAnthropic","allOf":[{"$ref":"#/components/schemas/AiCopilotBase"},{"type":"object","properties":{"provider":{"type":"string","const":"anthropic"},"providerModel":{"$ref":"#/components/schemas/AnthropicModel"},"providerOptions":{"$ref":"#/components/schemas/AnthropicProviderOptions"}},"required":["provider","providerModel"]}],"additionalProperties":false,"example":{"type":"copilot","id":"cp_abc456","name":"My Anthropic Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":true,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","provider":"anthropic","providerModel":"claude-3-5-sonnet-latest"}},"AiCopilotGoogle":{"title":"AiCopilotGoogle","allOf":[{"$ref":"#/components/schemas/AiCopilotBase"},{"type":"object","properties":{"provider":{"type":"string","const":"google"},"providerModel":{"$ref":"#/components/schemas/GoogleModel"},"providerOptions":{"$ref":"#/components/schemas/GoogleProviderOptions"}},"required":["provider","providerModel"]}],"additionalProperties":false,"example":{"type":"copilot","id":"cp_abc789","name":"My Google Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":false,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","provider":"google","providerModel":"gemini-2.5-flash"}},"AiCopilotOpenAiCompatible":{"title":"AiCopilotOpenAiCompatible","allOf":[{"$ref":"#/components/schemas/AiCopilotBase"},{"type":"object","required":["provider","providerModel","compatibleProviderName","providerBaseUrl"],"properties":{"provider":{"type":"string","const":"openai-compatible"},"providerModel":{"type":"string"},"compatibleProviderName":{"type":"string"},"providerBaseUrl":{"type":"string"}}}],"additionalProperties":false,"example":{"type":"copilot","id":"cp_compat1","name":"My Compatible Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":false,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","provider":"openai-compatible","providerModel":"my-custom-model","compatibleProviderName":"my-provider","providerBaseUrl":"https://api.my-provider.com/v1"}},"AiCopilot":{"title":"AiCopilot","oneOf":[{"$ref":"#/components/schemas/AiCopilotOpenAi"},{"$ref":"#/components/schemas/AiCopilotAnthropic"},{"$ref":"#/components/schemas/AiCopilotGoogle"},{"$ref":"#/components/schemas/AiCopilotOpenAiCompatible"}],"discriminator":{"propertyName":"provider","mapping":{"openai":"#/components/schemas/AiCopilotOpenAi","anthropic":"#/components/schemas/AiCopilotAnthropic","google":"#/components/schemas/AiCopilotGoogle","openai-compatible":"#/components/schemas/AiCopilotOpenAiCompatible"}},"additionalProperties":false,"example":{"type":"copilot","id":"cp_abc123","name":"My Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":true,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","provider":"openai","providerModel":"gpt-4o","settings":{"maxTokens":4096,"temperature":0.7}}},"CreateAiCopilotOptionsBase":{"type":"object","required":["name","systemPrompt","providerApiKey"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"systemPrompt":{"type":"string"},"knowledgePrompt":{"type":"string"},"alwaysUseKnowledge":{"type":"boolean"},"settings":{"$ref":"#/components/schemas/AiCopilotProviderSettings"},"providerApiKey":{"type":"string"}},"additionalProperties":false,"example":{"name":"My Copilot","systemPrompt":"You are a helpful assistant.","providerApiKey":"sk-...","alwaysUseKnowledge":true,"settings":{"maxTokens":4096,"temperature":0.7}}},"CreateAiCopilotOptionsOpenAi":{"allOf":[{"$ref":"#/components/schemas/CreateAiCopilotOptionsBase"},{"type":"object","required":["provider","providerModel"],"properties":{"provider":{"type":"string","const":"openai"},"providerModel":{"$ref":"#/components/schemas/OpenAiModel"},"providerOptions":{"$ref":"#/components/schemas/OpenAiProviderOptions"}},"additionalProperties":false}],"additionalProperties":false,"example":{"name":"My Copilot","systemPrompt":"You are a helpful assistant.","providerApiKey":"sk-...","provider":"openai","providerModel":"gpt-4o"}},"CreateAiCopilotOptionsAnthropic":{"allOf":[{"$ref":"#/components/schemas/CreateAiCopilotOptionsBase"},{"type":"object","required":["provider","providerModel"],"properties":{"provider":{"type":"string","const":"anthropic"},"providerModel":{"$ref":"#/components/schemas/AnthropicModel"},"providerOptions":{"$ref":"#/components/schemas/AnthropicProviderOptions"}}}],"example":{"name":"My Anthropic Copilot","systemPrompt":"You are a helpful assistant.","providerApiKey":"sk-ant-...","provider":"anthropic","providerModel":"claude-3-5-sonnet-latest"}},"CreateAiCopilotOptionsGoogle":{"allOf":[{"$ref":"#/components/schemas/CreateAiCopilotOptionsBase"},{"type":"object","required":["provider","providerModel"],"properties":{"provider":{"type":"string","const":"google"},"providerModel":{"$ref":"#/components/schemas/GoogleModel"},"providerOptions":{"$ref":"#/components/schemas/GoogleProviderOptions"}}}],"example":{"name":"My Google Copilot","systemPrompt":"You are a helpful assistant.","providerApiKey":"AIza...","provider":"google","providerModel":"gemini-2.5-flash"}},"CreateAiCopilotOptionsOpenAiCompatible":{"allOf":[{"$ref":"#/components/schemas/CreateAiCopilotOptionsBase"},{"type":"object","required":["provider","providerModel","compatibleProviderName","providerBaseUrl"],"properties":{"provider":{"type":"string","const":"openai-compatible"},"providerModel":{"type":"string"},"compatibleProviderName":{"type":"string"},"providerBaseUrl":{"type":"string"}}}],"example":{"name":"My Compatible Copilot","systemPrompt":"You are a helpful assistant.","providerApiKey":"sk-...","provider":"openai-compatible","providerModel":"my-custom-model","compatibleProviderName":"my-provider","providerBaseUrl":"https://api.my-provider.com/v1"}},"CreateAiCopilotRequestBody":{"oneOf":[{"$ref":"#/components/schemas/CreateAiCopilotOptionsOpenAi"},{"$ref":"#/components/schemas/CreateAiCopilotOptionsAnthropic"},{"$ref":"#/components/schemas/CreateAiCopilotOptionsGoogle"},{"$ref":"#/components/schemas/CreateAiCopilotOptionsOpenAiCompatible"}],"discriminator":{"propertyName":"provider","mapping":{"openai":"#/components/schemas/CreateAiCopilotOptionsOpenAi","anthropic":"#/components/schemas/CreateAiCopilotOptionsAnthropic","google":"#/components/schemas/CreateAiCopilotOptionsGoogle","openai-compatible":"#/components/schemas/CreateAiCopilotOptionsOpenAiCompatible"}},"example":{"name":"My Copilot","systemPrompt":"You are a helpful assistant.","providerApiKey":"sk-...","provider":"openai","providerModel":"gpt-4o"}},"UpdateAiCopilotRequestBody":{"title":"UpdateAiCopilotRequestBody","type":"object","properties":{"name":{"type":"string"},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"systemPrompt":{"type":"string"},"knowledgePrompt":{"oneOf":[{"type":"string"},{"type":"null"}]},"alwaysUseKnowledge":{"type":"boolean"},"settings":{"oneOf":[{"$ref":"#/components/schemas/AiCopilotProviderSettings"},{"type":"null"}]},"providerApiKey":{"type":"string"},"provider":{"type":"string","enum":["openai","anthropic","google","openai-compatible"]},"providerModel":{"type":"string"},"providerOptions":{"oneOf":[{"$ref":"#/components/schemas/OpenAiProviderOptions"},{"$ref":"#/components/schemas/AnthropicProviderOptions"},{"$ref":"#/components/schemas/GoogleProviderOptions"},{"type":"null"}]},"compatibleProviderName":{"type":"string"},"providerBaseUrl":{"type":"string","format":"uri"}},"additionalProperties":false,"example":{"name":"Updated Copilot","systemPrompt":"You are an updated helpful assistant.","providerModel":"gpt-4o","settings":{"maxTokens":8192}}},"AiCopilotProviderSettings":{"title":"AiCopilotProviderSettings","type":"object","properties":{"maxTokens":{"type":"integer"},"temperature":{"type":"number"},"topP":{"type":"number"},"topK":{"type":"number"},"frequencyPenalty":{"type":"number"},"presencePenalty":{"type":"number"},"stopSequences":{"type":"array","items":{"type":"string"}},"seed":{"type":"integer"},"maxRetries":{"type":"integer"}},"additionalProperties":false,"example":{"maxTokens":4096,"temperature":0.7,"topP":0.9}},"OpenAiModel":{"title":"OpenAiModel","type":"string","enum":["o1","o1-mini","o3","o3-mini","o4-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4o","gpt-4o-mini","gpt-4-turbo","gpt-4","gpt-5","gpt-5-pro","gpt-5-mini","gpt-5-nano","gpt-5-chat-latest","gpt-5.1","gpt-5.1-mini","gpt-5.1-chat-latest","gpt-5.2","gpt-5.2-pro","gpt-5.4","gpt-5.4-pro","gpt-5.4-mini","gpt-5.4-nano","gpt-5.5"],"example":"gpt-4o"},"AnthropicModel":{"title":"AnthropicModel","type":"string","enum":["claude-opus-4-7","claude-sonnet-4-6","claude-opus-4-6","claude-opus-4-5-20251101","claude-sonnet-4-5-20250929","claude-haiku-4-5-20251001","claude-opus-4-1-20250805","claude-4-opus-20250514","claude-4-sonnet-20250514","claude-3-7-sonnet-20250219","claude-3-5-sonnet-latest","claude-3-5-haiku-latest","claude-3-opus-latest"],"example":"claude-3-5-sonnet-latest"},"GoogleModel":{"title":"GoogleModel","type":"string","enum":["gemini-3-flash-preview","gemini-3.1-pro-preview","gemini-2.5-flash","gemini-2.5-pro","gemini-2.0-flash-001","gemini-1.5-flash","gemini-1.5-pro"],"example":"gemini-2.5-flash"},"OpenAiProviderOptions":{"type":"object","required":["openai"],"properties":{"openai":{"type":"object","properties":{"reasoningEffort":{"type":"string","enum":["low","medium","high"]},"webSearch":{"type":"object","properties":{"allowedDomains":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false,"example":{"openai":{"reasoningEffort":"medium"}}},"AnthropicProviderOptions":{"type":"object","required":["anthropic"],"properties":{"anthropic":{"type":"object","properties":{"thinking":{"oneOf":[{"title":"AnthropicThinkingEnabled","type":"object","required":["type","budgetTokens"],"properties":{"type":{"type":"string","const":"enabled"},"budgetTokens":{"type":"integer"}},"additionalProperties":false},{"title":"AnthropicThinkingDisabled","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"disabled"}},"additionalProperties":false}]},"webSearch":{"title":"AnthropicWebSearch","type":"object","properties":{"allowedDomains":{"type":"array","items":{"type":"string"}}}}},"additionalProperties":false}},"additionalProperties":false,"example":{"anthropic":{"thinking":{"type":"enabled","budgetTokens":10000}}}},"GoogleProviderOptions":{"title":"GoogleProviderOptions","type":"object","required":["google"],"properties":{"google":{"type":"object","properties":{"thinkingConfig":{"type":"object","properties":{"thinkingBudget":{"type":"integer"}}}}}},"additionalProperties":false,"example":{"google":{"thinkingConfig":{"thinkingBudget":10000}}}},"GetAiCopilotsResponse":{"title":"GetAiCopilotsResponse","type":"object","properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AiCopilot"}}},"required":["nextCursor","data"],"additionalProperties":false,"example":{"nextCursor":null,"data":[{"type":"copilot","id":"cp_abc123","name":"My Copilot","systemPrompt":"You are a helpful assistant.","alwaysUseKnowledge":true,"createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","provider":"openai","providerModel":"gpt-4o"}]}},"KnowledgeSourceBase":{"type":"object","required":["id","createdAt","updatedAt","lastIndexedAt","status"],"properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastIndexedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["ingesting","ready","error"]},"errorMessage":{"type":"string"}},"additionalProperties":false,"example":{"id":"ks_abc123","createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z","status":"ready"}},"KnowledgeSourceWebSource":{"allOf":[{"$ref":"#/components/schemas/KnowledgeSourceBase"},{"type":"object","required":["type","link","status"],"properties":{"type":{"type":"string","const":"ai-knowledge-web-source"},"link":{"type":"object","required":["url","type"],"properties":{"url":{"type":"string"},"type":{"type":"string","enum":["individual_link","crawl","sitemap"]}}}}}],"additionalProperties":false,"example":{"id":"ks_web123","type":"ai-knowledge-web-source","createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z","status":"ready","link":{"url":"https://docs.example.com","type":"crawl"}}},"KnowledgeSourceFileSource":{"allOf":[{"$ref":"#/components/schemas/KnowledgeSourceBase"},{"type":"object","required":["type","file"],"properties":{"type":{"type":"string","const":"ai-knowledge-file-source"},"file":{"type":"object","required":["name","mimeType"],"properties":{"name":{"type":"string"},"mimeType":{"type":"string"}}}}}],"example":{"id":"ks_file123","type":"ai-knowledge-file-source","createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z","status":"ready","file":{"name":"document.pdf","mimeType":"application/pdf"}}},"KnowledgeSource":{"type":"object","title":"KnowledgeSource","oneOf":[{"$ref":"#/components/schemas/KnowledgeSourceWebSource"},{"$ref":"#/components/schemas/KnowledgeSourceFileSource"}],"discriminator":{"propertyName":"type"},"additionalProperties":false,"example":{"id":"ks_web123","type":"ai-knowledge-web-source","createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z","status":"ready","link":{"url":"https://docs.example.com","type":"crawl"}}},"GetKnowledgeSourcesResponse":{"title":"GetKnowledgeSourcesResponse","type":"object","properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]},"data":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSource"}}},"required":["nextCursor","data"],"additionalProperties":false,"example":{"nextCursor":null,"data":[{"id":"ks_abc123","type":"ai-knowledge-web-source","createdAt":"2024-06-01T12:00:00.000Z","updatedAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z","status":"ready","link":{"url":"https://docs.example.com","type":"crawl"}}]}},"CreateWebKnowledgeSourceRequestBody":{"title":"CreateWebKnowledgeSourceRequestBody","type":"object","properties":{"copilotId":{"type":"string"},"url":{"type":"string","format":"uri"},"type":{"type":"string","enum":["individual_link","crawl","sitemap"]}},"required":["copilotId","url","type"],"example":{"copilotId":"cp_abc123","url":"https://docs.example.com","type":"crawl"}},"CreateWebKnowledgeSourceResponse":{"title":"CreateWebKnowledgeSourceResponse","type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false,"example":{"id":"ks_abc123"}},"GetFileKnowledgeSourceMarkdownResponse":{"title":"GetFileKnowledgeSourceMarkdownResponse","type":"object","properties":{"id":{"type":"string"},"content":{"type":"string"}},"required":["id","content"],"additionalProperties":false,"example":{"id":"ks_abc123","content":"# Document Title\n\nThis is the content of the uploaded file."}},"WebKnowledgeSourceLink":{"title":"WebKnowledgeSourceLink","type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"status":{"type":"string","enum":["ingesting","ready","error"]},"createdAt":{"type":"string","format":"date-time"},"lastIndexedAt":{"type":"string","format":"date-time"}},"required":["id","url","status","createdAt","lastIndexedAt"],"additionalProperties":false,"example":{"id":"ksl_abc123","url":"https://docs.example.com/getting-started","status":"ready","createdAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z"}},"GetWebKnowledgeSourceLinksResponse":{"title":"GetWebKnowledgeSourceLinksResponse","type":"object","properties":{"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebKnowledgeSourceLink"}}},"required":["nextCursor","data"],"additionalProperties":false,"example":{"nextCursor":null,"data":[{"id":"ksl_abc123","url":"https://docs.example.com/getting-started","status":"ready","createdAt":"2024-06-01T12:00:00.000Z","lastIndexedAt":"2024-06-01T12:00:00.000Z"}]}},"Group":{"title":"Group","type":"object","properties":{"type":{"type":"string","const":"group"},"id":{"type":"string"},"organizationId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"scopes":{"type":"object","properties":{"mention":{"type":"boolean","const":true}}},"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMember"}}},"required":["type","id","organizationId","createdAt","updatedAt","scopes","members"],"example":{"type":"group","id":"engineering","organizationId":"org_123456789","createdAt":"2024-01-15T10:30:00.000Z","updatedAt":"2024-01-15T10:30:00.000Z","scopes":{"mention":true},"members":[{"id":"alice","addedAt":"2024-01-15T10:30:00.000Z"},{"id":"bob","addedAt":"2024-01-16T09:00:00.000Z"}]}},"GroupMember":{"title":"GroupMember","type":"object","properties":{"id":{"type":"string"},"addedAt":{"type":"string","format":"date-time"}},"required":["id","addedAt"],"example":{"id":"alice","addedAt":"2024-01-15T10:30:00.000Z"}},"CreateGroupRequestBody":{"title":"CreateGroupRequestBody","type":"object","properties":{"id":{"type":"string"},"memberIds":{"type":"array","items":{"type":"string"}},"organizationId":{"type":"string"},"scopes":{"type":"object","properties":{"mention":{"type":"boolean","const":true}}}},"required":["id"],"additionalProperties":false,"example":{"id":"engineering","memberIds":["alice","bob"],"organizationId":"org_123456789","scopes":{"mention":true}}},"AddGroupMembersRequestBody":{"title":"AddGroupMembersRequestBody","type":"object","properties":{"memberIds":{"type":"array","items":{"type":"string"}}},"required":["memberIds"],"example":{"memberIds":["charlie","dave"]}},"RemoveGroupMembersRequestBody":{"title":"RemoveGroupMembersRequestBody","type":"object","properties":{"memberIds":{"type":"array","items":{"type":"string"}}},"required":["memberIds"],"example":{"memberIds":["charlie"]}},"GetGroupsResponse":{"title":"GetGroupsResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Group"}},"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"data":[{"type":"group","id":"engineering","organizationId":"org_123456789","createdAt":"2024-01-15T10:30:00.000Z","updatedAt":"2024-01-15T10:30:00.000Z","scopes":{"mention":true},"members":[{"id":"alice","addedAt":"2024-01-15T10:30:00.000Z"}]}],"nextCursor":null}},"GetUserGroupsResponse":{"title":"GetUserGroupsResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Group"}},"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"data":[{"type":"group","id":"engineering","organizationId":"org_123456789","createdAt":"2024-01-15T10:30:00.000Z","updatedAt":"2024-01-15T10:30:00.000Z","scopes":{"mention":true},"members":[{"id":"alice","addedAt":"2024-01-15T10:30:00.000Z"}]}],"nextCursor":null}},"ManagementProjectType":{"title":"ManagementProjectType","type":"string","enum":["dev","prod"],"example":"dev"},"ManagementProjectRegion":{"title":"ManagementProjectRegion","type":"string","description":"The region where the project's data is stored and processed.","enum":["earth","eu","fedramp"],"example":"earth"},"ManagementProjectVersionCreationTimeout":{"title":"ManagementProjectVersionCreationTimeout","description":"False to disable timeout or number of seconds between 30 and 300.","oneOf":[{"type":"boolean","enum":[false]},{"type":"integer","minimum":30,"maximum":300}],"example":false},"ManagementProjectPublicKey":{"title":"ManagementProjectPublicKey","type":"object","properties":{"activated":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"value":{"type":"string"}},"required":["activated","createdAt","value"],"example":{"activated":true,"createdAt":"2024-09-03T12:34:56.000Z","value":"pk_dev_123"}},"ManagementProjectSecretKey":{"title":"ManagementProjectSecretKey","type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"value":{"type":"string"}},"required":["createdAt","value"],"example":{"createdAt":"2024-09-03T12:34:56.000Z","value":"sk_dev_123"}},"ManagementProject":{"title":"ManagementProject","type":"object","properties":{"id":{"type":"string"},"teamId":{"type":"string"},"type":{"$ref":"#/components/schemas/ManagementProjectType"},"name":{"type":"string"},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"publicKey":{"$ref":"#/components/schemas/ManagementProjectPublicKey"},"secretKey":{"oneOf":[{"$ref":"#/components/schemas/ManagementProjectSecretKey"},{"type":"null"}]},"region":{"$ref":"#/components/schemas/ManagementProjectRegion"},"versionCreationTimeout":{"$ref":"#/components/schemas/ManagementProjectVersionCreationTimeout"}},"required":["id","teamId","type","name","description","createdAt","updatedAt","publicKey","secretKey","region","versionCreationTimeout"],"example":{"id":"683d49ed6b4d1cec5a597b13","teamId":"team_123","type":"dev","name":"My Project","createdAt":"2024-09-03T12:34:56.000Z","updatedAt":"2024-09-03T12:34:56.000Z","publicKey":{"activated":true,"createdAt":"2024-09-03T12:34:56.000Z","value":"pk_dev_123"},"secretKey":{"createdAt":"2024-09-03T12:34:56.000Z","value":"sk_dev_123"},"region":"earth","versionCreationTimeout":false}},"GetManagementProjectsResponse":{"title":"GetManagementProjectsResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ManagementProject"}},"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"data":[{"id":"683d49ed6b4d1cec5a597b13","teamId":"team_123","type":"dev","name":"My Project","createdAt":"2024-09-03T12:34:56.000Z","updatedAt":"2024-09-03T12:34:56.000Z","publicKey":{"activated":true,"createdAt":"2024-09-03T12:34:56.000Z","value":"pk_dev_123"},"secretKey":{"createdAt":"2024-09-03T12:34:56.000Z","value":"sk_dev_123"},"region":"earth","versionCreationTimeout":false}],"nextCursor":null}},"CreateManagementProjectRequestBody":{"title":"CreateManagementProjectRequestBody","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/ManagementProjectType"},"region":{"$ref":"#/components/schemas/ManagementProjectRegion","default":"earth"},"versionCreationTimeout":{"$ref":"#/components/schemas/ManagementProjectVersionCreationTimeout","default":false}},"required":["type"],"example":{"name":"My Project","description":"Project description","type":"dev","region":"earth","versionCreationTimeout":false}},"UpdateManagementProjectRequestBody":{"title":"UpdateManagementProjectRequestBody","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"versionCreationTimeout":{"$ref":"#/components/schemas/ManagementProjectVersionCreationTimeout"}},"example":{"name":"Updated Project Name","description":"Updated project description","versionCreationTimeout":60}},"RollProjectPublicApiKeyResponse":{"title":"RollProjectPublicApiKeyResponse","type":"object","properties":{"publicKey":{"$ref":"#/components/schemas/ManagementProjectPublicKey"}},"required":["publicKey"],"additionalProperties":false,"example":{"publicKey":{"activated":true,"createdAt":"2024-09-03T12:34:56.000Z","value":"pk_dev_123"}}},"RollProjectPublicApiKeyRequestBody":{"title":"RollProjectPublicApiKeyRequestBody","type":"object","properties":{"expirationIn":{"type":"string","enum":["now","1h","1hour","1 hour","24hrs","24hours","24 hours","3d","3days","3 days","7d","7days","7 days"],"default":"now"}},"additionalProperties":false,"example":{"expirationIn":"1 hour"}},"RollProjectSecretApiKeyRequestBody":{"title":"RollProjectSecretApiKeyRequestBody","type":"object","properties":{"expirationIn":{"type":"string","enum":["now","1h","1hour","1 hour","24hrs","24hours","24 hours","3d","3days","3 days","7d","7days","7 days"],"default":"now"},"newKeyExpirationIn":{"type":"string","enum":["now","5m","5min","5 minutes","3m","3min","3 minutes","1h","1hour","1 hour","48h","48hrs","48hours","48 hours","24hrs","24hours","24 hours","3d","3days","3 days","7d","7days","7 days","21d","21days","21 days","30d","30days","30 days","1y","1year","1 year","one year"]}},"additionalProperties":false,"example":{"expirationIn":"3 days","newKeyExpirationIn":"30 days"}},"RollProjectSecretApiKeyResponse":{"title":"ManagementProjectRollProjectSecretApiKeyResponseSecretKeyResponse","type":"object","properties":{"secretKey":{"$ref":"#/components/schemas/ManagementProjectSecretKey"}},"required":["secretKey"],"additionalProperties":false,"example":{"secretKey":{"createdAt":"2024-09-03T12:34:56.000Z","value":"sk_dev_123"}}},"ManagementWebhookEvent":{"title":"ManagementWebhookEvent","type":"string","enum":["storageUpdated","userEntered","userLeft","roomCreated","roomDeleted","commentCreated","commentEdited","commentDeleted","commentReactionAdded","commentReactionRemoved","commentMetadataUpdated","threadMetadataUpdated","threadCreated","threadDeleted","ydocUpdated","notification","threadMarkedAsResolved","threadMarkedAsUnresolved"],"example":"storageUpdated"},"ManagementWebhookSecret":{"title":"ManagementWebhookSecret","type":"object","properties":{"value":{"type":"string"}},"required":["value"],"example":{"value":"whsec_abc123"}},"ManagementWebhook":{"title":"ManagementWebhook","type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"url":{"type":"string","format":"uri"},"disabled":{"type":"boolean"},"rateLimit":{"type":"integer","minimum":1,"maximum":65534},"subscribedEvents":{"type":"array","items":{"$ref":"#/components/schemas/ManagementWebhookEvent"}},"secret":{"oneOf":[{"$ref":"#/components/schemas/ManagementWebhookSecret"},{"type":"null"}]},"additionalHeaders":{"$ref":"#/components/schemas/ManagementWebhookAdditionalHeaders"},"storageUpdatedThrottleSeconds":{"type":"integer"},"yDocUpdatedThrottleSeconds":{"type":"integer"}},"required":["id","createdAt","updatedAt","url","disabled","subscribedEvents","secret","storageUpdatedThrottleSeconds","yDocUpdatedThrottleSeconds"],"additionalProperties":false,"example":{"id":"wh_abc123","createdAt":"2024-09-03T12:34:56.000Z","updatedAt":"2024-09-03T12:34:56.000Z","url":"https://example.com/webhooks","disabled":false,"subscribedEvents":["storageUpdated","userEntered"],"secret":{"value":"whsec_abc123"},"storageUpdatedThrottleSeconds":10,"yDocUpdatedThrottleSeconds":10}},"CreateManagementWebhookRequestBody":{"title":"CreateManagementWebhookRequestBody","type":"object","properties":{"url":{"type":"string","format":"uri"},"subscribedEvents":{"type":"array","items":{"$ref":"#/components/schemas/ManagementWebhookEvent"}},"rateLimit":{"type":"integer","minimum":1,"maximum":65534},"additionalHeaders":{"type":"object","additionalProperties":{"type":"string"}},"storageUpdatedThrottleSeconds":{"type":"integer"},"yDocUpdatedThrottleSeconds":{"type":"integer"}},"required":["url","subscribedEvents"],"example":{"url":"https://example.com/webhooks","subscribedEvents":["storageUpdated","userEntered"],"rateLimit":100,"storageUpdatedThrottleSeconds":10,"yDocUpdatedThrottleSeconds":10}},"UpdateManagementWebhookRequestBody":{"title":"UpdateManagementWebhookRequestBody","type":"object","properties":{"url":{"type":"string","format":"uri"},"subscribedEvents":{"type":"array","items":{"$ref":"#/components/schemas/ManagementWebhookEvent"}},"rateLimit":{"type":"integer","minimum":1,"maximum":65534},"storageUpdatedThrottleSeconds":{"type":"integer"},"yDocUpdatedThrottleSeconds":{"type":"integer"},"disabled":{"type":"boolean"}},"example":{"url":"https://example.com/webhooks","subscribedEvents":["storageUpdated","userEntered"],"rateLimit":100,"disabled":false}},"ManagementWebhookAdditionalHeaders":{"title":"ManagementWebhookAdditionalHeaders","type":"object","additionalProperties":{"type":"string"},"example":{"X-Custom-Header":"value"}},"UpsertManagementWebhookHeadersRequestBody":{"title":"UpsertManagementWebhookHeadersRequestBody","type":"object","properties":{"headers":{"$ref":"#/components/schemas/ManagementWebhookAdditionalHeaders"}},"required":["headers"],"additionalProperties":false,"example":{"headers":{"X-Custom-Header":"value"}}},"GetManagementWebhookHeadersResponse":{"title":"GetManagementWebhookHeadersResponse","type":"object","properties":{"headers":{"$ref":"#/components/schemas/ManagementWebhookAdditionalHeaders"}},"required":["headers"],"additionalProperties":false,"example":{"headers":{"X-Custom-Header":"value"}}},"DeleteManagementWebhookHeadersRequestBody":{"title":"DeleteManagementWebhookHeadersRequestBody","type":"object","properties":{"headers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["headers"],"additionalProperties":false,"example":{"headers":["X-Custom-Header","X-Another-Header"]}},"DeleteManagementWebhookHeadersResponse":{"title":"DeleteManagementWebhookHeadersResponse","type":"object","properties":{"headers":{"$ref":"#/components/schemas/ManagementWebhookAdditionalHeaders"}},"required":["headers"],"additionalProperties":false,"example":{"headers":{"X-Remaining-Header":"value"}}},"ManagementWebhookHeadersDelete":{"title":"ManagementWebhookHeadersDelete","type":"object","properties":{"headers":{"type":"array","items":{"type":"string"}}},"required":["headers"],"example":{"headers":["X-Custom-Header"]}},"UpsertManagementWebhookHeadersResponse":{"title":"UpsertManagementWebhookHeadersResponse","type":"object","properties":{"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["headers"],"additionalProperties":false,"example":{"headers":{"X-Custom-Header":"value"}}},"GetManagementWebhooksResponse":{"title":"GetManagementWebhooksResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ManagementWebhook"}},"nextCursor":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["data","nextCursor"],"additionalProperties":false,"example":{"data":[{"id":"wh_abc123","createdAt":"2024-09-03T12:34:56.000Z","updatedAt":"2024-09-03T12:34:56.000Z","url":"https://example.com/webhooks","disabled":false,"subscribedEvents":["storageUpdated","userEntered"],"secret":{"value":"whsec_abc123"},"storageUpdatedThrottleSeconds":10,"yDocUpdatedThrottleSeconds":10}],"nextCursor":null}},"RotateManagementWebhookSecretResponse":{"title":"RotateManagementWebhookSecretResponse","type":"object","properties":{"secret":{"$ref":"#/components/schemas/ManagementWebhookSecret"},"message":{"type":"string"}},"required":["secret","message"],"example":{"secret":{"value":"whsec_new_abc123"},"message":"Previous secret remains valid for 24 hours."}},"RecoverManagementWebhookFailedMessagesRequestBody":{"title":"RecoverManagementWebhookFailedMessagesRequestBody","type":"object","properties":{"since":{"type":"string","format":"date-time"}},"required":["since"],"additionalProperties":false,"example":{"since":"2026-01-21T00:00:00.000Z"}},"TestManagementWebhookRequestBody":{"title":"TestManagementWebhookRequestBody","type":"object","properties":{"subscribedEvent":{"$ref":"#/components/schemas/ManagementWebhookEvent"}},"required":["subscribedEvent"],"example":{"subscribedEvent":"storageUpdated"}},"TestManagementWebhookResponse":{"title":"TestManagementWebhookResponse","type":"object","properties":{"message":{"type":"object","properties":{"id":{"type":"string"},"deliveredAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id"],"additionalProperties":false}},"required":["message"],"additionalProperties":false,"example":{"message":{"id":"msg_abc123","deliveredAt":"2024-09-03T12:34:56.000Z"}}}},"securitySchemes":{"Authorization":{"name":"Bearer sk_xxx","type":"apiKey","in":"header"}},"responses":{"401":{"description":"Missing or wrong credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"WRONG_KEY_USED":{"value":{"error":"WRONG_KEY_USED","message":"Public key instead of the secret key.","suggestion":"Please use your secret key instead of the public key, the secret key is available in the dashboard: https://liveblocks.io/dashboard/apikeys.","docs":""}},"MISSING_SECRET_KEY":{"value":{"error":"MISSING_SECRET_KEY","message":"Missing secret key in authentication header","suggestion":"Please use a secret key, the secret key is available in the dashboard: https://liveblocks.io/dashboard/apikeys","docs":""}},"MISSING_MANAGEMENT_API_ACCESS_TOKEN":{"value":{"error":"MISSING_MANAGEMENT_API_ACCESS_TOKEN","message":"Missing management api access token in authentication header","suggestion":"Please provide a management api access token in the authentication header","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}},"INVALID_MANAGEMENT_API_ACCESS_TOKEN":{"value":{"error":"INVALID_MANAGEMENT_API_ACCESS_TOKEN","message":"Invalid management api access token","suggestion":"Please provide a valid management api access token in the authentication header","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}},"REVOKED_MANAGEMENT_API_ACCESS_TOKEN":{"value":{"error":"REVOKED_MANAGEMENT_API_ACCESS_TOKEN","message":"Revoked management api access token","suggestion":"Please provide an active management api access token in the authentication header","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}},"EXPIRED_MANAGEMENT_API_ACCESS_TOKEN":{"value":{"error":"EXPIRED_MANAGEMENT_API_ACCESS_TOKEN","message":"Expired management api access token","suggestion":"Please provide a not expired management api access token in the authentication header","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}}}}}},"403":{"description":"Unauthorized access.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"INVALID_SECRET_KEY":{"value":{"error":"INVALID_SECRET_KEY","message":"Invalid secret key.","suggestion":"Please use a valid secret key, the secret key is available in the dashboard: https://liveblocks.io/dashboard/apikeys.","docs":""}},"INVALID_PUBLIC_KEY":{"value":{"error":"INVALID_PUBLIC_KEY","message":"Invalid public key","suggestion":"Please use a valid public key, the public key is available in the dashboard: https://liveblocks.io/dashboard/apikeys","docs":""}},"UNAUTHORIZED_ROOM_ACCESS":{"value":{"error":"UNAUTHORIZED_ROOM_ACCESS","message":"The user does not have permission to access the room.","suggestion":"Please add the user’s ID or one of the user’s group IDs to the room first.","docs":""}},"INVALID_MANAGEMENT_API_ACCESS_TOKEN_SCOPE":{"value":{"error":"INVALID_MANAGEMENT_API_ACCESS_TOKEN_SCOPE","message":"Invalid management api access token scope","suggestion":"Please provide a management api access token with required scope: 'read:all'.","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}},"FEATURE_NOT_ENABLED":{"value":{"error":"FEATURE_NOT_ENABLED","message":"The \"Management API\" feature is not enabled for this account.","suggestion":"If you want access to this feature, please contact us at support@liveblocks.io","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}},"PUBLIC_KEY_NOT_ENABLED":{"value":{"error":"PUBLIC_KEY_NOT_ENABLED","message":"Public key not enabled","suggestion":"Please enable the public key for the project","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}}}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"ROOM_NOT_FOUND":{"value":{"error":"ROOM_NOT_FOUND","message":"Room not found.","suggestion":"Please use a valid room ID, room IDs are available in the dashboard: https://liveblocks.io/dashboard/rooms.","docs":""}},"WEBHOOK_NOT_FOUND":{"value":{"error":"WEBHOOK_NOT_FOUND","message":"Webhook \"ep_xxx\" not found.","suggestion":"Please use a valid webhook ID, webhook IDs are available in the dashboard: https://liveblocks.io/dashboard/webhooks","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}},"NOT_EXISTING_MANAGEMENT_API_ACCESS_TOKEN":{"value":{"error":"NOT_EXISTING_MANAGEMENT_API_ACCESS_TOKEN","message":"Not existing management api access token","suggestion":"Please provide an existing management api access token in the authentication header","docs":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}}}}}},"409":{"description":"Room already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"ROOM_ALREADY_EXISTS":{"value":{"error":"ROOM_ALREADY_EXISTS","message":"The room already exists.","suggestion":"Please use a different room ID or update the existing room.","docs":""}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}},"422":{"description":"Unprocessable entity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"UNPROCESSABLE_ENTITY":{"value":{"error":"UNPROCESSABLE_ENTITY","message":"Missing key: 'defaultAccesses'.","suggestion":"Please ensure the data follows the correct format.","docs":""}}}}}},"409-thread":{"description":"Thread already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"RESOURCE_ALREADY_EXISTS":{"value":{"error":"RESOURCE_ALREADY_EXISTS","message":"Thread already exists"}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}},"404-thread":{"description":"Thread not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"RESOURCE_NOT_FOUND":{"value":{"error":"RESOURCE_NOT_FOUND","message":"Thread not found"}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}},"409-comment":{"description":"Comment already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"RESOURCE_ALREADY_EXISTS":{"value":{"error":"RESOURCE_ALREADY_EXISTS","message":"Comment already exists"}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}},"404-comment":{"description":"Comment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"RESOURCE_NOT_FOUND":{"value":{"error":"RESOURCE_NOT_FOUND","message":"Comment not found"}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}},"409-comment-reaction":{"description":"Reaction already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"RESOURCE_ALREADY_EXISTS":{"value":{"error":"RESOURCE_ALREADY_EXISTS","message":"Reaction already exists"}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}},"404-comment-reaction":{"description":"Comment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"RESOURCE_NOT_FOUND":{"value":{"error":"RESOURCE_NOT_FOUND","message":"Comment reaction not found"}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}}}},"tags":[{"name":"Auth"},{"name":"Room"},{"name":"Storage"},{"name":"Yjs"},{"name":"Version History"},{"name":"Comments"},{"name":"Feeds"},{"name":"Notifications"},{"name":"Groups"},{"name":"Users"},{"name":"AI"},{"name":"Management"}],"externalDocs":{"description":"Liveblocks REST API reference","url":"https://liveblocks.io/docs/api-reference/rest-api-endpoints"}}