openapi: 3.0.0 info: title: Ably LiveObjects REST API version: 1.0.0 description: | # LiveObjects REST API LiveObjects provides a comprehensive REST API that allows you to directly work with objects over HTTP.

Whilst you can interact with these endpoints directly, it is recommended where possible to use the Ably Pub/Sub SDKs - which provide a convenient `request` method for interacting with Ably APIs. By using this method, you can take advantage of built-in support for Ably's authentication, pagination, and link headers, as well as automatic retry and fallback mechanics. This approach helps ensure consistent error handling, reduces setup overhead, and simplifies performing common operations against the LiveObjects REST API. Using this method, instead of implementing your own request handling, will lead to more robust and maintainable client-side integrations. servers: - url: https://main.realtime.ably.net/ description: Production server for Ably REST API paths: /channels/{channelId}/object: post: summary: Publishing operations description: | Publish operations to create or update objects on the channel.

For more information, see the usage documentation for [publishing operations](/docs/liveobjects/rest-api-usage#publishing-operations). parameters: - name: channelId in: path required: true description: The channel name. schema: type: string example: "my-channel" requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OperationRequest' examples: incObjectId: summary: Increment a specific LiveCounter object value: counterInc: number: 1 objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" incPath: summary: Increment a LiveCounter object by path value: counterInc: number: 1 path: "votes.up" incPathWildcard: summary: Increment multiple LiveCounter objects by wildcard path value: counterInc: number: 1 path: "votes.*" remove: summary: Remove a LiveMap entry value: mapRemove: key: "posts" objectId: "root" createMap: summary: Create a new LiveMap object value: mapCreate: semantics: 0 entries: title: data: string: "LiveObjects is awesome" createdAt: data: number: 1745835181122 isPublished: data: boolean: true createCounter: summary: Create a new LiveCounter object value: counterCreate: count: 5 createMapPath: summary: Create a new LiveMap object at a specific path value: mapCreate: semantics: 0 entries: title: data: string: "LiveObjects is awesome" createdAt: data: number: 1745835181122 isPublished: data: boolean: true path: "posts.post1" responses: '200': description: Successfully published operation. content: application/json: schema: $ref: '#/components/schemas/PublishResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: badRequest: summary: Bad request (40000) value: message: "Bad request" code: 40000 statusCode: 400 href: "https://help.ably.io/error/40000" details: null invalidObjectMessage: summary: Invalid object message (92000) value: message: "invalid object message: nonce is required when objectId is specified" code: 92000 statusCode: 400 href: "https://help.ably.io/error/92000" details: null objectsLimitExceeded: summary: Objects limit exceeded (92001) value: message: "objects limit max number 100 exceeded" code: 92001 statusCode: 400 href: "https://help.ably.io/error/92001" details: null operationOnTombstone: summary: Operation on tombstone object (92002) value: message: "unable to submit operation on tombstone object: root" code: 92002 statusCode: 400 href: "https://help.ably.io/error/92002" details: null pathMatchedNoObjects: summary: Operation path matched no objects (92005) value: message: "no objects matched path: votes.missing" code: 92005 statusCode: 400 href: "https://help.ably.io/error/92005" details: null missingObjectIdAndPath: summary: Object ID or path required (92006) value: message: "object id or path required" code: 92006 statusCode: 400 href: "https://help.ably.io/error/92006" details: null pathNotProcessable: summary: Path not processable (92007) value: message: "path not processable: wildcard paths not supported for counter create" code: 92007 statusCode: 400 href: "https://help.ably.io/error/92007" details: null '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: unauthorized: summary: Unauthorized value: message: "Unauthorized" code: 40100 statusCode: 401 href: "https://help.ably.io/error/40100" details: null '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: forbidden: summary: Forbidden value: message: "Forbidden" code: 40300 statusCode: 403 href: "https://help.ably.io/error/40300" details: null '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: notFound: summary: Not found value: message: "Not found" code: 40400 statusCode: 404 href: "https://help.ably.io/error/40400" details: null fetchUnknownObject: summary: Object not found (92004) value: message: "unable to fetch objects tree for not found object: root" code: 92004 statusCode: 404 href: "https://help.ably.io/error/92004" details: null '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: rateLimitExceeded: summary: Rate limit exceeded value: message: "Rate limit exceeded" code: 42900 statusCode: 429 href: "https://help.ably.io/error/42900" details: null get: summary: Get object description: | Fetch an object by path in the compact or full object format.

If the path param is not provided then the root object is returned. If the compact param is not provided then the response defaults to the compact format.

For more information, see the usage documentation for [get object](/docs/liveobjects/rest-api-usage#fetch-object). parameters: - name: channelId in: path required: true description: The channel name. schema: type: string example: "my-channel" - name: compact in: query required: false description: | If `true` or not provided, returns a compact view of the object. If `false`, returns the full object structure. schema: type: boolean default: true - name: path in: query required: false description: | The path from the root to the object. If not provided, returns the root object. schema: type: string example: "votes" responses: '200': description: Object data in either compact or full format. content: application/json: schema: oneOf: - $ref: '#/components/schemas/LiveObjectCompact' - $ref: '#/components/schemas/LiveObjectV2' examples: compact: summary: "Get a compact view of the object tree: default or ?compact=true" value: votes: up: 5 down: 10 compactWithCycles: summary: "Get a compact view with cycles" value: votes: up: 5 down: 10 myRoot: objectId: "root" compactWithPath: summary: "Get a compact by path: ?path=votes" value: up: 5 down: 10 fullObject: summary: "Get full object: ?compact=false" value: objectId: "root" map: semantics: "LWW" entries: votes: data: objectId: "map:ja7cjMUib2LmJKTRdoGAG9pbBYCnkMObAVpmojCOmek@1745828596519" map: semantics: "LWW" entries: down: data: objectId: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" counter: data: number: 10 up: data: objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" counter: data: number: 5 fullObjectWithCycles: summary: "Get full object with cycles: ?compact=false" value: objectId: "root" map: semantics: "LWW" entries: votes: data: objectId: "map:ja7cjMUib2LmJKTRdoGAG9pbBYCnkMObAVpmojCOmek@1745828596519" map: semantics: "LWW" entries: down: data: objectId: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" counter: data: number: 10 up: data: objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" counter: data: number: 5 myRoot: data: objectId: "root" fullObjectWithPath: summary: "Get full object by path: ?compact=false&path=votes" value: objectId: "map:ja7cjMUib2LmJKTRdoGAG9pbBYCnkMObAVpmojCOmek@1745828596519" map: semantics: "LWW" entries: down: data: objectId: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" counter: data: number: 10 up: data: objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" counter: data: number: 5 '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: badRequest: summary: Bad request (40000) value: message: "Bad request" code: 40000 statusCode: 400 href: "https://help.ably.io/error/40000" details: null fetchTombstoneObject: summary: Unable to fetch tombstone object (92003) value: message: "unable to fetch objects tree for tombstone object: root" code: 92003 statusCode: 400 href: "https://help.ably.io/error/92003" details: null '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: unauthorized: summary: Unauthorized value: message: "Unauthorized" code: 40100 statusCode: 401 href: "https://help.ably.io/error/40100" details: null '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: forbidden: summary: Forbidden value: message: "Forbidden" code: 40300 statusCode: 403 href: "https://help.ably.io/error/40300" details: null '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: notFound: summary: Not found value: message: "Not found" code: 40400 statusCode: 404 href: "https://help.ably.io/error/40400" details: null fetchUnknownObject: summary: Object not found (92004) value: message: "unable to fetch objects tree for not found object: root" code: 92004 statusCode: 404 href: "https://help.ably.io/error/92004" details: null '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: rateLimitExceeded: summary: Rate limit exceeded value: message: "Rate limit exceeded" code: 42900 statusCode: 429 href: "https://help.ably.io/error/42900" details: null /channels/{channelName}/object/{objectId}: get: summary: Get object by ID description: | Fetch an object by ID in the compact or full object format.

If the compact param is not provided then the response defaults to the compact format. The path query param can be used to request a value from the provided object ID's children. For more information, see the usage documentation for [get object by ID](/docs/liveobjects/rest-api-usage#fetch-object-get-by-id). parameters: - name: channelName in: path required: true description: The channel name. schema: type: string example: "my-channel" - name: objectId in: path required: true description: The [object ID](/docs/liveobjects/concepts/objects#object-ids) of the object to fetch. schema: $ref: '#/components/schemas/ObjectIdString' - name: compact in: query required: false description: | If `true` or not provided, returns a compact view of the object. If `false`, returns the full object structure. schema: type: boolean default: true - name: path in: query required: false description: | The path from the root of the object requested. If not provided, returns the whole object. schema: type: string example: "votes" responses: '200': description: Object data in either compact or full format. content: application/json: schema: oneOf: - $ref: '#/components/schemas/LiveObjectCompact' - $ref: '#/components/schemas/LiveObjectV2' examples: compact: summary: "Get a compact view of the object tree: default or ?compact=true" value: votes: up: 5 down: 10 compactWithCycles: summary: "Get a compact view with cycles" value: votes: up: 5 down: 10 myRoot: objectId: "root" compactWithPath: summary: "Get a compact by path: ?path=votes" value: up: 5 down: 10 fullObject: summary: "Get full object: ?compact=false" value: objectId: "root" map: semantics: "LWW" entries: votes: data: objectId: "map:ja7cjMUib2LmJKTRdoGAG9pbBYCnkMObAVpmojCOmek@1745828596519" map: semantics: "LWW" entries: down: data: objectId: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" counter: data: number: 10 up: data: objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" counter: data: number: 5 fullObjectWithCycles: summary: "Get full object with cycles: ?compact=false" value: objectId: "root" map: semantics: "LWW" entries: votes: data: objectId: "map:ja7cjMUib2LmJKTRdoGAG9pbBYCnkMObAVpmojCOmek@1745828596519" map: semantics: "LWW" entries: down: data: objectId: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" counter: data: number: 10 up: data: objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" counter: data: number: 5 myRoot: data: objectId: "root" fullObjectWithPath: summary: "Get full object by path: ?path=votes" value: objectId: "map:ja7cjMUib2LmJKTRdoGAG9pbBYCnkMObAVpmojCOmek@1745828596519" map: semantics: "LWW" entries: down: data: objectId: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" counter: data: number: 10 up: data: objectId: "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" counter: data: number: 5 '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: badRequest: summary: Bad request (40000) value: message: "Bad request" code: 40000 statusCode: 400 href: "https://help.ably.io/error/40000" details: null fetchTombstoneObject: summary: Unable to fetch tombstone object (92003) value: message: "unable to fetch objects tree for tombstone object: root" code: 92003 statusCode: 400 href: "https://help.ably.io/error/92003" details: null '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: unauthorized: summary: Unauthorized value: message: "Unauthorized" code: 40100 statusCode: 401 href: "https://help.ably.io/error/40100" details: null '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: forbidden: summary: Forbidden value: message: "Forbidden" code: 40300 statusCode: 403 href: "https://help.ably.io/error/40300" details: null '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: notFound: summary: Not found value: message: "Not found" code: 40400 statusCode: 404 href: "https://help.ably.io/error/40400" details: null fetchUnknownObject: summary: Object not found (92004) value: message: "unable to fetch objects tree for not found object: root" code: 92004 statusCode: 404 href: "https://help.ably.io/error/92004" details: null '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: rateLimitExceeded: summary: Rate limit exceeded value: message: "Rate limit exceeded" code: 42900 statusCode: 429 href: "https://help.ably.io/error/42900" details: null components: schemas: # Fragments Encoding: type: object properties: encoding: type: string example: "json" description: A client-supplied encoding which clients can use to interpret raw string or bytes values. ObjectIdString: title: ObjectId type: string description: An [object ID](/docs/liveobjects/concepts/objects#object-ids). example: "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" NumberValue: title: Number type: object required: [number] properties: number: type: number description: A [primitive](/docs/liveobjects/concepts/objects#primitive-types) numeric value. example: 42 BooleanValue: title: Boolean type: object required: [boolean] properties: boolean: type: boolean description: A [primitive](/docs/liveobjects/concepts/objects#primitive-types) boolean value. example: true StringValue: title: String type: object allOf: - $ref: '#/components/schemas/Encoding' - type: object required: [string] properties: string: type: string description: A [primitive](/docs/liveobjects/concepts/objects#primitive-types) string value. example: "LiveObjects is awesome" BytesValue: title: Bytes type: object allOf: - $ref: '#/components/schemas/Encoding' - type: object required: [bytes] properties: bytes: type: string format: byte description: A [primitive](/docs/liveobjects/concepts/objects#primitive-types) base64-encoded bytes value. example: "TGl2ZU9iamVjdHMgaXMgYXdlc29tZQo=" ObjectIdValue: title: ObjectId type: object required: [objectId] properties: objectId: $ref: '#/components/schemas/ObjectIdString' PrimitiveValue: oneOf: - $ref: '#/components/schemas/ObjectIdValue' - $ref: '#/components/schemas/NumberValue' - $ref: '#/components/schemas/BooleanValue' - $ref: '#/components/schemas/StringValue' - $ref: '#/components/schemas/BytesValue' SiteTimeserials: type: object description: A map of site ID to [timeserial](/docs/liveobjects/concepts/objects#timeserials). additionalProperties: type: string description: The [timeserial](/docs/liveobjects/concepts/objects#timeserials) of the latest operation applied in this site. example: "01745828651671-000@e025VxXLABoR0C19591332:000" LiveMapEntryMetadata: type: object properties: timeserial: type: string description: A [timeserial](/docs/liveobjects/concepts/objects#timeserials) value. example: "01745828651671-000@e025VxXLABoR0C19591332:000" tombstone: type: boolean description: Indicates whether this entry was deleted and is a [tombstone](/docs/liveobjects/concepts/objects#tombstones). example: false LiveMapMetadata: type: object properties: mapSemantics: type: string description: The semantics used for conflict resolution on the [LiveMap](/docs/liveobjects/map). example: "LWW" LiveObjectMetadata: type: object properties: siteTimeserials: $ref: '#/components/schemas/SiteTimeserials' tombstone: type: boolean description: Indicates whether this object was deleted as is a [tombstone](/docs/liveobjects/concepts/objects#tombstones). example: false LiveObjectBase: type: object required: [objectId] properties: objectId: $ref: '#/components/schemas/ObjectIdString' # Object types. # Shallow definitions do not resolve the values of child objects. # Some duplication in these definitions as unfortunately OpenAPI # does not support merging definitions, only replacements. LiveCounter: title: LiveCounter type: object required: [data] properties: data: description: | The value of the [LiveCounter](/docs/liveobjects/counter) object. allOf: - $ref: '#/components/schemas/NumberValue' LiveCounterObject: title: LiveCounter description: A [LiveCounter](/docs/liveobjects/counter) object. allOf: - $ref: '#/components/schemas/LiveObjectBase' - type: object required: [counter] properties: counter: description: A [LiveCounter](/docs/liveobjects/counter) object. allOf: - $ref: '#/components/schemas/LiveCounter' - $ref: '#/components/schemas/LiveObjectMetadata' LiveMapEntryShallow: title: LiveMapEntry allOf: - type: object description: | The value of an entry in a [LiveMap](/docs/liveobjects/map). required: [data] properties: data: description: | The value of the entry, which is either a [primitive value](/docs/liveobjects/concepts/objects#primitive-types) another [LiveObject](/docs/liveobjects/concepts/objects). If `?children=false`, child objects will be included by reference to their [ObjectId](/docs/liveobjects/concepts/objects#object-ids). Otherwise, the child object will be resolved and its value will be included in the response, unless resolving the child object would exceed the specified `limit`, in which case it will be included by reference. allOf: - $ref: '#/components/schemas/PrimitiveValue' - $ref: '#/components/schemas/LiveMapEntryMetadata' LiveMapEntry: title: LiveMapEntry allOf: - type: object description: | The value of an entry in a [LiveMap](/docs/liveobjects/map). required: [data] properties: data: description: | The value of the entry, which is either a [primitive value](/docs/liveobjects/concepts/objects#primitive-types) another [LiveObject](/docs/liveobjects/concepts/objects). If `?children=false`, child objects will be included by reference to their [ObjectId](/docs/liveobjects/concepts/objects#object-ids). Otherwise, the child object will be resolved and its value will be included in the response, unless resolving the child object would exceed the specified `limit`, in which case it will be included by reference. oneOf: - $ref: '#/components/schemas/PrimitiveValue' - $ref: '#/components/schemas/LiveMapObject' - $ref: '#/components/schemas/LiveCounterObject' - $ref: '#/components/schemas/LiveMapEntryMetadata' LiveMapShallow: title: LiveMap allOf: - type: object description: A [LiveMap](/docs/liveobjects/map) object. required: [entries] properties: entries: type: object description: | An object describing the entries in the [LiveMap](/docs/liveobjects/map) object. The properties in the `entries` object describe the map *keys*. additionalProperties: $ref: '#/components/schemas/LiveMapEntryShallow' - $ref: '#/components/schemas/LiveMapMetadata' LiveMap: title: LiveMap allOf: - type: object description: A [LiveMap](/docs/liveobjects/map) object. required: [entries] properties: entries: type: object description: | An object describing the entries in the [LiveMap](/docs/liveobjects/map) object. The properties in the `entries` object describe the map *keys*. additionalProperties: $ref: '#/components/schemas/LiveMapEntry' - $ref: '#/components/schemas/LiveMapMetadata' # Wrappers LiveMapObjectShallow: title: LiveMap description: A [LiveMap](/docs/liveobjects/map) object. allOf: - $ref: '#/components/schemas/LiveObjectBase' - type: object required: [map] properties: map: $ref: '#/components/schemas/LiveMapShallow' - $ref: '#/components/schemas/LiveObjectMetadata' LiveMapObject: title: LiveMap description: A [LiveMap](/docs/liveobjects/map) object. allOf: - $ref: '#/components/schemas/LiveObjectBase' - type: object required: [map] properties: semantics: type: string enum: [LWW] map: $ref: '#/components/schemas/LiveMap' - $ref: '#/components/schemas/LiveObjectMetadata' LiveObjectShallow: title: LiveObject description: A [LiveObject](/docs/liveobjects/concepts/objects) instance, which is either a [LiveMap](/docs/liveobjects/map) or a [LiveCounter](/docs/liveobjects/counter). oneOf: - $ref: '#/components/schemas/LiveMapObjectShallow' - $ref: '#/components/schemas/LiveCounterObject' LiveObject: title: LiveObject description: A [LiveObject](/docs/liveobjects/concepts/objects) instance, which is either a [LiveMap](/docs/liveobjects/map) or a [LiveCounter](/docs/liveobjects/counter). oneOf: - $ref: '#/components/schemas/LiveMapObject' - $ref: '#/components/schemas/LiveCounterObject' LiveCounterCompact: title: LiveCounter (compact) description: The value of a [LiveCounter](/docs/liveobjects/counter) object. type: number LiveMapCompact: title: LiveMap (compact) type: object description: A compact view of a [LiveMap](/docs/liveobjects/map) object. additionalProperties: description: A compact view of an entry in a [LiveMap](/docs/liveobjects/map). oneOf: - $ref: '#/components/schemas/LiveCounterCompact' - $ref: '#/components/schemas/LiveMapCompact' - $ref: '#/components/schemas/ObjectIdValue' LiveObjectCompact: title: LiveObject (compact) description: A compact view of a [LiveObject](/docs/liveobjects/concepts/objects) instance, which is either a [LiveMap](/docs/liveobjects/map) or a [LiveCounter](/docs/liveobjects/counter). oneOf: - $ref: '#/components/schemas/LiveCounterCompact' - $ref: '#/components/schemas/LiveMapCompact' LiveObjectV2: title: LiveObject description: A [LiveObject](/docs/liveobjects/concepts/objects) instance, which is either a [LiveMap](/docs/liveobjects/map) or a [LiveCounter](/docs/liveobjects/counter). oneOf: - $ref: '#/components/schemas/LiveMapObjectV2' - $ref: '#/components/schemas/LiveCounterObjectV2' LiveMapObjectV2: title: LiveMap description: A [LiveMap](/docs/liveobjects/map) object. allOf: - $ref: '#/components/schemas/LiveObjectBase' - type: object required: [ map ] properties: map: $ref: '#/components/schemas/LiveMapV2' LiveCounterObjectV2: title: LiveCounter description: A [LiveCounter](/docs/liveobjects/counter) object. allOf: - $ref: '#/components/schemas/LiveObjectBase' - type: object required: [ counter ] properties: counter: description: A [LiveCounter](/docs/liveobjects/counter) object. allOf: - $ref: '#/components/schemas/LiveCounter' LiveMapV2: title: LiveMap allOf: - type: object description: A [LiveMap](/docs/liveobjects/map) object. required: [ entries ] properties: semantics: type: string enum: [ LWW ] entries: type: object description: | An object describing the entries in the [LiveMap](/docs/liveobjects/map) object. The properties in the `entries` object describe the map *keys*. additionalProperties: $ref: '#/components/schemas/LiveMapEntryV2' LiveMapEntryV2: title: LiveMapEntry allOf: - type: object description: | The value of an entry in a [LiveMap](/docs/liveobjects/map). required: [data] properties: data: description: | The value of the entry, which is either a [primitive value](/docs/liveobjects/concepts/objects#primitive-types) another [LiveObject](/docs/liveobjects/concepts/objects). oneOf: - $ref: '#/components/schemas/PrimitiveValue' - $ref: '#/components/schemas/LiveMapObjectV2' - $ref: '#/components/schemas/LiveCounterObjectV2' # Operations OperationBase: type: object properties: id: type: string description: An idempotency key used for [idempotent operations](/docs/liveobjects/rest-api-usage#idempotent-operations). example: "my-idempotency-key" objectId: $ref: '#/components/schemas/ObjectIdString' path: type: string description: The [path](/docs/liveobjects/rest-api-usage#fetch-object-with-path) from the root to the object. example: "votes.up" MapSetData: type: object description: The key and value to set in the [LiveMap](/docs/liveobjects/map) object. required: [key, value] properties: key: type: string description: The name of the key. value: description: The value to set at the specified `key`, which is either a [primitive value](/docs/liveobjects/concepts/objects#primitive-types) or the ID of another [LiveObject](/docs/liveobjects/concepts/objects). allOf: - $ref: '#/components/schemas/PrimitiveValue' MapRemoveData: type: object description: The key to remove from the [LiveMap](/docs/liveobjects/map) object. required: [key] properties: key: type: string description: The name of the key. MapCreateData: type: object description: The initial data for the [LiveMap](/docs/liveobjects/map) object. required: [semantics, entries] properties: semantics: type: integer enum: [0] description: The conflict resolution semantics. Must be 0 for Last-Writer-Wins. entries: type: object description: The initial entries for the map, where each value is wrapped in a data object. additionalProperties: type: object required: [data] properties: data: description: The initial value for this key, which is either a [primitive value](/docs/liveobjects/concepts/objects#primitive-types) or the ID of another [LiveObject](/docs/liveobjects/concepts/objects). allOf: - $ref: '#/components/schemas/PrimitiveValue' CounterIncData: type: object description: The value to increment the [LiveCounter](/docs/liveobjects/counter) object by. required: [number] properties: number: type: number description: The amount to increment (or decrement if negative). CounterCreateData: type: object description: The initial value for the [LiveCounter](/docs/liveobjects/counter) object. required: [count] properties: count: type: number description: The initial count value. OperationMapSet: allOf: - $ref: '#/components/schemas/OperationBase' - type: object required: [mapSet] properties: mapSet: $ref: '#/components/schemas/MapSetData' OperationMapRemove: allOf: - $ref: '#/components/schemas/OperationBase' - type: object required: [mapRemove] properties: mapRemove: $ref: '#/components/schemas/MapRemoveData' OperationMapCreate: allOf: - $ref: '#/components/schemas/OperationBase' - type: object required: [mapCreate] properties: mapCreate: $ref: '#/components/schemas/MapCreateData' OperationCounterInc: allOf: - $ref: '#/components/schemas/OperationBase' - type: object required: [counterInc] properties: counterInc: $ref: '#/components/schemas/CounterIncData' OperationCounterCreate: allOf: - $ref: '#/components/schemas/OperationBase' - type: object required: [counterCreate] properties: counterCreate: $ref: '#/components/schemas/CounterCreateData' Operation: type: object oneOf: - $ref: '#/components/schemas/OperationMapSet' - $ref: '#/components/schemas/OperationMapRemove' - $ref: '#/components/schemas/OperationMapCreate' - $ref: '#/components/schemas/OperationCounterCreate' - $ref: '#/components/schemas/OperationCounterInc' OperationRequest: oneOf: - $ref: '#/components/schemas/Operation' - type: array title: BatchOperation items: $ref: '#/components/schemas/Operation' PublishResponse: type: object required: - messageId - channel - objectIds properties: messageId: type: string description: The message ID of the published operation. example: "TJPWHhMTrF:0" channel: type: string description: The channel name. example: "my-channel" objectIds: type: array items: $ref: '#/components/schemas/ObjectIdString' description: The [object IDs](/docs/liveobjects/concepts/objects#object-ids) of the objects that were created or updated by the operation. example: - "counter:JbZYiHnw0ORAyzzLSQahVik31iBDL_ehJNpTEF3qwg8@1745828651669" - "counter:iVji62_MW_j4dShuJbr2fmsP2D8MyCs6tFqON9-xAkc@1745828645269" # Errors ErrorResponse: type: object description: Base error response structure used by all API errors. properties: message: type: string description: The error message. code: type: integer description: The HTTP status code returned. statusCode: type: integer description: The Ably error code. nullable: true href: type: string description: The URL to documentation about the error code. nullable: true details: type: object nullable: true description: Any additional details about the error message. required: - message - code