# Copyright 2022 ETSI. Licensed under the BSD-3-Clause license # API for the Augmented Reality Framework (ARF) # Working group: ETSI ISG ARF # STF group: STF620 (validation) # # References: # - Explaination UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier / https://fr.wikipedia.org/wiki/Universally_unique_identifier # - UUID formats: 8-4-4-4-12 format string, lower case (but case insensitive on input) # - UUID RFC4122: https://datatracker.ietf.org/doc/html/rfc4122#section-3 # - online UUID generator: https://www.uuidgenerator.net/ # - Rules for RESTful error code RFC2616: https://datatracker.ietf.org/doc/html/rfc2616#section-10 # - Guide: https://restfulapi.net/http-status-codes/ # # Last Version: 01.06.2022 openapi: "3.0.0" info: version: 1.0.0 title: World Storage API description: API ensuring interoperability between an authoring tool and a World Storage service license: name: Copyright 2022 ETSI. Licensed under the BSD-3-Clause license url: https://opensource.org/licenses/BSD-3-Clause servers: - url: http://localhost:8080 tags: - name: default description: Default operations to test the current server's state - name: Trackables description: Trackables are models of parts of the real world.
Trackables are elements of the real world of which features are available and/or could be extracted.
Trackables provide a Coordinate Reference System in which a pose can be expressed. - name: World Anchors description: A World Anchor represents a fixed position in relation to one or more elements of the real world.
It has a Coordinate Reference System in which AR Assets stay spatially-registered. - name: World Links description: A World Link represents and defines the relative 3D position and orientation between elements (Trackables and/or World Anchors). paths: /ping: get: summary: Test the server availability. operationId: getPing responses: '200': description: Ok, returns a string message. content: text/plain: schema: type: string example: "pong" /admin: get: summary: Get the state of the server. operationId: getAdmin responses: '200': description: OK, world storage server ready. content: text/plain: schema: type: string example: "Server up and running" /version: get: summary: Get the version of the ARF API. operationId: getVersion responses: '200': description: Current version. content: text/plain: schema: type: string example: "1.0.0" ############## # TRACKABLES # ############## /trackables: post: summary: Create a Trackable. operationId: addTrackable description: Create a new Trackable from a json object containing all the required informations and add it to the world storage.
As a result you will get the ID of the newly created Trackable. tags: - Trackables requestBody: description: The Trackable to be added to the world storage. required: true content: application/json: schema: $ref: '#/components/schemas/Trackable' responses: '200': description: OK, return the UUID of the Trackable defined by the world storage. content: text/plain: schema: type: string example: "777266da-e286-11ec-8fea-0242ac120002" '201': description: Null response. content: text/plain: schema: type: string example: "" '400': $ref: '#/components/responses/400_BadRequest' '409': $ref: '#/components/responses/409_NotEmptyUUID' 'default': $ref: '#/components/responses/4xx_UnexpectedError' put: summary: Modify a Trackable. operationId: modifyTrackable description: Modify an existing Trackable given a json object containing all the required informations.
**Please note that ID of the object is required in the JSON** tags: - Trackables requestBody: description: The Trackable to be modified in the world storage. required: true content: application/json: schema: $ref: '#/components/schemas/Trackable' responses: '200': description: OK, return the UUID of the modified Trackable. content: text/plain: schema: type: string example: "777266da-e286-11ec-8fea-0242ac120002" '400': $ref: '#/components/responses/400_BadRequest' '404': $ref: '#/components/responses/404_NotFoundUUID' 'default': $ref: '#/components/responses/4xx_UnexpectedError' get: summary: Return all the Trackables. operationId: getTrackables description: Get all the Trackables currently being stored in the world storage. tags: - Trackables responses: '200': description: OK, return all the Trackables defined by the world storage. content: application/json: schema: type : array items : $ref: "#/components/schemas/Trackable" '201': description: Null response. content: text/plain: schema: type: string example: "" default: $ref: '#/components/responses/4xx_UnexpectedError' /trackables/{trackableUUID}: get: summary: Find a Trackable by its UUID. operationId: getTrackableById description: Get a single Trackable stored in the world storage from its ID. tags: - Trackables parameters: - name: trackableUUID in: path description: UUID of the Trackable to retrieve. required: true schema: type: string format: uuid responses: '200': description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/Trackable' '400': $ref: '#/components/responses/400_InvalidUUID' '404': $ref: '#/components/responses/404_NotFoundUUID' delete: summary: Delete a Trackable. operationId: deleteTrackable description: Delete a single Trackable stored in the world storage from its ID. tags: - Trackables parameters: - name: trackableUUID in: path description: Trackable UUID to delete. required: true schema: type: string format: uuid responses: '200': description: OK, delete successful. content: text/plain: schema: type: string example: "Element succesfully deleted" '400': $ref: '#/components/responses/400_InvalidUUID' '404': $ref: '#/components/responses/404_NotFoundUUID' ################# # WORLD ANCHORS # ################# /worldAnchors: post: summary: Create a World Anchor. operationId: addWorldAnchor description: Create a new World Anchor from a json object containing all the required informations and add it to the world storage.
As a result you will get the ID of the newly created World Anchor. tags: - World Anchors requestBody: description: The World Anchor to be added to the world storage. required: true content: application/json: schema: $ref: '#/components/schemas/WorldAnchor' responses: '200': description: OK, return the UUID of the World Anchor defined by the world storage. content: text/plain: schema: type: string example: "777266da-e286-11ec-8fea-0242ac120002" '201': description: Null response. content: text/plain: schema: type: string example: "" '400': $ref: '#/components/responses/400_BadRequest' '409': $ref: '#/components/responses/409_NotEmptyUUID' 'default': $ref: '#/components/responses/4xx_UnexpectedError' put: summary: Modify a World Anchor. operationId: modifyWorldAnchor description: Modify an existing World Anchor given a json object containing all the required informations.
**Please note that ID of the object is required in the JSON** tags: - World Anchors requestBody: description: The World Anchor to be modified in the world storage. required: true content: application/json: schema: $ref: '#/components/schemas/WorldAnchor' responses: '200': description: OK, return the UUID of the modified World Anchor. content: text/plain: schema: type: string example: "777266da-e286-11ec-8fea-0242ac120002" '400': $ref: '#/components/responses/400_BadRequest' '404': $ref: '#/components/responses/404_NotFoundUUID' 'default': $ref: '#/components/responses/4xx_UnexpectedError' get: summary: Return all the World Anchors. operationId: getWorldAnchors description: Get all the World Anchors currently being stored in the world storage. tags: - World Anchors responses: '200': description: OK, return all the World Anchors defined by the world storage. content: application/json: schema: type : array items : $ref: "#/components/schemas/WorldAnchor" '201': description: Null response. content: text/plain: schema: type: string example: "" default: $ref: '#/components/responses/4xx_UnexpectedError' /worldAnchors/{worldAnchorUUID}: get: summary: Find a World Anchor by its UUID. operationId: getWorldAnchorById description: Get a single World Anchor stored in the world storage from its ID. tags: - World Anchors parameters: - name: worldAnchorUUID in: path description: UUID of the World Anchor to retrieve. required: true schema: type: string format: uuid responses: '200': description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/WorldAnchor' '400': $ref: '#/components/responses/400_InvalidUUID' '404': $ref: '#/components/responses/404_NotFoundUUID' delete: summary: Delete a World Anchor. operationId: deleteWorldAnchor description: Delete a single World Anchor stored in the world storage from its ID. tags: - World Anchors parameters: - name: worldAnchorUUID in: path description: World Anchor UUID to delete. required: true schema: type: string format: uuid responses: '200': description: OK, delete successful. content: text/plain: schema: type: string example: "Element succesfuly deleted" '400': $ref: '#/components/responses/400_InvalidUUID' '404': $ref: '#/components/responses/404_NotFoundUUID' ############### # WORLD LINKS # ############### /worldLinks: post: summary: Create a World Link between elements (world anchors and/or trackables). operationId: addWorldLink description: Create a new World Link from a json object containing all the required informations and add it to the world storage.
As a result you will get the ID of the newly created World Link. tags: - World Links requestBody: description: The link to be added to the world storage. required: true content: application/json: schema: $ref: '#/components/schemas/WorldLink' responses: '200': description: OK, return the UUID of the World Link defined by the world storage. content: text/plain: schema: type: string example: "777266da-e286-11ec-8fea-0242ac120002" '201': description: Null response. content: text/plain: schema: type: string example: "" '400': $ref: '#/components/responses/400_BadRequest' '409': $ref: '#/components/responses/409_NotEmptyUUID' 'default': $ref: '#/components/responses/4xx_UnexpectedError' put: summary: Modify a World Link. operationId: modifyWorldLink description: Modify an existing World Link given a json object containing all the required informations.
**Please note that ID of the object is required in the JSON** tags: - World Links requestBody: description: The World Link to be modified in the world storage. required: true content: application/json: schema: $ref: '#/components/schemas/WorldLink' responses: '200': description: OK, return the UUID of the modified World Link. content: text/plain: schema: type: string example: "777266da-e286-11ec-8fea-0242ac120002" '400': $ref: '#/components/responses/400_BadRequest' '404': $ref: '#/components/responses/404_NotFoundUUID' 'default': $ref: '#/components/responses/4xx_UnexpectedError' get: summary: Return all World Links. description: Get all the World Links currently being stored in the world storage. operationId: getWorldLinks tags: - World Links responses: '200': description: OK return all the World Links defined by the world storage. content: application/json: schema: type : array items : $ref: "#/components/schemas/WorldLink" '201': description: Null response. content: text/plain: schema: type: string example: "" default: $ref: '#/components/responses/4xx_UnexpectedError' /worldLinks/{worldLinkUUID}: get: summary: Find a World Link by its UUID. operationId: getWorldLinkById description: Get a single World Link stored in the world storage from its ID. tags: - World Links parameters: - name: worldLinkUUID in: path description: UUID of the World Link to retrieve. required: true schema: type: string format: uuid responses: '200': description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/WorldLink' '400': $ref: '#/components/responses/400_InvalidUUID' '404': $ref: '#/components/responses/404_NotFoundUUID' delete: summary: Delete a World Link. operationId: deleteWorldLink description: Delete a single World Link stored in the world storage from its ID. tags: - World Links parameters: - name: worldLinkUUID in: path description: World Link id to delete. required: true schema: type: string format: uuid responses: '200': description: OK, delete successful. content: text/plain: schema: type: string example: "Element succesfully deleted" '400': $ref: '#/components/responses/400_InvalidUUID' '404': $ref: '#/components/responses/404_NotFoundUUID' # COMPONENTS ############################################### components: #------------------------------- # Reusable schemas (data models) #------------------------------- schemas: Trackable: description: An element representing a Trackable object in the real world. type: object required: - name - creatorUUID - trackableType - trackableEncodingInformation - trackablePayload - localCRS - unit - trackableSize - keyvalueTags properties: UUID: description: An Universally Unique IDentifier identifying the Trackable (RFC 4122). type: string format: uuid example: fa8bbe40-8052-11ec-a8a3-0242ac120002 name: description: A human readable name for the Trackable. type: string example: myTrackableXYZ creatorUUID: description: An Universally Unique IDentifier identifying the creator of the Trackable (a person, a team or a company). type: string format: uuid example: bd6ce7ce-7fe8-487d-a179-fddfe914f293 trackableType: description: Extensible list of Trackable types, possibly handled by complient world storage implementation. type: string enum: [FIDUCIAL_MARKER, IMAGE_MARKER, MAP, GEOPOSE, OTHER] example: FIDUCIAL_MARKER trackableEncodingInformation: $ref: '#/components/schemas/EncodingInformationStructure' trackablePayload: description: The data provided to create the Trackable in a specific format handled by the world storage service. type: string format: byte example: "10110101" localCRS: $ref: '#/components/schemas/Transform3D' unit: $ref: '#/components/schemas/UnitSystem' trackableSize: $ref: '#/components/schemas/Size' keyvalueTags: $ref: '#/components/schemas/KeyvalueTagList' WorldAnchor: description: An element describing a pose in the world graph. type: object required: - name - creatorUUID - localCRS - unit - worldAnchorSize - keyvalueTags properties: UUID: description: An Universally Unique IDentifier identifying the World Anchor (RFC 4122). type: string format: uuid example: 49d18ab3-1bf8-481d-919b-cd062a2fd428 name: description: A human readable name for the World Anchor. type: string example: myWorldAnchorXYZ creatorUUID: description: An Universally Unique IDentifier identifying the creator of the World Anchor. type: string format: uuid example: 6ddeb59e-7740-42f7-b329-1374b92e7fc2 localCRS: $ref: '#/components/schemas/Transform3D' unit: $ref: '#/components/schemas/UnitSystem' worldAnchorSize: $ref: '#/components/schemas/Size' keyvalueTags: $ref: '#/components/schemas/KeyvalueTagList' WorldLink: description: An object holding the info of a transform between two elements. type: object required: - creatorUUID - UUIDFrom - UUIDTo - typeFrom - typeTo - transform - unit - keyvalueTags properties: UUID: description: An Universally Unique IDentifier identifying the World Link (RFC 4122). type: string format: uuid example: c6998f4f-1b8d-460b-9de8-4793b92fae2a creatorUUID: description: An Universally Unique IDentifier identifying the creator of the World Link. type: string format: uuid example: 7506001c-9c00-4f84-ae2e-e4dfcb77d36a UUIDFrom: description: An Universally Unique IDentifier identifying a World Anchor or Trackable. type: string format: uuid example: 60e11d81-1230-4588-be4c-93520a275012 UUIDTo: description: An Universally Unique IDentifier identifying a World Anchor or Trackable. type: string format: uuid example: 85eed503-875c-4d3d-9569-06c4859bd4cd typeFrom: $ref: '#/components/schemas/ObjectType' typeTo: $ref: '#/components/schemas/ObjectType' transform: $ref: '#/components/schemas/Transform3D' unit: $ref: '#/components/schemas/UnitSystem' keyvalueTags: $ref: '#/components/schemas/KeyvalueTagList' EncodingInformationStructure: description: An object holding the info of a Trackable`'`s encoding informations `:` the data format and the version. required: - dataFormat - version properties: dataFormat: description: Identifier of the target framework. type: string enum: [HOLOLENS, ARKIT, ARCORE, VUFORIA, ARUCO, OTHER] example : "HOLOLENS" version: description: The version of the format type: string example : "1.01" Transform3D: description: Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector. type: array minItems: 16 maxItems: 16 items: type: number format: float example: [ 1, 0, 0, 3, 0, 1, 0, 3, 0, 0, 1, 3, 0, 0, 0, 1] ObjectType: description: Type of a world representaion object. type: string enum: [Trackable, WorldAnchor, NotIdentified] example: Trackable UnitSystem: description: Unit of length. type: string enum: [MM, CM, DM, M, DAM, HM, KM, INCH, FOOT, YARD, MILE] example: M Size: description: Size object in format {width, length, depth}. type: array items: type: number format: double minItems: 3 maxItems: 3 example: [1.0,1.0,1.5] KeyvalueTagList: description: List of additional parameters to be stored with the object. type: object additionalProperties: type: array items: type: string minItems: 1 example: { "Place" : ["Building 123"], "Room" : ["007"]} Error: required: - code - message properties: code: type: integer format: int32 example: 406 message: type: string example: "Error 406" #------------------------------- # Reusable responses #------------------------------- responses: ####################### # 1xx : Informational # ####################### ################# # 2xx : Success # ################# ##################### # 3xx : Redirection # ##################### ####################### # 4xx : Client Errors # ####################### 400_BadRequest: description: Bad request. content: text/plain: schema: type: string example: "Bad request" 400_InvalidUUID: description: Invalid UUID supplied. content: text/plain: schema: example: "The format of the UUID is incorrect" type: string 404_NotFoundUUID: description: Not found, could not find UUID in database. content: text/plain: schema: type: string example: "Element not found" 409_NotEmptyUUID: description: Invalid UUID, id must be a Nil value. content: text/plain: schema: type: string example: "The element you sent has already a value and can't be sent to the world storage" 4xx_UnexpectedError: # Can be referenced as '#/components/responses/GenericError' description: Unexpected error. content: application/json: schema: $ref: '#/components/schemas/Error' ######################## # 5xx : Server Errors # ######################## 5xx_UnexpectedError: description: Unexpected server error. content: application/json: schema: $ref: '#/components/schemas/Error'