diff --git a/code/API_definitions/esim-remote-management.yaml b/code/API_definitions/esim-remote-management.yaml index 4b5cc3e..9eedd15 100644 --- a/code/API_definitions/esim-remote-management.yaml +++ b/code/API_definitions/esim-remote-management.yaml @@ -53,7 +53,7 @@ info: The list of error codes in this API specification is not exhaustive. Therefore the API specification MAY not document some non-mandatory error statuses as indicated in `CAMARA API Design Guide`. - Please refer to the `CAMARA_common.yaml` of the Commonalities Release associated to this API version for a complete list of error responses. The applicable Commonalities Release can be identified in the `API Readiness Checklist` document associated to this API version. + Please refer to the `CAMARA_common.yaml` of the Commonalities Release associated to this API version for a complete list of error responses. The applicable Commonalities Release can be identified from the `x-camara-commonalities` field, the changelog and the metadata of the released API version. As a specific rule, error `501 - NOT_IMPLEMENTED` can be only a possible error response if it is explicitly documented in the API. @@ -66,7 +66,7 @@ info: version: wip - x-camara-commonalities: 0.8.0-rc.2 + x-camara-commonalities: 0.9.0 license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html @@ -93,8 +93,12 @@ paths: summary: Download profile description: | Download and optionally install a new eSIM profile to the device. This is an asynchronous operation that returns a task ID for status tracking. + + If the optional `sink` is provided in the request body, the API provider + notifies the API consumer of the operation outcome via that sink; + otherwise the outcome is retrieved with `/result/query`. parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" operationId: profileDownload requestBody: content: @@ -107,27 +111,27 @@ paths: description: OK headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: $ref: '#/components/schemas/BaseCmpRespProfileDownloadResp' '400': - $ref: '#/components/responses/Generic400' + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" '401': - $ref: '#/components/responses/Generic401' + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" '403': - $ref: '#/components/responses/Generic403' + $ref: "#/components/responses/PermissionDenied403" '404': - $ref: '#/components/responses/Generic404' + $ref: "#/components/responses/NotFound404" '422': - $ref: "#/components/responses/Generic422" + $ref: "#/components/responses/ProfileOperationUnprocessableEntity422" callbacks: profile-download-completed: - "{$request.body/sink}": + "{$request.body#/sink}": post: parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" requestBody: content: application/cloudevents+json: @@ -138,17 +142,17 @@ paths: description: Successful notification headers: x-correlator: - $ref: "#/components/headers/x-correlator" + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" "400": - $ref: "#/components/responses/Generic400" + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" "401": - $ref: "#/components/responses/Generic401" + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" "403": - $ref: "#/components/responses/Generic403" + $ref: "#/components/responses/PermissionDenied403" "410": - $ref: "#/components/responses/Generic410" + $ref: "../common/CAMARA_event_common.yaml#/components/responses/SinkGone410" "429": - $ref: "#/components/responses/Generic429" + $ref: "#/components/responses/TooManyRequests429" security: - {} - notificationsBearerAuth: [] @@ -163,7 +167,7 @@ paths: description: | Query the result of an profile operation using the task ID returned from a operation request. parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" operationId: profileResultQuery requestBody: content: @@ -176,21 +180,21 @@ paths: description: OK headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: $ref: '#/components/schemas/BaseCmpRespProfileResultQueryResp' '400': - $ref: '#/components/responses/Generic400' + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" '401': - $ref: '#/components/responses/Generic401' + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" '403': - $ref: '#/components/responses/Generic403' + $ref: "#/components/responses/PermissionDenied403" '404': - $ref: '#/components/responses/Generic404' + $ref: "#/components/responses/NotFound404" '422': - $ref: "#/components/responses/Generic422" + $ref: "../common/CAMARA_common.yaml#/components/responses/DeviceIdentifier422" /enable-profile: post: security: @@ -201,8 +205,12 @@ paths: summary: Enable a profile description: | Enable an eSIM profile. This is an asynchronous operation that returns a task ID for status tracking. + + If the optional `sink` is provided in the request body, the API provider + notifies the API consumer of the operation outcome via that sink; + otherwise the outcome is retrieved with `/result/query`. parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" operationId: profileEnable requestBody: content: @@ -215,27 +223,27 @@ paths: description: OK headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: $ref: '#/components/schemas/BaseCmpRespProfileOperResp' '400': - $ref: '#/components/responses/Generic400' + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" '401': - $ref: '#/components/responses/Generic401' + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" '403': - $ref: '#/components/responses/Generic403' + $ref: "#/components/responses/PermissionDenied403" '404': - $ref: '#/components/responses/Generic404' + $ref: "#/components/responses/NotFound404" '422': - $ref: "#/components/responses/Generic422" + $ref: "#/components/responses/ProfileOperationUnprocessableEntity422" callbacks: profile-operation-completed: - "{$request.body/sink}": + "{$request.body#/sink}": post: parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" requestBody: content: application/cloudevents+json: @@ -246,17 +254,17 @@ paths: description: Successful notification headers: x-correlator: - $ref: "#/components/headers/x-correlator" + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" "400": - $ref: "#/components/responses/Generic400" + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" "401": - $ref: "#/components/responses/Generic401" + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" "403": - $ref: "#/components/responses/Generic403" + $ref: "#/components/responses/PermissionDenied403" "410": - $ref: "#/components/responses/Generic410" + $ref: "../common/CAMARA_event_common.yaml#/components/responses/SinkGone410" "429": - $ref: "#/components/responses/Generic429" + $ref: "#/components/responses/TooManyRequests429" security: - {} - notificationsBearerAuth: [] @@ -271,8 +279,12 @@ paths: summary: Disable a profile description: | Disable an eSIM profile. This is an asynchronous operation that returns a task ID for status tracking. + + If the optional `sink` is provided in the request body, the API provider + notifies the API consumer of the operation outcome via that sink; + otherwise the outcome is retrieved with `/result/query`. parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" operationId: profileDisable requestBody: content: @@ -285,27 +297,27 @@ paths: description: OK headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: $ref: '#/components/schemas/BaseCmpRespProfileOperResp' '400': - $ref: '#/components/responses/Generic400' + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" '401': - $ref: '#/components/responses/Generic401' + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" '403': - $ref: '#/components/responses/Generic403' + $ref: "#/components/responses/PermissionDenied403" '404': - $ref: '#/components/responses/Generic404' + $ref: "#/components/responses/NotFound404" '422': - $ref: "#/components/responses/Generic422" + $ref: "#/components/responses/ProfileOperationUnprocessableEntity422" callbacks: profile-operation-completed: - "{$request.body/sink}": + "{$request.body#/sink}": post: parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" requestBody: content: application/cloudevents+json: @@ -316,17 +328,17 @@ paths: description: Successful notification headers: x-correlator: - $ref: "#/components/headers/x-correlator" + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" "400": - $ref: "#/components/responses/Generic400" + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" "401": - $ref: "#/components/responses/Generic401" + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" "403": - $ref: "#/components/responses/Generic403" + $ref: "#/components/responses/PermissionDenied403" "410": - $ref: "#/components/responses/Generic410" + $ref: "../common/CAMARA_event_common.yaml#/components/responses/SinkGone410" "429": - $ref: "#/components/responses/Generic429" + $ref: "#/components/responses/TooManyRequests429" security: - {} - notificationsBearerAuth: [] @@ -340,8 +352,12 @@ paths: summary: Delete a profile description: | Delete an eSIM profile. This is an asynchronous operation that returns a task ID for status tracking. + + If the optional `sink` is provided in the request body, the API provider + notifies the API consumer of the operation outcome via that sink; + otherwise the outcome is retrieved with `/result/query`. parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" operationId: profileDelete requestBody: content: @@ -354,27 +370,27 @@ paths: description: OK headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: $ref: '#/components/schemas/BaseCmpRespProfileOperResp' '400': - $ref: '#/components/responses/Generic400' + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" '401': - $ref: '#/components/responses/Generic401' + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" '403': - $ref: '#/components/responses/Generic403' + $ref: "#/components/responses/PermissionDenied403" '404': - $ref: '#/components/responses/Generic404' + $ref: "#/components/responses/NotFound404" '422': - $ref: "#/components/responses/Generic422" + $ref: "#/components/responses/ProfileOperationUnprocessableEntity422" callbacks: profile-operation-completed: - "{$request.body/sink}": + "{$request.body#/sink}": post: parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "../common/CAMARA_common.yaml#/components/parameters/x-correlator" requestBody: content: application/cloudevents+json: @@ -385,17 +401,17 @@ paths: description: Successful notification headers: x-correlator: - $ref: "#/components/headers/x-correlator" + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" "400": - $ref: "#/components/responses/Generic400" + $ref: "../common/CAMARA_common.yaml#/components/responses/BadRequestWithRange400" "401": - $ref: "#/components/responses/Generic401" + $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" "403": - $ref: "#/components/responses/Generic403" + $ref: "#/components/responses/PermissionDenied403" "410": - $ref: "#/components/responses/Generic410" + $ref: "../common/CAMARA_event_common.yaml#/components/responses/SinkGone410" "429": - $ref: "#/components/responses/Generic429" + $ref: "#/components/responses/TooManyRequests429" security: - {} - notificationsBearerAuth: [] @@ -403,27 +419,10 @@ paths: components: securitySchemes: openId: - description: OpenID Connect authentication - type: openIdConnect - openIdConnectUrl: https://example.com/.well-known/openid-configuration + $ref: "../common/CAMARA_common.yaml#/components/securitySchemes/openId" notificationsBearerAuth: - description: Bearer authentication for notifications - type: http - scheme: bearer - bearerFormat: "{$request.body#sinkCredential.credentialType}" - - parameters: - x-correlator: - name: x-correlator - in: header - description: Correlation id for the different services - schema: - $ref: "#/components/schemas/XCorrelator" - headers: - x-correlator: - description: Correlation id for the different services - schema: - $ref: "#/components/schemas/XCorrelator" + $ref: "../common/CAMARA_event_common.yaml#/components/securitySchemes/notificationsBearerAuth" + schemas: BaseCmpReqProfileResultQueryReq: type: object @@ -474,15 +473,20 @@ components: device: $ref: '#/components/schemas/ProfileOperDevice' sink: - type: string - format: uri - maxLength: 2048 - description: The URL where the API response will be asynchronously delivered, using the HTTP protocol. - example: "https://endpoint.example.com/sink" - sinkCredential: - description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + description: | + The URL where notifications about the outcome of this operation are + delivered, using the CloudEvents format over HTTP. + + Providing `sink` requests event-notification delivery for this + operation. If the API provider does not support notification + delivery, the request MUST be rejected with + `422 EVENT_NOTIFICATIONS_NOT_SUPPORTED` and the operation MUST NOT + be started. The API consumer can then retry without `sink` and + retrieve the outcome via `/result/query` instead. allOf: - - $ref: "../common/CAMARA_event_common.yaml#/components/schemas/SinkCredential" + - $ref: "../common/CAMARA_event_common.yaml#/components/schemas/Sink" + sinkCredential: + $ref: "../common/CAMARA_event_common.yaml#/components/schemas/SinkCredential" BaseCmpRespProfileOperResp: type: object description: Response body for profile operation @@ -550,15 +554,20 @@ components: device: $ref: '#/components/schemas/ProfileOperDevice' sink: - type: string - format: uri - maxLength: 2048 - description: The URL where the API response will be asynchronously delivered, using the HTTP protocol. - example: "https://endpoint.example.com/sink" - sinkCredential: - description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + description: | + The URL where notifications about the outcome of this operation are + delivered, using the CloudEvents format over HTTP. + + Providing `sink` requests event-notification delivery for this + operation. If the API provider does not support notification + delivery, the request MUST be rejected with + `422 EVENT_NOTIFICATIONS_NOT_SUPPORTED` and the operation MUST NOT + be started. The API consumer can then retry without `sink` and + retrieve the outcome via `/result/query` instead. allOf: - - $ref: "../common/CAMARA_event_common.yaml#/components/schemas/SinkCredential" + - $ref: "../common/CAMARA_event_common.yaml#/components/schemas/Sink" + sinkCredential: + $ref: "../common/CAMARA_event_common.yaml#/components/schemas/SinkCredential" BaseCmpRespProfileDownloadResp: type: object description: Response body for profile operation @@ -609,12 +618,6 @@ components: - ERROR required: - taskId - XCorrelator: - description: Value for the x-correlator - type: string - pattern: ^[a-zA-Z0-9-_:;.\/<>{}]{0,256}$ - maxLength: 256 - example: "b4333c46-49c0-4f62-80d7-f0ef930f1c46" ApiEventType: type: string description: | @@ -644,73 +647,29 @@ components: org.camaraproject.esim-remote-management.v0.profile-download-completed: "#/components/schemas/ProfileOperationCallback" org.camaraproject.esim-remote-management.v0.profile-operation-completed: "#/components/schemas/ProfileOperationCallback" responses: - Generic400: - description: Bad Request - headers: - x-correlator: - $ref: '#/components/headers/x-correlator' - content: - application/json: - schema: - allOf: - - $ref: '../common/CAMARA_common.yaml#/components/schemas/ErrorInfo' - - type: object - properties: - status: - enum: - - 400 - code: - enum: - - INVALID_ARGUMENT - - OUT_OF_RANGE - examples: - GENERIC_400_INVALID_ARGUMENT: - description: Invalid Argument. Generic Syntax Exception - value: - status: 400 - code: INVALID_ARGUMENT - message: Client specified an invalid argument, request body or query param. - GENERIC_400_OUT_OF_RANGE: - description: Out of Range. Specific Syntax Exception used when a given field has a pre-defined range or a invalid filter criteria combination is requested - value: - status: 400 - code: OUT_OF_RANGE - message: Client specified an invalid range. - Generic401: - description: Unauthorized - headers: - x-correlator: - $ref: '#/components/headers/x-correlator' - content: - application/json: - schema: - allOf: - - $ref: '../common/CAMARA_common.yaml#/components/schemas/ErrorInfo' - - type: object - properties: - status: - enum: - - 401 - code: - enum: - - UNAUTHENTICATED - examples: - GENERIC_401_UNAUTHENTICATED: - description: Request cannot be authenticated and a new authentication is required - value: - status: 401 - code: UNAUTHENTICATED - message: Request not authenticated due to missing, invalid, or expired credentials. A new authentication is required. - Generic403: + + # ───────────────────────────────────────────────────────────────────────── + # API-specific error responses (locally defined) + # + # Following the Commonalities 0.9.0 catalogue model, responses that match a + # referenceable catalogue entry are referenced directly from + # `CAMARA_common.yaml` / `CAMARA_event_common.yaml` (see `paths` above). + # Only the code combinations the catalogue does not cover are defined + # locally here — combining `ErrorInfo` with a local restriction of `status` + # and `code`, and referencing the shared example ingredients so that the + # error wording stays consistent across CAMARA APIs. + # ───────────────────────────────────────────────────────────────────────── + + PermissionDenied403: description: Forbidden headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: allOf: - - $ref: '../common/CAMARA_common.yaml#/components/schemas/ErrorInfo' + - $ref: "../common/CAMARA_common.yaml#/components/schemas/ErrorInfo" - type: object properties: status: @@ -722,27 +681,24 @@ components: - INVALID_TOKEN_CONTEXT examples: GENERIC_403_PERMISSION_DENIED: - description: Permission denied. OAuth2 token access does not have the required scope or when the user fails operational security - value: - status: 403 - code: PERMISSION_DENIED - message: Client does not have sufficient permissions to perform this action. + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_403_PERMISSION_DENIED" GENERIC_403_INVALID_TOKEN_CONTEXT: description: Reflect some inconsistency between information in some field of the API and the related OAuth2 Token value: status: 403 code: INVALID_TOKEN_CONTEXT message: Request body is not consistent with access token. - Generic404: + + NotFound404: description: Not found headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: allOf: - - $ref: '../common/CAMARA_common.yaml#/components/schemas/ErrorInfo' + - $ref: "../common/CAMARA_common.yaml#/components/schemas/ErrorInfo" - type: object properties: status: @@ -754,22 +710,18 @@ components: - IDENTIFIER_NOT_FOUND examples: GENERIC_404_NOT_FOUND: - description: Resource is not found - value: - status: 404 - code: NOT_FOUND - message: The specified resource is not found. + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_404_NOT_FOUND" GENERIC_404_IDENTIFIER_NOT_FOUND: - description: Some identifier cannot be matched to a device - value: - status: 404 - code: IDENTIFIER_NOT_FOUND - message: Device identifier not found. - Generic410: - description: Gone + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_404_IDENTIFIER_NOT_FOUND" + + # 422 for the asynchronous operations that accept `sink`: the identifier + # codes plus the Commonalities 0.9.0 implicit-subscription code + # `EVENT_NOTIFICATIONS_NOT_SUPPORTED` (see the `sink` property description). + ProfileOperationUnprocessableEntity422: + description: Unprocessable Content headers: x-correlator: - $ref: "#/components/headers/x-correlator" + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: @@ -779,22 +731,33 @@ components: properties: status: enum: - - 410 + - 422 code: enum: - - GONE + - SERVICE_NOT_APPLICABLE + - MISSING_IDENTIFIER + - UNSUPPORTED_IDENTIFIER + - UNNECESSARY_IDENTIFIER + - EVENT_NOTIFICATIONS_NOT_SUPPORTED examples: - GENERIC_410_GONE: - description: Use in notifications flow to allow API Consumer to indicate that its callback is no longer available - value: - status: 410 - code: GONE - message: Access to the target resource is no longer available. - Generic429: + GENERIC_422_SERVICE_NOT_APPLICABLE: + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_422_SERVICE_NOT_APPLICABLE" + GENERIC_422_MISSING_IDENTIFIER_DEVICE: + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_422_MISSING_IDENTIFIER_DEVICE" + GENERIC_422_UNSUPPORTED_IDENTIFIER_DEVICE: + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_422_UNSUPPORTED_IDENTIFIER_DEVICE" + GENERIC_422_UNNECESSARY_IDENTIFIER_DEVICE: + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_422_UNNECESSARY_IDENTIFIER_DEVICE" + GENERIC_422_EVENT_NOTIFICATIONS_NOT_SUPPORTED: + $ref: "../common/CAMARA_event_common.yaml#/components/examples/GENERIC_422_EVENT_NOTIFICATIONS_NOT_SUPPORTED" + + # 429 — extends the catalogue `TooManyRequests429` with the API-specific + # business quota code `QUOTA_EXCEEDED`. + TooManyRequests429: description: Quota Exceed or Too Many Requests headers: x-correlator: - $ref: "#/components/headers/x-correlator" + $ref: "../common/CAMARA_common.yaml#/components/headers/x-correlator" content: application/json: schema: @@ -811,60 +774,6 @@ components: - TOO_MANY_REQUESTS examples: GENERIC_429_QUOTA_EXCEEDED: - description: Request is rejected due to exceeding a business quota limit - value: - status: 429 - code: QUOTA_EXCEEDED - message: Out of resource quota. + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_429_QUOTA_EXCEEDED" GENERIC_429_TOO_MANY_REQUESTS: - description: Access to the API has been temporarily blocked due to rate or spike arrest limits being reached - value: - status: 429 - code: TOO_MANY_REQUESTS - message: Rate limit reached. - Generic422: - description: Unprocessable Content - headers: - x-correlator: - $ref: "#/components/headers/x-correlator" - content: - application/json: - schema: - allOf: - - $ref: "../common/CAMARA_common.yaml#/components/schemas/ErrorInfo" - - type: object - properties: - status: - enum: - - 422 - code: - enum: - - SERVICE_NOT_APPLICABLE - - MISSING_IDENTIFIER - - UNSUPPORTED_IDENTIFIER - - UNNECESSARY_IDENTIFIER - examples: - GENERIC_422_SERVICE_NOT_APPLICABLE: - description: Service not applicable for the provided identifier - value: - status: 422 - code: SERVICE_NOT_APPLICABLE - message: The service is not available for the provided identifier. - GENERIC_422_MISSING_IDENTIFIER: - description: An identifier is not included in the request and the device or phone number identification cannot be derived from the 3-legged access token - value: - status: 422 - code: MISSING_IDENTIFIER - message: The device cannot be identified. - GENERIC_422_UNSUPPORTED_IDENTIFIER: - description: None of the provided identifiers is supported by the implementation - value: - status: 422 - code: UNSUPPORTED_IDENTIFIER - message: The identifier provided is not supported. - GENERIC_422_UNNECESSARY_IDENTIFIER: - description: An explicit identifier is provided when a device or phone number has already been identified from the access token - value: - status: 422 - code: UNNECESSARY_IDENTIFIER - message: The device is already identified by the access token. + $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_429_TOO_MANY_REQUESTS"