From e76f243fabaf8bbc137a05e9f04c7641ce9d1f62 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sat, 11 Apr 2026 16:42:44 +0200 Subject: [PATCH 01/10] Add open extensions management endpoints Added endpoints for managing open extensions on DriveItems, including listing, retrieving, creating, updating, and deleting extensions. --- api/openapi-spec/v1.0.yaml | 261 +++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 8dcf432..be33f85 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -2217,6 +2217,227 @@ paths: default: $ref: '#/components/responses/error' x-ms-docs-operation-type: operation + '/v1beta1/drives/{drive-id}/items/{item-id}/extensions': + get: + tags: + - driveItem.extensions + summary: List all extensions on a DriveItem + operationId: ListExtensions + description: | + Get the collection of open extensions on the specified DriveItem. + + Each extension is identified by its `extensionName`, which follows a reverse DNS naming convention + (e.g. `com.example.myApp`). + parameters: + - name: drive-id + in: path + description: "key: id of drive" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668 + x-ms-docs-key-type: drive + - name: item-id + in: path + description: "key: id of item" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id + x-ms-docs-key-type: item + responses: + "200": + description: Retrieved extensions + content: + application/json: + schema: + title: Collection of openTypeExtensions + type: object + properties: + value: + type: array + items: + $ref: '#/components/schemas/openTypeExtension' + examples: + list extensions: + value: + value: + - extensionName: "com.example.project" + status: "reviewed" + assignee: "alice" + - extensionName: "eu.opencloud.workflow" + step: "approval" + default: + $ref: '#/components/responses/error' + x-ms-docs-operation-type: operation + '/v1beta1/drives/{drive-id}/items/{item-id}/extensions/{extensionName}': + get: + tags: + - driveItem.extensions + summary: Get an extension by name + operationId: GetExtension + description: | + Get a specific open extension identified by the extension name. + parameters: + - name: drive-id + in: path + description: "key: id of drive" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668 + x-ms-docs-key-type: drive + - name: item-id + in: path + description: "key: id of item" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id + x-ms-docs-key-type: item + - name: extensionName + in: path + description: "The unique name of the extension, using reverse DNS notation (e.g. com.example.myApp)" + required: true + schema: + type: string + example: com.example.project + responses: + "200": + description: Retrieved extension + content: + application/json: + schema: + $ref: '#/components/schemas/openTypeExtension' + examples: + get extension: + value: + extensionName: "com.example.project" + status: "reviewed" + assignee: "alice" + priority: 3 + "404": + description: Extension not found + default: + $ref: '#/components/responses/error' + x-ms-docs-operation-type: operation + put: + tags: + - driveItem.extensions + summary: Create or update an extension + operationId: UpsertExtension + description: | + Create or update an open extension on the specified DriveItem. + + If the extension does not exist, it is created. If it already exists, the provided properties + are merged with the existing data: + + * Properties included in the request body are added or updated. + * Properties set to `null` are removed from the extension. + * Properties not included in the request body remain unchanged. + + The extension name should follow reverse DNS naming conventions (e.g. `com.example.myApp`) + to avoid collisions between applications. + parameters: + - name: drive-id + in: path + description: "key: id of drive" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668 + x-ms-docs-key-type: drive + - name: item-id + in: path + description: "key: id of item" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id + x-ms-docs-key-type: item + - name: extensionName + in: path + description: "The unique name of the extension, using reverse DNS notation (e.g. com.example.myApp)" + required: true + schema: + type: string + example: com.example.project + requestBody: + description: Extension properties to set. Use `null` values to remove individual properties. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/openTypeExtensionUpdate' + examples: + create extension: + value: + status: "reviewed" + assignee: "alice" + priority: 3 + update single property: + value: + status: "approved" + remove a property: + value: + priority: null + responses: + "200": + description: Extension updated + content: + application/json: + schema: + $ref: '#/components/schemas/openTypeExtension' + "201": + description: Extension created + content: + application/json: + schema: + $ref: '#/components/schemas/openTypeExtension' + default: + $ref: '#/components/responses/error' + x-ms-docs-operation-type: operation + delete: + tags: + - driveItem.extensions + summary: Delete an extension + operationId: DeleteExtension + description: | + Delete an open extension from the specified DriveItem. + + This removes the extension and all its properties. + parameters: + - name: drive-id + in: path + description: "key: id of drive" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668 + x-ms-docs-key-type: drive + - name: item-id + in: path + description: "key: id of item" + required: true + schema: + type: string + example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id + x-ms-docs-key-type: item + - name: extensionName + in: path + description: "The unique name of the extension, using reverse DNS notation (e.g. com.example.myApp)" + required: true + schema: + type: string + example: com.example.project + responses: + "204": + description: Extension deleted + "404": + description: Extension not found + default: + $ref: '#/components/responses/error' + x-ms-docs-operation-type: operation '/v1.0/drives/{drive-id}/root': get: tags: @@ -5331,6 +5552,12 @@ components: - link - remote readOnly: true + extensions: + description: The collection of open extensions defined for this DriveItem. Nullable. Returned only on `$expand`. + type: array + items: + $ref: '#/components/schemas/openTypeExtension' + readOnly: true sharingLinkType: type: string enum: [ internal, view, upload, edit, createOnly, blocksDownload ] @@ -6084,6 +6311,40 @@ components: password: type: string description: Password. It may require a password policy. + openTypeExtension: + type: object + description: | + Represents an open extension on a DriveItem, providing a flexible way to attach + untyped custom data to a resource. + + Extensions are identified by their `extensionName`, which should follow reverse DNS + naming conventions (e.g. `com.example.myApp`) to avoid collisions between applications. + properties: + extensionName: + type: string + description: | + The unique identifier of the extension. Use reverse DNS naming conventions + (e.g. `com.example.myApp`). + readOnly: true + additionalProperties: true + example: + extensionName: "com.example.project" + status: "reviewed" + assignee: "alice" + priority: 3 + openTypeExtensionUpdate: + type: object + description: | + Properties to set or remove on an open extension. + + * Properties included in the request body are added or updated. + * Properties set to `null` are removed from the extension. + * Properties not included in the request body remain unchanged. + additionalProperties: + nullable: true + example: + status: "approved" + priority: null audio: type: object description: | From 8697c92376192bae56a336abb4d67ff4b4fcb64a Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sat, 11 Apr 2026 18:35:45 +0200 Subject: [PATCH 02/10] fix: copilot review findings --- api/openapi-spec/v1.0.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index be33f85..505f5fc 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -2317,7 +2317,7 @@ paths: assignee: "alice" priority: 3 "404": - description: Extension not found + $ref: '#/components/responses/error' default: $ref: '#/components/responses/error' x-ms-docs-operation-type: operation @@ -2363,7 +2363,11 @@ paths: type: string example: com.example.project requestBody: - description: Extension properties to set. Use `null` values to remove individual properties. + description: | + Extension properties to set. Use `null` values to remove individual properties. + + The `extensionName` is derived from the URL path parameter and must not be included + in the request body. If present, it will be ignored. required: true content: application/json: @@ -2434,7 +2438,7 @@ paths: "204": description: Extension deleted "404": - description: Extension not found + $ref: '#/components/responses/error' default: $ref: '#/components/responses/error' x-ms-docs-operation-type: operation From da31c6ab2c21da53a22645fcd5901457c8e1fa39 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sat, 11 Apr 2026 19:07:51 +0200 Subject: [PATCH 03/10] fix: copilot review findings --- api/openapi-spec/v1.0.yaml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 505f5fc..75921ef 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -2246,7 +2246,7 @@ paths: example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id x-ms-docs-key-type: item responses: - "200": + '200': description: Retrieved extensions content: application/json: @@ -2270,7 +2270,7 @@ paths: default: $ref: '#/components/responses/error' x-ms-docs-operation-type: operation - '/v1beta1/drives/{drive-id}/items/{item-id}/extensions/{extensionName}': + '/v1beta1/drives/{drive-id}/items/{item-id}/extensions/{extension-name}': get: tags: - driveItem.extensions @@ -2295,7 +2295,7 @@ paths: type: string example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id x-ms-docs-key-type: item - - name: extensionName + - name: extension-name in: path description: "The unique name of the extension, using reverse DNS notation (e.g. com.example.myApp)" required: true @@ -2303,7 +2303,7 @@ paths: type: string example: com.example.project responses: - "200": + '200': description: Retrieved extension content: application/json: @@ -2316,7 +2316,7 @@ paths: status: "reviewed" assignee: "alice" priority: 3 - "404": + '404': $ref: '#/components/responses/error' default: $ref: '#/components/responses/error' @@ -2355,7 +2355,7 @@ paths: type: string example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id x-ms-docs-key-type: item - - name: extensionName + - name: extension-name in: path description: "The unique name of the extension, using reverse DNS notation (e.g. com.example.myApp)" required: true @@ -2386,13 +2386,13 @@ paths: value: priority: null responses: - "200": + '200': description: Extension updated content: application/json: schema: $ref: '#/components/schemas/openTypeExtension' - "201": + '201': description: Extension created content: application/json: @@ -2427,7 +2427,7 @@ paths: type: string example: a0ca6a90-a365-4782-871e-d44447bbc668$a0ca6a90-a365-4782-871e-d44447bbc668!share-id x-ms-docs-key-type: item - - name: extensionName + - name: extension-name in: path description: "The unique name of the extension, using reverse DNS notation (e.g. com.example.myApp)" required: true @@ -2435,9 +2435,9 @@ paths: type: string example: com.example.project responses: - "204": + '204': description: Extension deleted - "404": + '404': $ref: '#/components/responses/error' default: $ref: '#/components/responses/error' @@ -6323,6 +6323,8 @@ components: Extensions are identified by their `extensionName`, which should follow reverse DNS naming conventions (e.g. `com.example.myApp`) to avoid collisions between applications. + required: + - extensionName properties: extensionName: type: string From f829425d7760e38e56fedef8261263cbfe2ba366 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 5 May 2026 19:59:02 +0200 Subject: [PATCH 04/10] refactor: factor out driveItemExpand parameter component Mirror the existing driveItemSelect pattern so $expand on driveItem is referenced via $ref instead of inlined. --- api/openapi-spec/v1.0.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 75921ef..980f377 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -6817,6 +6817,7 @@ components: enum: - children - thumbnails + - extensions type: string examples: request children: @@ -6825,6 +6826,9 @@ components: request thumbnails: value: - thumbnails + request extensions: + value: + - extensions drivesFilter: name: $filter in: query From 784b1232158f012a555b8f40bdf6b0860e319cd9 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 15 Sep 2026 17:10:08 +0000 Subject: [PATCH 05/10] docs: specify value shapes and odata.type annotations for open extensions --- api/openapi-spec/v1.0.yaml | 41 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 980f377..ef4e8b5 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -6318,38 +6318,51 @@ components: openTypeExtension: type: object description: | - Represents an open extension on a DriveItem, providing a flexible way to attach - untyped custom data to a resource. - - Extensions are identified by their `extensionName`, which should follow reverse DNS - naming conventions (e.g. `com.example.myApp`) to avoid collisions between applications. + An open extension on a DriveItem: untyped custom data, identified by + `extensionName` (reverse DNS, e.g. `com.example.myApp`, use a domain you control). + + All other members are custom properties. Values are strings, numbers, booleans, + arrays of those, or a `geoCoordinates` object; no nested objects. Values are + stored and returned as written. + + A sibling member `@odata.type` annotates the type. It is required for + `#DateTimeOffset` (RFC 3339 string) and `#microsoft.graph.geoCoordinates`, and + optional for `#String`, `#Int64`, `#Double`, `#Boolean` and `#Collection(...)`, + which are inferred from the JSON value. A mismatch is rejected with 400. + Responses always include the annotation. required: - extensionName properties: extensionName: type: string - description: | - The unique identifier of the extension. Use reverse DNS naming conventions - (e.g. `com.example.myApp`). + description: The unique identifier of the extension, in reverse DNS notation. readOnly: true additionalProperties: true example: extensionName: "com.example.project" status: "reviewed" - assignee: "alice" + "status@odata.type": "#String" priority: 3 + "priority@odata.type": "#Int64" + due: "2026-10-01T00:00:00Z" + "due@odata.type": "#DateTimeOffset" + site: + latitude: 52.5 + longitude: 13.4 + "site@odata.type": "#microsoft.graph.geoCoordinates" openTypeExtensionUpdate: type: object description: | - Properties to set or remove on an open extension. - - * Properties included in the request body are added or updated. - * Properties set to `null` are removed from the extension. - * Properties not included in the request body remain unchanged. + Properties to set or remove on an open extension. Included properties are added + or updated, `null` removes a property and its annotation, omitted properties stay + unchanged. Annotations follow the rules of `openTypeExtension`; a property written + without one gets the type of its new value. additionalProperties: nullable: true example: status: "approved" + due: "2026-11-01T00:00:00Z" + "due@odata.type": "#DateTimeOffset" priority: null audio: type: object From 194d86173d8034af90189118dbab4d34bb0c9726 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 15 Sep 2026 17:17:47 +0000 Subject: [PATCH 06/10] docs: explain why open extension type annotations matter for search --- api/openapi-spec/v1.0.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index ef4e8b5..92f7a92 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -6325,10 +6325,12 @@ components: arrays of those, or a `geoCoordinates` object; no nested objects. Values are stored and returned as written. - A sibling member `@odata.type` annotates the type. It is required for - `#DateTimeOffset` (RFC 3339 string) and `#microsoft.graph.geoCoordinates`, and - optional for `#String`, `#Int64`, `#Double`, `#Boolean` and `#Collection(...)`, - which are inferred from the JSON value. A mismatch is rejected with 400. + A sibling member `@odata.type` annotates the type. Search indexes a + property by its type, so a date-time (RFC 3339 string) needs `#DateTimeOffset` + and a `geoCoordinates` object needs `#microsoft.graph.geoCoordinates` to be + searchable as such; without the annotation they are indexed as a string and + not at all. `#String`, `#Int64`, `#Double`, `#Boolean` and `#Collection(...)` + are inferred from the JSON value and optional. A mismatch is rejected with 400. Responses always include the annotation. required: - extensionName From c897b7224834b1ab1bb6c2441f0919a9d01c2ccc Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 15 Sep 2026 17:25:44 +0000 Subject: [PATCH 07/10] docs: allow objects in open extensions only as annotated geoCoordinates --- api/openapi-spec/v1.0.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 92f7a92..678778c 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -6321,17 +6321,17 @@ components: An open extension on a DriveItem: untyped custom data, identified by `extensionName` (reverse DNS, e.g. `com.example.myApp`, use a domain you control). - All other members are custom properties. Values are strings, numbers, booleans, - arrays of those, or a `geoCoordinates` object; no nested objects. Values are - stored and returned as written. + All other members are custom properties. Values are strings, numbers, booleans + or arrays of those. The only object allowed is a `geoCoordinates` object + annotated with `#microsoft.graph.geoCoordinates`. Values are stored and + returned as written. A sibling member `@odata.type` annotates the type. Search indexes a - property by its type, so a date-time (RFC 3339 string) needs `#DateTimeOffset` - and a `geoCoordinates` object needs `#microsoft.graph.geoCoordinates` to be - searchable as such; without the annotation they are indexed as a string and - not at all. `#String`, `#Int64`, `#Double`, `#Boolean` and `#Collection(...)` - are inferred from the JSON value and optional. A mismatch is rejected with 400. - Responses always include the annotation. + property by its type: a date-time (RFC 3339 string) is indexed as a date only + with `#DateTimeOffset`, otherwise as a string. `#String`, `#Int64`, `#Double`, + `#Boolean` and `#Collection(...)` are inferred from the JSON value and optional. + A mismatch or an unannotated object is rejected with 400. Responses always + include the annotation. required: - extensionName properties: From 4e718f49b2615c7fb14c15b9d2598eed30fc537b Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 15 Sep 2026 17:40:31 +0000 Subject: [PATCH 08/10] fix: mark the location facet read-only instead of the geoCoordinates schema --- api/openapi-spec/v1.0.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 678778c..3004a42 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -5445,6 +5445,7 @@ components: location: description: Location metadata, if the item has location data. Read-only. $ref: '#/components/schemas/geoCoordinates' + readOnly: true thumbnails: description: Collection containing ThumbnailSet objects associated with the item. Read-only. Nullable. type: array @@ -5967,7 +5968,6 @@ components: readOnly: true geoCoordinates: type: object - readOnly: true description: | The GeoCoordinates resource provides geographic coordinates and elevation of a location based on metadata contained within the file. If a DriveItem has a non-null location facet, the item represents a file with a known location associated with it. From d7902f9e4a8979fb0f1a57939d5cea113c5daa6e Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 15 Sep 2026 17:41:37 +0000 Subject: [PATCH 09/10] fix: mark the other driveItem facets read-only at the property, not the schema --- api/openapi-spec/v1.0.yaml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 3004a42..98ad36d 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -5428,20 +5428,26 @@ components: readOnly: true deleted: $ref: '#/components/schemas/deleted' + readOnly: true pendingOperations: description: Present while operations affecting the item's content have not completed. Read-only. $ref: '#/components/schemas/pendingOperations' + readOnly: true file: $ref: '#/components/schemas/openGraphFile' + readOnly: true fileSystemInfo: $ref: '#/components/schemas/fileSystemInfo' folder: $ref: '#/components/schemas/folder' + readOnly: true image: $ref: '#/components/schemas/image' + readOnly: true photo: description: Photo metadata, if the item is a photo. Read-only. $ref: '#/components/schemas/photo' + readOnly: true location: description: Location metadata, if the item has location data. Read-only. $ref: '#/components/schemas/geoCoordinates' @@ -5457,6 +5463,7 @@ components: $ref: '#/components/schemas/trash' specialFolder: $ref: '#/components/schemas/specialFolder' + readOnly: true remoteItem: $ref: '#/components/schemas/remoteItem' size: @@ -5489,12 +5496,15 @@ components: '@libre.graph.motionPhoto': description: Motion Photo metadata, if the item is a Motion Photo. Read-only. $ref: '#/components/schemas/motionPhoto' + readOnly: true '@libre.graph.livePhoto': description: Live Photo metadata, if the item is part of an Apple Live Photo. Read-only. $ref: '#/components/schemas/livePhoto' + readOnly: true lockInfo: description: Lock metadata, if the file is locked. Read-only. $ref: '#/components/schemas/lockInfo' + readOnly: true '@client.synchronize': description: Indicates if the item is synchronized with the underlying storage provider. Read-only. type: boolean @@ -5708,7 +5718,6 @@ components: deleted: type: object description: Information about the deleted state of the item. Read-only. - readOnly: true properties: state: type: string @@ -5716,7 +5725,6 @@ components: openGraphFile: type: object description: 'File metadata, if the item is a file. Read-only.' - readOnly: true properties: hashes: $ref: '#/components/schemas/hashes' @@ -5748,7 +5756,6 @@ components: folder: type: object description: 'Folder metadata, if the item is a folder. Read-only.' - readOnly: true properties: childCount: maximum: 2147483647 @@ -5760,7 +5767,6 @@ components: image: type: object description: 'Image metadata, if the item is an image. Read-only.' - readOnly: true properties: height: maximum: 2147483647 @@ -5776,7 +5782,6 @@ components: readOnly: true photo: type: object - readOnly: true description: | The photo resource provides photo and camera properties, for example, EXIF metadata, on a driveItem. properties: @@ -5817,7 +5822,6 @@ components: description: Represents the date and time the photo was taken. Read-only. pendingOperations: type: object - readOnly: true description: | Present while operations affecting the item's content have not completed, whether still queued or already running. While present, @@ -5840,7 +5844,6 @@ components: readOnly: true motionPhoto: type: object - readOnly: true description: | Motion Photo metadata. A Motion Photo is a still image with a short video clip appended to the end of the file. The presence of this facet on a driveItem indicates that the item is @@ -5872,7 +5875,6 @@ components: readOnly: true livePhoto: type: object - readOnly: true description: | Apple Live Photo metadata. A Live Photo is a pair of files sharing one content identifier: a still image (HEIC or JPEG) and a short QuickTime video. Unlike a @@ -5935,7 +5937,6 @@ components: readOnly: true lockInfo: type: object - readOnly: true description: | Read-only lock metadata for a file, matching the MS Graph beta lockInfo resource. Indicates whether the file is locked, the kind of @@ -6050,7 +6051,6 @@ components: specialFolder: type: object description: 'If the current item is also available as a special folder, this facet is returned. Read-only' - readOnly: true properties: name: type: string @@ -6069,10 +6069,12 @@ components: format: date-time file: $ref: '#/components/schemas/openGraphFile' + readOnly: true fileSystemInfo: $ref: '#/components/schemas/fileSystemInfo' folder: $ref: '#/components/schemas/folder' + readOnly: true driveAlias: type: string description: "The drive alias can be used in clients to make the urls user friendly. Example: 'personal/einstein'. This will be used to resolve to the correct driveID." @@ -6090,6 +6092,7 @@ components: description: Unique identifier for the remote item in its drive. Read-only. image: $ref: '#/components/schemas/image' + readOnly: true lastModifiedBy: $ref: '#/components/schemas/identitySet' lastModifiedDateTime: @@ -6122,6 +6125,7 @@ components: format: int64 specialFolder: $ref: '#/components/schemas/specialFolder' + readOnly: true webDavUrl: type: string description: DAV compatible URL for the item. From c7ebc388b2cc73a00d046e8e9097653e42062ece Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 15 Sep 2026 17:52:58 +0000 Subject: [PATCH 10/10] docs: do not promise type annotations for inferred types in responses --- api/openapi-spec/v1.0.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/api/openapi-spec/v1.0.yaml b/api/openapi-spec/v1.0.yaml index 98ad36d..a479b4f 100644 --- a/api/openapi-spec/v1.0.yaml +++ b/api/openapi-spec/v1.0.yaml @@ -6334,8 +6334,8 @@ components: property by its type: a date-time (RFC 3339 string) is indexed as a date only with `#DateTimeOffset`, otherwise as a string. `#String`, `#Int64`, `#Double`, `#Boolean` and `#Collection(...)` are inferred from the JSON value and optional. - A mismatch or an unannotated object is rejected with 400. Responses always - include the annotation. + A mismatch or an unannotated object is rejected with 400. Responses carry the + annotations that were stored with the values. required: - extensionName properties: @@ -6347,9 +6347,7 @@ components: example: extensionName: "com.example.project" status: "reviewed" - "status@odata.type": "#String" priority: 3 - "priority@odata.type": "#Int64" due: "2026-10-01T00:00:00Z" "due@odata.type": "#DateTimeOffset" site: