--- openapi: 3.1.2 info: description: |- You're looking at the current **stable** documentation of the OpenProject APIv3. If you're interested in the current development version, please go to [github.com/opf](https://github.com/opf/openproject/tree/dev/docs/api/apiv3). ## Introduction The documentation for the APIv3 is written according to the [OpenAPI 3.1 Specification](https://swagger.io/specification/). You can either view the static version of this documentation on the [website](https://www.openproject.org/docs/api/introduction/) or the interactive version, rendered with [OpenAPI Explorer](https://github.com/Rhosys/openapi-explorer/blob/main/README.md), in your OpenProject installation under `/api/docs`. In the latter you can try out the various API endpoints directly interacting with our OpenProject data. Moreover you can access the specification source itself under `/api/v3/spec.json` and `/api/v3/spec.yml` (e.g. [here](https://community.openproject.org/api/v3/spec.yml)). The APIv3 is a hypermedia REST API, a shorthand for "Hypermedia As The Engine Of Application State" (HATEOAS). This means that each endpoint of this API will have links to other resources or actions defined in the resulting body. These related resources and actions for any given resource will be context sensitive. For example, only actions that the authenticated user can take are being rendered. This can be used to dynamically identify actions that the user might take for any given response. As an example, if you fetch a work package through the [Work Package endpoint](https://www.openproject.org/docs/api/endpoints/work-packages/), the `update` link will only be present when the user you authenticated has been granted a permission to update the work package in the assigned project. ## HAL+JSON HAL is a simple format that gives a consistent and easy way to hyperlink between resources in your API. Read more in the following specification: [https://tools.ietf.org/html/draft-kelly-json-hal-08](https://tools.ietf.org/html/draft-kelly-json-hal-08) **OpenProject API implementation of HAL+JSON format** enriches JSON and introduces a few meta properties: - `_type` - specifies the type of the resource (e.g.: WorkPackage, Project) - `_links` - contains all related resource and action links available for the resource - `_embedded` - contains all embedded objects HAL does not guarantee that embedded resources are embedded in their full representation, they might as well be partially represented (e.g. some properties can be left out). However in this API you have the guarantee that whenever a resource is **embedded**, it is embedded in its **full representation**. ## API response structure All API responses contain a single HAL+JSON object, even collections of objects are technically represented by a single HAL+JSON object that itself contains its members. More details on collections can be found in the [Collections Section](https://www.openproject.org/docs/api/collections/). ## Authentication The API supports the following authentication schemes: * Session-based authentication * API tokens * passed as Bearer token * passed via Basic auth * OAuth 2.0 * using built-in authorization server * using an external authorization server (RFC 9068) Depending on the settings of the OpenProject instance many resources can be accessed without being authenticated. In case the instance requires authentication on all requests the client will receive an **HTTP 401** status code in response to any request. Otherwise unauthenticated clients have all the permissions of the anonymous user. ### Session-based authentication This means you have to login to OpenProject via the Web-Interface to be authenticated in the API. This method is well-suited for clients acting within the browser, like the Angular-Client built into OpenProject. In this case, you always need to pass the HTTP header `X-Requested-With "XMLHttpRequest"` for authentication. ### API token as bearer token Users can authenticate towards the API v3 using an API token as a bearer token. For example: ```shell API_KEY=opapi-2519132cdf62dcf5a66fd96394672079f9e9cad1 curl -H "Authorization: Bearer $API_KEY" https://community.openproject.org/api/v3/users/42 ``` Users can generate API tokens on their account page. ### API token through Basic Auth API tokens can also be used with basic auth, using the user name `apikey` (NOT your login) and the API token as the password. For example: ```shell API_KEY=opapi-2519132cdf62dcf5a66fd96394672079f9e9cad1 curl -u apikey:$API_KEY https://community.openproject.org/api/v3/users/42 ``` ### OAuth 2.0 authentication OpenProject allows authentication and authorization with OAuth2 with *Authorization code flow*, as well as *Client credentials* operation modes. To get started, you first need to register an application in the OpenProject OAuth administration section of your installation. This will save an entry for your application with a client unique identifier (`client_id`) and an accompanying secret key (`client_secret`). You can then use one the following guides to perform the supported OAuth 2.0 flows: - [Authorization code flow](https://oauth.net/2/grant-types/authorization-code) - [Authorization code flow with PKCE](https://doorkeeper.gitbook.io/guides/ruby-on-rails/pkce-flow), recommended for clients unable to keep the client_secret confidential - [Client credentials](https://oauth.net/2/grant-types/client-credentials/) - Requires an application to be bound to an impersonating user for non-public access ### OAuth 2.0 using an external authorization server There is a possibility to use JSON Web Tokens (JWT) generated by an OIDC provider configured in OpenProject as a bearer token to do authenticated requests against the API. The following requirements must be met: - OIDC provider must be configured in OpenProject with **jwks_uri** - JWT must be signed using RSA algorithm - JWT **iss** claim must be equal to OIDC provider **issuer** - JWT **aud** claim must contain the OpenProject **client ID** used at the OIDC provider - JWT **scope** claim must include a valid scope to access the desired API (e.g. `api_v3` for APIv3) - JWT must be actual (neither expired or too early to be used) - JWT must be passed in Authorization header like: `Authorization: Bearer {jwt}` - User from **sub** claim must be linked to OpenProject before (e.g. by logging in), otherwise it will be not authenticated In more general terms, OpenProject should be compliant to [RFC 9068](https://www.rfc-editor.org/rfc/rfc9068) when validating access tokens. ### Why not username and password? The simplest way to do basic auth would be to use a user's username and password naturally. However, OpenProject already has supported API keys in the past for the API v2, though not through basic auth. Using **username and password** directly would have some advantages: * It is intuitive for the user who then just has to provide those just as they would when logging into OpenProject. * No extra logic for token management necessary. On the other hand using **API keys** has some advantages too, which is why we went for that: * If compromised while saved on an insecure client the user only has to regenerate the API key instead of changing their password, too. * They are naturally long and random which makes them invulnerable to dictionary attacks and harder to crack in general. Most importantly users may not actually have a password to begin with. Specifically when they have registered through an OpenID Connect provider. ## Cross-Origin Resource Sharing (CORS) By default, the OpenProject API is _not_ responding with any CORS headers. If you want to allow cross-domain AJAX calls against your OpenProject instance, you need to enable CORS headers being returned. Please see [our API settings documentation](https://www.openproject.org/docs/system-admin-guide/api-and-webhooks/) on how to selectively enable CORS. ## Allowed HTTP methods - `GET` - Get a single resource or collection of resources - `POST` - Create a new resource or perform - `PATCH` - Update a resource - `DELETE` - Delete a resource ## Compression Responses are compressed if requested by the client. Currently [gzip](https://www.gzip.org/) and [deflate](https://tools.ietf.org/html/rfc1951) are supported. The client signals the desired compression by setting the [`Accept-Encoding` header](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3). If no `Accept-Encoding` header is send, `Accept-Encoding: identity` is assumed which will result in the API responding uncompressed. title: OpenProject API V3 (Stable) version: '3' servers: - url: https://qa.openproject-edge.com description: Edge QA instance - url: https://qa.openproject-stage.com description: Staging instance - url: https://community.openproject.org description: Community instance paths: "/api/v3": get: summary: View root operationId: view_root description: Returns the root resource, containing basic information about the server instance and a collection of useful links. tags: - Root responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/RootModel" "/api/v3/actions": get: parameters: - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + id: Returns only the action having the id or all actions except those having the id(s). example: '[{ "id": { "operator": "=", "values": ["memberships/create"] }" }]' in: query name: filters required: false schema: type: string - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + *No sort supported yet* example: '[["id", "asc"]]' in: query name: sortBy required: false schema: default: '[["id", "asc"]]' type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/actions/work_packages/create" title: Add work package _type: Action description: Creating a work package within a project including the uploading of attachments. Some attributes might not be selected, e.g version which requires a second permission id: work_packages/create modules: - work_packages name: Add work package - _links: self: href: "/api/v3/actions/work_packages/assign_versions" title: Assigning version _type: Action description: Assigning a work package to a version when creating/updating a work package. Only principals having this permission can assign a value to the version property of the work package resource. id: work_packages/assign_versions modules: - work_packages - versions name: Assign version _links: self: href: "/api/v3/actions" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/List_actionsModel" description: OK headers: {} tags: - Actions & Capabilities description: |- Returns a collection of actions. The client can choose to filter the actions similar to how work packages are filtered. In addition to the provided filters, the server will reduce the result set to only contain actions, for which the requesting client has sufficient permissions. operationId: List_actions summary: List actions "/api/v3/actions/{id}": get: parameters: - description: action id which is the name of the action example: work_packages/create in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/actions/work_packages/create" title: Add work package _type: Action description: Creating a work package within a project including the uploading of attachments. Some attributes might not be selected, e.g version which requires a second permission id: work_packages/create modules: - work_packages name: Add work package schema: "$ref": "#/components/schemas/View_actionModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the action does not exist. headers: {} tags: - Actions & Capabilities description: Returns an individual action. operationId: View_action summary: View action "/api/v3/activities/{id}": get: summary: Get an activity operationId: get_activity tags: - Activities description: Returns the requested activity resource identified by its unique id. parameters: - name: id description: Activity id in: path required: true schema: type: integer example: 1 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ActivityModel" examples: response: "$ref": "#/components/examples/ActivityResponse" patch: summary: Update activity operationId: update_activity tags: - Activities description: Updates an activity's comment and, on success, returns the updated activity. parameters: - name: id description: Activity id in: path required: true schema: type: integer example: 1 requestBody: content: application/json: schema: "$ref": "#/components/schemas/ActivityCommentWriteModel" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ActivityModel" examples: response: "$ref": "#/components/examples/ActivityResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit journals content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to edit the comment of this journal entry. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: Returned if the client tries to modify a read-only property. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyIsReadOnly message: The ID of an activity can't be changed. "/api/v3/activities/{id}/attachments": get: summary: List attachments by activity operationId: list_activity_attachments tags: - Activities - Attachments description: List all attachments of a single activity. parameters: - name: id description: ID of the activity whose attachments will be listed in: path required: true schema: type: integer example: 1 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/Attachments_Model" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: "Returned if the activity does not exist or the client does not have sufficient permissions\nto see it.\n\n**Required permission:** \n- `view_work_packages`\n- for internal comments: `view_internal_comments`\n\n*Note: A client without sufficient permissions shall not be able to test for the existence of an activity.\nThat's why a 404 is returned here, even if a 403 might be more appropriate.*" post: summary: Add attachment to activity operationId: create_activity_attachment tags: - Activities - Attachments description: Adds an attachment to the specified activity. parameters: - name: id description: ID of the activity to receive the attachment in: path required: true schema: type: integer example: 1 requestBody: content: multipart/form-data: schema: "$ref": "#/components/schemas/FileUploadForm" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/AttachmentModel" '400': description: |- Returned if the client sends a not understandable request. Reasons include: * Omitting one of the required parts (metadata and file) * sending unparsable JSON in the metadata part content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request could not be parsed as JSON. '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** view_work_packages or view_internal_comments (for internal comments) *Note that you will only receive this error, if you are at least allowed to see the activity* content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to add attachments to this activity. '404': description: |- Returned if the activity does not exist or the client does not have sufficient permissions to see it. **Required permission:** view_work_packages or view_internal_comments (for internal comments) *Note: A client without sufficient permissions shall not be able to test for the existence of an activity. That's why a 404 is returned here, even if a 403 might be more appropriate.* content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if the client tries to send an invalid attachment. Reasons are: * Omitting the file name (`fileName` property of metadata part) * Sending a file that is too large content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: File is too large (maximum size is 5242880 Bytes). "/api/v3/activities/{id}/emoji_reactions": get: summary: List emoji reactions by activity operationId: list_activity_emoji_reactions tags: - Activities - EmojiReactions description: List all emoji reactions of a single activity. parameters: - name: id description: ID of the activity whose emoji reactions will be listed in: path required: true schema: type: integer example: '1' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/EmojiReactions_Model" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the activity does not exist or the client does not have sufficient permissions to see it. **Required permission:** - `view_work_packages` - for internal comments: `view_internal_comments` *Note: A client without sufficient permissions shall not be able to test for the existence of an activity. That's why a 404 is returned here, even if a 403 might be more appropriate.* patch: summary: Toggle emoji reaction for an activity operationId: toggle_activity_emoji_reaction tags: - Activities - EmojiReactions description: |- Toggle an emoji reaction for a given activity. If the user has already reacted with the given emoji, the reaction will be removed. Otherwise, a new reaction will be created. **Note:** The response contains the complete collection of all emoji reactions for this activity. **Required permission:** - `add_work_package_comments` - for internal comments: `add_internal_comments` parameters: - name: id description: ID of the activity to toggle emoji reaction for in: path required: true schema: type: integer example: '1' requestBody: required: true content: application/hal+json: schema: type: object required: - reaction properties: reaction: type: string description: The emoji reaction identifier example: thumbs_up enum: - thumbs_up - thumbs_down - grinning_face_with_smiling_eyes - confused_face - heart - party_popper - rocket - eyes responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/EmojiReactionModel" '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:BadRequest message: 'Bad request: reaction does not have a valid value' description: Returned if the request is invalid. For example, if the reaction is not valid. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: Returned if the client does not have sufficient permissions to toggle the emoji reaction for the activity. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the activity does not exist or the client does not have sufficient permissions to see it. "/api/v3/attachments": post: responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/AttachmentModel" description: OK '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request could not be parsed as JSON. description: |- Returned if the client sends a not understandable request. Reasons include: * Omitting one of the required parts (metadata and file) * sending unparsable JSON in the metadata part '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this attachment. description: |- Returned if the client does not have sufficient permissions. **Required permission:** At least one permission in any project: edit work package, add work package, edit messages, edit wiki pages (plugins might extend this list) '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: File is too large (maximum size is 5242880 Bytes). description: |- Returned if the client tries to send an invalid attachment. Reasons are: * Omitting the file name (`fileName` property of metadata part) * Sending a file that is too large tags: - Attachments description: |- Clients can create attachments without a container first and attach them later on. This is useful if the container does not exist at the time the attachment is uploaded. After the upload, the client can then claim such containerless attachments for any resource eligible (e.g. WorkPackage) on subsequent requests. The upload and the claiming *must* be done for the same user account. Attachments uploaded by another user cannot be claimed and once claimed for a resource, they cannot be claimed by another. The upload request must be of type `multipart/form-data` with exactly two parts. The first part *must* be called `metadata`. Its content type is expected to be `application/json`, the body *must* be a single JSON object, containing at least the `fileName` and optionally the attachments `description`. The second part *must* be called `file`, its content type *should* match the mime type of the file. The body *must* be the raw content of the file. Note that a `filename` *must* be indicated in the `Content-Disposition` of this part, although it will be ignored. Instead the `fileName` inside the JSON of the metadata part will be used. operationId: create_attachment summary: Create Attachment "/api/v3/attachments/{id}": delete: parameters: - description: Attachment id example: 1 in: path name: id required: true schema: type: integer responses: '204': description: |- Returned if the attachment was deleted successfully. Note that the response body is empty as of now. In future versions of the API a body *might* be returned along with an appropriate HTTP status. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this attachment. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit permission for the container of the attachment or being the author for attachments without container *Note that you will only receive this error, if you are at least allowed to see the attachment.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified attachment does not exist. description: |- Returned if the attachment does not exist or the client does not have sufficient permissions to see it. **Required permission:** view permission for the container of the attachment or being the author for attachments without container *Note: A client without sufficient permissions shall not be able to test for the existence of an attachment. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Attachments description: Permanently deletes the specified attachment. operationId: delete_attachment summary: Delete attachment get: parameters: - description: Attachment id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/AttachmentModel" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified attachment does not exist. description: |- Returned if the attachment does not exist or the client does not have sufficient permissions to see it. **Required permission:** view permission for the container of the attachment or being the author for attachments without container *Note: A client without sufficient permissions shall not be able to test for the existence of an attachment. That's why a 404 is returned here, even if a 403 might be more appropriate.* tags: - Attachments description: '' operationId: view_attachment summary: View attachment "/api/v3/budgets/{id}": get: parameters: - description: Budget id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/budgets/1" title: Q3 2015 _type: Budget id: 1 subject: Q3 2015 schema: "$ref": "#/components/schemas/BudgetModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see this budget. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages **or** view budgets (on the budgets project) headers: {} tags: - Budgets description: '' operationId: view_Budget summary: view Budget "/api/v3/capabilities": get: parameters: - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. + action: Get all capabilities of a certain action + principal: Get all capabilities of a principal + context: Get all capabilities within a context. Note that for a workspace context the client needs to provide `w{id}`, e.g. `w5` and for the global context a `g`. + **Deprecation**: The now deprecated context `p` for project still works, but must eventually be replaced with the `w` for the workspace context. example: '[{ "principal": { "operator": "=", "values": ["1"] }" }]' in: query name: filters required: false schema: type: string - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by the capabilities id example: '[["id", "asc"]]' in: query name: sortBy required: false schema: default: '[["id", "asc"]]' type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: action: href: "/api/v3/actions/work_packages/create" title: Add work package context: href: "/api/v3/projects/123" title: A project principal: href: "/api/v3/users/567" title: Some user self: href: "/api/v3/capabilities/work_packages/create/w123-567" _type: Capability id: work_packages/create/w123-567 - _links: action: href: "/api/v3/actions/work_packages/assignee" context: href: "/api/v3/projects/123" title: A project principal: href: "/api/v3/users/567" title: Some user self: href: "/api/v3/capabilities/work_packages/assignee/w123-567" _type: Capability id: work_packages/assignee/w123-567 - _links: action: href: "/api/v3/actions/memberships/create" context: href: "/api/v3/portfolios/345" title: A portfolio principal: href: "/api/v3/users/821" title: Some user self: href: "/api/v3/capabilities/memberships/create/w345-821" title: Create members _type: Capability id: memberships/create/w345-821 - _links: context: href: "/api/v3/capabilities/context/global" title: Global principal: href: "/api/v3/users/567" title: Some user self: href: "/api/v3/capabilities/users/delete/g-567" title: Delete user _type: Capability id: users/delete/g-567 _links: changeSize: href: "/api/v3/capabilities?pageSize={size}" templated: true jumpTo: href: "/api/v3/capabilities?offset={offset}" templated: true self: href: "/api/v3/capabilities" _type: Collection count: 4 total: 4 schema: "$ref": "#/components/schemas/List_capabilitiesModel" description: OK headers: {} tags: - Actions & Capabilities description: Returns a collection of actions assigned to a principal in a context. The client can choose to filter the actions similar to how work packages are filtered. In addition to the provided filters, the server will reduce the result set to only contain actions, for which the requesting client has sufficient permissions operationId: List_capabilities summary: List capabilities "/api/v3/capabilities/context/global": get: responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/capabilities/context/global" _type: CapabilityContext::Global id: global schema: "$ref": "#/components/schemas/View_global_contextModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the action does not exist. headers: {} tags: - Actions & Capabilities description: Returns the global capability context. This context is necessary to consistently link to a context even if the context is not a project. operationId: View_global_context summary: View global context "/api/v3/capabilities/{id}": get: parameters: - description: capability id example: work_packages/create/p123-567 in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: action: href: "/api/v3/actions/work_packages/create" title: Add work package context: href: "/api/v3/projects/123" title: A project principal: href: "/api/v3/users/567" title: Some user self: href: "/api/v3/capabilities/work_packages/create/w123-567" _type: Capability id: work_packages/create/p123-567 schema: "$ref": "#/components/schemas/View_capabilitiesModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the capability does not exist. headers: {} tags: - Actions & Capabilities description: '' operationId: View_capabilities summary: View capabilities "/api/v3/categories/{id}": get: parameters: - description: Category id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: defaultAssignee: href: "/api/v3/users/42" title: John Sheppard project: href: "/api/v3/projects/11" title: Example project self: href: "/api/v3/categories/10" title: Category with assignee _type: Category id: 10 name: Foo schema: "$ref": "#/components/schemas/CategoryModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified category does not exist. description: |- Returned if the category does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project (defining the category) *Note: A client without sufficient permissions shall not be able to test for the existence of a category. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Categories description: '' operationId: View_Category summary: View Category "/api/v3/configuration": get: responses: '200': content: application/hal+json: examples: response: value: _type: Configuration _links: self: href: "/api/v3/configuration" userPreferences: href: "/api/v3/my_preferences" maximumAttachmentFileSize: 5242880 hostName: example.com:8080 perPageOptions: - 1 - 10 - 100 durationFormat: hours_only activeFeatureFlags: - aFeatureFlag - anotherFeatureFlag schema: "$ref": "#/components/schemas/ConfigurationModel" description: OK headers: {} tags: - Configuration description: '' operationId: View_configuration summary: View configuration "/api/v3/custom_actions/{id}": get: summary: Get a custom action tags: - Custom actions description: Retrieves a custom action by id. operationId: get_custom_action parameters: - name: id description: The id of the custom action to fetch in: path required: true schema: type: integer example: 42 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/CustomActionModel" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit work packages in any project '404': description: Returned if the custom action does not exist. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. "/api/v3/custom_actions/{id}/execute": post: parameters: - description: The id of the custom action to execute example: 1 in: path name: id required: true schema: type: integer responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit work packages - Additional permissions might be required based on the custom action. headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the custom action does not exist. headers: {} '406': "$ref": "#/components/responses/MissingContentType" '409': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict message: Couldn't update the resource because of conflicting modifications. description: Returned if the client provided an outdated lockVersion or no lockVersion at all. headers: {} '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: lag _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Lag must be a number greater than or equal to 0 description: Returned if the custom action was not executed successfully e.g. when a constraint on a work package property was violated. headers: {} tags: - Custom actions description: |- A POST to this endpoint executes the custom action on the work package provided in the payload. The altered work package will be returned. In order to avoid executing the custom action unbeknown to a change that has already taken place, the client has to provide the work package's current lockVersion. operationId: Execute_custom_action requestBody: content: application/json: schema: example: _links: workPackage: href: "/api/v3/work_packages/42" lockVersion: '3' properties: _links: properties: workPackage: properties: href: type: string type: object type: object lockVersion: type: string type: object summary: Execute custom action "/api/v3/custom_fields/{id}/items": get: summary: Get the custom field hierarchy items operationId: get_custom_field_items description: |- Retrieves the hierarchy of custom fields. The hierarchy is a tree structure of hierarchy items. It is represented as a flat list of items, where each item has a reference to its parent and children. The list is ordered in a depth-first manner. The first item is the requested parent. If parent was unset, the root item is returned as first element. Passing the `depth` query parameter allows to limit the depth of the hierarchy. If the depth is unset, the full hierarchy tree is returned. If the depth is set to `0`, only the requested parent is returned. Any other positive integer will return the number of children levels specified by this value. This endpoint only returns, if the custom field is of type `hierarchy`. parameters: - name: id description: The custom field's unique identifier in: path example: '42' required: true schema: type: integer - name: parent description: The identifier of the parent hierarchy item in: query example: '1337' required: false schema: type: integer - name: depth description: The level of hierarchy depth in: query example: '1' required: false schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/HierarchyItemCollectionModel" examples: simple response: "$ref": "#/components/examples/HierarchyItemCollectionResponse" filtered response: "$ref": "#/components/examples/HierarchyItemCollectionFilteredResponse" '403': description: Returned if the user is not logged in. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': description: Returned if the custom field does not exist or the user lacks the permission to view it. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '422': description: Returned if the custom field is not of type hierarchy. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:UnprocessableContent message: The requested custom field resource is of wrong type. "/api/v3/custom_field_items/{id}": get: summary: Get a custom field hierarchy item operationId: get_custom_field_item description: Retrieves a single custom field item specified by its unique identifier. parameters: - name: id description: The custom field item's unique identifier in: path example: 42 required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/HierarchyItemReadModel" examples: simple response: "$ref": "#/components/examples/HierarchyItemResponse" '403': description: Returned if the user is not logged in. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': description: |- Returned if the custom field item does not exist or the user lacks permission to see it. The permission required to view the item depends on the custom field it belongs to. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. "/api/v3/custom_field_items/{id}/branch": get: summary: Get a custom field hierarchy item's branch operationId: get_custom_field_item_branch description: |- Retrieves the branch of a single custom field item specified by its unique identifier. A branch is list of all ancestors, starting with the root item and finishing with the item itself. parameters: - name: id description: The custom field item's unique identifier in: path example: 42 required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/HierarchyItemCollectionModel" examples: simple response: "$ref": "#/components/examples/HierarchyItemCollectionResponse" '403': description: Returned if the user is not logged in. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': description: Returned if the custom field does not exist or the user lacks permission to view it. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '422': description: Returned if the custom field is not of type hierarchy. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:UnprocessableContent message: The requested custom field resource is of wrong type. "/api/v3/custom_options/{id}": get: parameters: - description: The custom option's identifier example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/custom_options/1" _type: CustomOption value: Foo schema: "$ref": "#/components/schemas/CustomOptionModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the custom option does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package in any project the custom option's custom field is active in. headers: {} tags: - Custom Options description: '' operationId: View_Custom_Option summary: View Custom Option "/api/v3/days/non_working": get: summary: Lists all non working days operationId: list_non_working_days tags: - Work Schedule description: |- Lists all one-time non working days, such as holidays. It does not lists the non working weekdays, such as each Saturday, Sunday. For listing the weekends, the `/api/v3/days` endpoint should be used. All days from current year are returned by default. parameters: - name: filters in: query description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + date: the inclusive date interval to scope days to look up. When unspecified, default is from the beginning to the end of current year. Example: `{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"] } }` would return days between May 5 and May 26 2022, inclusive. example: '[{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"] } }]' required: false schema: type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/NonWorkingDayCollectionModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" post: summary: Creates a non-working day (NOT IMPLEMENTED) operationId: create_non_working_day tags: - Work Schedule description: |- **(NOT IMPLEMENTED)** Marks a day as being a non-working day. Note: creating a non-working day will not affect the start and finish dates of work packages but will affect their duration. requestBody: content: application/json: schema: "$ref": "#/components/schemas/NonWorkingDayModel" example: _type: NonWorkingDay date: '2022-12-25' name: Christmas responses: '201': description: Non-working day created. content: application/hal+json: schema: "$ref": "#/components/schemas/NonWorkingDayModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: Returned if the client does not have sufficient permissions. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: You are not authorized to access this resource. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/days/non_working/{date}": get: summary: View a non-working day operationId: view_non_working_day tags: - Work Schedule description: Returns the non-working day information for a given date. parameters: - name: date in: path required: true description: The date of the non-working day to view in ISO 8601 format. schema: type: string format: date example: '2022-05-06' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/NonWorkingDayModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '404': description: Returned if the given date is not a non-working day. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. patch: summary: Update a non-working day attributes (NOT IMPLEMENTED) operationId: update_non_working_day tags: - Work Schedule description: |- **(NOT IMPLEMENTED)** Update the non-working day information for a given date. parameters: - name: date in: path required: true description: The date of the non-working day to view in ISO 8601 format. schema: type: string format: date example: '2022-05-06' requestBody: content: application/json: schema: "$ref": "#/components/schemas/NonWorkingDayModel" example: _type: NonWorkingDay date: '2022-05-01' name: Labour day responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/NonWorkingDayModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '404': description: Returned if the given date is not a non-working day. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" delete: summary: Removes a non-working day (NOT IMPLEMENTED) operationId: delete_non_working_day tags: - Work Schedule description: |- **(NOT IMPLEMENTED)** Removes the non-working day at the given date. Note: deleting a non-working day will not affect the start and finish dates of work packages but will affect their duration. parameters: - name: date in: path required: true description: The date of the non-working day to view in ISO 8601 format. schema: type: string format: date example: '2022-05-06' responses: '204': description: |- No Content. The operation succeeded. '400': "$ref": "#/components/responses/InvalidRequestBody" '404': description: Returned if the given date is not a non-working day. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/days/week": get: summary: Lists week days operationId: list_week_days tags: - Work Schedule description: Lists week days with work schedule information. responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/WeekDayCollectionModel" '400': "$ref": "#/components/responses/InvalidRequestBody" patch: summary: Update week days (NOT IMPLEMENTED) operationId: update_week_days tags: - Work Schedule description: |- **(NOT IMPLEMENTED)** Update multiple week days with work schedule information. requestBody: content: application/json: schema: "$ref": "#/components/schemas/WeekDayCollectionWriteModel" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/WeekDayCollectionModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '404': description: Returned if a week day resource can not be found. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/days/week/{day}": get: summary: View a week day operationId: view_week_day tags: - Work Schedule description: View a week day and its attributes. parameters: - name: day in: path required: true description: The week day from 1 to 7. 1 is Monday. 7 is Sunday. schema: type: integer minimum: 1 maximum: 7 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/WeekDayModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '404': description: Returned if the day is out of the 1-7 range. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. patch: summary: Update a week day attributes (NOT IMPLEMENTED) operationId: update_week_day description: |- **(NOT IMPLEMENTED)** Makes a week day a working or non-working day. Note: changing a week day working attribute will not affect the start and finish dates of work packages but will affect their duration attribute. tags: - Work Schedule parameters: - name: day in: path required: true description: The week day from 1 to 7. 1 is Monday. 7 is Sunday. schema: type: integer minimum: 1 maximum: 7 requestBody: content: application/json: schema: "$ref": "#/components/schemas/WeekDayWriteModel" example: _type: WeekDay working: false responses: '200': description: |- Update succeeded. Response will include the week day with updated attributes. content: application/hal+json: schema: "$ref": "#/components/schemas/WeekDayModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: Returned if the client does not have sufficient permissions. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: You are not authorized to access this resource. '404': description: Returned if the day is out of the 1-7 range. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/days": get: summary: Lists days operationId: list_days tags: - Work Schedule description: |- Lists days information for a given date interval. All days from the beginning of current month to the end of following month are returned by default. parameters: - name: filters in: query description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + date: the inclusive date interval to scope days to look up. When unspecified, default is from the beginning of current month to the end of following month. Example: `{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"] } }` would return days between May 5 and May 26 2022, inclusive. + working: when `true`, returns only the working days. When `false`, returns only the non-working days (weekend days and non-working days). When unspecified, returns both working and non-working days. Example: `{ "working": { "operator": "=", "values": ["t"] } }` would exclude non-working days from the response. example: '[{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"] } }, { "working": { "operator": "=", "values": ["f"] } }]' required: false schema: type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/DayCollectionModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/days/{date}": get: summary: View day operationId: view_day tags: - Work Schedule description: View the day information for a given date. parameters: - name: date in: path required: true description: The date of the non-working day to view in ISO 8601 format. schema: type: string format: date example: '2022-05-06' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/DayModel" '400': "$ref": "#/components/responses/InvalidRequestBody" "/api/v3/documents": get: parameters: - description: Page number inside the requested collection. example: '25' in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: '25' in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by primary key + created_at: Sort by document creation datetime example: '[["created_at", "asc"]]' in: query name: sortBy required: false schema: type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: addAttachment: href: "/api/v3/documents/1/attachments" method: post attachments: href: "/api/v3/documents/1/attachments" project: href: "/api/v3/projects/19" title: Some project self: href: "/api/v3/documents/1" title: Some document _type: Document createdAt: '2018-12-10T20:53:39.184Z' description: format: markdown html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. id: 1 title: Some other document - _links: addAttachment: href: "/api/v3/documents/2/attachments" method: post attachments: href: "/api/v3/documents/2/attachments" project: href: "/api/v3/projects/29" title: Some other project self: href: "/api/v3/documents/2" title: Some other document _type: Document createdAt: '2018-12-10T20:55:54.049Z' description: format: markdown html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. id: 2 title: Some other document _links: changeSize: href: "/api/v3/documents?offset=1&pageSize=%7Bsize%7D" templated: true jumpTo: href: "/api/v3/documents?offset=%7Boffset%7D&pageSize=30" templated: true self: href: "/api/v3/documents?offset=1&pageSize=30" _type: Collection count: 2 offset: 1 pageSize: 30 total: 2 schema: "$ref": "#/components/schemas/DocumentsModel" description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: - Filters Invalid filter does not exist. description: Returned if the client sends invalid request parameters e.g. filters headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. description: Returned if the client is not logged in and login is required. headers: {} tags: - Documents description: The documents returned depend on the provided parameters and also on the requesting user's permissions. operationId: List_Documents summary: List Documents "/api/v3/documents/{id}": get: parameters: - description: Document id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: attachments: _embedded...: elements: [] _links: self: href: "/api/v3/documents/1/attachments" _type: Collection count: 2 total: 2 project: _type: Project... _links: addAttachment: href: "/api/v3/documents/1/attachments" method: post attachments: href: "/api/v3/documents/1/attachments" project: href: "/api/v3/projects/19" title: Some project self: href: "/api/v3/documents/1" title: Some document _type: Document createdAt: '2018-12-10T20:53:39.698Z' description: format: markdown html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. id: 1 title: Some other document schema: "$ref": "#/components/schemas/DocumentModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the document does not exist or if the user does not have permission to view it. **Required permission** `view documents` in the project the document belongs to headers: {} tags: - Documents description: '' operationId: View_document summary: View document patch: parameters: - description: Document id example: '1' in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: type: object properties: title: type: string description: The title of the document description: type: object properties: raw: type: string description: The raw markdown content examples: request: value: title: Updated document title description: raw: Updated description content responses: '200': content: application/hal+json: examples: response: value: _embedded: attachments: _embedded...: elements: [] _links: self: href: "/api/v3/documents/1/attachments" _type: Collection count: 2 total: 2 project: _type: Project... _links: addAttachment: href: "/api/v3/documents/1/attachments" method: post attachments: href: "/api/v3/documents/1/attachments" project: href: "/api/v3/projects/19" title: Some project self: href: "/api/v3/documents/1" title: Updated document title _type: Document createdAt: '2018-12-10T20:53:39.698Z' description: format: markdown html: "

Updated description content

" raw: Updated description content id: 1 title: Updated document title schema: "$ref": "#/components/schemas/DocumentModel" description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:BadRequest message: The request body was invalid. description: Returned if the request body is invalid. headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the user does not have permission to edit the document. **Required permission** `manage documents` in the project the document belongs to headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the document does not exist or if the user does not have permission to view it. **Required permission** `view documents` in the project the document belongs to headers: {} '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Title can't be blank. _embedded: details: attribute: title description: Returned if the request body contains validation errors. headers: {} tags: - Documents description: Updates a document's attributes. operationId: Update_document summary: Update document "/api/v3/example/form": post: responses: '200': content: application/hal+json: examples: response: value: _embedded: payload: _links: status: href: "/api/v3/statuses/1" _type: Example lockVersion: 5 subject: An example title schema: _links: self: href: "/api/v3/example/schema" _type: Schema lockVersion: type: Integer writable: false status: _embedded: allowedValues: - _links: self: href: "/api/v3/statuses/1" _type: Status createdAt: '2014-05-21T08:51:20.396Z' defaultDoneRatio: 0 id: 1 isClosed: false isDefault: true name: New position: 1 updatedAt: '2014-05-21T09:12:00.647Z' - _links: self: href: "/api/v3/statuses/2" _type: Status createdAt: '2014-05-21T08:51:20.396Z' defaultDoneRatio: 100 id: 2 isClosed: true isDefault: false name: Closed position: 2 updatedAt: '2014-05-21T09:12:00.647Z' _links: allowedValues: - href: "/api/v3/statuses/1" title: New - href: "/api/v3/statuses/2" title: Closed type: Status subject: maxLength: 255 minLength: 1 type: String validationErrors: subject: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:BadExampleError message: For the purpose of this example we need a validation error. The remainder of the response pretends there were no errors. _links: commit: href: "/api/v3/example" method: PATCH previewMarkup: href: "/api/v3/render/markdown" method: POST self: href: "/api/v3/example/form" validate: href: "/api/v3/example/form" method: POST _type: Form schema: "$ref": "#/components/schemas/Example_FormModel" description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request body was neither empty, nor did it contain a single JSON object. description: |- Occurs when the client did not send a valid JSON object in the request body and the request body was not empty. Note that this error only occurs when the content is not at all a single JSON object. It **does not occur** for requests containing undefined properties or invalid property values. headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to edit example resources. description: Returned if the client does not have sufficient permissions to modify the associated resource. headers: {} '406': "$ref": "#/components/responses/MissingContentType" '409': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict message: The resource you are about to edit was changed in the meantime. description: Returned if underlying resource was changed since the client requested the form. This is determined using the `lockVersion` property. headers: {} '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Forms description: This is an example of how a form might look like. Note that this endpoint does not exist in the actual implementation. operationId: show_or_validate_form requestBody: content: application/json: schema: example: _type: Example lockVersion: 5 subject: An example title properties: _type: type: string lockVersion: type: number subject: type: string type: object summary: show or validate form "/api/v3/example/schema": get: responses: '200': content: application/hal+json: examples: response: value: _dependencies: [] _links: self: href: "/api/v3/example/schema" _type: Schema lockVersion: name: Resource Version type: Integer writable: false status: _embedded: allowedValues: - _links: self: href: "/api/v3/statuses/1" _type: Status createdAt: '2014-05-21T08:51:20.396Z' defaultDoneRatio: 0 id: 1 isClosed: false isDefault: true name: New position: 1 updatedAt: '2014-05-21T09:12:00.441Z' - _links: self: href: "/api/v3/statuses/2" _type: Status createdAt: '2014-05-21T08:51:20.396Z' defaultDoneRatio: 100 id: 2 isClosed: true isDefault: false name: Closed position: 2 updatedAt: '2014-05-21T09:12:00.441Z' _links: allowedValues: - href: "/api/v3/statuses/1" title: New - href: "/api/v3/statuses/2" title: Closed location: _links name: Status type: Status subject: maxLength: 255 minLength: 1 name: Subject type: String schema: "$ref": "#/components/schemas/Example_SchemaModel" description: OK headers: {} tags: - Schemas description: This is an example of how a schema might look like. Note that this endpoint does not exist in the actual implementation. operationId: view_the_schema summary: view the schema "/api/v3/examples": get: parameters: - description: |- The column to group by. Note: Aggregation is as of now only supported by the work package collection. You can pass any column name as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. example: status in: query name: groupBy required: false schema: type: string - description: '' example: true in: query name: showSums required: false schema: default: false type: boolean responses: '200': description: OK headers: {} tags: - Collections description: '' operationId: view_aggregated_result summary: view aggregated result "/api/v3/file_links/{id}": get: summary: Gets a file link. operationId: view_file_link tags: - File links description: Gets a single file link resource of a work package. parameters: - name: id description: File link id in: path required: true schema: type: integer example: 42 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/FileLinkReadModel" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package, view file links delete: summary: Removes a file link. operationId: delete_file_link tags: - File links description: |- Removes a file link on a work package. The request contains only the file link identifier as a path parameter. No request body is needed. parameters: - name: id description: File link id in: path required: true schema: type: integer example: 42 responses: '200': description: OK '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage file links *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package or the file link does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package, view file links "/api/v3/file_links/{id}/open": get: summary: Creates an opening uri of the linked file. operationId: open_file_link tags: - File links description: |- Creates a uri to open the origin file linked by the given file link. This uri depends on the storage type and is always located on the origin storage itself. parameters: - name: id description: File link id in: path required: true schema: type: integer example: 42 - name: location description: Boolean flag indicating, if the file should be opened directly or rather the directory location. in: query required: false schema: type: boolean example: true responses: '303': headers: Location: schema: type: string format: uri description: |- Returned if the request was successful. In the `Location` header is the uri where the client can open the origin file on the storage. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package, view file links "/api/v3/file_links/{id}/download": get: summary: Creates a download uri of the linked file. operationId: download_file_link tags: - File links description: |- Creates a uri to download the origin file linked by the given file link. This uri depends on the storage type and is always located on the origin storage itself. parameters: - name: id description: File link id in: path required: true schema: type: integer example: 42 responses: '303': headers: Location: schema: type: string format: uri description: |- Returned if the request was successful. In the `Location` header is the uri where the client can download the origin file from the storage. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package, view file links "/api/v3/grids": get: summary: List grids tags: - Grids description: |- Lists all grids matching the provided filters and being part of the selected query page. The grids returned will also depend on the permissions of the requesting user. operationId: list_grids parameters: - name: offset schema: type: integer default: 1 description: Page number inside the requested collection. in: query required: false example: 25 - name: pageSize schema: type: integer default: 30 description: Number of elements to display per page. in: query required: false example: 25 - name: filters schema: type: string description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: - page: Filter grid by work package in: query required: false example: '[{ "page": { "operator": "=", "values": ["/my/page"] } }]' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/GridCollectionModel" examples: Simple grid collection: "$ref": "#/components/examples/GridSimpleCollectionResponse" '400': "$ref": "#/components/responses/InvalidQuery" '403': description: Returned if the client is not logged in and login is required. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. post: summary: Create a grid operationId: create_grid tags: - Grids description: |- Creates a new grid applying the attributes provided in the body. The constraints applied to the grid depend on the page the grid is placed in which is why the create form endpoint should be used to be guided when wanting to create a grid. requestBody: content: application/json: schema: "$ref": "#/components/schemas/GridWriteModel" examples: Simple grid creation: "$ref": "#/components/examples/GridSimplePatchModel" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/GridReadModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Depends on the page the grid is defined for. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/grids/form": post: responses: '200': description: OK headers: {} tags: - Grids description: '' operationId: Grid_Create_Form summary: Grid Create Form "/api/v3/grids/{id}": get: summary: Get a grid operationId: get_grid tags: - Grids description: Fetches a single grid identified by its id. parameters: - name: id in: path description: Grid id required: true schema: type: integer example: '42' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/GridReadModel" examples: Simple grid: "$ref": "#/components/examples/GridSimpleResponse" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the Grid does not exist or if the user does not have permission to view it. **Required permission** depends on the page the grid is defined for patch: summary: Update a grid operationId: update_grid tags: - Grids description: |- Updates the given grid by applying the attributes provided in the body. The constraints applied to the grid depend on the page the grid is placed in which is why the create form endpoint should be used to be guided when wanting to update a grid. parameters: - name: id in: path description: Grid id required: true schema: type: integer example: '42' requestBody: content: application/json: schema: "$ref": "#/components/schemas/GridWriteModel" examples: Simple grid patch: "$ref": "#/components/examples/GridSimplePatchModel" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/GridReadModel" examples: Simple grid: "$ref": "#/components/examples/GridSimpleResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** The permission depends on the page the grid is placed in. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/grids/{id}/form": post: parameters: - description: ID of the grid being modified example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: type: object examples: response: value: _embedded: payload: columnCount: 5 rowCount: 6 widgets: - _type: GridWidget endColumn: 3 endRow: 8 identifier: time_entries_current_user startColumn: 1 startRow: 1 - _type: GridWidget endColumn: 5 endRow: 8 identifier: news startColumn: 4 startRow: 3 - _type: GridWidget endColumn: 6 endRow: 3 identifier: documents startColumn: 3 startRow: 1 schema: _links: {} _type: Schema columnCount: hasDefault: false name: Number of columns required: true type: Integer writable: true createdAt: hasDefault: false name: Created on required: true type: DateTime writable: false id: hasDefault: false name: ID required: true type: Integer writable: false rowCount: hasDefault: false name: Number of rows required: true type: Integer writable: true scope: _links: {} hasDefault: false name: Page required: true type: Href writable: false updatedAt: hasDefault: false name: Updated on required: true type: DateTime writable: false widgets: _links: {} hasDefault: false name: Widgets required: true type: "[]GridWidget" writable: true validationErrors: widgets: _embedded: errors: - _embedded: details: attribute: widgets _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Widgets is outside of the grid. - _embedded: details: attribute: widgets _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Widgets is outside of the grid. _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MultipleErrors message: Multiple field constraints have been violated. _links: self: href: "/api/v3/grids/2/form" method: post validate: href: "/api/v3/grids/2/form" method: post _type: Form description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** depends on the page the grid is defined for. *Note that you will only receive this error, if you are at least allowed to see the corresponding grid.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the grid does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Grids description: '' operationId: Grid_Update_Form summary: Grid Update Form "/api/v3/groups": get: summary: List groups operationId: list_groups tags: - Groups description: |- Returns a collection of groups. The client can choose to filter the groups similar to how work packages are filtered. In addition to the provided filters, the server will reduce the result set to only contain groups, for which the requesting client has sufficient permissions (*view_members*, *manage_members*). parameters: - name: sortBy description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by primary key + created_at: Sort by group creation datetime + updated_at: Sort by the time the group was updated last in: query required: false example: '[["id", "asc"]]' schema: default: '[["id", "asc"]]' type: string - name: select description: Comma separated list of properties to include. in: query required: false example: total,elements/name,elements/self,self schema: type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/GroupCollectionModel" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** View members or manage members in any project content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. post: summary: Create group operationId: create_group tags: - Groups description: Creates a new group applying the attributes provided in the body. requestBody: content: application/json: schema: "$ref": "#/components/schemas/GroupWriteModel" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/GroupModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name can't be blank. "/api/v3/groups/{id}": delete: summary: Delete group operationId: delete_group tags: - Groups description: Deletes the group. parameters: - name: id description: Group id example: 1 in: path required: true schema: type: integer responses: '202': description: |- Returned if the group was marked for deletion. Note that the response body is empty as of now. In future versions of the API a body *might* be returned, indicating the progress of deletion. '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': description: |- Returned if the group does not exist or the client does not have sufficient permissions to see it. **Required permission:** Administrator *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" get: summary: Get group operationId: get_group tags: - Groups description: Fetches a group resource. parameters: - name: id description: Group id example: 1 in: path required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/GroupModel" examples: group response: "$ref": "#/components/examples/GroupResponse" '404': description: |- Returned if the group does not exist or if the API user does not have permission to view them. **Required permission** If the user has the *manage members* permission in at least one project the user will be able to query all groups. If not, the user will be able to query all groups which are members in projects, he has the *view members* permission in. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. patch: summary: Update group operationId: update_group tags: - Groups description: |- Updates the given group by applying the attributes provided in the body. Please note that the `members` array provided will override the existing set of members (similar to a PUT). A client thus has to provide the complete list of members the group is to have after the PATCH even if only one member is to be added. parameters: - name: id description: Group id example: 1 in: path required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/GroupWriteModel" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/GroupModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': description: |- Returned if the group does not exist or the client does not have sufficient permissions to see it. **Required permission** If the user has the *manage members* permission in at least one project the user will be able to query all groups. If not, the user will be able to query all groups which are members in projects, he has the *view members* permission in. *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: members _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Member is already taken. "/api/v3/help_texts": get: summary: List help texts operationId: list_help_texts tags: - Help texts description: List the complete collection of help texts. responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/HelpTextCollectionModel" "/api/v3/help_texts/{id}": get: summary: Get help text operationId: get_help_text tags: - Help texts description: Fetches the help text from the given id. parameters: - name: id description: Help text id example: 1 in: path required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/HelpTextModel" '404': description: Returned if the help text does not exist. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. "/api/v3/meetings": get: summary: List all visible meetings operationId: list_meetings tags: - Meetings description: Retrieve a paginated collection of meetings visible to the authenticated user. responses: '200': description: OK content: application/hal+json: examples: response: "$ref": "#/components/examples/MeetingCollectionSimpleResponse" schema: "$ref": "#/components/schemas/MeetingCollectionModel" "/api/v3/meetings/{id}": get: summary: Get a meeting operationId: get_meeting tags: - Meetings description: Retrieve an individual meeting as identified by the id parameter parameters: - description: Meeting identifier example: 1 in: path name: id required: true schema: type: integer responses: '200': description: OK content: application/hal+json: examples: response: "$ref": "#/components/examples/MeetingSimpleResponse" schema: "$ref": "#/components/schemas/MeetingModel" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the meeting does not exist or the client does not have sufficient permissions to see it. **Required permission:** view meetings in the page's project "/api/v3/meetings/{id}/attachments": get: parameters: - description: ID of the meeting whose attachments will be listed example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: author: href: "/api/v3/users/1" title: OpenProject Admin container: href: "/api/v3/meetings/72" title: meeting delete: href: "/api/v3/attachments/376" method: delete downloadLocation: href: "/api/v3/attachments/376/content" self: href: "/api/v3/attachments/376" title: 200.gif _type: Attachment contentType: image/gif createdAt: '2018-06-01T07:24:19.896Z' description: format: plain html: '' raw: '' digest: algorithm: md5 hash: 7ac9c97ef73d47127f590788b84c0c1c fileName: some.gif fileSize: 3521772 id: 376 _links: self: href: "/api/v3/meetings/72/attachments" _type: Collection count: 1 total: 1 schema: "$ref": "#/components/schemas/Attachments_Model" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the meeting does not exist or the client does not have sufficient permissions to see it. **Required permission:** view meetings *Note: A client without sufficient permissions shall not be able to test for the existence of a meeting. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Attachments description: '' operationId: List_attachments_by_meeting summary: List attachments by meeting post: parameters: - description: ID of the meeting to receive the attachment example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: author: _links: lock: href: "/api/v3/users/1/lock" method: post title: Set lock on admin self: href: "/api/v3/users/1" title: OpenProject Admin showUser: href: "/users/1" type: text/html updateImmediately: href: "/api/v3/users/1" method: patch title: Update admin _type: User admin: true avatar: '' createdAt: '2015-03-20T12:56:52.343Z' email: firstName: OpenProject id: 1 identityUrl: lastName: Admin login: admin name: OpenProject Admin status: active updatedAt: '2018-05-29T13:57:44.662Z' container: _links: addAttachment: href: "/api/v3/meetings/72/attachments" method: post attachments: href: "/api/v3/meetings/72/attachments" project: href: "/api/v3/projects/12" title: Demo project self: href: "/api/v3/meetings/72" _type: Meeting id: 72 title: meeting _links: author: href: "/api/v3/users/1" title: OpenProject Admin container: href: "/api/v3/meetings/72" title: meeting delete: href: "/api/v3/attachments/376" method: delete downloadLocation: href: "/api/v3/attachments/376/content" self: href: "/api/v3/attachments/376" title: 200.gif _type: Attachment contentType: image/gif createdAt: '2018-06-01T07:24:19.896Z' description: format: plain html: '' raw: '' digest: algorithm: md5 hash: 7ac9c97ef73d47127f590788b84c0c1c fileName: some.gif fileSize: 3521772 id: 376 description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request could not be parsed as JSON. description: |- Returned if the client sends a not understandable request. Reasons include: * Omitting one of the required parts (metadata and file) * sending unparsable JSON in the metadata part headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this attachment. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit meetings *Note that you will only receive this error, if you are at least allowed to see the meeting* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the meeting does not exist or the client does not have sufficient permissions to see it. **Required permission:** view meetings *Note: A client without sufficient permissions shall not be able to test for the existence of a meeting That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: File is too large (maximum size is 5242880 Bytes). description: |- Returned if the client tries to send an invalid attachment. Reasons are: * Omitting the file name (`fileName` property of metadata part) * Sending a file that is too large headers: {} tags: - Attachments description: Adds an attachment with the meeting as its container. operationId: Add_attachment_to_meeting summary: Add attachment to meeting "/api/v3/memberships": get: summary: List memberships operationId: list_memberships tags: - Memberships description: |- Returns a collection of memberships. The client can choose to filter the memberships similar to how work packages are filtered. In addition to the provided filters, the server will reduce the result set to only contain memberships, for which the requesting client has sufficient permissions (*view_members*, *manage_members*). parameters: - name: filters in: query required: false schema: type: string description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + any_name_attribute: filters memberships based on the name of the principal. All possible name variants (and also email and login) are searched. + blocked: reduces the result set to all memberships that are temporarily blocked or that are not blocked temporarily. + group: filters memberships based on the name of a group. The group however is not the principal used for filtering. Rather, the memberships of the group are used as the filter values. + name: filters memberships based on the name of the principal. Note that only the name is used which depends on a setting in the OpenProject instance. + principal: filters memberships based on the id of the principal. + project: filters memberships based on the id of the project. + role: filters memberships based on the id of any role assigned to the membership. + status: filters memberships based on the status of the principal. + created_at: filters memberships based on the time the membership was created. + updated_at: filters memberships based on the time the membership was updated last. examples: name-filter: summary: Filtering on the name of the principal value: '[{ "name": { "operator": "=", "values": ["A User"] }" }]' global-memberships: summary: Get memberships for global roles value: '[{ "project": { "operator": "!*", "values": null }" }]' - name: sortBy in: query required: false schema: default: '[["id", "asc"]]' type: string description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by primary key + name: Sort by the name of the principal. Note that this depends on the setting for how the name is to be displayed at least for users. + email: Sort by the email address of the principal. Groups and principal users, which do not have an email, are sorted last. + status: Sort by the status of the principal. Groups and principal users, which do not have a status, are sorted together with the active users. + created_at: Sort by membership creation datetime + updated_at: Sort by the time the membership was updated last example: '[["id", "asc"]]' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipCollectionModel" examples: simple membership collection: "$ref": "#/components/examples/MembershipSimpleCollectionResponse" '400': "$ref": "#/components/responses/InvalidQuery" '403': description: Returned if the client is not logged in and login is required. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. post: summary: Create a membership operationId: create_membership tags: - Memberships description: |- Creates a new membership applying the attributes provided in the body. You can use the form and schema to retrieve the valid attribute values and by that be guided towards successful creation. By providing a `notificationMessage` within the `_meta` block of the payload, the client can include a customized message to the user of the newly created membership. In case of a group, the message will be sent to every user belonging to the group. By including `{ "sendNotifications": false }` within the `_meta` block of the payload, no notifications is send out at all. requestBody: content: application/json: schema: "$ref": "#/components/schemas/MembershipWriteModel" examples: global role: "$ref": "#/components/examples/MembershipCreateRequestGlobalRole" no notification: "$ref": "#/components/examples/MembershipCreateRequestNoNotification" custom message: "$ref": "#/components/examples/MembershipCreateRequestCustomMessage" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipReadModel" examples: simple membership: "$ref": "#/components/examples/MembershipSimpleResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Manage members '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: project _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Project can't be blank. description: |- Returned if: - a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/memberships/available_projects": get: summary: Available projects for memberships operationId: get_memberships_available_projects tags: - Memberships description: |- Gets a list of projects in which a membership can be created in. The list contains all projects in which the user issuing the request has the manage members permissions. responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectCollectionModel" examples: simple project collection: "$ref": "#/components/examples/ProjectCollection" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage members "/api/v3/memberships/form": post: summary: Form create membership operationId: form_create_membership tags: - Memberships description: |- Requests and validates the creation form for memberships. The request payload, if sent, is validated. The form endpoint itself does not create a membership. requestBody: content: application/json: schema: "$ref": "#/components/schemas/MembershipWriteModel" examples: global role: "$ref": "#/components/examples/MembershipCreateRequestGlobalRole" no notification: "$ref": "#/components/examples/MembershipCreateRequestNoNotification" custom message: "$ref": "#/components/examples/MembershipCreateRequestCustomMessage" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipFormModel" examples: form: "$ref": "#/components/examples/MembershipFormResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage memberships in any project '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/memberships/schema": get: summary: Schema membership operationId: get_membership_schema tags: - Memberships description: Retrieves the schema for the membership resource object. responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipSchemaModel" examples: schema: "$ref": "#/components/examples/MembershipSchemaResponse" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see the schema. **Required permission:** manage members or view memberships on any project "/api/v3/memberships/{id}": delete: summary: Delete membership operationId: delete_membership tags: - Memberships description: Deletes the membership. parameters: - name: id description: Membership id in: path required: true example: 1 schema: type: integer responses: '204': description: Returned if the membership was successfully deleted '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage members content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the membership does not exist or the client does not have sufficient permissions to see it. **Required permission:** view members *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" get: summary: Get a membership operationId: get_membership description: Retrieves a membership resource identified by the given id. tags: - Memberships parameters: - name: id description: Membership id in: path required: true example: 1 schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipReadModel" examples: simple membership: "$ref": "#/components/examples/MembershipSimpleResponse" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the membership does not exist or the client does not have sufficient permissions to see it. **Required permission:** view members **or** manage members *Note: A client without sufficient permissions shall not be able to test for the existence of a membership. That's why a 404 is returned here, even if a 403 might be more appropriate.* patch: summary: Update membership operationId: update_membership description: |- Updates the given membership by applying the attributes provided in the body. By providing a `notificationMessage` within the `_meta` block of the payload, the client can include a customized message to the user of the updated membership. In case of a group, the message will be sent to every user belonging to the group. By including `{ "sendNotifications": false }` within the `_meta` block of the payload, no notifications is send out at all. tags: - Memberships parameters: - name: id description: Membership id in: path required: true example: 1 schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/MembershipWriteModel" examples: add roles: "$ref": "#/components/examples/MembershipUpdateAdditionalRoles" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipReadModel" examples: simple membership: "$ref": "#/components/examples/MembershipSimpleResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Manage members in the membership's project. headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the membership does not exist or the client does not have sufficient permissions to see it. **Required permission:** view member *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: roles _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Roles has an unassignable role. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/memberships/{id}/form": post: summary: Form update membership operationId: form_update_membership tags: - Memberships description: |- Requests and validates the update form for a membership identified by the given id. The request payload, if sent, is validated. The form endpoint itself does not change the membership. parameters: - name: id description: Membership id in: path required: true example: 1 schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/MembershipWriteModel" examples: no notification: "$ref": "#/components/examples/MembershipCreateRequestNoNotification" custom message: "$ref": "#/components/examples/MembershipCreateRequestCustomMessage" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/MembershipReadModel" examples: simple membership: "$ref": "#/components/examples/MembershipSimpleResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage versions in the version's project '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/my_preferences": get: responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/my_preferences" user: href: "/api/v3/users/1" title: John Sheppard updateImmediately: href: "/api/v3/users/3/preferences" method: patch _type: UserPreferences commentSortDescending: true disableKeyboardShortcuts: false timeZone: Europe/Berlin warnOnLeavingUnsaved: true notifications: watched: false involved: true mentioned: false shared: true newsAdded: false, newsCommented: false documentAdded: false forumMessages: false wikiPageAdded: false wikiPageUpdated: false membershipAdded: false membershipUpdated: false workPackageCommented: false workPackageProcessed: false workPackagePrioritized: false workPackageScheduled: false _links: project: href: schema: "$ref": "#/components/schemas/UserPreferencesModel" description: OK headers: {} '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if no user is currently authenticated headers: {} tags: - UserPreferences description: '' operationId: Show_my_preferences summary: Show my preferences patch: responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/my_preferences" user: href: "/api/v3/users/1" title: John Sheppard updateImmediately: href: "/api/v3/users/3/preferences" method: patch _type: UserPreferences commentSortDescending: true disableKeyboardShortcuts: false timeZone: Europe/Berlin warnOnLeavingUnsaved: true notifications: watched: false involved: true mentioned: false shared: true newsAdded: false, newsCommented: false documentAdded: false forumMessages: false wikiPageAdded: false wikiPageUpdated: false membershipAdded: false membershipUpdated: false workPackageCommented: false workPackageProcessed: false workPackagePrioritized: false workPackageScheduled: false _links: project: href: schema: "$ref": "#/components/schemas/UserPreferencesModel" description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if no user is currently authenticated headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Time zone is not set to one of the allowed values. description: |- Returned if the update contains invalid properties. Reasons are: * Specifying an invalid type * Using an unknown time zone headers: {} tags: - UserPreferences description: When calling this endpoint the client provides a single object, containing the properties that it wants to change, in the body. operationId: Update_UserPreferences requestBody: content: application/json: schema: example: autoHidePopups: true timeZone: Europe/Paris properties: autoHidePopups: type: boolean timeZone: type: string type: object summary: Update my preferences "/api/v3/news": get: parameters: - description: Page number inside the requested collection. example: 25 in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: 25 in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by primary key + created_at: Sort by news creation datetime example: '[["created_at", "asc"]]' in: query name: sortBy required: false schema: type: string - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + project_id: Filter news by project example: '[{ "project_id": { "operator": "=", "values": ["1", "2"] } }]' in: query name: filters required: false schema: type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: author: href: "/api/v3/users/2" title: Peggie Feeney project: href: "/api/v3/projects/1" title: Seeded Project self: href: "/api/v3/news/1" title: asperiores possimus nam doloribus ab _type: News createdAt: '2015-03-20T12:57:01.209Z' description: format: markdown html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. id: 1 summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus. Comparo crapula depopulo demonstro. title: asperiores possimus nam doloribus ab - _links: author: href: "/api/v3/users/2" title: Peggie Feeney project: href: "/api/v3/projects/1" title: Seeded Project self: href: "/api/v3/news/2" title: terminatio tutamen. Officia adeptio sp _type: News createdAt: '2015-03-20T12:57:01.262Z' description: format: markdown html: "

Amicitia alius cattus voluntarius. Virgo viduo terminatio tutamen. Officia adeptio spectaculum atavus nisi cum concido bis. Harum caecus auxilium sol theatrum eaque consequatur. Omnis aeger suus adipisci cicuta. Cur delicate alias curto cursim atqui talio fugiat.

" raw: Amicitia alius cattus voluntarius. Virgo viduo terminatio tutamen. Officia adeptio spectaculum atavus nisi cum concido bis. Harum caecus auxilium sol theatrum eaque consequatur. Omnis aeger suus adipisci cicuta. Cur delicate alias curto cursim atqui talio fugiat. id: 2 summary: Consequatur sequi surculus creo tui aequitas. title: terminatio tutamen. Officia adeptio sp _links: changeSize: href: "/api/v3/news?offset=1&pageSize=%7Bsize%7D" templated: true jumpTo: href: "/api/v3/news?offset=%7Boffset%7D&pageSize=2" templated: true nextByOffset: href: "/api/v3/news?offset=2&pageSize=2" self: href: "/api/v3/news?offset=1&pageSize=2" _type: Collection count: 2 offset: 1 pageSize: 2 total: 78 schema: "$ref": "#/components/schemas/List_of_NewsModel" description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. description: Returned if the client is not logged in and login is required. headers: {} tags: - News description: Lists news. The news returned depend on the provided parameters and also on the requesting user's permissions. operationId: List_News summary: List News post: summary: Create News operationId: create_news tags: - News description: |- Creates a news entry. Only administrators and users with "Manage news" permission in the given project are eligible. When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. requestBody: content: application/json: schema: "$ref": "#/components/schemas/NewsCreateModel" responses: '201': content: application/hal+json: schema: "$ref": "#/components/schemas/NewsModel" description: Created '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to create new news. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator, Manage news permission in the project '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: title _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Title can't be blank. description: |- Returned if: * the client tries to modify a read-only property (`PropertyIsReadOnly`) * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/news/{id}": get: parameters: - description: news id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: author: _type: User... project: _type: Project... _links: author: href: "/api/v3/users/2" title: Peggie Feeney project: href: "/api/v3/projects/1" title: A project self: href: "/api/v3/news/1" title: asperiores possimus nam doloribus ab _type: News createdAt: '2015-03-20T12:57:01.601Z' description: format: markdown html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. id: 1 summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus. Comparo crapula depopulo demonstro. title: asperiores possimus nam doloribus ab schema: "$ref": "#/components/schemas/NewsModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the news does not exist or if the user does not have permission to view it. **Required permission** being member of the project the news belongs to headers: {} tags: - News description: '' operationId: View_news summary: View news patch: summary: Update news operationId: update_news tags: - News description: |- Updates the news's writable attributes. When calling this endpoint the client provides a single object, containing the properties and links to be updated, in the body. parameters: - description: News id example: 1 in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/NewsCreateModel" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/NewsModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to update this news. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrators, Manage news permission '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified news does not exist or you do not have permission to view it. description: |- Returned if the news entry does not exist or if the API user does not have the necessary permissions to update it. **Required permission:** Administrators, Manage news permission '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: title _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Title can't be blank. description: |- Returned if: * the client tries to modify a read-only property (`PropertyIsReadOnly`) * a constraint for a property was violated (`PropertyConstraintViolation`) delete: summary: Delete news operationId: delete_news description: Permanently deletes the specified news entry. tags: - News parameters: - description: News id example: 1 in: path name: id required: true schema: type: integer responses: '202': description: |- Returned if the news was deleted successfully. Note that the response body is empty as of now. In future versions of the API a body *might* be returned, indicating the progress of deletion. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this news entry description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrators and Manage news permission '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified news does not exist. description: Returned if the news does not exist. "/api/v3/notifications": get: summary: Get notification collection operationId: list_notifications tags: - Notifications description: |- Returns the collection of available in-app notifications. The notifications returned depend on the provided parameters and also on the requesting user's permissions. Contrary to most collections, this one also links to and embeds schemas for the `details` properties of the notifications returned. This is an optimization. Clients will receive the information necessary to display the various types of details that a notification can carry. parameters: - name: offset description: Page number inside the requested collection. in: query example: 25 required: false schema: default: 1 type: integer - name: pageSize description: Number of elements to display per page. in: query example: 25 required: false schema: default: 20 type: integer - name: sortBy in: query description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by primary key + reason: Sort by notification reason + readIAN: Sort by read status example: '[["reason", "asc"]]' required: false schema: type: string - name: groupBy in: query description: |- string specifying group_by criteria. + reason: Group by notification reason + project: Sort by associated project example: reason required: false schema: type: string - name: filters in: query description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + id: Filter by primary key + project: Filter by the project the notification was created in + readIAN: Filter by read status + reason: Filter by the reason, e.g. 'mentioned' or 'assigned' the notification was created because of + resourceId: Filter by the id of the resource the notification was created for. Ideally used together with the `resourceType` filter. + resourceType: Filter by the type of the resource the notification was created for. Ideally used together with the `resourceId` filter. example: '[{ "readIAN": { "operator": "=", "values": ["t"] } }]' required: false schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/NotificationCollectionModel" examples: Collection of notifications: "$ref": "#/components/examples/NotificationCollection" description: OK '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. description: Returned if the client is not logged in and login is required. '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. description: Returned if the client sends invalid request parameters e.g. filters "/api/v3/notifications/read_ian": post: summary: Read all notifications operationId: read_notifications tags: - Notifications description: |- Marks the whole notification collection as read. The collection contains only elements the authenticated user can see, and can be further reduced with filters. parameters: - name: filters in: query description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + id: Filter by primary key + project: Filter by the project the notification was created in + reason: Filter by the reason, e.g. 'mentioned' or 'assigned' the notification was created because of + resourceId: Filter by the id of the resource the notification was created for. Ideally used together with the `resourceType` filter. + resourceType: Filter by the type of the resource the notification was created for. Ideally used together with the `resourceId` filter. example: '[{ "reason": { "operator": "=", "values": ["mentioned"] } }]' required: false schema: type: string responses: '204': description: OK '400': description: Returned if the request is not properly formatted. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: - Filters Invalid filter does not exist. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/notifications/unread_ian": post: summary: Unread all notifications operationId: unread_notifications tags: - Notifications description: |- Marks the whole notification collection as unread. The collection contains only elements the authenticated user can see, and can be further reduced with filters. parameters: - name: filters in: query description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + id: Filter by primary key + project: Filter by the project the notification was created in + reason: Filter by the reason, e.g. 'mentioned' or 'assigned' the notification was created because of + resourceId: Filter by the id of the resource the notification was created for. Ideally used together with the `resourceType` filter. + resourceType: Filter by the type of the resource the notification was created for. Ideally used together with the `resourceId` filter. example: '[{ "reason": { "operator": "=", "values": ["mentioned"] } }]' required: false schema: type: string responses: '204': description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/notifications/{id}": get: summary: Get the notification operationId: view_notification tags: - Notifications description: Returns the notification identified by the notification id. parameters: - name: id in: path description: notification id example: 1 required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/NotificationModel" examples: Date alert notification: "$ref": "#/components/examples/DateAlertNotification" Mentioned notification: "$ref": "#/components/examples/MentionedNotification" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the notification does not exist or if the user does not have permission to view it. **Required permission** being recipient of the notification "/api/v3/notifications/{notification_id}/details/{id}": get: summary: Get a notification detail operationId: view_notification_detail tags: - Notifications - Values::Property description: Returns an individual detail of a notification identified by the notification id and the id of the detail. parameters: - name: notification_id in: path description: notification id example: 1 required: true schema: type: integer - name: id in: path description: detail id example: 0 required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/ValuesPropertyModel" examples: Start date notification detail: "$ref": "#/components/examples/ValuesPropertyStartDate" Due date notification detail: "$ref": "#/components/examples/ValuesPropertyDueDate" Date notification detail for milestone work package: "$ref": "#/components/examples/ValuesPropertyDate" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the notification or the detail of it does not exist or if the user does not have permission to view it. **Required permission** being recipient of the notification "/api/v3/notifications/{id}/read_ian": post: summary: Read notification operationId: read_notification tags: - Notifications description: Marks the given notification as read. parameters: - name: id in: path description: notification id example: '1' required: true schema: type: integer responses: '204': description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the notification does not exist or if the user does not have permission to view it. **Required permission** being recipient of the notification "/api/v3/notifications/{id}/unread_ian": post: summary: Unread notification operationId: unread_notification tags: - Notifications description: Marks the given notification as unread. parameters: - name: id in: path description: notification id example: 1 required: true schema: type: integer responses: '204': description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the notification does not exist or if the user does not have permission to view it. **Required permission** being recipient of the notification "/api/v3/oauth_applications/{id}": get: summary: Get the oauth application. operationId: get_oauth_application tags: - OAuth 2 description: |- Retrieves the OAuth 2 provider application for the given identifier. The secret will not be part of the response, instead a `confidential` flag is indicating, whether there is a secret or not. parameters: - name: id description: OAuth application id in: path required: true schema: type: integer example: 1337 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/OAuthApplicationReadModel" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the application does not exist. "/api/v3/oauth_client_credentials/{id}": get: summary: Get the oauth client credentials object. operationId: get_oauth_client_credentials tags: - OAuth 2 description: |- Retrieves the OAuth 2 client credentials for the given identifier. The secret will not be part of the response, instead a `confidential` flag is indicating, whether there is a secret or not. parameters: - name: id description: OAuth Client Credentials id in: path required: true schema: type: integer example: 1337 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/OAuthClientCredentialsReadModel" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the object does not exist. "/api/v3/placeholder_users": get: summary: List placehoder users operationId: list_placeholder_users tags: - Principals description: |- List all placeholder users. This can only be accessed if the requesting user has the global permission `manage_placeholder_user` or `manage_members` in any project. parameters: - name: filters description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: - name: filters placeholder users by the name. - group: filters placeholder by the group it is contained in. - status: filters placeholder by the status it has. in: query required: false schema: type: string example: '[{ "name": { "operator": "~", "values": ["Darth"] } }]' - name: select description: Comma separated list of properties to include. in: query required: false schema: type: string example: total,elements/name,elements/self,self responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/PrincipalCollectionModel" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. post: summary: Create placeholder user operationId: create_placeholder_user tags: - Principals description: |- Creates a new placeholder user. Only administrators and users with `manage_placeholder_user` global permission are allowed to do so. When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. requestBody: content: application/json: schema: "$ref": "#/components/schemas/PlaceholderUserCreateModel" responses: '201': content: application/hal+json: schema: "$ref": "#/components/schemas/PlaceholderUserModel" description: Created '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to create new placeholder users. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name has already been taken. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/placeholder_users/{id}": delete: summary: Delete placeholder user operationId: delete_placeholder_user description: Set the specified placeholder user to deleted status. tags: - Principals parameters: - description: Placeholder user id example: 1 in: path name: id required: true schema: type: integer responses: '202': description: |- Returned if the group was marked for deletion. Note that the response body is empty as of now. In future versions of the API a body *might* be returned, indicating the progress of deletion. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete the account of this user. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_placeholder_users` '404': description: Returned if the placeholder user does not exist. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified placeholder user does not exist. get: summary: View placeholder user operationId: view_placeholder_user description: Return the placeholder user resource. tags: - Principals parameters: - description: The placeholder user id example: 1 in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/PlaceholderUserModel" examples: placeholder user response: "$ref": "#/components/examples/PlaceholderUserResponse" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified placeholder user does not exist or you do not have permission to view them. description: |- Returned if the user does not exist or if the API user does not have permission to view them. **Required permission**: `manage_placeholder_users` patch: summary: Update placeholder user operationId: update_placeholder_user tags: - Principals description: |- Updates the placeholder user's writable attributes. When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. parameters: - description: Placeholder user id example: 1 in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/PlaceholderUserCreateModel" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/PlaceholderUserModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to update the account of this user. description: |- Returned if the client does not have sufficient permissions. **Required permission**: `manage_placeholder_users` '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified placeholder user does not exist. description: Returned if the placeholder user does not exist. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name has already been taken. description: |- Returned if: - the client tries to modify a read-only property (`PropertyIsReadOnly`) - a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/portfolios": get: summary: List portfolios operationId: list_portfolios tags: - Portfolios description: Returns a collection of portfolios. The collection can be filtered via query parameters similar to how work packages are filtered. In addition to the provided filter, the result set is always limited to only contain portfolios the client is allowed to see. parameters: - name: filters schema: type: string in: query required: false description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openportfolio.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + active: based on the active property of the portfolio + ancestor: filters portfolios by their ancestor. A portfolio is not considered to be its own ancestor. + available_project_attributes: filters portfolios based on the activated project attributes. + created_at: based on the time the portfolio was created + favorited: based on the favorited property of the portfolio + id: based on portfolios' id. + latest_activity_at: based on the time the last activity was registered on a portfolio. + name_and_identifier: based on both the name and the identifier. + parent_id: filters portfolios by their parent. + principal: based on members of the portfolio. + project_phase_any: based on the project phases active in a portfolio. + project_status_code: based on status code of the portfolio + storage_id: filters portfolios by linked storages + storage_url: filters portfolios by linked storages identified by the host url + type_id: based on the types active in a portfolio. + user_action: based on the actions the current user has in the portfolio. + visible: based on the visibility for the user (id) provided as the filter value. This filter is useful for admins to identify the portfolios visible to a user. There might also be additional filters based on the custom fields that have been configured. Each defined lifecycle step will also define a filter in this list endpoint. Given that the elements are not static but rather dynamically created on each OpenProject instance, a list cannot be provided. Those filters follow the schema: + project_start_gate_[id]: a filter on a project phase's start gate active in a portfolio. The id is the id of the phase the gate belongs to. + project_finish_gate_[id]: a filter on a project phase's finish gate active in a portfolio. The id is the id of the phase the gate belongs to. + project_phase_[id]: a filter on a project phase active in a portfolio. The id is the id of the phase queried for. example: '[{ "ancestor": { "operator": "=", "values": ["1"] }" }]' - name: sortBy schema: type: string in: query required: false description: |- JSON specifying sort criteria. Currently supported orders are: + id + name + typeahead (sorting by hierarchy and name) + created_at + public + latest_activity_at + required_disk_space There might also be additional orders based on the custom fields that have been configured. example: '[["id", "asc"]]' - name: select schema: type: string in: query required: false description: Comma separated list of properties to include. example: total,elements/identifier,elements/name responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/PortfolioCollectionModel" examples: simple portfolio collection: "$ref": "#/components/examples/PortfolioCollection" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. "/api/v3/portfolios/{id}": get: parameters: - description: Portfolio id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/PortfolioModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the portfolio does not exist or the client does not have sufficient permissions to see it. **Required permission:** any permission in the portfolio *Note: A client without sufficient permissions shall not be able to test for the existence of a portfolio. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Portfolios description: '' operationId: View_portfolio summary: View portfolio patch: parameters: - description: Portfolio id example: '1' in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/PortfolioModel" examples: with custom fields: "$ref": "#/components/examples/PortfolioBody" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/PortfolioModel" examples: with custom fields: "$ref": "#/components/examples/Portfolio" description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit project for the portfolio to be altered headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the portfolio does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name can't be blank. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) headers: {} tags: - Portfolios description: Updates the given portfolio by applying the attributes provided in the body. operationId: Update_Portfolio summary: Update Portfolio delete: parameters: - description: Portfolio id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: |- Returned if the portfolio was successfully deleted. There is currently no endpoint to query for the actual deletion status. Such an endpoint _might_ be added in the future. headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the portfolio does not exist or the client does not have sufficient permissions to see it. **Required permission:** any permission in the portfolio *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: base _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Work packages in non descendant projects reference versions of the portfolio or its descendants. description: |- Returned if the portfolio cannot be deleted. This can happen when there are still references to the portfolio in other workspaces that need to be severed at first. headers: {} tags: - Portfolios description: |- Deletes the portfolio permanently. As this is a lengthy process, the actual deletion is carried out asynchronously. So the portfolio might exist well after the request has returned successfully. To prevent unwanted changes to the portfolio scheduled for deletion, it is archived at once. operationId: Delete_Portfolio summary: Delete Portfolio "/api/v3/portfolios/{id}/form": post: parameters: - description: Portfolio id example: '1' in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: type: object examples: with custom fields: "$ref": "#/components/examples/PortfolioBody" empty: description: Empty request to get the form initially in order to start the guided update of a portfolio value: {} responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit workspace in the portfolio headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Portfolios description: '' operationId: Portfolio_update_form summary: Portfolio update form "/api/v3/posts/{id}": get: parameters: - description: Post's identifier example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: project: _type: Project... _links: addAttachment: href: "/api/v3/posts/1/attachments" method: post attachments: href: "/api/v3/posts/1/attachments" project: href: "/api/v3/projects/1" title: A project with a title self: href: "/api/v3/posts/1" _type: Post id: 1 subject: A post with a subject schema: "$ref": "#/components/schemas/PostModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the post does not exist or the client does not have sufficient permissions to see it. **Required permission:** view messages in the post's project headers: {} tags: - Posts description: Retrieve an individual post as identified by the id parameter operationId: View_Post summary: View Post "/api/v3/posts/{id}/attachments": get: parameters: - description: ID of the post whose attachments will be listed example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: author: href: "/api/v3/users/1" title: OpenProject Admin container: href: "/api/v3/posts/72" title: wiki delete: href: "/api/v3/attachments/376" method: delete downloadLocation: href: "/api/v3/attachments/376/content" self: href: "/api/v3/attachments/376" title: 200.gif _type: Attachment contentType: image/gif createdAt: '2018-06-01T07:24:19.706Z' description: format: plain html: '' raw: '' digest: algorithm: md5 hash: 7ac9c97ef73d47127f590788b84c0c1c fileName: some.gif fileSize: 3521772 id: 376 _links: self: href: "/api/v3/posts/72/attachments" _type: Collection count: 1 total: 1 schema: "$ref": "#/components/schemas/Attachments_Model" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the post does not exist or the client does not have sufficient permissions to see it. **Required permission:** view messages *Note: A client without sufficient permissions shall not be able to test for the existence of a post. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Attachments description: '' operationId: List_attachments_by_post summary: List attachments by post post: parameters: - description: ID of the post to receive the attachment example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: author: _links: lock: href: "/api/v3/users/1/lock" method: post title: Set lock on admin self: href: "/api/v3/users/1" title: OpenProject Admin showUser: href: "/users/1" type: text/html updateImmediately: href: "/api/v3/users/1" method: patch title: Update admin _type: User admin: true avatar: '' createdAt: '2015-03-20T12:56:52.850Z' email: firstName: OpenProject id: 1 identityUrl: lastName: Admin login: admin name: OpenProject Admin status: active updatedAt: '2018-05-29T13:57:44.604Z' container: _links: addAttachment: href: "/api/v3/posts/150/attachments" method: post attachments: href: "/api/v3/posts/150/attachments" project: href: "/api/v3/projects/12" title: Demo project self: href: "/api/v3/posts/150" _type: Post id: 150 subject: sfsdfsdfsdfsdf _links: author: href: "/api/v3/users/1" title: OpenProject Admin container: href: "/api/v3/posts/150" title: sfsdfsdfsdfsdf delete: href: "/api/v3/attachments/377" method: delete downloadLocation: href: "/api/v3/attachments/377/content" self: href: "/api/v3/attachments/377" title: 200.gif _type: Attachment contentType: image/gif createdAt: '2018-06-01T07:53:36.831Z' description: format: plain html: '' raw: '' digest: algorithm: md5 hash: 7ac9c97ef73d47127f590788b84c0c1c fileName: some.gif fileSize: 3521772 id: 377 description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request could not be parsed as JSON. description: |- Returned if the client sends a not understandable request. Reasons include: * Omitting one of the required parts (metadata and file) * sending unparsable JSON in the metadata part headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this attachment. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit messages *Note that you will only receive this error, if you are at least allowed to see the wiki page* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the post does not exist or the client does not have sufficient permissions to see it. **Required permission:** view messages *Note: A client without sufficient permissions shall not be able to test for the existence of a post. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: File is too large (maximum size is 5242880 Bytes). description: |- Returned if the client tries to send an invalid attachment. Reasons are: * Omitting the file name (`fileName` property of metadata part) * Sending a file that is too large headers: {} tags: - Attachments description: Adds an attachment with the post as its container. operationId: Add_attachment_to_post summary: Add attachment to post "/api/v3/principals": get: summary: List principals operationId: list_principals tags: - Principals description: |- List all principals. The client can choose to filter the principals similar to how work packages are filtered. In addition to the provided filters, the server will reduce the result set to only contain principals who are members in projects the client is allowed to see. parameters: - name: filters description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: - type: filters principals by their type (*User*, *Group*, *PlaceholderUser*). - member: filters principals by the projects they are members in. - name: filters principals by the user or group name. - any_name_attribute: filters principals by the user or group first- and last name, email or login. - status: filters principals by their status number (active = *1*, registered = *2*, locked = *3*, invited = *4*) in: query required: false schema: type: string example: '[{ "type": { "operator": "=", "values": ["User"] } }]' - name: select description: Comma separated list of properties to include. in: query required: false schema: type: string example: total,elements/name,elements/self,self responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/PrincipalCollectionModel" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. "/api/v3/priorities": get: responses: '200': content: application/hal+json: examples: simple priority collection: "$ref": "#/components/examples/PriorityCollection" schema: "$ref": "#/components/schemas/PriorityCollectionModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the priorities. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package (on any project) headers: {} tags: - Priorities description: '' operationId: List_all_Priorities summary: List all Priorities "/api/v3/priorities/{id}": get: parameters: - description: Priority id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/priorities/1" title: Low _type: Priority id: 1 isActive: true isDefault: false name: Low position: 1 schema: "$ref": "#/components/schemas/PriorityModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see this priority. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package (on any project) headers: {} tags: - Priorities description: '' operationId: View_Priority summary: View Priority "/api/v3/programs": get: summary: List programs operationId: list_programs tags: - Programs description: Returns a collection of programs. The collection can be filtered via query parameters similar to how work packages are filtered. In addition to the provided filter, the result set is always limited to only contain programs the client is allowed to see. parameters: - name: filters schema: type: string in: query required: false description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + active: based on the active property of the program + ancestor: filters programs by their ancestor. A program is not considered to be its own ancestor. + available_project_attributes: filters programs based on the activated project attributes. + created_at: based on the time the program was created + favorited: based on the favorited property of the program + id: based on programs' id. + latest_activity_at: based on the time the last activity was registered on a program. + name_and_identifier: based on both the name and the identifier. + parent_id: filters programs by their parent. + principal: based on members of the program. + project_phase_any: based on the project phases active in a program. + project_status_code: based on status code of the program + storage_id: filters programs by linked storages + storage_url: filters programs by linked storages identified by the host url + type_id: based on the types active in a program. + user_action: based on the actions the current user has in the program. + visible: based on the visibility for the user (id) provided as the filter value. This filter is useful for admins to identify the programs visible to a user. There might also be additional filters based on the custom fields that have been configured. Each defined lifecycle step will also define a filter in this list endpoint. Given that the elements are not static but rather dynamically created on each OpenProject instance, a list cannot be provided. Those filters follow the schema: + project_start_gate_[id]: a filter on a project phase's start gate active in a program. The id is the id of the phase the gate belongs to. + project_finish_gate_[id]: a filter on a project phase's finish gate active in a program. The id is the id of the phase the gate belongs to. + project_phase_[id]: a filter on a project phase active in a program. The id is the id of the phase queried for. example: '[{ "ancestor": { "operator": "=", "values": ["1"] }" }]' - name: sortBy schema: type: string in: query required: false description: |- JSON specifying sort criteria. Currently supported orders are: + id + name + typeahead (sorting by hierarchy and name) + created_at + public + latest_activity_at + required_disk_space There might also be additional orders based on the custom fields that have been configured. example: '[["id", "asc"]]' - name: select schema: type: string in: query required: false description: Comma separated list of properties to include. example: total,elements/identifier,elements/name responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProgramCollectionModel" examples: simple program collection: "$ref": "#/components/examples/ProgramCollection" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. "/api/v3/programs/{id}": get: parameters: - description: Program id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/ProgramModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the program does not exist or the client does not have sufficient permissions to see it. **Required permission:** any permission in the program *Note: A client without sufficient permissions shall not be able to test for the existence of a program. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Programs description: '' operationId: View_program summary: View program patch: parameters: - description: Program id example: 1 in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/ProgramModel" examples: with custom fields: "$ref": "#/components/examples/ProgramBody" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/ProgramModel" examples: with custom fields: "$ref": "#/components/examples/Program" description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit project for the program to be altered headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the program does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name can't be blank. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) headers: {} tags: - Programs description: Updates the given program by applying the attributes provided in the body. operationId: Update_Program summary: Update Program delete: parameters: - description: Program id example: 1 in: path name: id required: true schema: type: integer responses: '204': description: |- Returned if the program was successfully deleted. There is currently no endpoint to query for the actual deletion status. Such an endpoint _might_ be added in the future. headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the program does not exist or the client does not have sufficient permissions to see it. **Required permission:** any permission in the program *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: base _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Work packages in non descendant projects reference versions of the program or its descendants. description: |- Returned if the program cannot be deleted. This can happen when there are still references to the program in other workspaces that need to be severed at first. headers: {} tags: - Programs description: |- Deletes the program permanently. As this is a lengthy process, the actual deletion is carried out asynchronously. So the program might exist well after the request has returned successfully. To prevent unwanted changes to the program scheduled for deletion, it is archived at once. operationId: Delete_Program summary: Delete Program "/api/v3/programs/{id}/form": post: parameters: - description: Program id example: 1 in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: type: object examples: with custom fields: "$ref": "#/components/examples/ProgramBody" empty: description: Empty request to get the form initially in order to start the guided update of a program value: {} responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit workspace in the program headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Programs description: '' operationId: Program_update_form summary: Program update form "/api/v3/project_phases/{id}": get: summary: Get a project phase operationId: get_project_phase tags: - Project Phases description: |- Gets a project phase resource. This resource contains an instance of a ProjectPhaseDefinition within a project which can then have project specific dates. parameters: - name: id description: Project phase id in: path required: true schema: type: integer example: 1337 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectPhaseModel" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project phase does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project phase "/api/v3/project_phase_definitions": get: summary: List project phase definitions operationId: list_project_phase_definitions tags: - Project Phase Definitions description: |- Returns a collection of all project phase definitions. The result set is always limited to only contain project phase definitions the client is allowed to see. responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectPhaseDefinitionCollectionModel" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. "/api/v3/project_phase_definitions/{id}": get: summary: Get a project phase definition operationId: get_project_phase_definition tags: - Project Phase Definitions description: "Gets a project phase definition resource. This resource is part of the abstract definition of a project life\ncycle shaping the phases of a project. " parameters: - name: id description: Project phase definition id in: path required: true schema: type: integer example: 1337 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectPhaseDefinitionModel" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the user does not have permission to see project phases. **Required permission:** view project phase OR select project phase "/api/v3/project_storages": get: summary: Gets a list of project storages operationId: list_project_storages tags: - File Links description: Gets a collection of all project storages that meet the provided filters and the user has permission to see them. parameters: - name: filters in: query required: false schema: default: "[]" type: string description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: - project_id - storage_id - storage_url example: '[{ "project_id": { "operator": "=", "values": ["42"] }}, { "storage_id": { "operator": "=", "values": ["1337"] }}]' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectStorageCollectionModel" '400': description: Returned if any given filter is invalid. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: The query parameter 'filters' is missing or malformed. "/api/v3/project_storages/{id}": get: summary: Gets a project storage operationId: get_project_storage tags: - File Links description: |- Gets a project storage resource. This resource contains all data that is applicable on the relation between a storage and a project. parameters: - name: id description: Project storage id in: path required: true schema: type: integer example: 1337 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectStorageModel" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links "/api/v3/project_storages/{id}/open": get: summary: Open the project storage operationId: open_project_storage tags: - File Links description: |- Gets a redirect to the location of the project storage's remote origin. If the project storage has a project folder, it is opened at this location. If not, the storage root is opened. parameters: - name: id description: Project storage id in: path required: true schema: type: integer example: 1337 responses: '303': description: Redirect headers: Location: schema: type: string format: uri '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: Returned if the authorization token of the current user grants no permission to access the remote storage. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links "/api/v3/projects": get: summary: List projects operationId: list_projects tags: - Projects description: |- Returns a collection of projects. The collection can be filtered via query parameters similar to how work packages are filtered. In addition to the provided filter, the result set is always limited to only contain projects the client is allowed to see. Prior to OpenProject 17.0, only projects existed and the concept of workspaces wasn't implemented in the API. With 17.0 the other workspace types (program and portfolio) exist and will be returned alongside projects by this endpoint. This might surprise typed clients. parameters: - name: filters schema: type: string in: query required: false description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + active: based on the active property of the project + ancestor: filters projects by their ancestor. A project is not considered to be its own ancestor. + available_project_attributes: filters projects based on the activated project project attributes. + created_at: based on the time the project was created + favorited: based on the favorited property of the project + id: based on projects' id. + latest_activity_at: based on the time the last activity was registered on a project. + name_and_identifier: based on both the name and the identifier. + parent_id: filters projects by their parent. + principal: based on members of the project. + project_phase_any: based on the project phases active in a project. + project_status_code: based on status code of the project + storage_id: filters projects by linked storages + storage_url: filters projects by linked storages identified by the host url + type_id: based on the types active in a project. + user_action: based on the actions the current user has in the project. + visible: based on the visibility for the user (id) provided as the filter value. This filter is useful for admins to identify the projects visible to a user. There might also be additional filters based on the custom fields that have been configured. Each defined lifecycle step will also define a filter in this list endpoint. Given that the elements are not static but rather dynamically created on each OpenProject instance, a list cannot be provided. Those filters follow the schema: + project_start_gate_[id]: a filter on a project phase's start gate active in a project. The id is the id of the phase the gate belongs to. + project_finish_gate_[id]: a filter on a project phase's finish gate active in a project. The id is the id of the phase the gate belongs to. + project_phase_[id]: a filter on a project phase active in a project. The id is the id of the phase queried for. example: '[{ "ancestor": { "operator": "=", "values": ["1"] }" }]' - name: sortBy schema: type: string in: query required: false description: |- JSON specifying sort criteria. Currently supported orders are: + id + name + typeahead (sorting by hierarchy and name) + created_at + public + latest_activity_at + required_disk_space There might also be additional orders based on the custom fields that have been configured. example: '[["id", "asc"]]' - name: select schema: type: string in: query required: false description: Comma separated list of properties to include. example: total,elements/identifier,elements/name responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectCollectionModel" examples: simple project collection: "$ref": "#/components/examples/ProjectCollection" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. post: summary: Create project operationId: create_project tags: - Projects description: |- Creates a new project, applying the attributes provided in the body. You can use the form and schema to be retrieve the valid attribute values and by that be guided towards successful creation. requestBody: content: application/json: schema: "$ref": "#/components/schemas/ProjectModel" examples: with custom fields: "$ref": "#/components/examples/ProjectBody" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectModel" examples: with custom fields: "$ref": "#/components/examples/Project" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add project which is a global permission '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name can't be blank. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/projects/form": post: requestBody: content: application/json: schema: type: object examples: with custom fields: "$ref": "#/components/examples/ProjectBody" empty: description: Empty request to get the form initially in order to start the guided creation of a project value: {} responses: '200': content: application/hal+json: schema: type: object examples: response: value: _embedded: payload: _links: customField26: href: title: customField31: href: title: parent: href: status: href: active: true customField30: customField34: customField35: Text custom field value customField41: format: markdown html: '' raw: '' customField42: description: format: markdown html: '' raw: identifier: new_project_identifier name: New project name public: false statusExplanation: format: markdown html: "

" raw: schema: _dependencies: [] _links: {} _type: Schema active: hasDefault: true name: Active required: true type: Boolean writable: true createdAt: hasDefault: false name: Created on required: true type: DateTime writable: false customField26: _links: allowedValues: href: "/api/v3/principals?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%220%22%2C%223%22%5D%7D%7D%2C%7B%22type%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22User%22%5D%7D%7D%2C%7B%22member%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22%22%5D%7D%7D%5D&pageSize=0" hasDefault: false location: _links name: Project user required: false type: User visibility: default writable: true customField30: hasDefault: false name: some project cf required: false type: Integer visibility: default writable: true customField31: _embedded: allowedValues: - _links: self: href: "/api/v3/custom_options/513" title: abc _type: CustomOption id: 513 value: abc - _links: self: href: "/api/v3/custom_options/514" title: def _type: CustomOption id: 514 value: def - _links: self: href: "/api/v3/custom_options/515" title: ghi _type: CustomOption id: 515 value: ghi _links: allowedValues: - href: "/api/v3/custom_options/513" title: abc - href: "/api/v3/custom_options/514" title: def - href: "/api/v3/custom_options/515" title: ghi hasDefault: false location: _links name: list project cf required: false type: CustomOption visibility: default writable: true customField34: hasDefault: false name: Bool Project CF required: false type: Boolean visibility: default writable: true customField35: hasDefault: false name: text project cf required: true type: String visibility: default writable: true customField41: hasDefault: false name: Long text project cf required: false type: Formattable visibility: default writable: true customField42: hasDefault: false name: Date project cf required: false type: Date visibility: default writable: true description: hasDefault: false name: Description required: false type: Formattable writable: true id: hasDefault: false name: ID required: true type: Integer writable: false identifier: hasDefault: false maxLength: 100 minLength: 1 name: Identifier required: true type: String writable: true name: hasDefault: false maxLength: 255 minLength: 1 name: Name required: true type: String writable: true parent: _links: allowedValues: href: "/api/v3/projects/available_parent_projects" hasDefault: false location: _links name: Subproject of required: false type: Project visibility: default writable: true public: hasDefault: false name: Public required: true type: Boolean writable: true status: _links: allowedValues: - href: "/api/v3/project_statuses/on_track" title: On track - href: "/api/v3/project_statuses/at_risk" title: At risk - href: "/api/v3/project_statuses/off_track" title: Off track hasDefault: true name: Status required: false type: ProjectStatus writable: true statusExplanation: hasDefault: false name: Status explanation required: false type: Formattable writable: true updatedAt: hasDefault: false name: Updated on required: true type: DateTime writable: false validationErrors: identifier: _embedded: details: attribute: identifier _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Identifier has already been taken. _links: self: href: "/api/v3/projects/form" method: post validate: href: "/api/v3/projects/form" method: post _type: Form description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add project which is a global permission headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Projects description: '' operationId: Project_create_form summary: Project create form "/api/v3/projects/schema": get: responses: '200': content: application/hal+json: examples: response: value: _dependencies: [] _attributeGroups: - _type: ProjectFormCustomFieldSection name: Project Details attributes: - customField30 - customField34 - _type: ProjectFormCustomFieldSection name: Budget Information attributes: - customField31 - customField32 - customField35 _links: self: href: "/api/v3/projects/schema" _type: Schema active: hasDefault: true name: Active required: true type: Boolean writable: true createdAt: hasDefault: false name: Created on required: true type: DateTime writable: false customField30: hasDefault: false name: Integer project custom field required: false type: Integer visibility: default writable: true customField31: _links: {} hasDefault: false location: _links name: List project custom field required: false type: CustomOption visibility: default writable: true customField32: _links: {} hasDefault: false location: _links name: Version project custom field required: false type: Version visibility: default writable: true customField34: hasDefault: false name: Boolean project custom field required: false type: Boolean visibility: default writable: true customField35: hasDefault: false name: Text project custom field required: true type: String visibility: default writable: true description: hasDefault: false name: Description required: false type: Formattable writable: true id: hasDefault: false name: ID required: true type: Integer writable: false identifier: hasDefault: false maxLength: 100 minLength: 1 name: Identifier required: true type: String writable: true name: hasDefault: false maxLength: 255 minLength: 1 name: Name required: true type: String writable: true parent: _links: {} hasDefault: false location: _links name: Subproject of required: false type: Project visibility: default writable: true public: hasDefault: false name: Public required: true type: Boolean writable: true status: _links: allowedValues: - href: "/api/v3/project_statuses/on_track" title: On track - href: "/api/v3/project_statuses/at_risk" title: At risk - href: "/api/v3/project_statuses/off_track" title: Off track hasDefault: true name: Status required: false type: ProjectStatus writable: true statusExplanation: hasDefault: false name: Status explanation required: false type: Formattable writable: true updatedAt: hasDefault: false name: Updated on required: true type: DateTime writable: false schema: "$ref": "#/components/schemas/Workspaces_schemaModel" description: OK headers: {} tags: - Projects description: |- Provides the schema describing a project resource. This endpoint is deprecated. As projects are workspaces, an equivalent schema can be found fetching `/api/v3/workspaces/schema`. operationId: View_project_schema summary: View project schema "/api/v3/projects/{id}": delete: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer responses: '204': description: |- Returned if the project was successfully deleted. There is currently no endpoint to query for the actual deletion status. Such an endpoint _might_ be added in the future. headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** any permission in the project *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: base _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Work packages in non descendant projects reference versions of the project or its descendants. description: |- Returned if the project cannot be deleted. This can happen when there are still references to the project in other workspaces that need to be severed at first. headers: {} tags: - Projects description: |- Deletes the project permanently. As this is a lengthy process, the actual deletion is carried out asynchronously. So the project might exist well after the request has returned successfully. To prevent unwanted changes to the project scheduled for deletion, it is archived at once. operationId: Delete_Project summary: Delete Project get: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: with custom fields: "$ref": "#/components/examples/Project" schema: "$ref": "#/components/schemas/ProjectModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Projects description: '' operationId: View_project summary: View project patch: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/ProjectModel" examples: with custom fields: "$ref": "#/components/examples/ProjectBody" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/ProjectModel" examples: with custom fields: "$ref": "#/components/examples/Project" description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit project for the project to be altered headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name can't be blank. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) headers: {} tags: - Projects description: Updates the given project by applying the attributes provided in the body. operationId: Update_Project summary: Update Project "/api/v3/projects/{id}/form": post: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: type: object examples: with custom fields: "$ref": "#/components/examples/ProjectBody" empty: description: Empty request to get the form initially in order to start the guided update of a project value: {} responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit projects in the project headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Projects description: '' operationId: Project_update_form summary: Project update form "/api/v3/projects/{id}/copy": post: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '302': description: Returned if the request is successful. It will redirect to the job statuses API with the backend job that got created. You can query that endpoint to check the status of the copy, and eventually get the created project. headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** copy projects in the source project headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: name _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Name can't be blank. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) headers: {} tags: - Projects description: '' operationId: Create_project_copy summary: Create project copy "/api/v3/projects/{id}/copy/form": post: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** copy projects in the source project headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Projects description: '' operationId: Project_copy_form summary: Project copy form "/api/v3/project_statuses/{id}": get: parameters: - description: Project status id example: on_track in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/project_statuses/on_track" _type: ProjectStatus id: on_track name: On track schema: "$ref": "#/components/schemas/View_project_statusModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the project status does not exist. headers: {} tags: - Projects description: '' operationId: View_project_status summary: View project status "/api/v3/projects/available_parent_projects": get: parameters: - description: JSON specifying filter conditions. example: '[{ "ancestor": { "operator": "=", "values": [''1''] }" }]' in: query name: filters required: false schema: type: string - description: The id or identifier of the project the parent candidate is determined for example: '123' in: query name: of required: false schema: type: string - description: |- The workspace type of the new project the parent candidate is determined for. Ignored when `of` parameter is provided. Note that while 'portfolio' is supported as a type (since it is a type of Workspace), the endpoint will currently always return an empty resultset as portfolios cannot have parents. example: program in: query name: workspace_type required: false schema: type: string enum: - project - program - portfolio - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint and allows all the filters and sortBy supported by the project list endpoint. example: '[["id", "asc"]]' in: query name: sortBy required: false schema: type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: categories: href: "/api/v3/projects/6/categories" createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post self: href: "/api/v3/projects/6" title: A project status: href: "/api/v3/project_statuses/on_track" title: On track versions: href: "/api/v3/projects/6/versions" _type: Project active: true createdAt: '2015-07-06T13:28:14+00:00' description: format: markdown html: "

Lorem ipsum dolor sit amet

" raw: Lorem **ipsum** dolor sit amet id: 6 identifier: a_project name: A project public: false statusExplanation: format: markdown html: "

Everything fine

" raw: Everything **fine** type: Customer Project updatedAt: '2015-10-01T09:55:02+00:00' - _links: categories: href: "/api/v3/projects/14/categories" createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post self: href: "/api/v3/projects/14" title: Another project status: href: "/api/v3/project_statuses/on_track" title: On track versions: href: "/api/v3/projects/14/versions" _type: Project active: true createdAt: '2016-02-29T12:50:20+00:00' description: format: markdown html: '' raw: '' id: 14 identifier: another_project name: Another project public: true statusExplanation: format: markdown html: "

Everything super fine

" raw: Everything super **fine** type: updatedAt: '2016-02-29T12:50:20+00:00' _links: self: href: "/api/v3/projects/available_parent_projects?of=123" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/List_available_parent_project_candidatesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit project in a project or the global add project permission headers: {} tags: - Projects description: |- Lists projects which can become parent to another project. Only sound candidates are returned. For instance a project cannot become parent of itself or its children. To specify the project for which a parent is queried for, the `of` parameter can be provided. If no `of` parameter is provided, a new project is assumed. Then, the check for the hierarchy is omitted as a new project cannot be part of a hierarchy yet, instead `workspace_type` parameter can be passed defining it for new project. Candidates can be filtered. Most commonly one will want to filter by name or identifier. You can do this through the `filters` parameter which works just like the work package index. For instance to find all parent candidates with "rollout" in their name: ``` ?filters=[{"name_and_identifier":{"operator":"~","values":["rollout"]}}] ``` operationId: List_available_parent_project_candidates summary: List available parent project candidates "/api/v3/projects/{id}/budgets": get: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/budgets/1" title: Q3 2015 _type: Budget id: 1 subject: Q3 2015 - _links: self: href: "/api/v3/budgets/2" title: Q4 2015 _type: Budget id: 2 subject: Q4 2015 _links: self: href: "/api/v3/projects/1/budgets" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Budgets_by_ProjectModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the budgets of this project. description: |- Returned if the client does not have sufficient permissions to see the budgets of the given project. **Required permission:** view work packages **or** view budgets *Note that you will only receive this error, if you are at least allowed to see the corresponding project.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if either: * the project does not exist * the client does not have sufficient permissions to see the project * the costs module is not enabled on the given project **Required permission:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Budgets description: '' operationId: view_Budgets_of_a_Project summary: view Budgets of a Project "/api/v3/projects/{id}/queries/default": get: summary: View default query for project operationId: View_default_query_for_project tags: - Queries description: |- Same as [viewing an existing, persisted Query](https://www.openproject.org/docs/api/endpoints/queries/#list-queries) in its response, this resource returns an unpersisted query and by that allows to get the default query configuration. The client may also provide additional parameters which will modify the default query. The query will already be scoped to the project. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/queries/default`](https://www.openproject.org/docs/api/endpoints/queries/#view-default-query-for-workspace) parameters: - description: Id of the project the default query is requested for example: 1 in: path name: id required: true schema: type: integer - name: filters description: |- JSON specifying filter conditions. The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters. All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`). example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]' in: query required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - name: offset description: Page number inside the queries' result collection of work packages. example: 25 in: query required: false schema: default: 1 type: integer - name: pageSize description: Number of elements to display per page for the queries' result collection of work packages. example: 25 in: query required: false schema: type: integer - name: sortBy description: JSON specifying sort criteria. The sort criteria is applied to the query's result collection of work packages overriding the query's persisted sort criteria. example: '[["status", "asc"]]' in: query required: false schema: default: '[["id", "asc"]]' type: string - name: groupBy description: The column to group by. The grouping criteria is applied to the to the query's result collection of work packages overriding the query's persisted group criteria. example: status in: query required: false schema: type: string - name: showSums description: Indicates whether properties should be summed up if they support it. The showSums parameter is applied to the to the query's result collection of work packages overriding the query's persisted sums property. example: true in: query required: false schema: default: false type: boolean - name: timestamps description: 'Indicates the timestamps to filter by when showing changed attributes on work packages. Values can be either ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part represents the zero paded hours and minutes. The last "+HH:MM" part represents the timezone offset from UTC associated with the time. Values older than 1 day are accepted only with valid Enterprise Token available. ' example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00 in: query required: false schema: default: PT0S type: string - name: timelineVisible description: Indicates whether the timeline should be shown. example: true in: query required: false schema: default: false type: boolean - name: showHierarchies description: Indicates whether the hierarchy mode should be enabled. example: true in: query required: false schema: default: true type: boolean responses: '200': content: application/hal+json: examples: response: value: _embedded: results: _embedded: elements: - "<--- shortened for brevity --->" _links: changeSize: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post jumpTo: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true self: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" _type: WorkPackageCollection count: 30 offset: 1 pageSize: 2 total: 234 _links: columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: project: href: "/api/v3/projects/42" title: Lorem ipsum project results: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" self: href: "/api/v3/workspaces/42/queries/default" title: Default sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin _type: Query filters: - _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] _type: StatusQueryFilter name: Status name: default public: false showHierarchies: true starred: false sums: false timelineVisible: false timelineZoomLevel: days schema: "$ref": "#/components/schemas/Default_Query_for_WorkspaceModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see the default query. **Required permission:** view work packages in the project headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the client does not have sufficient permissions to see the project. **Required permission:** any permission in the project headers: {} "/api/v3/projects/{id}/queries/filter_instance_schemas": get: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/assignee" title: Assignee self: href: "/api/v3/queries/filter_instance_schemas/assignee" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/author" title: Author self: href: "/api/v3/queries/filter_instance_schemas/author" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false _links: self: href: "/api/v3/projects/42/queries/filter_instance_schemas" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Query_Filter_Instance_Schemas_For_WorkspaceModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} tags: - Query Filter Instance Schema description: |- Returns the list of QueryFilterInstanceSchemas defined for a query of the specified project. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/queries/filter_instance_schemas`](https://www.openproject.org/docs/api/endpoints/query-filter-instance-schema/#list-query-filter-instance-schemas-for-workspace) operationId: List_Query_Filter_Instance_Schemas_for_Project summary: List Query Filter Instance Schemas for Project "/api/v3/projects/{id}/queries/schema": get: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: QuerySchema: "$ref": "#/components/examples/QuerySchemaModel" schema: "$ref": "#/components/schemas/Schema_For_Workspace_QueriesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: "**Required permission:** view work package in the project" headers: {} tags: - Queries description: |- Retrieve the schema for project queries. This endpoint is deprecated and replaced by ['/api/v3/workspaces/{id}/queries/schema`](https://www.openproject.org/docs/api/endpoints/queries/#view-schema-for-workspace-queries) operationId: View_schema_for_project_queries summary: View schema for project queries "/api/v3/projects/{id}/work_packages": get: summary: Get work packages of project operationId: Get_Project_Work_Package_Collection tags: - Work Packages description: |- Returns the collection of work packages that are related to the given project. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/work_packages`](https://www.openproject.org/docs/api/endpoints/work-packages/#get-work-packages-of-workspace) parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer - description: Page number inside the requested collection. example: 25 in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: 25 in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. If no filter is to be applied, the client should send an empty array (`[]`). example: '[{ "type_id": { "operator": "=", "values": [''1'', ''2''] }}]' in: query name: filters required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. example: '[["status", "asc"]]' in: query name: sortBy required: false schema: default: '[["id", "asc"]]' type: string - description: The column to group by. example: status in: query name: groupBy required: false schema: type: string - description: Indicates whether properties should be summed up if they support it. example: true in: query name: showSums required: false schema: default: false type: boolean - description: Comma separated list of properties to include. example: total,elements/subject,elements/id,self in: query name: select required: false schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/Work_PackagesModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the work packages of this project. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding project.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project post: summary: Create work package in project operationId: Create_Project_Work_Package tags: - Work Packages description: |- When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. The required fields of a WorkPackage can be found in its schema, which is embedded in the respective form. Note that it is only allowed to provide properties or links supporting the write operation. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/work_packages`](https://www.openproject.org/docs/api/endpoints/work-packages/#create-work-package-in-workspace) requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageModel" parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer - description: |- Indicates whether change notifications (e.g. via E-Mail) should be sent. Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee), not just the current user. example: false in: query name: notify required: false schema: default: true type: boolean responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/WorkPackageModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to add work packages to this project. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding project.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permissions:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: Subject _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The subject might not be blank. description: |- Returned if: * the client tries to write a read-only property * a constraint for a property was violated * a property was provided in an unreadable format "/api/v3/projects/{id}/work_packages/form": post: summary: Form for creating Work Packages in a Project operationId: form_create_work_package_in_project tags: - Work Packages description: |- This endpoint allows you to validation a new work package creation body in a specific project. It works similarly to the `/api/v3/work_packages/form` endpoint, but already specifies the work package's project in the path, so that it does not have to be defined in the request body. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/work_packages/form`](https://www.openproject.org/docs/api/endpoints/work-packages/#form-for-creating-work-packages-in-a-workspace) parameters: - name: id description: ID of the project in which the work package will be created in: path required: true schema: type: integer example: 1 requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageWriteModel" examples: Minimal example: "$ref": "#/components/examples/WorkPackageCreateOnlySubject" Valid example: "$ref": "#/components/examples/WorkPackageCreateValid" responses: '200': description: OK content: application/json: schema: "$ref": "#/components/schemas/WorkPackageFormModel" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/projects/{id}/available_assignees": get: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: delete: href: "/api/v3/users/1" method: DELETE title: Delete j.sheppard lock: href: "/api/v3/users/1/lock" method: POST title: Set lock on j.sheppard self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.com firstName: John id: 1 lastName: Sheppard login: j.sheppard status: active updatedAt: '2014-05-21T08:51:20.396Z' - _links: delete: href: "/api/v3/users/2" method: DELETE title: Delete j.sheppard2 lock: href: "/api/v3/users/2/lock" method: POST title: Set lock on j.sheppard2 self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.net firstName: Jim id: 2 lastName: Sheppard login: j.sheppard2 status: active updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/projects/42/available_assignees" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_AssigneesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the assignable users for this project. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding project.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project headers: {} tags: - Work Packages description: |- Gets a list of users that can be assigned to work packages in the given project. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/available_assignees`](https://www.openproject.org/docs/api/endpoints/work-packages/#workspace-available-assignees) operationId: Project_Available_assignees summary: Project Available assignees "/api/v3/projects/{id}/categories": get: parameters: - description: ID of the project whose categories will be listed example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: defaultAssignee: href: "/api/v3/users/42" title: John Sheppard project: href: "/api/v3/projects/11" title: Example project self: href: "/api/v3/categories/10" title: Category with assignee _type: Category id: 10 name: Foo - _links: project: href: "/api/v3/projects/11" self: href: "/api/v3/categories/11" _type: Category id: 11 name: Bar _links: self: href: "/api/v3/projects/11/categories" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Categories_by_WorkspaceModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Categories description: "List all categories of a project\nThis endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/categories`](https://www.openproject.org/docs/api/endpoints/categories/#list-categories-of-a-workspace) " operationId: List_categories_of_a_project summary: List categories of a project "/api/v3/projects/{id}/sprints": get: parameters: - description: ID of the project whose sprints will be listed example: '1' in: path name: id required: true schema: type: integer - description: |- JSON specifying filter conditions. Accepts the same format and filters as returned by the [sprints](https://www.openproject.org/docs/api/endpoints/sprints/) endpoint. example: '[{ "definingWorkspace": { "operator": "=", "values": ["1"] }" }]' in: query name: filters required: false schema: type: string - description: Page number inside the requested collection. example: '25' in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: '25' in: query name: pageSize required: false schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/SprintCollectionModel" examples: response: "$ref": "#/components/examples/SprintCollectionResponse" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/SprintCollectionModel" examples: response: "$ref": "#/components/examples/SprintCollectionResponse" description: |- Returned if the user lacks permission to list sprints in the queried for project. **Required permission:** view sprints in the project. headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist. **Required permission:** view sprints in the queried for project. headers: {} tags: - Sprints description: List sprints in the project. The sprints might be ones native to the project or shared with it. This endpoint supports pagination and filtering. operationId: List_sprints_in_project summary: List sprints in project "/api/v3/projects/{id}/types": get: parameters: - description: ID of the project whose types will be listed example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/types/1" _type: Type color: "#ff0000" createdAt: '2014-05-21T08:51:20.396Z' id: 1 isDefault: true isMilestone: false name: Bug position: 1 updatedAt: '2014-05-21T08:51:20.396Z' - _links: self: href: "/api/v3/types/2" _type: Type color: "#888" createdAt: '2014-05-21T08:51:20.396Z' id: 2 isDefault: false isMilestone: false name: Feature position: 2 updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/projects/11/types" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Types_by_WorkspaceModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage types (on given project) *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Types description: |- This endpoint lists the types that are *available* in a given project. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/types`](https://www.openproject.org/docs/api/endpoints/types/#list-types-available-in-a-workspace) operationId: List_types_available_in_a_project summary: List types available in a project "/api/v3/projects/{id}/versions": get: parameters: - description: ID of the project whose versions will be listed example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: availableInProjects: href: "/api/v3/versions/11/workspaces" definingProject: href: "/api/v3/projects/11" self: href: "/api/v3/versions/11" _type: Version description: format: plain html: This version has a description raw: This version has a description endDate: id: 11 name: v3.0 Alpha startDate: '2014-11-20' status: Open - _links: availableInProjects: href: "/api/v3/versions/12/workspaces" definingProject: href: "/api/v3/projects/11" self: href: "/api/v3/versions/12" _type: Version description: format: plain html: '' raw: '' endDate: id: 12 name: v2.0 startDate: status: Closed - _links: availableInProjects: href: "/api/v3/versions/10/workspaces" definingProject: href: "/api/v3/projects/11" self: href: "/api/v3/versions/10" _type: Version description: format: plain html: '' raw: '' endDate: id: 10 name: v1.0 startDate: status: Open _links: self: href: "/api/v3/projects/11/versions" _type: Collection count: 3 total: 3 schema: "$ref": "#/components/schemas/Versions_by_WorkspaceModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (on given project) *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Versions description: |- This endpoint lists the versions that are *available* in a given project. Note that due to sharing this might be more than the versions *defined* by that project. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/versions`](https://www.openproject.org/docs/api/endpoints/versions/#list-versions-available-in-a-workspace) operationId: List_versions_available_in_a_project summary: List versions available in a project "/api/v3/projects/{id}/favorite": delete: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: Returned if the project was successfully removed from favorites. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** logged in tags: - Projects - Favorites description: |- Removes the project from the current user's favorites. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/favorite`](https://www.openproject.org/docs/api/endpoints/workspaces/#unfavorite-workspace) operationId: Unfavorite_Project summary: Unfavorite Project post: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: Returned if the project was successfully added to favorites. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permission:** view project '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** logged in tags: - Projects - Favorites description: |- Adds the project to the current user's favorites. This endpoint is deprecated and replaced by [`/api/v3/workspaces/{id}/favorite`](https://www.openproject.org/docs/api/endpoints/workspaces/#favorite-workspace) operationId: Favorite_Project summary: Favorite Project "/api/v3/projects/{id}/configuration": get: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _type: Configuration _links: self: href: "/api/v3/projects/1/configuration" userPreferences: href: "/api/v3/my_preferences" maximumAttachmentFileSize: 5242880 perPageOptions: - 20 - 100 enabledInternalComments: true schema: "$ref": "#/components/schemas/ProjectConfigurationModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the project does not exist or the user cannot view it. headers: {} tags: - Configuration - Projects description: |- Returns the configuration scoped to a specific project, including all global configuration properties plus project-specific settings. operationId: View_project_configuration summary: View project configuration "/api/v3/queries": get: summary: List queries operationId: List_queries tags: - Queries description: Returns a collection of queries. The collection can be filtered via query parameters similar to how work packages are filtered. Please note however, that the filters are applied to the queries and not to the work packages the queries in turn might return. parameters: - description: |- JSON specifying filter conditions. Currently supported filters are: + project: filters queries by the project they are assigned to. If the project filter is passed with the `!*` (not any) operator, global queries are returned. + id: filters queries based on their id + updated_at: filters queries based on the last time they where updated example: '[{ "project_id": { "operator": "!*", "values": null }" }]' in: query name: filters required: false schema: type: string responses: '200': content: application/hal+json: examples: Queries: "$ref": "#/components/examples/QueriesModel" schema: "$ref": "#/components/schemas/QueriesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the queries. description: |- Returned if the client does not have sufficient permissions to see queries. **Required permission:** view work packages or manage public queries in any project headers: {} post: summary: Create query operationId: Create_query tags: - Queries description: |- When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. The required fields of a Query can be found in its schema, which is embedded in the respective form. Note that it is only allowed to provide properties or links supporting the write operation. requestBody: content: application/json: schema: "$ref": "#/components/schemas/Query_Create_Form" responses: '201': content: application/hal+json: examples: Query: "$ref": "#/components/examples/QueryModel" schema: "$ref": "#/components/schemas/QueryModel" description: Created headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: project _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Project not found description: |- Returned if: * the client tries to modify a read-only property (`PropertyIsReadOnly`) * a constraint for a property was violated (`PropertyConstraintViolation`) * the client provides a link to an invalid resource (`ResourceTypeMismatch`), e.g. a user, project or operator not found headers: {} "/api/v3/queries/available_projects": get: responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: categories: href: "/api/v3/projects/6/categories" createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post self: href: "/api/v3/projects/6" title: A project versions: href: "/api/v3/projects/6/versions" _type: Project createdAt: '2015-07-06T13:28:14+00:00' description: Eveniet molestias omnis quis aut qui eum adipisci. id: 6 identifier: a_project name: A project type: Customer Project updatedAt: '2015-10-01T09:55:02+00:00' - _links: categories: href: "/api/v3/projects/14/categories" createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post self: href: "/api/v3/projects/14" title: Another project versions: href: "/api/v3/projects/14/versions" _type: Project createdAt: '2016-02-29T12:50:20+00:00' description: '' id: 14 identifier: another_project name: Another project type: updatedAt: '2016-02-29T12:50:20+00:00' _links: self: href: "/api/v3/queries/available_projects" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_projects_for_queryModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages headers: {} tags: - Queries description: Gets a list of projects that are available as projects a query can be assigned to. operationId: Available_projects_for_query summary: Available projects for query "/api/v3/queries/columns/{id}": get: parameters: - description: QueryColumn id example: priority in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/queries/columns/priority" title: Priority _type: QueryColumn::Property id: priority name: Priority schema: "$ref": "#/components/schemas/Query_ColumnModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified query does not exist. description: Returned if the QueryColumn does not exist. headers: {} tags: - Query Columns description: Retrieve an individual QueryColumn as identified by the `id` parameter. operationId: View_Query_Column summary: View Query Column "/api/v3/queries/default": get: summary: View default query operationId: View_default_query tags: - Queries description: Same as [viewing an existing, persisted Query](https://www.openproject.org/docs/api/endpoints/queries/#list-queries) in its response, this resource returns an unpersisted query and by that allows to get the default query configuration. The client may also provide additional parameters which will modify the default query. parameters: - name: filters description: |- JSON specifying filter conditions. The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters. All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`). example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]' in: query required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - name: offset description: Page number inside the queries' result collection of work packages. example: 25 in: query required: false schema: default: 1 type: integer - name: pageSize description: Number of elements to display per page for the queries' result collection of work packages. example: 25 in: query required: false schema: type: integer - name: sortBy description: JSON specifying sort criteria. The sort criteria is applied to the query's result collection of work packages overriding the query's persisted sort criteria. example: '[["status", "asc"]]' in: query required: false schema: default: '[["id", "asc"]]' type: string - name: groupBy description: The column to group by. The grouping criteria is applied to the to the query's result collection of work packages overriding the query's persisted group criteria. example: status in: query required: false schema: type: string - name: showSums description: Indicates whether properties should be summed up if they support it. The showSums parameter is applied to the to the query's result collection of work packages overriding the query's persisted sums property. example: true in: query required: false schema: default: false type: boolean - name: timestamps description: 'Indicates the timestamps to filter by when showing changed attributes on work packages. Values can be either ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part represents the zero paded hours and minutes. The last "+HH:MM" part represents the timezone offset from UTC associated with the time, the offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00". Values older than 1 day are accepted only with valid Enterprise Token available. ' example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00 in: query required: false schema: default: PT0S type: string - name: timelineVisible description: Indicates whether the timeline should be shown. example: true in: query required: false schema: default: false type: boolean - name: timelineZoomLevel description: Indicates in what zoom level the timeline should be shown. Valid values are `days`, `weeks`, `months`, `quarters`, and `years`. example: days in: query required: false schema: default: days type: string - name: showHierarchies description: Indicates whether the hierarchy mode should be enabled. example: true in: query required: false schema: default: true type: boolean responses: '200': content: application/hal+json: examples: response: value: _embedded: results: _embedded: elements: - "<--- shortened for brevity --->" _links: changeSize: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post jumpTo: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true self: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" _type: WorkPackageCollection count: 30 offset: 1 pageSize: 2 total: 234 _links: columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: highlightedAttributes: [] project: href: results: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" self: href: "/api/v3/queries/default" title: Default sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin _type: Query filters: - _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] _type: StatusQueryFilter name: Status highlightingMode: inline name: default public: false showHierarchies: true starred: false sums: false timelineLabels: {} timelineVisible: false timelineZoomLevel: days schema: "$ref": "#/components/schemas/Default_QueryModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see the default query. **Required permission:** view work packages in any project headers: {} "/api/v3/queries/filter_instance_schemas": get: responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/assignee" title: Assignee self: href: "/api/v3/queries/filter_instance_schemas/assignee" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/author" title: Author self: href: "/api/v3/queries/filter_instance_schemas/author" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false _links: self: href: "/api/v3/queries/filter_instance_schemas" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Query_Filter_Instance_SchemasModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} tags: - Query Filter Instance Schema description: Returns the list of QueryFilterInstanceSchemas defined for a global query. That is a query not assigned to a project. operationId: List_Query_Filter_Instance_Schemas summary: List Query Filter Instance Schemas "/api/v3/queries/filter_instance_schemas/{id}": get: parameters: - description: QueryFilterInstanceSchema identifier. The identifier is the filter identifier. example: author in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/author" title: Author self: href: "/api/v3/queries/filter_instance_schemas/author" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false schema: "$ref": "#/components/schemas/Query_Filter_Instance_SchemaModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified query does not exist. description: Returned if the QueryFilterInstanceSchema does not exist. headers: {} tags: - Query Filter Instance Schema description: Retrieve an individual QueryFilterInstanceSchema as identified by the id parameter. operationId: View_Query_Filter_Instance_Schema summary: View Query Filter Instance Schema "/api/v3/queries/filters/{id}": get: parameters: - description: QueryFilter identifier example: status in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/queries/filters/status" title: Status _type: QueryFilter id: status schema: "$ref": "#/components/schemas/Query_FilterModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified query does not exist. description: Returned if the QueryFilter does not exist. headers: {} tags: - Query Filters description: Retrieve an individual QueryFilter as identified by the id parameter. operationId: View_Query_Filter summary: View Query Filter "/api/v3/queries/form": post: summary: Query Create Form operationId: Query_Create_Form tags: - Queries description: '' requestBody: content: application/json: schema: "$ref": "#/components/schemas/Query_Create_Form" responses: '200': description: OK headers: {} "/api/v3/queries/operators/{id}": get: parameters: - description: QueryOperator id example: "!" in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/queries/operators/!" title: is not _type: QueryOperator id: "!" name: is not schema: "$ref": "#/components/schemas/Query_OperatorModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified query does not exist. description: Returned if the QueryOperator does not exist. headers: {} tags: - Query Operators description: Retrieve an individual QueryOperator as identified by the `id` parameter. operationId: View_Query_Operator summary: View Query Operator "/api/v3/queries/schema": get: summary: View schema for global queries operationId: View_schema_for_global_queries tags: - Queries description: Retrieve the schema for global queries, those, that are not assigned to a project. responses: '200': content: application/hal+json: examples: QuerySchema: "$ref": "#/components/examples/QuerySchemaModel" schema: "$ref": "#/components/schemas/Schema_For_Global_QueriesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: "**Required permission:** view work package in any project" headers: {} "/api/v3/queries/sort_bys/{id}": get: parameters: - description: QuerySortBy identifier. The identifier is a combination of the column identifier and the direction. example: status-asc in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: examples: response: value: _links: column: href: "/api/v3/queries/columns/status" title: Status direction: href: urn:openproject-org:api:v3:queries:directions:asc title: Ascending self: href: "/api/v3/queries/sort_bys/status-asc" title: Status (Ascending) _type: QuerySortBy id: status-asc name: Status (Ascending) schema: "$ref": "#/components/schemas/Query_Sort_ByModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any project headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified query does not exist. description: Returned if the QuerySortBy does not exist. headers: {} tags: - Query Sort Bys description: Retrieve an individual QuerySortBy as identified by the id parameter. operationId: View_Query_Sort_By summary: View Query Sort By "/api/v3/queries/{id}": delete: summary: Delete query operationId: Delete_query tags: - Queries description: Delete the query identified by the id parameter parameters: - description: Query id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: No Content headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** for own queries none; for public queries: manage public queries *Note that you will only receive this error, if you are at least allowed to see the corresponding query.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the query does not exist or the client does not have sufficient permissions to see it. **Required condition:** query belongs to user or query is public **Required permission:** view work package in queries project headers: {} get: summary: View query operationId: View_query tags: - Queries description: Retrieve an individual query as identified by the id parameter. Then endpoint accepts a number of parameters that can be used to override the resources' persisted parameters. parameters: - name: id description: Query id example: '1' in: path required: true schema: type: integer - name: filters description: |- JSON specifying filter conditions. The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters. All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`). example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]' in: query required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - name: offset description: Page number inside the queries' result collection of work packages. example: '25' in: query required: false schema: default: 1 type: integer - name: pageSize description: Number of elements to display per page for the queries' result collection of work packages. example: '25' in: query required: false schema: type: integer - name: columns description: Selected columns for the table view. example: "[]" in: query required: false schema: default: "['type', 'priority']" type: string - name: sortBy description: JSON specifying sort criteria. The sort criteria is applied to the query's result collection of work packages overriding the query's persisted sort criteria. example: '[["status", "asc"]]' in: query required: false schema: default: '[["id", "asc"]]' type: string - name: groupBy description: The column to group by. The grouping criteria is applied to the to the query's result collection of work packages overriding the query's persisted group criteria. example: status in: query required: false schema: type: string - name: showSums description: Indicates whether properties should be summed up if they support it. The showSums parameter is applied to the to the query's result collection of work packages overriding the query's persisted sums property. example: true in: query required: false schema: default: false type: boolean - name: timestamps description: 'Indicates the timestamps to filter by when showing changed attributes on work packages. Values can be either ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part represents the zero paded hours and minutes. The last "+HH:MM" part represents the timezone offset from UTC associated with the time, the offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00". Values older than 1 day are accepted only with valid Enterprise Token available. ' example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00 in: query required: false schema: default: PT0S type: string - name: timelineVisible description: Indicates whether the timeline should be shown. example: true in: query required: false schema: default: false type: boolean - name: timelineLabels description: Overridden labels in the timeline view example: "{}" in: query required: false schema: default: "{}" type: string - name: highlightingMode description: Highlighting mode for the table view. example: inline in: query required: false schema: default: inline type: string - name: highlightedAttributes description: Highlighted attributes mode for the table view when `highlightingMode` is `inline`. When set to `[]` all highlightable attributes will be returned as `highlightedAttributes`. example: "[]" in: query required: false schema: default: "['type', 'priority']" type: string - name: showHierarchies description: Indicates whether the hierarchy mode should be enabled. example: true in: query required: false schema: default: true type: boolean responses: '200': content: application/hal+json: examples: Query: "$ref": "#/components/examples/QueryModel" schema: "$ref": "#/components/schemas/QueryModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified query does not exist. description: |- Returned if the query does not exist or the client does not have sufficient permissions to see it. **Required condition:** query belongs to user or query is public **Required permission:** view work package in queries project headers: {} patch: summary: Edit Query operationId: Edit_Query tags: - Queries description: |- When calling this endpoint the client provides a single object, containing the properties and links that it wants to change, in the body. Note that it is only allowed to provide properties or links supporting the **write** operation. parameters: - description: Query id example: '1' in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/Query_Update_Form" responses: '200': content: application/hal+json: examples: response: value: _embedded: highlightedAttributes: [] results: _embedded: elements: - "<--- shortened for brevity --->" _links: changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" _type: WorkPackageCollection count: 30 offset: 1 pageSize: 2 total: 234 _links: columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: highlightedAttributes: [] project: href: "/api/v3/projects/3" title: copy results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" self: href: "/api/v3/queries/9" title: fdsfdsfdsf sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin _type: Query createdAt: '2015-03-20T12:56:56.343Z' filters: - _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] _type: StatusQueryFilter name: Status - _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" _type: WorkPackageCollection count: 30 offset: 1 pageSize: 2 total: 234 _links: columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: project: href: "/api/v3/projects/3" title: copy results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" self: href: "/api/v3/queries/9" title: fdsfdsfdsf sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin _type: Query createdAt: '2015-03-20T12:56:56.856Z' filters: - _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] _type: StatusQueryFilter name: Status - _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" _type: WorkPackageCollection count: 30 offset: 1 pageSize: 2 total: 234 _links: columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: project: href: "/api/v3/projects/3" title: copy results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" self: href: "/api/v3/queries/9" title: fdsfdsfdsf sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin _type: Query createdAt: '2015-03-20T12:56:56.468Z' filters: - _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] _type: StatusQueryFilter name: Status - _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/Hello world! This is markdown!

schema: "$ref": "#/components/schemas/MarkdownModel" description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRenderContext message: Could not render markdown string in the given context. description: |- Returned if the context passed by the client is not valid (e.g. unknown). Note that this response will also occur when the requesting user is not allowed to see the context resource (e.g. limited work package visibility). headers: {} '415': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:TypeNotSupported message: Expected Content-Type to be 'text/plain' but got 'application/json'. description: Returned if the Content-Type indicated in the request is not `text/plain`. headers: {} tags: - Previewing description: '' operationId: Preview_Markdown_document summary: Preview Markdown document "/api/v3/render/plain": post: responses: '200': content: text/html: examples: response: value: "

Hello world! This *is* plain text!

\n" schema: "$ref": "#/components/schemas/Plain_TextModel" description: OK headers: {} '415': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:TypeNotSupported message: Expected Content-Type to be 'text/plain' but got 'application/json'. description: Returned if the Content-Type indicated in the request is not `text/plain`. headers: {} tags: - Previewing description: '' operationId: Preview_plain_document summary: Preview plain document "/api/v3/revisions/{id}": get: parameters: - description: Revision id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: author: href: "/api/v3/users/1" project: href: "/api/v3/projects/1" self: href: "/api/v3/revisions/1" showRevision: href: "/projects/identifier/repository/revision/11f4b07" _type: Revision authorName: Some Developer createdAt: '2015-07-21T13:36:59.454Z' formattedIdentifier: 11f4b07 id: 1 identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6 message: format: plain html: "

This revision provides new features

An elaborate description

" raw: |- This revision provides new features An elaborate description schema: "$ref": "#/components/schemas/RevisionModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified revision does not exist. description: |- Returned if the revision does not exist or the client does not have sufficient permissions to see it. **Required permission:** view changesets for the project the repository is created in. *Note: A client without sufficient permissions shall not be able to test for the existence of a revision. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Revisions description: '' operationId: View_revision summary: View revision "/api/v3/reminders": get: summary: List all active reminders operationId: list_reminders tags: - Reminders description: Gets a list of all active reminders for the user. responses: '200': description: OK content: application/hal+json: schema: type: object required: - _type - total - count - _embedded properties: _type: type: string enum: - Collection total: type: integer description: The total amount of elements available in the collection. minimum: 0 count: type: integer description: Actual amount of elements in this response. minimum: 0 _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/ReminderModel" "/api/v3/reminders/{id}": patch: summary: Update a reminder operationId: update_reminder tags: - Reminders description: |- Updates an existing reminder. A user can only update their own active reminder. **Required permission:** view work packages for the project the reminder is contained in. parameters: - name: id in: path description: Reminder ID example: 1 required: true schema: type: integer requestBody: required: true content: application/json: schema: type: object properties: remindAt: type: string format: date-time description: The date and time when the reminder is due note: type: string description: The note of the reminder (optional) responses: '200': description: Reminder updated successfully content: application/hal+json: schema: "$ref": "#/components/schemas/ReminderModel" '404': description: Returned if the reminder does not exist or the client does not have sufficient permissions to see it. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" delete: summary: Delete a reminder operationId: delete_reminder tags: - Reminders description: |- Deletes an existing reminder. A user can only delete their own active reminder. **Required permission:** view work packages for the project the reminder is contained in. parameters: - name: id in: path description: Reminder ID example: 1 required: true schema: type: integer responses: '204': description: Reminder deleted successfully '404': description: Returned if the reminder does not exist or the client does not have sufficient permissions to see it. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" "/api/v3/roles": get: parameters: - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + grantable: filters roles based on whether they are selectable for a membership + unit: filters roles based on the unit ('project' or 'system') for which they are selectable for a membership example: '[{ "unit": { "operator": "=", "values": ["system"] }" }]' in: query name: filters required: false schema: type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/roles/3" title: Manager _type: Role id: 3 name: Manager - _links: self: href: "/api/v3/roles/2" title: Anonymous _type: Role id: 2 name: Anonymous - _links: self: href: "/api/v3/roles/5" title: Reader _type: Role id: 5 name: Reader - _links: self: href: "/api/v3/roles/4" title: Member _type: Role id: 4 name: Member - _links: self: href: "/api/v3/roles/1" title: Non member _type: Role id: 1 name: Non member _links: self: href: "/api/v3/roles" _type: Collection count: 5 total: 5 schema: "$ref": "#/components/schemas/RolesModel" description: OK headers: {} tags: - Roles description: List all defined roles. This includes built in roles like 'Anonymous' and 'Non member'. operationId: List_roles summary: List roles "/api/v3/roles/{id}": get: parameters: - description: Role id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/roles/3" title: Manager _type: Role id: 3 name: Manager schema: "$ref": "#/components/schemas/RoleModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. description: |- Returned if the client does not have sufficient permissions to see roles. **Required permission:** view members **or** manage members headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the role does not exist. headers: {} tags: - Roles description: Fetch an individual role. operationId: View_role summary: View role "/api/v3/sprints": get: parameters: - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + definingWorkspace: filters sprints based on the project they are defined in. This is opposed to the projects they are shared with. example: '[{ "definingWorkspace": { "operator": "=", "values": ["1"] }" }]' in: query name: filters required: false schema: type: string - description: Page number inside the requested collection. example: '25' in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: '25' in: query name: pageSize required: false schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/SprintCollectionModel" examples: response: "$ref": "#/components/examples/SprintCollectionResponse" description: OK headers: {} tags: - Sprints description: List sprints visible to the user. This endpoint supports pagination and filtering. operationId: List_sprints summary: List sprints "/api/v3/sprints/{id}": get: summary: Get sprint operationId: get_sprint tags: - Sprints description: Retrieves a sprint defined by its unique identifier. parameters: - description: Sprint id example: '1' in: path name: id required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/SprintModel" examples: response: "$ref": "#/components/examples/SprintResponse" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the sprint does not exist or the client does not have sufficient permissions to see it. **Required permission:** view master backlogs (this will change to view sprints) "/api/v3/statuses": get: summary: List the collection of all statuses operationId: list_statuses tags: - Statuses description: Returns a collection of all work package statuses. responses: '200': description: OK content: application/hal+json: examples: simple status collection: "$ref": "#/components/examples/StatusCollection" schema: "$ref": "#/components/schemas/StatusCollectionModel" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package (on any project) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the statuses. "/api/v3/statuses/{id}": get: summary: Get a work package status operationId: get_status tags: - Statuses description: Returns a work package status by its unique identifier. parameters: - name: id description: Status id in: path required: true schema: type: integer example: 1 responses: '200': description: OK content: application/hal+json: examples: response: "$ref": "#/components/examples/StatusResponse" schema: "$ref": "#/components/schemas/StatusModel" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package (on any project) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see this status. '404': description: Returned if the status does not exist. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. "/api/v3/storages": get: summary: Get Storages operationId: list_storages tags: - File links description: Returns a collection of storages. responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/StorageCollectionModel" examples: Simple storage collection: "$ref": "#/components/examples/StoragesSimpleCollectionModel" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. post: summary: Creates a storage. operationId: create_storage tags: - File links description: |- Creates a storage resource. When creating a storage, a confidential OAuth 2 provider application is created automatically. The oauth client id and secret of the created OAuth application are returned in the response. **IMPORTANT:** This is the only time, the oauth client secret is visible to the consumer. After that, the secret is hidden. To update the storage with OAuth client credentials, which enable the storage resource to behave as an OAuth 2 client against an external OAuth 2 provider application, another request must be made to create those, see `POST /api/v3/storages/{id}/oauth_client_credentials`. requestBody: content: application/json: schema: "$ref": "#/components/schemas/StorageWriteModel" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/StorageReadModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Depends on the page the grid is defined for. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/storages/{id}": get: summary: Get a storage operationId: get_storage tags: - File links description: |- Gets a storage resource. As a side effect, a live connection to the storages origin is established to retrieve connection state data. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/StorageReadModel" examples: Nextcloud storage: "$ref": "#/components/examples/StorageNextcloudResponse" Freshly created Nextcloud storage: "$ref": "#/components/examples/StorageNextcloudResponseForCreation" OneDrive storage: "$ref": "#/components/examples/StorageOneDriveResponse" Incomplete OneDrive storage: "$ref": "#/components/examples/StorageOneDriveIncompleteResponse" Unauthorized Nextcloud storage: "$ref": "#/components/examples/StorageNextcloudUnauthorizedResponse" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links patch: summary: Update a storage operationId: update_storage tags: - File links description: |- Updates a storage resource. Only data that is not generated by the server can be updated. This excludes the OAuth 2 application data. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 requestBody: content: application/json: schema: "$ref": "#/components/schemas/StorageWriteModel" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/StorageReadModel" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links delete: summary: Delete a storage operationId: delete_storage tags: - File links description: |- Deletes a storage resource. This also deletes all related records, like the created oauth application, client, and any file links created within this storage. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 responses: '204': description: No content '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links "/api/v3/storages/{id}/files": get: summary: Gets files of a storage. operationId: get_storage_files tags: - File links description: |- Gets a collection of files from a storage. If no `parent` context is given, the result is the content of the document root. With `parent` context given, the result contains the collections of files/directories from within the given parent file id. If given `parent` context is no directory, `400 Bad Request` is returned. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 - name: parent description: Parent file identification in: query required: false schema: type: string example: "/my/data" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/StorageFilesModel" '400': description: Returned if the given parent parameter value does not refer to a directory. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: The given parent is not a directory. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned in either of those cases: - if the storage does not exist or the client does not have sufficient permissions to see it **Required permission:** view file links - if the document root file identification does not exist on the storage "/api/v3/storages/{id}/files/prepare_upload": post: summary: Preparation of a direct upload of a file to the given storage. operationId: prepare_storage_file_upload tags: - File links description: |- Executes a request that prepares a link for a direct upload to the storage. The background here is, that the client needs to make a direct request to the storage instance for file uploading, but should not get access to the credentials, which are stored in the backend. The response contains a link object, that enables the client to execute a file upload without the real credentials. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 requestBody: content: application/json: schema: "$ref": "#/components/schemas/StorageFileUploadPreparationModel" responses: '201': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/StorageFileUploadLinkModel" '400': description: Returned if the given parent parameter value does not refer to a directory. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: The given parent is not a directory. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage file links '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links '500': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: outbound request failed: description: |- This error is returned, if the outbound request to the file storage failed with a 404, e.g. if the upload location is not available. value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:OutboundRequest:NotFound message: An outbound request to another resource has failed with status code 404. enterprise token missing: description: |- This error is returned, if there is no Enterprise token available. The file upload to that storage is only available in an Enterprise edition. value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingEnterpriseToken message: The request cannot be handled due to invalid or missing Enterprise token. description: Returned if the outbound request to the storage has failed with any reason. "/api/v3/storages/{id}/folders": post: summary: Creation of a new folder operationId: create_storage_folder tags: - File links description: Creates a new folder under the given parent parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 requestBody: content: application/json: schema: "$ref": "#/components/schemas/StorageFolderWriteModel" examples: Valid example: "$ref": "#/components/examples/StorageCreateFolderRequestBody" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/StorageFileModel" '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: The given parent is not a directory. description: Returned if the request is missing a required parameter. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage file links '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links "/api/v3/storages/{id}/oauth_client_credentials": post: summary: Creates an oauth client credentials object for a storage. operationId: create_storage_oauth_credentials tags: - File links description: |- Inserts the OAuth 2 credentials into the storage, to allow the storage to act as an OAuth 2 client. Calling this endpoint on a storage that already contains OAuth 2 client credentials will replace them. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 requestBody: content: application/json: schema: "$ref": "#/components/schemas/OAuthClientCredentialsWriteModel" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/StorageReadModel" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** admin '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links "/api/v3/storages/{id}/open": get: summary: Open the storage operationId: open_storage tags: - File Links description: |- Gets a redirect to the location of the storage's remote origin. The storage's files root should be the target location. parameters: - name: id description: Storage id in: path required: true schema: type: integer example: 1337 responses: '303': description: Redirect headers: Location: schema: type: string format: uri '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the storage does not exist or the client does not have sufficient permissions to see it. **Required permission:** view file links "/api/v3/time_entries": get: summary: List time entries operationId: list_time_entries tags: - Time entries description: |- Lists time entries. The time entries returned depend on the filters provided and also on the permission of the requesting user. parameters: - name: offset description: Page number inside the requested collection. example: 25 in: query required: false schema: default: 1 type: integer - name: pageSize description: Number of elements to display per page. example: '25' in: query required: false schema: type: integer - name: sortBy description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are: + id: Sort by primary key + hours: Sort by logged hours + spent_on: Sort by spent on date + created_at: Sort by time entry creation datetime + updated_at: Sort by the time the time entry was updated last example: '[["spent_on", "asc"]]' in: query required: false schema: default: '["spent_on", "asc"]' type: string - name: filters description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + entity_type: Filter time entries depending on the entity they are logged on. Can either be `WorkPackage` or `Meeting`. + entity_id: Filter time entries for the specified entity IDs. + project_id: Filter time entries by project + user_id: Filter time entries by users + ongoing: Filter to only recevie ongoing timers + spent_on: Filter time entries by spent on date + created_at: Filter time entries by creation datetime + updated_at: Filter time entries by the last time they where updated + activity_id: Filter time entries by time entry activity example: '[{ "entity_type": { "operator": "=", "values": ["WorkPackage"] }}, { "entity_id": { "operator": "=", "values": ["1", "2"] } }, { "project": { "operator": "=", "values": ["1"] } }]' in: query required: false schema: type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/TimeEntryCollectionModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: Returned if the client is not logged in and login is required. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to view this resource. post: summary: Create time entry tags: - Time entries description: |- Creates a new time entry applying the attributes provided in the body. Please note that while there is a fixed set of attributes, custom fields can extend a time entries' attributes and are accepted by the endpoint. operationId: create_time_entry requestBody: content: application/json: schema: "$ref": "#/components/schemas/TimeEntryModel" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/TimeEntryModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** Log time content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: workPackage _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Work package is invalid. "/api/v3/time_entries/{id}/form": post: parameters: - description: Time entries activity id example: 1 in: path name: id required: true schema: type: integer responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to edit the time entry. **Required permission:** *edit time entries* for every time entry of a project, or *edit own time entries* for time entries belonging to the user. headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the time entry does not exist or if the client does not have sufficient permissions to view it. **Required permission** `view time entries` in the project the time entry is assigned to or `view own time entries` for time entries belonging to the user headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Time Entries description: '' operationId: Time_entry_update_form requestBody: content: application/json: schema: type: integer description: Time entries activity id required: true summary: Time entry update form "/api/v3/time_entries/activity/{id}": get: summary: View time entries activity operationId: get_time_entries_activity tags: - Time entry activities description: Fetches the time entry activity resource by the given id. parameters: - name: id description: Time entries activity id in: path example: 1 required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/TimeEntryActivityModel" '404': description: |- Returned if the activity does not exist or if the user does not have permission to view them. **Required permission** `view time entries`, `log time`, `edit time entries`, `edit own time entries` or `manage project activities` in any project content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. "/api/v3/time_entries/available_projects": get: responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _type: Project... - _type: Project... _links: self: href: "/api/v3/time_entries/available_projects" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_projects_for_time_entriesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** *log time*, *edit time entries* or *edit own time entries* in any project headers: {} tags: - Time Entries description: Gets a list of projects in which a time entry can be created in or be assigned to on update. The list contains all projects in which the user issuing the request has the necessary permissions. operationId: Available_projects_for_time_entries summary: Available projects for time entries "/api/v3/time_entries/form": post: responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** *log time* in any project headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Time Entries description: '' operationId: Time_entry_create_form summary: Time entry create form "/api/v3/time_entries/schema": get: responses: '200': content: application/hal+json: examples: response: value: _dependencies: [] _links: self: href: "/api/v3/time_entries/schema" _type: Schema activity: _links: {} hasDefault: true location: _links name: Activity required: true type: TimeEntriesActivity writable: true createdAt: hasDefault: false name: Created on options: {} required: true type: DateTime writable: false customField29: hasDefault: false name: sfsdfsdfsdfsdfdsf options: rtl: required: false type: String writable: true hours: hasDefault: false name: Hours options: {} required: true type: Duration writable: true id: hasDefault: false name: ID options: {} required: true type: Integer writable: false project: _links: {} hasDefault: false location: _links name: Project required: false type: Project writable: true ongoing: hasDefault: false name: Ongoing options: {} required: false type: Boolean writable: true spentOn: hasDefault: false name: Date options: {} required: true type: Date writable: true updatedAt: hasDefault: false name: Updated on options: {} required: true type: DateTime writable: false user: hasDefault: false name: User options: {} required: true type: User writable: false workPackage: _links: {} hasDefault: false location: _links name: Work package required: false type: WorkPackage writable: true schema: "$ref": "#/components/schemas/View_time_entry_schemaModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see the schema. **Required permission:** *log time* or *view time entries* or *edit time entries* or *edit own time entries* on any project headers: {} tags: - Time Entries description: '' operationId: View_time_entry_schema summary: View time entry schema "/api/v3/time_entries/{id}": delete: summary: Delete time entry tags: - Time entries description: Permanently deletes the specified time entry. operationId: delete_time_entry parameters: - name: id description: Time entry id example: 1 in: path required: true schema: type: integer responses: '204': description: Returned if the time entry was deleted successfully. '403': description: Returned if the client does not have sufficient permissions content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. '404': description: |- Returned if the time entry does not exist or if the user does not have sufficient permissions to see the time entry. **Required permission** `view time entries` in the project the time entry is assigned to or `view own time entries` for time entries belonging to the user content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" get: summary: Get time entry tags: - Time entries description: Retrieves a single time entry identified by the given id. operationId: get_time_entry parameters: - name: id description: time entry id example: 1 in: path required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/TimeEntryModel" '404': description: |- Returned if the time entry does not exist or if the user does not have permission to view them. **Required permission** - `view time entries` in the project the time entry is assigned to or - `view own time entries` for time entries belonging to the user content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. patch: summary: update time entry tags: - Time Entries description: |- Updates the given time entry by applying the attributes provided in the body. Please note that while there is a fixed set of attributes, custom fields can extend a time entries' attributes and are accepted by the endpoint. operationId: update_time_entry parameters: - name: id description: Time entry id example: 1 in: path required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/TimeEntryModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** Edit (own) time entries, depending on what time entry is being modified. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: workPackage _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Work package is invalid. "/api/v3/types": get: responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/types/1" _type: Type color: "#ff0000" createdAt: '2014-05-21T08:51:20.396Z' id: 1 isDefault: true isMilestone: false name: Bug position: 1 updatedAt: '2014-05-21T08:51:20.396Z' - _links: self: href: "/api/v3/types/2" _type: Type color: "#888" createdAt: '2014-05-21T08:51:20.396Z' id: 2 isDefault: false isMilestone: false name: Feature position: 2 updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/types" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/TypesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the types. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package or manage types (on any project) headers: {} tags: - Types description: '' operationId: List_all_Types summary: List all Types "/api/v3/types/{id}": get: parameters: - description: Type id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _links: self: href: "/api/v3/types/1" _type: Type color: "#ff0000" createdAt: '2014-05-21T08:51:20.396Z' id: 1 isDefault: true isMilestone: false name: Bug position: 1 updatedAt: '2014-05-21T08:51:20.396Z' schema: "$ref": "#/components/schemas/TypeModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see this type. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package or manage types (on any project) headers: {} tags: - Types description: '' operationId: View_Type summary: View Type "/api/v3/users": get: summary: List Users operationId: list_Users description: |- Lists users. Only administrators or users with the following global permission can access this resource: - `manage_user` tags: - Users - Principals parameters: - description: Page number inside the requested collection. example: '25' in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: '25' in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + status: Status the user has + group: Name of the group in which to-be-listed users are members. + name: Filter users in whose first or last names, or email addresses the given string occurs. + login: User's login example: '[{ "status": { "operator": "=", "values": ["invited"] } }, { "group": { "operator": "=", "values": ["1"] } }, { "name": { "operator": "=", "values": ["h.wurst@openproject.com"] } }]' in: query name: filters required: false schema: type: string - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. example: '[["status", "asc"]]' in: query name: sortBy required: false schema: type: string - description: Comma separated list of properties to include. example: total,elements/name,elements/self,self in: query name: select required: false schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/UserCollectionModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to list users. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator or any of: 'manage_members', 'manage_user', 'share_work_packages'. post: summary: Create User operationId: create_user tags: - Users - Principals description: |- Creates a new user. Only administrators and users with manage_user global permission are allowed to do so. When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. Valid values for `status`: 1) "active" - In this case a password has to be provided in addition to the other attributes. 2) "invited" - In this case nothing but the email address is required. The rest is optional. An invitation will be sent to the user. requestBody: content: application/json: schema: "$ref": "#/components/schemas/UserCreateModel" responses: '201': content: application/hal+json: schema: "$ref": "#/components/schemas/UserModel" description: Created '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to create new users. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrator '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: email _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The email address is already taken. description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/users/schema": get: responses: '200': content: application/hal+json: examples: response: value: _dependencies: [] _links: self: href: "/api/v3/users/schema" _type: Schema admin: hasDefault: false name: Administrator options: {} required: false type: Boolean writable: true avatar: hasDefault: false name: Avatar options: {} required: false type: String writable: false createdAt: hasDefault: false name: Created on options: {} required: true type: DateTime writable: false customField1: hasDefault: false name: User String CF required: false type: String writable: true customField2: hasDefault: false location: _links name: User List cf required: false type: CustomOption writable: true firstName: hasDefault: false maxLength: 255 minLength: 1 name: First name options: {} required: true type: String writable: false id: hasDefault: false name: ID options: {} required: true type: Integer writable: false identityUrl: hasDefault: false name: Identity url options: {} required: false type: String writable: true language: hasDefault: false name: Language options: {} required: false type: String writable: true lastName: hasDefault: false maxLength: 255 minLength: 1 name: Last name options: {} required: true type: String writable: false login: hasDefault: false maxLength: 255 minLength: 1 name: Username options: {} required: true type: String writable: true mail: hasDefault: false maxLength: 255 minLength: 1 name: Email options: {} required: true type: String writable: true password: hasDefault: false name: Password options: {} required: false type: Password writable: false status: hasDefault: false name: Status options: {} required: false type: String writable: true updatedAt: hasDefault: false name: Updated on options: {} required: true type: DateTime writable: false schema: "$ref": "#/components/schemas/View_user_schemaModel" description: OK headers: {} tags: - Users description: The schema response use two exemplary custom fields that extend the schema response. Depending on your instance and custom field configuration, the response will look somewhat different. operationId: View_user_schema summary: View user schema "/api/v3/users/{id}": delete: summary: Delete user operationId: delete_user description: Permanently deletes the specified user account. tags: - Users - Principals parameters: - description: User id. Use `me` to reference current user, if any. example: 1 in: path name: id required: true schema: type: string responses: '202': description: |- Returned if the account was deleted successfully. Note that the response body is empty as of now. In future versions of the API a body *might* be returned, indicating the progress of deletion. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete the account of this user. description: |- Returned if the client does not have sufficient permissions or if deletion of users was disabled in the instance wide settings. **Required permission:** Administrators only (exception: users might be able to delete their own accounts) '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist. description: Returned if the user does not exist. get: summary: View user operationId: view_user description: '' tags: - Users - Principals parameters: - description: User id. Use `me` to reference current user, if any. example: 1 in: path name: id required: true schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/UserModel" examples: user response: "$ref": "#/components/examples/UserResponse" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist or you do not have permission to view them. description: |- Returned if the user does not exist or if the API user does not have permission to view them. **Required permission** The user needs to be locked in if the installation is configured to prevent anonymous access patch: summary: Update user operationId: update_user tags: - Users - Principals description: |- Updates the user's writable attributes. When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. Password updates for self-service account changes require both `password` and `currentPassword`. parameters: - description: User id. Use `me` to reference current user, if any. example: 1 in: path name: id required: true schema: type: string requestBody: content: application/json: schema: "$ref": "#/components/schemas/UserCreateModel" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/UserModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to update the account of this user. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Administrators, manage_user global permission '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist or you do not have permission to view them. description: |- Returned if the user does not exist or if the API user does not have the necessary permissions to update it. **Required permission:** Administrators only (exception: users may update their own accounts) '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: email constraint violation: value: _embedded: details: attribute: email _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The email address is already taken. invalid current password: value: _embedded: details: attribute: currentPassword _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Current password is invalid. description: |- Returned if: * the client tries to modify a read-only property (`PropertyIsReadOnly`) * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/users/{id}/form": post: parameters: - description: User id. Use `me` to reference current user, if any. example: 1 in: path name: id required: true schema: type: string responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage_user global permission headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the request user can not be found. *Note: A client without sufficient permissions shall not be able to test for the existence of a membership. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Users description: |- Validates a user update payload. For self password changes, provide both `password` and `currentPassword`. operationId: User_update_form summary: User update form "/api/v3/users/{id}/lock": delete: summary: Unlock user operationId: unlock_user tags: - Users parameters: - description: User id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/UserModel" description: OK '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidUserStatusTransition message: The current user account status does not allow this operation. description: |- Returned if the client tries to unlock a user account whose current status does not allow this transition. **Required permission:** Administrators only '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to unlock the account of this user. description: |- Returned if the client does not have sufficient permissions for unlocking a user. **Required permission:** Administrators only '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist. description: Returned if the user does not exist. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" post: summary: Lock user operationId: lock_user tags: - Users parameters: - description: User id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/UserModel" description: OK '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidUserStatusTransition message: The current user account status does not allow this operation. description: |- Returned if the client tries to lock a user account whose current status does not allow this transition. **Required permission:** Administrators only '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to lock the account of this user. description: |- Returned if the client does not have sufficient permissions for locking a user. **Required permission:** Administrators only '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist. description: Returned if the user does not exist. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/users/{id}/non_working_times": get: summary: List personal non-working times for a user operationId: list_user_non_working_times tags: - User Working Times description: |- Returns all personal non-working times for the given user, ordered by start date ascending. Personal non-working times mark date ranges as non-working for a user (e.g., a local holiday or personal day off not covered by the system-wide non-working days). **Required permissions:** - Administrators can view non-working days for any user. - Users with the global `manage_own_working_times` permission can view their own records. - Users with the global `manage_working_times` permission can view non-working days for any user. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 - name: year in: query required: false description: Filter results to the given year. Defaults to the current year if not provided. schema: type: integer example: 2025 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/UserNonWorkingTimeCollectionModel" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist or you do not have permission to view them. description: Returned if the user does not exist or is not visible to the requesting user. post: summary: Create a personal non-working day for a user operationId: create_user_non_working_time tags: - User Working Times description: |- Creates a personal non-working time range for the given user. The date range must not overlap with an existing non-working time record for the same user. **Required permissions:** - Administrators can create non-working days for any user. - Users with the global `manage_own_working_times` permission can create records for themselves. - Users with the global `manage_working_times` permission can create non-working days for any user. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 requestBody: content: application/json: schema: "$ref": "#/components/schemas/UserNonWorkingTimeModel" example: startDate: '2025-06-16' endDate: '2025-06-20' responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/UserNonWorkingTimeModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_working_times` globally (for other users) or `manage_own_working_times` globally (for own records). '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist or you do not have permission to view them. description: Returned if the user does not exist or is not visible to the requesting user. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Validation failed. description: |- Returned if the request body contains invalid parameters, or if the date range overlaps with an existing non-working time record for the user. "/api/v3/users/{id}/non_working_times/{non_working_time_id}": get: summary: View a personal non-working time record operationId: view_user_non_working_time tags: - User Working Times description: |- Returns a single personal non-working time record for the given user. **Required permissions:** - Administrators can view non-working time records for any user. - Users with the global `manage_own_working_times` permission can view their own records. - Users with the global `manage_working_times` permission can view non-working time records for any user. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 - name: non_working_time_id in: path required: true description: The id of the personal non-working time record. schema: type: integer example: 7 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/UserNonWorkingTimeModel" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the user or non-working time record does not exist, or if the requesting user does not have permission to view it. patch: summary: Update a personal non-working time record operationId: update_user_non_working_time tags: - User Working Times description: |- Updates the given personal non-working time record. **Required permissions:** - Administrators can update non-working time records for any user. - Users with the global `manage_own_working_times` permission can update their own records. - Users with the global `manage_working_times` permission can update non-working time records for any user. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 - name: non_working_time_id in: path required: true description: The id of the personal non-working time record. schema: type: integer example: 7 requestBody: content: application/json: schema: "$ref": "#/components/schemas/UserNonWorkingTimeModel" example: startDate: '2025-06-23' endDate: '2025-06-27' responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/UserNonWorkingTimeModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_working_times` globally (for other users) or `manage_own_working_times` globally (for own records). '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the user or non-working time record does not exist, or if the requesting user does not have permission to view it. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Validation failed. description: |- Returned if the request body contains invalid parameters, or if the date range overlaps with an existing non-working time record for the user. delete: summary: Delete a personal non-working time record operationId: delete_user_non_working_time tags: - User Working Times description: |- Removes the personal non-working time record for the given user. **Required permissions:** - Administrators can delete non-working time records for any user. - Users with the global `manage_own_working_times` permission can delete their own records. - Users with the global `manage_working_times` permission can delete non-working time records for any user. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 - name: non_working_time_id in: path required: true description: The id of the personal non-working time record. schema: type: integer example: 7 responses: '204': description: |- No Content. The record was deleted successfully. '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_working_times` globally (for other users) or `manage_own_working_times` globally (for own records). '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the user or non-working time record does not exist, or if the requesting user does not have permission to view it. "/api/v3/users/{id}/working_hours": get: summary: List working hours for a user operationId: list_user_working_hours tags: - User Working Times description: |- Returns all working hours records for the given user, ordered by `validFrom` descending. Multiple records may exist for a user; each represents a period of their working time configuration. The most recently effective record (the one with the latest `validFrom` that is not in the future) is used for capacity calculations. **Required permissions:** - Administrators can view working hours for any user. - Users with the global `manage_working_times` permission can view working hours for any user. - Any user can view their own working hours records. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/UserWorkingHoursCollectionModel" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist or you do not have permission to view them. description: Returned if the user does not exist or is not visible to the requesting user. post: summary: Create a working hours record for a user operationId: create_user_working_hours tags: - User Working Times description: |- Creates a new working hours record for the given user, effective from the given date. **Required permissions:** - Administrators can create working hours records for any user. - Users with the global `manage_own_working_times` permission can create records for themselves. - Users with the global `manage_working_times` permission can create working hours records for any user. Use `me` as the `id` to reference the current user. parameters: - name: id in: path required: true description: User id. Use `me` to reference the current user. schema: type: string example: 42 requestBody: content: application/json: schema: "$ref": "#/components/schemas/UserWorkingHoursModel" example: validFrom: '2025-01-01' mondayHours: 8 tuesdayHours: 8 wednesdayHours: 8 thursdayHours: 8 fridayHours: 8 saturdayHours: 0 sundayHours: 0 availabilityFactor: 100 responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/UserWorkingHoursModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_working_times` globally (for other users) or `manage_own_working_times` globally (for own records). '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified user does not exist or you do not have permission to view them. description: Returned if the user does not exist or is not visible to the requesting user. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Validation failed. description: Returned if the request body contains invalid parameters. "/api/v3/users/{id}/working_hours/{working_hours_id}": get: summary: View a working hours record operationId: view_user_working_hours_record tags: - User Working Times description: |- Returns a single working hours record for the given user. **Required permissions:** - Administrators can view working hours records for any user. - Users with the global `manage_working_times` permission can view working hours for any user. - Any user can view their own working hours records. parameters: - name: id in: path required: true description: User id. schema: type: integer example: 42 - name: working_hours_id in: path required: true description: Working hours record id. schema: type: integer example: 1 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/UserWorkingHoursModel" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the user or working hours record does not exist, or if the requesting user does not have permission to view it. patch: summary: Update a working hours record operationId: update_user_working_hours_record tags: - User Working Times description: |- Updates the given working hours record. Only records that have not yet taken effect (i.e., `validFrom` is in the future) can be updated. Attempting to update a record that is already in effect will return a `422` error. **Required permissions:** - Administrators can update working hours records for any user. - Users with the global `manage_own_working_times` permission can update their own records. - Users with the global `manage_working_times` permission can update working hours for any user. parameters: - name: id in: path required: true description: User id. schema: type: integer example: 42 - name: working_hours_id in: path required: true description: Working hours record id. schema: type: integer example: 2 requestBody: content: application/json: schema: "$ref": "#/components/schemas/UserWorkingHoursModel" example: mondayHours: 6 tuesdayHours: 6 wednesdayHours: 6 thursdayHours: 6 fridayHours: 6 saturdayHours: 0 sundayHours: 0 availabilityFactor: 80 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/UserWorkingHoursModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_working_times` globally (for other users) or `manage_own_working_times` globally (for own records). '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the user or working hours record does not exist, or if the requesting user does not have permission to view it. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Validation failed. description: |- Returned if the request body contains invalid parameters, or if the record has already taken effect and cannot be modified. delete: summary: Delete a working hours record operationId: delete_user_working_hours_record tags: - User Working Times description: |- Deletes the given working hours record. **Required permissions:** - Administrators can delete working hours records for any user. - Users with the global `manage_own_working_times` permission can delete their own records. - Users with the global `manage_working_times` permission can delete working hours records for any user. parameters: - name: id in: path required: true description: User id. schema: type: integer example: 42 - name: working_hours_id in: path required: true description: Working hours record id. schema: type: integer example: 2 responses: '204': description: |- No Content. The record was deleted successfully. '401': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You need to be authenticated to access this resource. description: Returned if the client is not authenticated. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** `manage_working_times` globally (for other users) or `manage_own_working_times` globally (for own records). '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the user or working hours record does not exist, or if the requesting user does not have permission to view it. "/api/v3/values/schema/{id}": get: parameters: - name: id in: path description: |- The identifier of the value. This is typically the value of the `property` property of the `Values` resource. It should be in lower camelcase format. example: startDate required: true schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/SchemaModel" examples: Values::Property Start date schema: "$ref": "#/components/examples/ValuesPropertyStartDateSchema" Values::Property Due date schema: "$ref": "#/components/examples/ValuesPropertyDueDateSchema" Values::Property Date schema for Milestone work package: "$ref": "#/components/examples/ValuesPropertyDateSchema" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: Returned if the schema does not exist. '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:BadRequest message: 'Bad request: property is invalid' description: Returned if the requested property id is not in a lower camel case format. tags: - Values::Property description: The schema of a `Values` resource. operationId: View_values_schema summary: View Values schema "/api/v3/versions": get: summary: List versions operationId: list_versions tags: - Versions description: |- Returns a collection of versions. The client can choose to filter the versions similar to how work packages are filtered. In addition to the provided filters, the server will reduce the result set to only contain versions, for which the requesting client has sufficient permissions (*view_work_packages*). parameters: - name: filters description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: - sharing: filters versions by how they are shared within the server (*none*, *descendants*, *hierarchy*, *tree*, *system*). - name: filters versions by their name. example: '[{ "sharing": { "operator": "=", "values": ["system"] } }]' in: query required: false schema: type: string - name: sortBy description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported attributes are: - id: Sort by the version id - name: Sort by the version name using numeric collation, comparing sequences of decimal digits by their numeric value example: '[["name", "desc"]]' in: query required: false schema: type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/VersionCollectionModel" post: summary: Create version operationId: create_version tags: - Versions description: |- Creates a new version applying the attributes provided in the body. Please note that while there is a fixed set of attributes, custom fields can extend a version's attributes and are accepted by the endpoint. You can use the form and schema to be retrieve the valid attribute values and by that be guided towards successful creation. requestBody: content: application/json: schema: "$ref": "#/components/schemas/VersionWriteModel" examples: create version: "$ref": "#/components/examples/VersionCreateRequest" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/VersionReadModel" examples: response: "$ref": "#/components/examples/VersionSimpleResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Manage versions '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/versions/available_projects": get: responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: categories: href: "/api/v3/projects/6/categories" createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post editWorkPackage: href: "/api/v3//work_packages/{id}/form" method: post templated: true self: href: "/api/v3/projects/6" title: A project versions: href: "/api/v3/projects/6/versions" _type: Project createdAt: '2015-07-06T13:28:14+00:00' description: Eveniet molestias omnis quis aut qui eum adipisci. Atque aut aut in exercitationem adipisci amet. Nisi asperiores quia ratione veritatis enim exercitationem magnam. Aut fuga architecto adipisci nihil. Et repellat pariatur. Aliquam et sed perferendis nostrum quaerat. Fugit doloremque voluptatem. id: 6 identifier: a_project name: A project type: Customer Project updatedAt: '2015-10-01T09:55:02+00:00' - _links: categories: href: "/api/v3/projects/14/categories" createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post self: href: "/api/v3/projects/14" title: Another project versions: href: "/api/v3/projects/14/versions" _type: Project createdAt: '2016-02-29T12:50:20+00:00' description: '' id: 14 identifier: another_project name: Another project type: updatedAt: '2016-02-29T12:50:20+00:00' _links: self: href: "/api/v3/versions/available_projects" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_projects_for_versionsModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage versions headers: {} tags: - Versions description: Gets a list of projects in which a version can be created in. The list contains all projects in which the user issuing the request has the manage versions permissions. operationId: Available_projects_for_versions summary: Available projects for versions "/api/v3/versions/form": post: responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage versions in any project headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Versions description: '' operationId: Version_create_form summary: Version create form "/api/v3/versions/schema": get: responses: '200': content: application/hal+json: examples: response: value: _dependencies: [] _links: self: href: "/api/v3/versions/schema" _type: Schema createdAt: hasDefault: false name: Created on required: true type: DateTime writable: false customField14: hasDefault: false name: text CF required: false type: String visibility: default writable: true customField40: _links: {} hasDefault: false location: _links name: List CF required: false type: CustomOption visibility: default writable: true definingProject: _links: {} hasDefault: false name: Project required: true type: Project writable: true description: hasDefault: false name: Description required: false type: Formattable writable: true endDate: hasDefault: false name: Finish date required: false type: Date writable: false id: hasDefault: false name: ID required: true type: Integer writable: false name: hasDefault: false maxLength: 60 minLength: 1 name: Name required: true type: String writable: true sharing: _links: {} hasDefault: false name: Sharing required: true type: String visibility: default writable: true startDate: hasDefault: false name: Start date required: false type: Date writable: true status: _links: {} hasDefault: false name: Status required: true type: String visibility: default writable: true updatedAt: hasDefault: false name: Updated on required: true type: DateTime writable: false schema: "$ref": "#/components/schemas/Version_schemaModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see the schema. **Required permission:** view work packages or manage versions on any project headers: {} tags: - Versions description: '' operationId: View_version_schema summary: View version schema "/api/v3/versions/{id}": get: summary: Get version operationId: get_version tags: - Versions description: Retrieves a version defined by its unique identifier. parameters: - description: Version id example: '1' in: path name: id required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/VersionReadModel" examples: response: "$ref": "#/components/examples/VersionSimpleResponse" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the version does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (any project where the version is available) *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* delete: summary: Delete version operationId: delete_Version tags: - Versions description: Deletes the version. Entities associated to the version will no longer be assigned to it. parameters: - description: Version id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: Returned if the version was successfully deleted '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage versions '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the version does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (any project where the version is available) *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" patch: summary: Update Version operationId: update_Version tags: - Versions description: |- Updates the given version by applying the attributes provided in the body. Please note that while there is a fixed set of attributes, custom fields can extend a version's attributes and are accepted by the endpoint. parameters: - description: Version id example: '1' in: path name: id required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/VersionWriteModel" examples: update name: "$ref": "#/components/examples/VersionUpdateNameRequest" responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/VersionReadModel" examples: response: "$ref": "#/components/examples/VersionSimpleResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** Manage versions in the version's project. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the version does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (any project where the version is available) *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * a constraint for a property was violated (`PropertyConstraintViolation`) "/api/v3/versions/{id}/form": post: parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer responses: '200': description: OK headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage versions in the version's project headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Versions description: '' operationId: Version_update_form summary: Version update form "/api/v3/versions/{id}/projects": get: parameters: - description: Version id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: categories: href: "/api/v3/projects/1/categories" self: href: "/api/v3/projects/1" title: Lorem status: href: "/api/v3/project_statuses/on_track" title: On track versions: href: "/api/v3/projects/1/versions" _type: Project active: true createdAt: '2014-05-21T08:51:20.396Z' description: format: markdown html: "

Lorem ipsum dolor sit amet

" raw: Lorem **ipsum** dolor sit amet id: 1 identifier: project_identifier name: Project example statusExplanation: format: markdown html: "

Everything fine

" raw: Everything **fine** updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/versions/2/projects" _type: Collection count: 1 total: 1 schema: "$ref": "#/components/schemas/List_workspaces_by_versionModel" description: OK headers: {} '404': description: |- Returned if the version does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (any project where the given version is available) *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Projects description: |- This endpoint lists the projects where the given version is available. The projects returned depend on the sharing settings of the given version, but are also limited to the projects that the current user is allowed to see. This endpoint is deprecated and replaced by [`/api/v3/versions/{id}/workspaces`](https://www.openproject.org/docs/api/endpoints/projects/#list-workspaces-having-version) operationId: List_projects_with_version summary: List projects having version "/api/v3/versions/{id}/workspaces": get: parameters: - description: Version id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: categories: href: "/api/v3/projects/1/categories" self: href: "/api/v3/projects/1" title: Lorem status: href: "/api/v3/project_statuses/on_track" title: On track versions: href: "/api/v3/projects/1/versions" _type: Project active: true createdAt: '2014-05-21T08:51:20.396Z' description: format: markdown html: "

Lorem ipsum dolor sit amet

" raw: Lorem **ipsum** dolor sit amet id: 1 identifier: project_identifier name: Project example statusExplanation: format: markdown html: "

Everything fine

" raw: Everything **fine** updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/versions/2/projects" _type: Collection count: 1 total: 1 schema: "$ref": "#/components/schemas/List_workspaces_by_versionModel" description: OK headers: {} '404': description: |- Returned if the version does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (any workspace where the given version is available) *Note: A client without sufficient permissions shall not be able to test for the existence of a version. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Projects description: |- This endpoint lists the workspaces where the given version is available. The workspaces returned depend on the sharing settings of the given version, but are also limited to the workspaces that the current user is allowed to see. operationId: List_workspaces_with_version summary: List workspaces having version "/api/v3/views": get: parameters: - description: |- JSON specifying filter conditions. Currently supported filters are: + project: filters views by the project their associated query is assigned to. If the project filter is passed with the `!*` (not any) operator, global views are returned. + id: filters views based on their id + type: filters views based on their type example: '[{ "project_id": { "operator": "!*", "values": null }" }]' in: query name: filters required: false schema: type: string responses: '200': content: application/hal+json: examples: Queries: "$ref": "#/components/examples/Views" description: OK headers: {} tags: - Views description: Returns a collection of Views. The collection can be filtered via query parameters similar to how work packages are filtered. operationId: List_views summary: List views "/api/v3/views/{id}": get: parameters: - description: View id example: 42 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: ViewWorkPackagesTable: "$ref": "#/components/examples/ViewWorkPackagesTable" ViewTeamPlanner: "$ref": "#/components/examples/ViewTeamPlanner" description: Returns the result of a single view, dependent of the view type. '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** The required permission depends on the type of the view. headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the resource can not be found. *Note: A client without sufficient permissions shall not be able to test for the existence of a view. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Views description: '' operationId: View_view summary: View view post: parameters: - description: The view identifier name: id in: path required: true example: 1 schema: type: string requestBody: content: application/json: examples: Views::WorkPackagesTable: value: _links: query: href: "/api/v3/queries/5" Views::TeamPlanner: value: _links: query: href: "/api/v3/queries/5" schema: type: object properties: _links: type: object properties: query: type: object properties: href: type: string format: uri responses: '201': content: application/hal+json: schema: type: object examples: Views::WorkPackagesTable: "$ref": "#/components/examples/ViewWorkPackagesTable" Views::TeamPlanner: "$ref": "#/components/examples/ViewTeamPlanner" description: Created headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: query _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Query does not exist. description: |- Returned if: * the client tries to modify a read-only property (`PropertyIsReadOnly`) * a constraint for a property was violated (`PropertyConstraintViolation`) * the client provides a link to an invalid resource (`ResourceTypeMismatch`), e.g. a query not found headers: {} tags: - Views description: |- When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. The required fields of a View can be found in its schema, which is embedded in the respective form. Note that it is only allowed to provide properties or links supporting the write operation. There are different subtypes of `Views` (e.g. `Views::WorkPackagesTable`) with each having its own endpoint for creating that subtype e.g. * `/api/v3/views/work_packages_table` for `Views::WorkPackagesTable` * `/api/v3/views/team_planner` for `Views::TeamPlanner` * `/api/v3/views/work_packages_calendar` for `Views::WorkPackagesCalendar` **Not yet implemented** To get the list of available subtypes and by that the endpoints for creating a subtype, use the ``` /api/v3/views/schemas ``` endpoint. operationId: Create_views summary: Create view "/api/v3/wiki_pages/{id}": get: parameters: - description: Wiki page identifier example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: project: _type: Project... id: 12 _links: addAttachment: href: "/api/v3/wiki_pages/72/attachments" method: post attachments: href: "/api/v3/wiki_pages/72/attachments" project: href: "/api/v3/projects/12" title: some project self: href: "/api/v3/wiki_pages/72" _type: WikiPage id: 72 title: A wiki page with a name schema: "$ref": "#/components/schemas/Wiki_PageModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the wiki page does not exist or the client does not have sufficient permissions to see it. **Required permission:** view wiki page in the page's project headers: {} tags: - Wiki Pages description: Retrieve an individual wiki page as identified by the id parameter operationId: View_Wiki_Page summary: View Wiki Page "/api/v3/wiki_pages/{id}/attachments": get: parameters: - description: ID of the wiki page whose attachments will be listed example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: author: href: "/api/v3/users/1" title: OpenProject Admin container: href: "/api/v3/wiki_pages/72" title: wiki delete: href: "/api/v3/attachments/376" method: delete downloadLocation: href: "/api/v3/attachments/376/content" self: href: "/api/v3/attachments/376" title: 200.gif _type: Attachment contentType: image/gif createdAt: '2018-06-01T07:24:19.896Z' description: format: plain html: '' raw: '' digest: algorithm: md5 hash: 7ac9c97ef73d47127f590788b84c0c1c fileName: some.gif fileSize: 3521772 id: 376 _links: self: href: "/api/v3/wiki_pages/72/attachments" _type: Collection count: 1 total: 1 schema: "$ref": "#/components/schemas/Attachments_Model" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the wiki page does not exist or the client does not have sufficient permissions to see it. **Required permission:** view wiki pages *Note: A client without sufficient permissions shall not be able to test for the existence of a work package. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Attachments description: '' operationId: List_attachments_by_wiki_page summary: List attachments by wiki page post: parameters: - description: ID of the wiki page to receive the attachment example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: author: _links: lock: href: "/api/v3/users/1/lock" method: post title: Set lock on admin self: href: "/api/v3/users/1" title: OpenProject Admin showUser: href: "/users/1" type: text/html updateImmediately: href: "/api/v3/users/1" method: patch title: Update admin _type: User admin: true avatar: '' createdAt: '2015-03-20T12:56:52.343Z' email: firstName: OpenProject id: 1 identityUrl: lastName: Admin login: admin name: OpenProject Admin status: active updatedAt: '2018-05-29T13:57:44.662Z' container: _links: addAttachment: href: "/api/v3/wiki_pages/72/attachments" method: post attachments: href: "/api/v3/wiki_pages/72/attachments" project: href: "/api/v3/projects/12" title: Demo project self: href: "/api/v3/wiki_pages/72" _type: WikiPage id: 72 title: wiki _links: author: href: "/api/v3/users/1" title: OpenProject Admin container: href: "/api/v3/wiki_pages/72" title: wiki delete: href: "/api/v3/attachments/376" method: delete downloadLocation: href: "/api/v3/attachments/376/content" self: href: "/api/v3/attachments/376" title: 200.gif _type: Attachment contentType: image/gif createdAt: '2018-06-01T07:24:19.896Z' description: format: plain html: '' raw: '' digest: algorithm: md5 hash: 7ac9c97ef73d47127f590788b84c0c1c fileName: some.gif fileSize: 3521772 id: 376 description: OK headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request could not be parsed as JSON. description: |- Returned if the client sends a not understandable request. Reasons include: * Omitting one of the required parts (metadata and file) * sending unparsable JSON in the metadata part headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this attachment. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit wiki pages *Note that you will only receive this error, if you are at least allowed to see the wiki page* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the wiki page does not exist or the client does not have sufficient permissions to see it. **Required permission:** view wiki pages *Note: A client without sufficient permissions shall not be able to test for the existence of a wiki page That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: File is too large (maximum size is 5242880 Bytes). description: |- Returned if the client tries to send an invalid attachment. Reasons are: * Omitting the file name (`fileName` property of metadata part) * Sending a file that is too large headers: {} tags: - Attachments description: Adds an attachment with the wiki page as its container. operationId: Add_attachment_to_wiki_page summary: Add attachment to wiki page "/api/v3/work_packages": get: summary: List work packages operationId: list_work_packages tags: - Work Packages description: Returns a collection of work packages. parameters: - description: Page number inside the requested collection. example: '25' in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: '25' in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. If no filter is to be applied, the client should send an empty array (`[]`), otherwise a default filter is applied. A Currently supported filters are (there are additional filters added by modules): - assigned_to - assignee_or_group - attachment_base - attachment_content - attachment_file_name - author - blocked - blocks - category - comment - created_at - custom_field - dates_interval - description - done_ratio - due_date - duplicated - duplicates - duration - estimated_hours - file_link_origin_id - follows - group - id - includes - linkable_to_storage_id - linkable_to_storage_url - manual_sort - milestone - only_subproject - parent - partof - precedes - principal_base - priority - project - relatable - relates - required - requires - responsible - role - search - start_date - status - storage_id - storage_url - subject - subject_or_id - subproject - type - typeahead - updated_at - version - watcher - work_package example: '[{ "type_id": { "operator": "=", "values": ["1", "2"] }}]' in: query name: filters required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. example: '[["status", "asc"]]' in: query name: sortBy required: false schema: default: '[["id", "asc"]]' type: string - description: The column to group by. example: status in: query name: groupBy required: false schema: type: string - description: Indicates whether properties should be summed up if they support it. example: true in: query name: showSums required: false schema: default: false type: boolean - description: Comma separated list of properties to include. example: total,elements/subject,elements/id,self in: query name: select required: false schema: type: string - description: |- In order to perform a [baseline comparison](/docs/api/baseline-comparisons), you may provide one or several timestamps in ISO-8601 format as comma-separated list. The timestamps may be absolute or relative, such as ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part represents the zero paded hours and minutes. The last "+HH:MM" part represents the timezone offset from UTC associated with the time, the offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00". Usually, the first timestamp is the baseline date, the last timestamp is the current date. Values older than 1 day are accepted only with valid Enterprise Token available. example: 2022-01-01T00:00:00Z,PT0S in: query name: timestamps required: false schema: default: PT0S type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/Work_PackagesModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see work packages. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages (globally or in any project) post: summary: Create Work Package operationId: create_work_package tags: - Work Packages description: |- When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. The required fields of a WorkPackage can be found in its schema, which is embedded in the respective form. Note that it is only allowed to provide properties or links supporting the write operation. A project link must be set when creating work packages through this route. When setting start date, finish date, and duration together, their correctness will be checked and a 422 error will be returned if one value does not match with the two others. You can make the server compute a value: set only two values in the request and the third one will be computed and returned in the response. For instance, when sending `{ "startDate": "2022-08-23", duration: "P2D" }`, the response will include `{ "dueDate": "2022-08-24" }`. requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageModel" parameters: - description: |- Indicates whether change notifications (e.g. via E-Mail) should be sent. Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee), not just the current user. example: false in: query name: notify required: false schema: default: true type: boolean responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/WorkPackageModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to add work packages to this project. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding project.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the project does not exist or the client does not have sufficient permissions to see it. **Required permissions:** view project *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The subject might not be blank. _embedded: details: attribute: Subject description: |- Returned if: * the client tries to write a read-only property * a constraint for a property was violated * a property was provided in an unreadable format "/api/v3/work_packages/form": post: summary: Form for creating a Work Package operationId: form_create_work_package tags: - Work Packages description: |- When calling this endpoint, the client provides a single object containing the properties and links to be created, in the body. The input is validated and a schema response is returned. If the validation errors of the response is empty, the same payload can be used to create a work package. Only the properties of the work package write model are allowed to set on a work package on creation. When setting start date, finish date, and duration together, their correctness will be checked and a validation error will be returned if one value does not match with the two others. You can make the server compute a value: set only two values in the request and the third one will be computed and returned in the response. For instance, when sending `{ "startDate": "2022-08-23", duration: "P2D" }`, the response will include `{ "dueDate": "2022-08-24" }`. requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageWriteModel" examples: Valid creation: "$ref": "#/components/examples/WorkPackageCreateValid" responses: '200': description: OK content: application/json: schema: "$ref": "#/components/schemas/WorkPackageFormModel" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/work_packages/schemas": get: summary: List Work Package Schemas operationId: list_work_package_schemas tags: - Work Packages description: |- List all work package schemas that match the given filters. This endpoint does not return a successful response, if no filter is given. parameters: - name: filters description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + id: The schema's id Schema id has the form `project_id-work_package_type_id`. in: query required: true schema: type: string example: '[{ "id": { "operator": "=", "values": ["12-1", "14-2"] } }]' responses: '200': description: OK content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/work_packages/schemas/13-1" _type: Schema... - _links: self: href: "/api/v3/work_packages/schemas/7-6" _type: Schema... _links: self: href: "/api/v3/work_packages/schemas" _type: Collection count: 2 total: 5 '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to list schemas. description: |- Returned if the client does not have sufficient permissions. **Required permission:** View work packages in any project. headers: {} "/api/v3/work_packages/schemas/{identifier}": get: parameters: - description: Identifier of the schema example: 12-13 in: path name: identifier required: true schema: type: string responses: '200': description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified schema does not exist. description: |- Returned if the schema does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages (on the project where this schema is used) *Note: A client without sufficient permissions shall not be able to test for the existence of a project. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Work Packages description: '' operationId: View_Work_Package_Schema summary: View Work Package Schema "/api/v3/work_packages/{id}": delete: summary: Delete Work Package operationId: delete_work_package tags: - Work Packages description: |- Deletes the work package, as well as: - all associated time entries - its hierarchy of child work packages parameters: - description: Work package id in: path name: id required: true schema: type: integer example: 1 responses: '204': description: |- Returned if the work package was deleted successfully. Note that the response body is empty as of now. In future versions of the API a body *might* be returned along with an appropriate HTTP status. '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this work package. description: |- Returned if the client does not have sufficient permissions. **Required permission:** delete work package '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" get: summary: View Work Package operationId: view_work_package tags: - Work Packages description: Returns the specified work package. parameters: - description: Work package id in: path name: id required: true schema: type: integer example: 1 - description: |- In order to perform a [baseline comparison](/docs/api/baseline-comparisons) of the work-package attributes, you may provide one or several timestamps in ISO-8601 format as comma-separated list. The timestamps may be absolute or relative, such as ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part represents the zero paded hours and minutes. The last "+HH:MM" part represents the timezone offset from UTC associated with the time, the offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00". Usually, the first timestamp is the baseline date, the last timestamp is the current date. Values older than 1 day are accepted only with valid Enterprise Token available. in: query name: timestamps required: false schema: default: PT0S type: string example: 2022-01-01T00:00:00Z,PT0S responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/WorkPackageModel" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package patch: summary: Update a Work Package operationId: update_work_package tags: - Work Packages description: "When calling this endpoint the client provides a single object, containing the properties and links that it wants\nto change, in the body. Note that it is only allowed to provide properties or links supporting the **write**\noperation.\n\nAdditionally to the fields the client wants to change, it is mandatory to provide the value of `lockVersion` which\nwas received by the `GET` request this change originates from.\n\nThe value of `lockVersion` is used to implement\n[optimistic locking](https://en.wikipedia.org/wiki/Optimistic_concurrency_control).\n\n**Custom Field Validation** \n\nRequired custom fields are only validated when they are explicitly provided in the request body. If a custom field\nis not included in the update request, it will not be validated. This enables clients to update\nspecific attributes independently without having to provide values for all required custom fields.\n\nTo override this behavior and validate all required custom fields regardless of whether they are included in the\nrequest, set `validateCustomFields` to `true` in the `_meta` object of the request body." parameters: - name: id description: Work package id in: path required: true schema: type: integer example: 42 - name: notify description: |- Indicates whether change notifications should be sent. Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee), not just the current user. in: query required: false schema: type: boolean default: true example: false requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackagePatchModel" examples: With custom field validation: "$ref": "#/components/examples/WorkPackageWithMetaValidation" responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/WorkPackageModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to edit the content of the work package. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit work package, assign version, change work package status, manage subtasks or move work package '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package '406': "$ref": "#/components/responses/MissingContentType" '409': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict message: Your changes could not be saved, because the work package was changed since you've seen it the last time. description: Returned if the resource was changed since the client requested it. This is determined using the `lockVersion` property. '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: Subject _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The subject might not be blank. description: |- Returned if: - the client tries to modify a read-only property (`PropertyIsReadOnly`) - a constraint for a property was violated (`PropertyConstraintViolation`) - the client provides a link to an invalid resource (`ResourceTypeMismatch`) "/api/v3/work_packages/{id}/activities": get: parameters: - description: Work package id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/activity/1" user: href: "/api/v3/users/1" workPackage: href: "/api/v3/work_packages/1" _type: Activity comment: format: markdown html: "

Lorem ipsum dolor sit amet.

" raw: Lorem ipsum dolor sit amet. createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T09:14:02.726Z' details: [] id: 1 version: 1 - _links: self: href: "/api/v3/activity/2" user: href: "/api/v3/users/1" workPackage: href: "/api/v3/work_packages/1" _type: Activity comment: format: markdown html: "

Lorem ipsum dolor sit amet.

" raw: Lorem ipsum dolor sit amet. createdAt: '2014-05-21T09:51:22.077Z' updatedAt: '2014-05-21T10:14:02.957Z' details: [] id: 2 version: 2 _links: self: href: "/api/v3/work_packages/1/revisions" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Work_Package_activitiesModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package headers: {} tags: - Work Packages description: '' operationId: List_work_package_activities summary: List work package activities post: parameters: - description: Work package id example: 1 in: path name: id required: true schema: type: integer - description: |- Indicates whether change notifications (e.g. via E-Mail) should be sent. Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee), not just the current user. example: false in: query name: notify required: false schema: default: true type: boolean responses: '201': description: Created headers: {} '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to create a comment here. description: |- Returned if the client does not have sufficient permissions. **Required permission:** create journals *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package headers: {} tags: - Work Packages description: |- Creates an activity for the selected work package and, on success, returns the updated activity. operationId: Comment_work_package requestBody: content: application/json: schema: "$ref": "#/components/schemas/ActivityCommentWriteModel" summary: Comment work package "/api/v3/work_packages/{id}/activities_emoji_reactions": get: summary: List emoji reactions by work package activities operationId: list_work_package_activities_emoji_reactions tags: - WorkPackages - Activities - EmojiReactions description: List all emoji reactions of all activities of a single work package. parameters: - name: id description: ID of the work package whose activities' emoji reactions will be listed in: path required: true schema: type: integer example: 1 responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/EmojiReactions_Model" '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** - `view_work_packages` - for internal comments: `view_internal_comments` *Note: A client without sufficient permissions shall not be able to test for the existence of a work package. That's why a 404 is returned here, even if a 403 might be more appropriate.* "/api/v3/work_packages/{id}/attachments": get: parameters: - description: ID of the work package whose attachments will be listed example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/Attachments_Model" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package *Note: A client without sufficient permissions shall not be able to test for the existence of a work package. That's why a 404 is returned here, even if a 403 might be more appropriate.* tags: - Attachments description: '' operationId: list_work_package_attachments summary: List attachments by work package post: parameters: - description: ID of the work package to receive the attachment example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/AttachmentModel" description: OK '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request could not be parsed as JSON. description: |- Returned if the client sends a not understandable request. Reasons include: * Omitting one of the required parts (metadata and file) * sending unparsable JSON in the metadata part '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to delete this attachment. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit work package or add work package *Note that you will only receive this error, if you are at least allowed to see the work package.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package *Note: A client without sufficient permissions shall not be able to test for the existence of a work package. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: File is too large (maximum size is 5242880 Bytes). description: |- Returned if the client tries to send an invalid attachment. Reasons are: * Omitting the file name (`fileName` property of metadata part) * Sending a file that is too large tags: - Attachments description: |- To add an attachment to a work package, a client needs to issue a request of type `multipart/form-data` with exactly two parts. The first part *must* be called `metadata`. Its content type is expected to be `application/json`, the body *must* be a single JSON object, containing at least the `fileName` and optionally the attachments `description`. The second part *must* be called `file`, its content type *should* match the mime type of the file. The body *must* be the raw content of the file. Note that a `filename` must be indicated in the `Content-Disposition` of this part, however it will be ignored. Instead the `fileName` inside the JSON of the metadata part will be used. operationId: create_work_package_attachment summary: Create work package attachment "/api/v3/work_packages/{id}/available_assignees": get: parameters: - description: Work package id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: delete: href: "/api/v3/users/1" method: DELETE title: Delete j.sheppard lock: href: "/api/v3/users/1/lock" method: POST title: Set lock on j.sheppard self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.com firstName: John id: 1 lastName: Sheppard login: j.sheppard status: active updatedAt: '2014-05-21T08:51:20.396Z' - _links: delete: href: "/api/v3/users/2" method: DELETE title: Delete j.sheppard2 lock: href: "/api/v3/users/2/lock" method: POST title: Set lock on j.sheppard2 self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.net firstName: Jim id: 2 lastName: Sheppard login: j.sheppard2 status: active updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/work_packages/42/available_assignees" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_AssigneesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the assignable users for this work package. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The work package you are looking for cannot be found or has been deleted. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages headers: {} tags: - Work Packages description: Gets a list of users that can be assigned to the given work package. operationId: Work_Package_Available_assignees summary: Work Package Available assignees "/api/v3/work_packages/{id}/available_projects": get: parameters: - description: work package id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: categories: href: "/api/v3/projects/6/categories" createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post editWorkPackage: href: "/api/v3//work_packages/{id}/form" method: post templated: true self: href: "/api/v3/projects/6" title: A project versions: href: "/api/v3/projects/6/versions" _type: Project createdAt: '2015-07-06T13:28:14+00:00' description: Eveniet molestias omnis quis aut qui eum adipisci. Atque aut aut in exercitationem adipisci amet. Nisi asperiores quia ratione veritatis enim exercitationem magnam. Aut fuga architecto adipisci nihil. Et repellat pariatur. Aliquam et sed perferendis nostrum quaerat. Fugit doloremque voluptatem. id: 6 identifier: a_project name: A project type: Customer Project updatedAt: '2015-10-01T09:55:02+00:00' - _links: categories: href: "/api/v3/projects/14/categories" createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post self: href: "/api/v3/projects/14" title: Another project versions: href: "/api/v3/projects/14/versions" _type: Project createdAt: '2016-02-29T12:50:20+00:00' description: '' id: 14 identifier: another_project name: Another project type: updatedAt: '2016-02-29T12:50:20+00:00' _links: self: href: "/api/v3/work_packages/5/available_projects" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_projects_for_work_packageModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** edit work package *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package headers: {} tags: - Work Packages description: Gets a list of projects that are available as projects to which the work package can be moved. operationId: Available_projects_for_work_package summary: Available projects for work package "/api/v3/work_packages/{id}/available_relation_candidates": get: summary: Available relation candidates operationId: list_available_relation_candidates tags: - Work Packages description: '' parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer - description: Maximum number of candidates to list (default 10) example: 25 in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying filter conditions. Accepts the same filters as the [work packages](https://www.openproject.org/docs/api/endpoints/work-packages/) endpoint. example: '[{ "status_id": { "operator": "o", "values": null } }]' in: query name: filters required: false schema: type: string - description: Shortcut for filtering by ID or subject example: '"rollout"' in: query name: query required: false schema: type: string - description: Type of relation to find candidates for (default "relates") example: '"follows"' in: query name: type required: false schema: type: string - description: |- JSON specifying sort criteria. Accepts the same sort criteria as the [work packages](https://www.openproject.org/docs/api/endpoints/work-packages/) endpoint. example: '[["status", "asc"]]' in: query name: sortBy required: false schema: default: '[["id", "asc"]]' type: string responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/work_packages/1" _type: WorkPackage id: 1 subject: Skipped other properties for brevity - _links: self: href: "/api/v3/work_packages/2" _type: WorkPackage id: 2 subject: Skipped other properties for brevity _links: self: href: "/api/v3/projects/14/work_packages" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_relation_candidatesModel" description: OK '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package "/api/v3/work_packages/{id}/available_watchers": get: parameters: - description: work package id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: delete: href: "/api/v3/users/1" method: DELETE title: Delete j.sheppard lock: href: "/api/v3/users/1/lock" method: POST title: Set lock on j.sheppard self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.com firstName: John id: 1 lastName: Sheppard login: j.sheppard status: active updatedAt: '2014-05-21T08:51:20.396Z' - _links: delete: href: "/api/v3/users/2" method: DELETE title: Delete j.sheppard2 lock: href: "/api/v3/users/2/lock" method: POST title: Set lock on j.sheppard2 self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.net firstName: Jim id: 2 lastName: Sheppard login: j.sheppard2 status: active updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/work_packages/1/available_watchers" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_WatchersModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add work package watchers *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package headers: {} tags: - Work Packages description: Gets a list of users that are able to be watchers of the specified work package. operationId: Available_watchers summary: Available watchers "/api/v3/work_packages/{id}/file_links": post: summary: Creates file links. operationId: create_work_package_file_link tags: - Work Packages - File links description: |- Creates file links on a work package. The request is interpreted as a bulk insert, where every element of the collection is validated separately. Each element contains the origin meta data and a link to the storage, the file link is about to point to. The storage link can be provided as a resource link with id or as the host url. The file's id and name are considered mandatory information. The rest of the origin meta data SHOULD be provided by the client. The _mimeType_ SHOULD be a standard mime type. An empty mime type will be handled as unknown. To link a folder, the custom mime type `application/x-op-directory` MUST be used. Up to 20 file links can be submitted at once. If any element data is invalid, no file links will be created. If a file link with matching origin id, work package, and storage already exists, then it will not create an additional file link or update the meta data. Instead the information from the existing file link will be returned. parameters: - name: id description: Work package id in: path required: true schema: type: integer example: 1337 requestBody: content: application/json: schema: "$ref": "#/components/schemas/FileLinkCollectionWriteModel" example: _type: Collection _embedded: elements: - originData: id: 5503 name: logo.png mimeType: image/png size: 433765 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: storageUrl: href: https://nextcloud.deathstar.rocks/ responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/FileLinkCollectionReadModel" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage file links *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package, view file links '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The request was invalid. File Link logo.png - Storage was invalid. description: |- Occurs if the request body was correctly formatted, but some properties lead to errors in the validation process. This happens e.g. if the provided storage url is not available on the server. get: summary: Gets all file links of a work package operationId: list_work_package_file_links tags: - Work Packages - File links description: "Gets all file links of a work package.\n\nAs a side effect, for every file link a request is sent to the storage's origin to fetch live data and patch\nthe file link's data before returning, as well as retrieving permissions of the user on this origin file. " parameters: - name: id description: Work package id in: path required: true schema: type: integer example: 1337 - name: filters in: query description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. The following filters are supported: - storage required: false example: '[{"storage":{"operator":"=","values":["42"]}}]' schema: type: string responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/FileLinkCollectionReadModel" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view file links *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package "/api/v3/work_packages/{id}/form": post: summary: Form for editing a Work Package operationId: form_edit_work_package tags: - Work Packages description: "When calling this endpoint, the client provides a single object containing the properties and links to be\nedited, in the body. The input is validated and a schema response is returned. If the validation errors of the\nresponse is empty, the same payload can be used to edit the work package.\n\nOnly the properties of the work package write model are allowed to set on a work package on editing.\n\nWhen setting start date, finish date, and duration together, their correctness will be checked and a validation\nerror will be returned if one value does not match with the two others. You can make the server compute a value:\nset only two values in the request and the third one will be computed and returned in the response. For instance,\nwhen sending `{ \"startDate\": \"2022-08-23\", duration: \"P2D\" }`, the response will\ninclude `{ \"dueDate\": \"2022-08-24\" }`.\n\n**Custom Field Validation** \n\nRequired custom fields are only validated when they are explicitly provided in the request body. If a custom field\nis not included in the form request, it will not be validated, allowing clients to validate partial updates\nwithout triggering validation errors for unrelated required custom fields.\n\nTo override this behavior and validate all required custom fields regardless of whether they are included in the\nrequest, set `validateCustomFields` to `true` in the `_meta` object of the request body." requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageWriteModel" examples: Changing subject: "$ref": "#/components/examples/WorkPackageEditSubject" With custom field validation: "$ref": "#/components/examples/WorkPackageWithMetaValidation" parameters: - name: id description: ID of the work package being modified in: path required: true schema: type: integer example: 1 responses: '200': description: OK content: application/json: schema: "$ref": "#/components/schemas/WorkPackageFormModel" '404': description: "Returned if the work package does not exist or the client does not have sufficient permissions to see it.\t\n\n**Required permission:** view work package" content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/work_packages/{id}/revisions": get: parameters: - description: Work package id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: author: href: "/api/v3/users/1" title: John Sheppard - j.sheppard project: href: "/api/v3/projects/1" title: A Test Project self: href: "/api/v3/revisions/13" showRevision: href: "/projects/identifier/repository/revision/11f4b07" _type: Revision authorName: John Sheppard createdAt: '2015-07-21T13:36:59.220Z' formattedIdentifier: 11f4b07 id: 13 identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6 message: format: plain html: "

This revision provides new features

An elaborate description

" raw: |- This revision provides new features An elaborate description - _links: author: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard project: href: "/api/v3/projects/1" title: A Test Project self: href: "/api/v3/revisions/14" showRevision: href: "/projects/identifier/repository/revision/029ed72a" _type: Revision authorName: j1msheppard createdAt: '2015-06-30T08:47:00.818Z' formattedIdentifier: '029ed72a' id: 13 identifier: '029ed72a3b7b7c4ab332b1f6eaa6576e7c946059' message: format: plain html: "

This revision fixes some stuff

More information here

" raw: |- This revision fixes some stuff More information here _links: self: href: "/api/v3/work_packages/42/revisions" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/RevisionsModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see linked revisions for this work package. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages for the project the work package is contained in. *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work project does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package headers: {} tags: - Work Packages description: |- Gets a list of revisions that are linked to this work package, e.g., because it is referenced in the commit message of the revision. Only linked revisions from repositories are shown if the user has the view changesets permission in the defining project. operationId: Revisions summary: Revisions "/api/v3/work_packages/{id}/relations": post: summary: Create relation operationId: create_relation tags: - Relations description: |- Create a work package relation on the given work package. A successful creation will result in a relation between two work packages, thus appearing on both involved work package resources. parameters: - name: id description: Work package id example: 1 in: path required: true schema: type: integer requestBody: content: application/json: schema: "$ref": "#/components/schemas/RelationWriteModel" examples: request: "$ref": "#/components/examples/RelationCreateRequest" responses: '201': description: Created content: application/hal+json: schema: "$ref": "#/components/schemas/RelationReadModel" examples: Simple response: "$ref": "#/components/examples/RelationResponse" '400': "$ref": "#/components/responses/InvalidRequestBody" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** manage work package relations content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to create a relation. '409': description: |- Returned if there already exists a relation between the given work packages of **any** type or if the relation is not allowed. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict message: Couldn't update the resource because of conflicting modifications. '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: - the client tries to write a read-only property (`PropertyIsReadOnly`) - a constraint for a property was violated (`PropertyConstraintViolation`) - the client provides a link to an invalid resource (`ResourceTypeMismatch`) content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _embedded: details: attribute: lag _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Lag must be a number greater than or equal to 0 "/api/v3/work_packages/{work_package_id}/reminders": get: summary: List work package reminders operationId: list_work_package_reminders tags: - Work Packages - Reminders description: |- Gets a list of your upcoming reminders for this work package. Only active reminders that belong to the current user are returned. parameters: - name: work_package_id in: path description: Work package id example: '1' required: true schema: type: integer responses: '200': description: OK content: application/hal+json: schema: type: object required: - _type - total - count - _embedded properties: _type: type: string enum: - Collection total: type: integer description: The total amount of elements available in the collection. minimum: 0 count: type: integer description: Actual amount of elements in this response. minimum: 0 _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/ReminderModel" '403': description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages for the project the work package is contained in. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" '404': description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" post: summary: Create a work package reminder operationId: create_work_package_reminder tags: - Work Packages - Reminders description: |- Creates a new reminder for the specified work package. **Note:** A user can only have one **active** reminder at a time for a given work package. parameters: - name: work_package_id in: path description: Work package id example: '1' required: true schema: type: integer requestBody: required: true content: application/json: schema: type: object required: - remindAt properties: remindAt: type: string format: date-time description: The date and time when the reminder is due note: type: string description: The note of the reminder responses: '201': description: Reminder created successfully content: application/hal+json: schema: "$ref": "#/components/schemas/ReminderModel" '404': description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" '409': description: |- Returned if the user already has an active reminder for this work package. **Error message**: You can only set one reminder at a time for a work package. Please delete or update the existing reminder. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" "/api/v3/work_packages/{id}/watchers": get: parameters: - description: Work package id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: example: _embedded: elements: - _links: delete: href: "/api/v3/users/1" method: DELETE title: Delete j.sheppard lock: href: "/api/v3/users/1/lock" method: POST title: Set lock on j.sheppard self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard showUser: href: "/users/1" type: text/html _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' firstName: John id: 1 lastName: Sheppard login: j.sheppard mail: shep@mail.com status: active updatedAt: '2014-05-21T08:51:20.396Z' - _links: delete: href: "/api/v3/users/2" method: DELETE title: Delete j.sheppard2 lock: href: "/api/v3/users/2/lock" method: POST title: Set lock on j.sheppard2 self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' firstName: Jim id: 2 lastName: Sheppard login: j.sheppard2 mail: shep@mail.net status: active updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/work_packages/14/watchers" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/WatchersModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the watchers of this work package. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work package watchers *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package *Note that you will effectively not be able to see the watchers of a work package without being able to see the work package.* headers: {} tags: - Work Packages description: '' operationId: List_watchers summary: List watchers post: parameters: - description: Work package id example: 1 in: path name: id required: true schema: type: integer responses: '200': description: OK headers: {} '201': description: Created headers: {} '400': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request body was not a single JSON object. description: |- Occurs when the client did not send a valid JSON object in the request body. For example: * The request did not contain a single JSON object * The JSON object did not contain the key `user` * The value of `users` was not a link object headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to add watchers to this work package. description: |- Returned if the client does not have sufficient permissions. **Required permissions:** * view work package (for self) * add work package watchers (for other users) *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package *Note that you will effectively not be able to change the watchers of a work package without being able to see the work package.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': description: |- Returned if: * the client tries to specify a link to a resource that is not a user (`ResourceTypeMismatch`) * the user specified is not allowed to watch that work package (`PropertyConstraintViolation`) * the user specified does not exist (`PropertyConstraintViolation`) headers: {} tags: - Work Packages description: |- Adds a watcher to the specified work package. The request is expected to contain a single JSON object, that contains a link object under the `user` key. The response will be user added as watcher. In case the user was already watching the work package an `HTTP 200` is returned, an `HTTP 201` if the user was added as a new watcher. operationId: Add_watcher requestBody: content: application/json: schema: example: user: href: "/api/v3/users/1" properties: user: properties: href: type: string type: object type: object summary: Add watcher "/api/v3/work_packages/{id}/watchers/{user_id}": delete: parameters: - description: Work package id example: 1 in: path name: id required: true schema: type: integer - description: User id example: 1 in: path name: user_id required: true schema: type: integer responses: '204': description: No Content headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to remove watchers from this work package. description: |- Returned if the client does not have sufficient permissions. **Required permission:** delete work package watchers *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified work package does not exist. description: |- Returned in one of the following cases: Either the work package does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work package Or the specified user does not exist at all. *Note that you will effectively not be able to change the watchers of a work package without being able to see the work package.* headers: {} '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" tags: - Work Packages description: |- Removes the specified user from the list of watchers for the given work package. If the request succeeds, the specified user is not watching the work package anymore. *Note: This might also be the case, if the specified user did not watch the work package prior to the request.* operationId: Remove_watcher summary: Remove watcher "/api/v3/workspaces": get: summary: List workspace operationId: list_workspace tags: - Workspace description: |- Returns a collection of workspaces. The collection can be filtered via query parameters similar to how work packages are filtered. In addition to the provided filter, the result set is always limited to only contain workspaces the client is allowed to see. Since workspaces are the generic term for a number of resources like projects and portfolios, the returned collection will contain a mix of those resources. parameters: - name: filters schema: type: string in: query required: false description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are: + active: based on the active property of the workspace + ancestor: filters workspace by their ancestor. A workspace is not considered to be its own ancestor. + available_project_attributes: filters workspace based on the activated project attributes. + created_at: based on the time the workspace was created + favorited: based on the favorited property of the workspace + id: based on workspace' id. + latest_activity_at: based on the time the last activity was registered on a workspace. + name_and_identifier: based on both the name and the identifier. + parent_id: filters workspace by their parent. + principal: based on members of the workspace. + project_phase_any: based on the project phases active in a workspace. + project_status_code: based on status code of the workspace + storage_id: filters workspace by linked storages + storage_url: filters workspace by linked storages identified by the host url + type_id: based on the types active in a workspace. + user_action: based on the actions the current user has in the workspace. + visible: based on the visibility for the user (id) provided as the filter value. This filter is useful for admins to identify the workspace visible to a user. There might also be additional filters based on the custom fields that have been configured. Each defined lifecycle step will also define a filter in this list endpoint. Given that the elements are not static but rather dynamically created on each OpenProject instance, a list cannot be provided. Those filters follow the schema: + project_start_gate_[id]: a filter on a project phase's start gate active in a workspace. The id is the id of the phase the gate belongs to. + project_finish_gate_[id]: a filter on a project phase's finish gate active in a workspace. The id is the id of the phase the gate belongs to. + project_phase_[id]: a filter on a project phase active in a workspace. The id is the id of the phase queried for. example: '[{ "ancestor": { "operator": "=", "values": ["1"] }" }]' - name: sortBy schema: type: string in: query required: false description: |- JSON specifying sort criteria. Currently supported orders are: + id + name + typeahead (sorting by hierarchy and name) + created_at + public + latest_activity_at + required_disk_space There might also be additional orders based on the custom fields that have been configured. example: '[["id", "asc"]]' - name: select schema: type: string in: query required: false description: Comma separated list of properties to include. example: total,elements/identifier,elements/name responses: '200': description: OK content: application/hal+json: schema: "$ref": "#/components/schemas/WorkspaceCollectionModel" '400': description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. "/api/v3/workspaces/{id}/available_assignees": get: parameters: - description: Workspace id example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: delete: href: "/api/v3/users/1" method: DELETE title: Delete j.sheppard lock: href: "/api/v3/users/1/lock" method: POST title: Set lock on j.sheppard self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.com firstName: John id: 1 lastName: Sheppard login: j.sheppard status: active updatedAt: '2014-05-21T08:51:20.396Z' - _links: delete: href: "/api/v3/users/2" method: DELETE title: Delete j.sheppard2 lock: href: "/api/v3/users/2/lock" method: POST title: Set lock on j.sheppard2 self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 _type: User avatar: https://example.org/users/1/avatar createdAt: '2014-05-21T08:51:20.396Z' email: shep@mail.net firstName: Jim id: 2 lastName: Sheppard login: j.sheppard2 status: active updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/workspaces/42/available_assignees" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Available_AssigneesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the assignable users for this workspace. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding workspace.* headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified workspace does not exist. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view workspace headers: {} tags: - Work Packages description: Gets a list of users that can be assigned to work packages in the given workspace. operationId: Workspace_Available_assignees summary: Workspace Available assignees "/api/v3/workspaces/{id}/categories": get: parameters: - description: ID of the workspace whose categories will be listed example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: defaultAssignee: href: "/api/v3/users/42" title: John Sheppard project: href: "/api/v3/projects/11" title: Example project self: href: "/api/v3/categories/10" title: Category with assignee _type: Category id: 10 name: Foo - _links: project: href: "/api/v3/projects/11" self: href: "/api/v3/categories/11" _type: Category id: 11 name: Bar _links: self: href: "/api/v3/projects/11/categories" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Categories_by_WorkspaceModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view workspace *Note: A client without sufficient permissions shall not be able to test for the existence of a workspace. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Categories description: List all categories of a project operationId: List_categories_of_a_workspace summary: List categories of a workspace "/api/v3/workspaces/{id}/favorite": delete: parameters: - description: Workspace id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: Returned if the workspace was successfully removed from favorites. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view workspace '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** logged in tags: - Workspaces - Favorites description: Removes the workspace from the current user's favorites. operationId: Unfavorite_Workspace summary: Unfavorite Workspace post: parameters: - description: Workspace id example: '1' in: path name: id required: true schema: type: integer responses: '204': description: Returned if the workspace was successfully added to favorites. '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view workspace '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. **Required permission:** logged in tags: - Workspaces - Favorites description: Adds the workspace to the current user's favorites. operationId: Favorite_Workspace summary: Favorite Workspace "/api/v3/workspaces/{id}/queries/default": get: summary: View default query for workspace operationId: View_default_query_for_workspace tags: - Queries description: Same as [viewing an existing, persisted Query](https://www.openproject.org/docs/api/endpoints/queries/#list-queries) in its response, this resource returns an unpersisted query and by that allows to get the default query configuration. The client may also provide additional parameters which will modify the default query. The query will already be scoped to the workspace. parameters: - description: Id of the workspace the default query is requested for example: '1' in: path name: id required: true schema: type: integer - name: filters description: |- JSON specifying filter conditions. The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters. All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`). example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]' in: query required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - name: offset description: Page number inside the queries' result collection of work packages. example: '25' in: query required: false schema: default: 1 type: integer - name: pageSize description: Number of elements to display per page for the queries' result collection of work packages. example: '25' in: query required: false schema: type: integer - name: sortBy description: JSON specifying sort criteria. The sort criteria is applied to the query's result collection of work packages overriding the query's persisted sort criteria. example: '[["status", "asc"]]' in: query required: false schema: default: '[["id", "asc"]]' type: string - name: groupBy description: The column to group by. The grouping criteria is applied to the to the query's result collection of work packages overriding the query's persisted group criteria. example: status in: query required: false schema: type: string - name: showSums description: Indicates whether properties should be summed up if they support it. The showSums parameter is applied to the to the query's result collection of work packages overriding the query's persisted sums property. example: true in: query required: false schema: default: false type: boolean - name: timestamps description: 'Indicates the timestamps to filter by when showing changed attributes on work packages. Values can be either ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part represents the zero paded hours and minutes. The last "+HH:MM" part represents the timezone offset from UTC associated with the time. Values older than 1 day are accepted only with valid Enterprise Token available. ' example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00 in: query required: false schema: default: PT0S type: string - name: timelineVisible description: Indicates whether the timeline should be shown. example: true in: query required: false schema: default: false type: boolean - name: showHierarchies description: Indicates whether the hierarchy mode should be enabled. example: true in: query required: false schema: default: true type: boolean responses: '200': content: application/hal+json: examples: response: value: _embedded: results: _embedded: elements: - "<--- shortened for brevity --->" _links: changeSize: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post jumpTo: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true self: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" _type: WorkPackageCollection count: 30 offset: 1 pageSize: 2 total: 234 _links: columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: project: href: "/api/v3/projects/42" title: Lorem ipsum project results: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" self: href: "/api/v3/workspaces/42/queries/default" title: Default sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin _type: Query filters: - _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] _type: StatusQueryFilter name: Status name: default public: false showHierarchies: true starred: false sums: false timelineVisible: false timelineZoomLevel: days schema: "$ref": "#/components/schemas/Default_Query_for_WorkspaceModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see the default query. **Required permission:** view work packages in the workspace headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- Returned if the client does not have sufficient permissions to see the workspace. **Required permission:** any permission in the workspace headers: {} "/api/v3/workspace/{id}/queries/filter_instance_schemas": get: parameters: - description: Workspace id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/assignee" title: Assignee self: href: "/api/v3/queries/filter_instance_schemas/assignee" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/author" title: Author self: href: "/api/v3/queries/filter_instance_schemas/author" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false _links: self: href: "/api/v3/workspaces/42/queries/filter_instance_schemas" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Query_Filter_Instance_Schemas_For_WorkspaceModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions to see it. **Required permission:** view work package in any workspace headers: {} tags: - Query Filter Instance Schema description: Returns the list of QueryFilterInstanceSchemas defined for a query of the specified workspace. operationId: List_Query_Filter_Instance_Schemas_for_Workspace summary: List Query Filter Instance Schemas for Workspace "/api/v3/workspace/{id}/queries/schema": get: parameters: - description: Project id example: 1 in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: QuerySchema: "$ref": "#/components/examples/QuerySchemaModel" schema: "$ref": "#/components/schemas/Schema_For_Workspace_QueriesModel" description: OK headers: {} '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not authorized to access this resource. description: "**Required permission:** view work package in the workspace" headers: {} tags: - Queries description: Retrieve the schema for workspace queries. operationId: View_schema_for_workspace_queries summary: View schema for workspace queries "/api/v3/workspaces/{id}/types": get: parameters: - description: ID of the workspace whose types will be listed example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: self: href: "/api/v3/types/1" _type: Type color: "#ff0000" createdAt: '2014-05-21T08:51:20.396Z' id: 1 isDefault: true isMilestone: false name: Bug position: 1 updatedAt: '2014-05-21T08:51:20.396Z' - _links: self: href: "/api/v3/types/2" _type: Type color: "#888" createdAt: '2014-05-21T08:51:20.396Z' id: 2 isDefault: false isMilestone: false name: Feature position: 2 updatedAt: '2014-05-21T08:51:20.396Z' _links: self: href: "/api/v3/workspaces/11/types" _type: Collection count: 2 total: 2 schema: "$ref": "#/components/schemas/Types_by_WorkspaceModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified workspace does not exist. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage types (on given workspace) *Note: A client without sufficient permissions shall not be able to test for the existence of a workspace. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Types - Workspaces description: This endpoint lists the types that are *available* in a given workspace. operationId: List_types_available_in_a_workspace summary: List types available in a workspace "/api/v3/workspaces/{id}/work_packages": get: summary: Get work packages of workspace operationId: Get_Workspace_Work_Package_Collection tags: - Work Packages description: Returns the collection of work packages that are related to the given workspace. parameters: - description: Workspace id example: 1 in: path name: id required: true schema: type: integer - description: Page number inside the requested collection. example: 25 in: query name: offset required: false schema: default: 1 type: integer - description: Number of elements to display per page. example: 25 in: query name: pageSize required: false schema: type: integer - description: |- JSON specifying filter conditions. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. If no filter is to be applied, the client should send an empty array (`[]`). example: '[{ "type_id": { "operator": "=", "values": [''1'', ''2''] }}]' in: query name: filters required: false schema: default: '[{ "status_id": { "operator": "o", "values": null }}]' type: string - description: |- JSON specifying sort criteria. Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. example: '[["status", "asc"]]' in: query name: sortBy required: false schema: default: '[["id", "asc"]]' type: string - description: The column to group by. example: status in: query name: groupBy required: false schema: type: string - description: Indicates whether properties should be summed up if they support it. example: true in: query name: showSums required: false schema: default: false type: boolean - description: Comma separated list of properties to include. example: total,elements/subject,elements/id,self in: query name: select required: false schema: type: string responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/Work_PackagesModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to see the work packages of this project. description: |- Returned if the client does not have sufficient permissions. **Required permission:** view work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding workspace.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view workspace post: summary: Create work package in workspace operationId: Create_Workspace_Work_Package tags: - Work Packages description: |- When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body. The required fields of a WorkPackage can be found in its schema, which is embedded in the respective form. Note that it is only allowed to provide properties or links supporting the write operation. requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageModel" parameters: - description: Project id example: '1' in: path name: id required: true schema: type: integer - description: |- Indicates whether change notifications (e.g. via E-Mail) should be sent. Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee), not just the current user. example: false in: query name: notify required: false schema: default: true type: boolean responses: '200': content: application/hal+json: schema: "$ref": "#/components/schemas/WorkPackageModel" description: OK '400': "$ref": "#/components/responses/InvalidRequestBody" '403': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission message: You are not allowed to add work packages to this workspace. description: |- Returned if the client does not have sufficient permissions. **Required permission:** add work packages *Note that you will only receive this error, if you are at least allowed to see the corresponding workspace.* '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permissions:** view workspace *Note: A client without sufficient permissions shall not be able to test for the existence of a workspace. That's why a 404 is returned here, even if a 403 might be more appropriate.* '406': "$ref": "#/components/responses/MissingContentType" '415': "$ref": "#/components/responses/UnsupportedMediaType" '422': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _embedded: details: attribute: Subject _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: The subject might not be blank. description: |- Returned if: * the client tries to write a read-only property * a constraint for a property was violated * a property was provided in an unreadable format "/api/v3/workspaces/{id}/work_packages/form": post: summary: Form for creating Work Packages in a Workspace operationId: form_create_work_package_in_workspace tags: - Work Packages description: |- This endpoint allows you to validation a new work package creation body in a specific workspace. It works similarly to the `/api/v3/work_packages/form` endpoint, but already specifies the work package's workspace in the path, so that it does not have to be defined in the request body. parameters: - name: id description: ID of the workspace in which the work package will be created in: path required: true schema: type: integer example: '1' requestBody: content: application/json: schema: "$ref": "#/components/schemas/WorkPackageWriteModel" examples: Minimal example: "$ref": "#/components/examples/WorkPackageCreateOnlySubject" Valid example: "$ref": "#/components/examples/WorkPackageCreateValid" responses: '200': description: OK content: application/json: schema: "$ref": "#/components/schemas/WorkPackageFormModel" '415': "$ref": "#/components/responses/UnsupportedMediaType" "/api/v3/workspaces/{id}/versions": get: parameters: - description: ID of the workspace whose versions will be listed example: '1' in: path name: id required: true schema: type: integer responses: '200': content: application/hal+json: examples: response: value: _embedded: elements: - _links: availableInProjects: href: "/api/v3/versions/11/workspaces" definingProject: href: "/api/v3/projects/11" self: href: "/api/v3/versions/11" _type: Version description: format: plain html: This version has a description raw: This version has a description endDate: id: 11 name: v3.0 Alpha startDate: '2014-11-20' status: Open - _links: availableInProjects: href: "/api/v3/versions/12/workspaces" definingProject: href: "/api/v3/projects/11" self: href: "/api/v3/versions/12" _type: Version description: format: plain html: '' raw: '' endDate: id: 12 name: v2.0 startDate: status: Closed - _links: availableInProjects: href: "/api/v3/versions/10/workspaces" definingProject: href: "/api/v3/projects/11" self: href: "/api/v3/versions/10" _type: Version description: format: plain html: '' raw: '' endDate: id: 10 name: v1.0 startDate: status: Open _links: self: href: "/api/v3/workspaces/11/versions" _type: Collection count: 3 total: 3 schema: "$ref": "#/components/schemas/Versions_by_WorkspaceModel" description: OK headers: {} '404': content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" examples: response: value: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The specified project does not exist. description: |- Returned if the workspace does not exist or the client does not have sufficient permissions to see it. **Required permission:** view work packages **or** manage versions (on given workspace) *Note: A client without sufficient permissions shall not be able to test for the existence of a workspace. That's why a 404 is returned here, even if a 403 might be more appropriate.* headers: {} tags: - Versions description: |- This endpoint lists the versions that are *available* in a given workspace. Note that due to sharing this might be more than the versions *defined* by that workspace. operationId: List_versions_available_in_a_workspace summary: List versions available in a workspace "/api/v3/workspaces/schema": get: responses: '200': content: application/hal+json: examples: response: value: _dependencies: [] _attributeGroups: - _type: ProjectFormCustomFieldSection name: Workspace Details attributes: - customField30 - customField34 - _type: ProjectFormCustomFieldSection name: Budget Information attributes: - customField31 - customField32 - customField35 _links: self: href: "/api/v3/workspaces/schema" _type: Schema active: hasDefault: true name: Active required: true type: Boolean writable: true createdAt: hasDefault: false name: Created on required: true type: DateTime writable: false customField30: hasDefault: false name: Integer workspace custom field required: false type: Integer visibility: default writable: true customField31: _links: {} hasDefault: false location: _links name: List workspace custom field required: false type: CustomOption visibility: default writable: true customField32: _links: {} hasDefault: false location: _links name: Version workspace custom field required: false type: Version visibility: default writable: true customField34: hasDefault: false name: Boolean workspace custom field required: false type: Boolean visibility: default writable: true customField35: hasDefault: false name: Text workspace custom field required: true type: String visibility: default writable: true description: hasDefault: false name: Description required: false type: Formattable writable: true id: hasDefault: false name: ID required: true type: Integer writable: false identifier: hasDefault: false maxLength: 100 minLength: 1 name: Identifier required: true type: String writable: true name: hasDefault: false maxLength: 255 minLength: 1 name: Name required: true type: String writable: true parent: _links: {} hasDefault: false location: _links name: Subproject of required: false type: Workspace visibility: default writable: true public: hasDefault: false name: Public required: true type: Boolean writable: true status: _links: allowedValues: - href: "/api/v3/project_statuses/on_track" title: On track - href: "/api/v3/project_statuses/at_risk" title: At risk - href: "/api/v3/project_statuses/off_track" title: Off track hasDefault: true name: Status required: false type: ProjectStatus writable: true statusExplanation: hasDefault: false name: Status explanation required: false type: Formattable writable: true updatedAt: hasDefault: false name: Updated on required: true type: DateTime writable: false schema: "$ref": "#/components/schemas/Workspaces_schemaModel" description: OK headers: {} tags: - Workspaces description: '' operationId: View_workspace_schema summary: View workspace schema components: examples: ActivityResponse: description: A simple response example for an activity comment. value: _type: Activity::Comment id: 1478 comment: format: markdown raw: I can give you a CR70 corvette, you have to make do, Leia... html:

I can give you a CR70 corvette, you have to make do, Leia...

details: [] version: 4 internal: false createdAt: '2025-04-17T13:54:40.737Z' updatedAt: '2025-04-17T13:54:40.737Z' _embedded: attachments: _type: Collection total: 1 count: 1 _abbreviated: Attachments resource shortened for brevity. workPackage: id: 207 _type: WorkPackage _abbreviated: Work package resource shortened for brevity. emojiReactions: _type: Collection total: 1 count: 1 _abbreviated: Emoji reactions resource shortened for brevity. _links: attachments: href: "/api/v3/activities/1478/attachments" addAttachment: href: "/api/v3/activities/1478/attachments" method: post self: href: "/api/v3/activities/1478" workPackage: href: "/api/v3/work_packages/207" title: Recover Death Star blueprints user: href: "/api/v3/users/33" update: href: "/api/v3/activities/1478" method: patch DateAlertNotification: value: _type: Notification id: 1 readIAN: false reason: dateAlert createdAt: '2022-04-05T14:38:28.361Z' updatedAt: '2022-04-06T09:03:24.347Z' _embedded: project: _abbreviated: Project resource shortened for brevity _type: Project id: 11 name: Jedi Remnant Locator resource: _abbreviated: WorkPackage resource shortened for brevity _type: WorkPackage id: 77 subject: Educate Visas Marr details: - _type: Values::Property property: startDate value: '2021-01-01' _links: self: href: api/v3/notifications/123/details/0 schema: href: api/v3/values/schemas/startDate _links: self: href: "/api/v3/notifications/1" readIAN: href: "/api/v3/notifications/1/read_ian" method: post actor: href: project: href: "/api/v3/projects/11" title: Jedi Remnant Locator activity: href: resource: href: "/api/v3/work_packages/77" title: Educate Visas Marr GridSimpleCollectionResponse: value: _type: Collection total: 1 count: 1 pageSize: 30 offset: 1 _embedded: elements: - _type: Grid id: 2 rowCount: 8 columnCount: 5 widgets: - _type: GridWidget id: 1 identifier: time_entries_current_user startRow: 1 endRow: 8 startColumn: 1 endColumn: 3 - _type: GridWidget id: 2 identifier: news startRow: 3 endRow: 8 startColumn: 4 endColumn: 5 - _type: GridWidget id: 3 identifier: documents startRow: 1 endRow: 3 startColumn: 3 endColumn: 6 createdAt: '2018-12-03T16:58:30.297Z' updatedAt: '2018-12-13T19:36:40.352Z' _links: scope: href: "/my/page" type: text/html updateImmediately: href: "/api/v3/grids/2" method: patch update: href: "/api/v3/grids/2/form" method: post self: href: "/api/v3/grids/2" _links: self: href: "/api/v3/grids" jumpTo: href: "/api/v3/grids?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/grids?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true GridSimplePatchModel: value: rowCount: 1 columnCount: 2 widgets: - _type: GridWidget identifier: tasks startRow: 1 endRow: 2 startColumn: 1 endColumn: 2 options: name: Tasks - _type: GridWidget identifier: news startRow: 1 endRow: 2 startColumn: 2 endColumn: 3 options: name: News _links: scope: href: "/my/page" type: text/html GridSimpleResponse: value: _type: Grid id: 2 rowCount: 8 columnCount: 5 widgets: - _type: GridWidget id: 1 identifier: tasks startRow: 1 endRow: 8 startColumn: 1 endColumn: 3 - _type: GridWidget id: 2 identifier: news startRow: 3 endRow: 8 startColumn: 4 endColumn: 5 - _type: GridWidget id: 3 identifier: documents startRow: 1 endRow: 3 startColumn: 3 endColumn: 6 createdAt: '2018-12-03T16:58:30.915Z' updatedAt: '2018-12-13T19:36:40.588Z' _links: self: href: "/api/v3/grids/2" attachments: href: "/api/v3/grids/2/attachments" addAttachment: href: "/api/v3/grids/2/attachments" method: post scope: href: "/my/page" type: text/html updateImmediately: href: "/api/v3/grids/2" method: patch update: href: "/api/v3/grids/2/form" method: post delete: href: "/api/v3/grids/2" method: delete GroupResponse: value: _type: Group id: 26 name: Force Users createdAt: '2024-01-11T15:54:16.542Z' updatedAt: '2024-01-11T15:58:02.237Z' _embedded: members: - _type: User id: 23 name: Grogu Jarin _abbreviated: Principal resource shortened for brevity - _type: User id: 14 name: Mara Jade _abbreviated: Principal resource shortened for brevity - _type: User id: 3 name: Darth Vader _abbreviated: Principal resource shortened for brevity _links: self: href: "/api/v3/groups/26" title: Force Users memberships: href: "/api/v3/memberships?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2226%22%5D%7D%7D%5D" title: Memberships delete: href: "/api/v3/groups/26" method: delete updateImmediately: href: "/api/v3/groups/26" method: patch members: - href: "/api/v3/users/23" title: Grogu Jarin - href: "/api/v3/users/14" title: Mara Jade - href: "/api/v3/users/3" title: Darth Vader HierarchyItemCollectionFilteredResponse: description: Filtered response of a hierarchy structure starting at a specific parent and restricting the depth. value: _type: Collection total: 3 count: 3 _embedded: elements: - _type: HierarchyItem id: 1338 label: Stormtroopers short: ST weight: formattedWeight: depth: 1 _links: self: href: "/api/v3/custom_field_items/1338" name: Stormtroopers parent: href: "/api/v3/custom_field_items/1337" name: branch: href: "/api/v3/custom_field_items/1338/branch" children: - href: "/api/v3/custom_field_items/1340" name: ST-377 - href: "/api/v3/custom_field_items/1341" name: ST-422 - _type: HierarchyItem id: 1340 label: ST-377 short: weight: formattedWeight: depth: 2 _links: self: href: "/api/v3/custom_field_items/1340" name: ST-377 parent: href: "/api/v3/custom_field_items/1338" name: Stormtroopers branch: href: "/api/v3/custom_field_items/1340/branch" children: - href: "/api/v3/custom_field_items/1480" name: ST-377-200 - href: "/api/v3/custom_field_items/1481" name: ST-377-201 - _type: HierarchyItem id: 1341 label: ST-422 short: weight: formattedWeight: depth: 2 _links: self: href: "/api/v3/custom_field_items/1341" name: ST-422 parent: href: "/api/v3/custom_field_items/1338" name: Stormtroopers branch: href: "/api/v3/custom_field_items/1341/branch" children: - href: "/api/v3/custom_field_items/1580" name: ST-422-137 - href: "/api/v3/custom_field_items/1581" name: ST-422-138 _links: self: href: "/api/v3/custom_field/42/items?parent=1338&depth=1" HierarchyItemCollectionResponse: description: Simple response of a hierarchy structure starting at root. value: _type: Collection total: 37 count: 37 _embedded: elements: - _type: HierarchyItem id: 1337 label: short: weight: formattedWeight: depth: 0 _links: self: href: "/api/v3/custom_field_items/1337" branch: href: "/api/v3/custom_field_items/1337/branch" children: - href: "/api/v3/custom_field_items/1338" name: Stormtroopers - href: "/api/v3/custom_field_items/1339" name: Dark Troopers - _type: HierarchyItem id: 1338 label: Stormtroopers short: ST weight: formattedWeight: depth: 1 _links: self: href: "/api/v3/custom_field_items/1338" name: Stormtroopers parent: href: "/api/v3/custom_field_items/1337" name: Imperial Troopers branch: href: "/api/v3/custom_field_items/1338/branch" children: - href: "/api/v3/custom_field_items/1340" name: ST-377 - href: "/api/v3/custom_field_items/1341" name: ST-422 - _type: HierarchyItem id: 1340 label: ST-377 short: weight: formattedWeight: depth: 2 _links: self: href: "/api/v3/custom_field_items/1340" branch: href: "/api/v3/custom_field_items/1340/branch" children: [] _links: self: href: "/api/v3/custom_field/42/items" HierarchyItemResponse: description: Simple response of a single item of a custom field of type hierarchy. value: _type: HierarchyItem id: 1338 label: Stormtroopers short: ST weight: formattedWeight: depth: 1 _links: self: href: "/api/v3/custom_field_items/1338" name: Stormtroopers parent: href: "/api/v3/custom_field_items/1337" name: branch: href: "/api/v3/custom_field_items/1338/branch" children: - href: "/api/v3/custom_field_items/1340" name: ST-377 - href: "/api/v3/custom_field_items/1341" name: ST-422 MeetingCollectionSimpleResponse: description: A simple response of a meeting collection. value: _type: Collection total: 2 count: 2 pageSize: 20 offset: 1 _embedded: _abbreviated: Embedded resources shortened for brevity elements: - _type: Meeting id: 6 title: Weekly startTime: '2026-02-17T20:54:35.523Z' endTime: '2026-02-17T21:54:35.523Z' - _type: Meeting id: 5 title: Weekly startTime: '2026-02-10T20:54:35.523Z' endTime: '2026-02-10T21:54:35.523Z' _links: self: href: "/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/meetings?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/meetings?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true MeetingSimpleResponse: description: A simple meeting response. value: _type: Meeting id: 1 title: Meeting No 42 location: Death Star - Level 1337 L13/42 lockVersion: 13 startTime: '2026-02-16T10:00:00.000Z' endTime: '2026-02-16T11:00:00.000Z' duration: 1.0 createdAt: '2026-02-13T14:47:12.315Z' updatedAt: '2026-02-13T14:47:12.315Z' _links: attachments: href: "/api/v3/meetings/1/attachments" addAttachment: href: "/api/v3/meetings/1/attachments" method: post self: href: "/api/v3/meetings/1" title: Meeting No 42 author: href: "/api/v3/users/4" title: Darth Vader project: href: "/api/v3/projects/10" title: Death Star _embedded: _abbreviated: Embedded resources shortened for brevity attachments: _type: Collection total: 2 count: 2 author: _type: User name: Darth Vader id: 4 project: _type: Project name: Death Star id: 10 MembershipCreateRequestCustomMessage: description: Create a membership and send a custom notification message. value: _links: principal: href: "/api/v3/users/14" project: href: "/api/v3/projects/21" roles: - href: "/api/v3/roles/4" _meta: notificationMessage: format: markdown raw: Granted permission to execute Order *66*. MembershipCreateRequestGlobalRole: description: Create a membership for a global role. To address global roles, no project must be set. value: _links: principal: href: "/api/v3/users/14" roles: - href: "/api/v3/roles/4" MembershipCreateRequestNoNotification: description: Create a membership without sending a notification message. value: _links: principal: href: "/api/v3/users/14" project: href: "/api/v3/projects/21" roles: - href: "/api/v3/roles/4" _meta: sendNotification: false MembershipFormResponse: description: A simple form response example. value: _type: Form _embedded: payload: _meta: notificationMessage: format: markdown raw: "*Hallo*" html:

Hallo

_links: project: href: "/api/v3/projects/21" title: Death Star v3 principal: href: "/api/v3/users/14" title: Mara Jade roles: [] schema: _type: Schema _abbreviated: Schema resource shortened for brevity validationErrors: roles: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Roles need to be assigned. _embedded: details: attribute: roles _links: self: href: "/api/v3/memberships/form" method: post validate: href: "/api/v3/memberships/form" method: post MembershipSchemaResponse: description: A simple schema response example. value: _type: Schema _dependencies: [] id: type: Integer name: ID required: true hasDefault: false writable: false options: {} createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false options: {} updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false options: {} notificationMessage: type: Formattable name: Message required: false hasDefault: false writable: true options: {} location: _meta project: type: Project name: Project required: false hasDefault: false writable: true location: _links _links: allowedValues: href: "/api/v3/memberships/available_projects?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%2214%22%5D%7D%7D%5D" principal: type: Principal name: Principal required: true hasDefault: false writable: true location: _links _links: allowedValues: href: "/api/v3/principals?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%223%22%5D%7D%7D%2C%7B%22member%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%2221%22%5D%7D%7D%5D" roles: type: "[]Role" name: Role required: true hasDefault: false writable: true location: _links _links: allowedValues: href: "/api/v3/roles" _links: self: href: "/api/v3/memberships/schema" MembershipSimpleCollectionResponse: description: A simple membership collection response example. value: _type: Collection total: 1 count: 1 pageSize: 20 offset: 1 _embedded: elements: - _type: Membership id: 11 createdAt: '2015-03-20T12:56:56.643Z' updatedAt: '2018-12-20T18:16:11.643Z' _links: self: href: "/api/v3/memberships/11" title: Darth Vader schema: href: "/api/v3/memberships/schema" update: href: "/api/v3/memberships/11/form" method: post updateImmediately: href: "/api/v3/memberships/11" method: patch project: href: "/api/v3/projects/3" title: Death Start v3 principal: href: "/api/v3/users/5" title: Darth Vader roles: - href: "/api/v3/roles/4" title: Sith Lord _links: self: href: "/api/v3/memberships" jumpTo: href: "/api/v3/memberships?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/memberships?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true nextByOffset: href: "/api/v3/memberships?filters=%5B%5D&offset=2&pageSize=20" MembershipSimpleResponse: description: A simple membership response example. value: _type: Membership id: 11 createdAt: '2015-03-20T12:56:56.626Z' updatedAt: '2018-12-20T18:16:11.563Z' _embedded: project: _type: Project id: 3 _abbreviated: Project resource shortened for brevity principal: _type: User id: 5 _abbreviated: User resource shortened for brevity roles: - _type: Role id: 4 _abbreviated: Roles resource shortened for brevity _links: self: href: "/api/v3/memberships/11" title: Darth Vader schema: href: "/api/v3/memberships/schema" update: href: "/api/v3/memberships/11/form" method: post updateImmediately: href: "/api/v3/memberships/11" method: patch project: href: "/api/v3/projects/3" title: Death Start v3 principal: href: "/api/v3/users/5" title: Darth Vader roles: - href: "/api/v3/roles/4" title: Sith Lord MembershipUpdateAdditionalRoles: description: Updates a membership and add multiple roles. value: _links: roles: - href: "/api/v3/roles/5" - href: "/api/v3/roles/6" MentionedNotification: value: _type: Notification id: 1 readIAN: false reason: mentioned createdAt: '2022-04-05T14:38:28.881Z' updatedAt: '2022-04-06T09:03:24.591Z' _embedded: author: _abbreviated: User resource shortened for brevity _type: User id: 13 name: Darth Nihilus project: _abbreviated: Project resource shortened for brevity _type: Project id: 11 name: Jedi Remnant Locator activity: _abbreviated: Activity resource shortened for brevity _type: Activity::Comment id: 180 version: 3 resource: _abbreviated: WorkPackage resource shortened for brevity _type: WorkPackage id: 77 subject: Educate Visas Marr details: [] _links: self: href: "/api/v3/notifications/1" readIAN: href: "/api/v3/notifications/1/read_ian" method: post actor: href: "/api/v3/users/13" title: Darth Nihilus project: href: "/api/v3/projects/11" title: Jedi Remnant Locator activity: href: "/api/v3/activities/180" resource: href: "/api/v3/work_packages/77" title: Educate Visas Marr NotificationCollection: value: _type: Collection count: 2 total: 2 offset: 1 pageSize: 20 _embedded: elements: - _abbreviated: Notification resource shortened for brevity id: 1 readIAN: false reason: mentioned - _abbreviated: Notification resource shortened for brevity id: 2 readIAN: false reason: dateAlert _embedded: details: - _type: Values::Property property: startDate value: '2021-01-01' _links: self: href: api/v3/notifications/123/details/0 schema: href: api/v3/values/schemas/startDate detailsSchemas: - _type: Schema property: name: Property type: String value: name: Start date type: Date _links: self: href: "/api/v3/values/schemas/startDate" _links: self: href: "/api/v3/notifications?offset=1&pageSize=20" jumpTo: href: "/api/v3/notifications?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/notifications?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true PlaceholderUserResponse: value: _type: PlaceholderUser id: 27 name: Akolyth createdAt: '2024-02-12T11:52:24.708Z' updatedAt: '2024-02-12T11:52:24.708Z' _links: self: href: "/api/v3/placeholder_users/27" title: Akolyth memberships: href: "/api/v3/memberships?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2227%22%5D%7D%7D%5D" title: Memberships updateImmediately: href: "/api/v3/placeholder_users/27" title: Update Akolyth method: patch delete: href: "/api/v3/placeholder_users/27" title: Delete Akolyth method: delete showUser: href: "/placeholder_users/27" type: text/html Portfolio: value: _type: Portfolio _links: self: href: "/api/v3/portfolios/1" title: Lorem createWorkPackage: href: "/api/v3/portfolios/1/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/portfolios/1/work_packages" method: post categories: href: "/api/v3/portfolios/1/categories" types: href: "/api/v3/portfolios/1/types" versions: href: "/api/v3/portfolios/1/versions" workPackages: href: "/api/v3/portfolios/1/work_packages" memberships: href: /api/v3/memberships?filters=[{"project":{"operator":"=","values":["1"]}}] customField456: href: "/api/v3/users/315" title: A user parent: href: "/api/v3/portfolios/123" title: Parent portfolio ancestors: - href: "/api/v3/portfolios/2" title: Root portfolio - href: "/api/v3/portfolios/12" title: Grandparent portfolio - href: "/api/v3/portfolios/123" title: Parent portfolio status: href: "/api/v3/project_statuses/on_track" title: On track id: 1 identifier: connect2025 name: Digital Connect 2030 active: true public: false statusExplanation: format: markdown raw: Everything **fine** html: "

Everything fine

" description: format: markdown raw: This collection showcases a diverse selection of projects that highlight our commitment to excellence and our passion for design. From innovative web applications to stunning graphic designs, each piece reflects our unique approach and dedication to delivering impactful solutions. Discover the journey of our work and see how we bring ideas to life. html: "

This collection showcases a diverse selection of projects that highlight our commitment to excellence and our passion for design. From innovative web applications to stunning graphic designs, each piece reflects our unique approach and dedication to delivering impactful solutions. Discover the journey of our work and see how we bring ideas to life.

" createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' customField123: 123 customComment123: Why is the value 123? PortfolioBody: value: name: Portfolio example statusExplanation: raw: Everything **fine** description: raw: Lorem **ipsum** dolor sit amet customField123: 123 customComment123: Because it is 123! _links: parent: href: "/api/v3/portfolios/123" customField456: href: "/api/v3/portfolios/315" PortfolioCollection: value: _type: Collection count: 2 total: 2 pageSize: 20 offset: 1 _embedded: elements: - _hint: Portfolio resource shortened for brevity id: 1 identifier: connect2030 name: Digital Connect 2030 active: true public: true - _hint: Portfolio resource shortened for brevity id: 2 identifier: future2050 name: Digital Future 2050 active: true public: false _links: self: href: "/api/v3/portfolios?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/portfolios?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/portfolios?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true representations: - href: "/portfolios.csv?filters=%5B%5D&offset=1&pageSize=20" identifier: csv type: text/csv title: CSV - href: "/portfolios.xls?filters=%5B%5D&offset=1&pageSize=20" identifier: xls type: application/vnd.ms-excel title: XLS PriorityCollection: value: _embedded: elements: - _links: self: href: "/api/v3/priorities/1" title: Low _type: Priority id: 1 isActive: true isDefault: false name: Low position: 1 - _links: self: href: "/api/v3/priorities/2" title: Normal _type: Priority id: 2 isActive: true isDefault: true name: Normal position: 2 - _links: self: href: "/api/v3/priorities/3" title: High _type: Priority id: 3 isActive: true isDefault: false name: High position: 3 - _links: self: href: "/api/v3/priorities/4" title: Immediate _type: Priority id: 4 isActive: true isDefault: false name: Immediate position: 5 _links: self: href: "/api/v3/priorities" _type: Collection count: 4 total: 4 Program: value: _type: Program _links: self: href: "/api/v3/programs/1" title: Lorem createWorkPackage: href: "/api/v3/programs/1/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/programs/1/work_packages" method: post categories: href: "/api/v3/programs/1/categories" types: href: "/api/v3/programs/1/types" versions: href: "/api/v3/programs/1/versions" workPackages: href: "/api/v3/programs/1/work_packages" memberships: href: /api/v3/memberships?filters=[{"project":{"operator":"=","values":["1"]}}] customField456: href: "/api/v3/users/315" title: A user parent: href: "/api/v3/portfolio/123" title: Parent portfolio ancestors: - href: "/api/v3/portfolios/2" title: Root portfolio - href: "/api/v3/portfolios/12" title: Grandparent portfolio - href: "/api/v3/portfolios/123" title: Parent portfolio status: href: "/api/v3/project_statuses/on_track" title: On track id: 1 identifier: program_example name: Program example active: true public: false statusExplanation: format: markdown raw: Everything **fine** html: "

Everything fine

" description: format: markdown raw: Lorem **ipsum** dolor sit amet html: "

Lorem ipsum dolor sit amet

" createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' customField123: 123 customComment123: Why is the value 123? ProgramBody: value: name: Program example statusExplanation: raw: Everything **fine** description: raw: Lorem **ipsum** dolor sit amet customField123: 123 customComment123: Because it is 123! _links: parent: href: "/api/v3/programs/123" customField456: href: "/api/v3/programs/315" ProgramCollection: value: _type: Collection count: 2 total: 2 pageSize: 20 offset: 1 _embedded: elements: - _hint: Program resource shortened for brevity id: 1 identifier: initialprogram name: DeathStar construction active: true public: true - _hint: Program resource shortened for brevity id: 2 identifier: mysecret name: Palpatine's secret plan active: true public: false _links: self: href: "/api/v3/programs?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/programs?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/programs?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true representations: - href: "/programs.csv?filters=%5B%5D&offset=1&pageSize=20" identifier: csv type: text/csv title: CSV - href: "/programs.xls?filters=%5B%5D&offset=1&pageSize=20" identifier: xls type: application/vnd.ms-excel title: XLS Project: value: _type: Project _links: self: href: "/api/v3/projects/1" title: Lorem createWorkPackage: href: "/api/v3/projects/1/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/1/work_packages" method: post categories: href: "/api/v3/projects/1/categories" types: href: "/api/v3/projects/1/types" versions: href: "/api/v3/projects/1/versions" workPackages: href: "/api/v3/projects/1/work_packages" memberships: href: /api/v3/memberships?filters=[{"project":{"operator":"=","values":["1"]}}] customField456: href: "/api/v3/users/315" title: A user parent: href: "/api/v3/projects/123" title: Parent project ancestors: - href: "/api/v3/portfolios/2" title: Root portfolios - href: "/api/v3/programs/12" title: Grandparent program - href: "/api/v3/projects/123" title: Parent project status: href: "/api/v3/project_statuses/on_track" title: On track id: 1 identifier: project_example name: Project example active: true public: false statusExplanation: format: markdown raw: Everything **fine** html: "

Everything fine

" description: format: markdown raw: Lorem **ipsum** dolor sit amet html: "

Lorem ipsum dolor sit amet

" createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' customField123: 123 customComment123: Why is the value 123? ProjectBody: value: name: Project example statusExplanation: raw: Everything **fine** description: raw: Lorem **ipsum** dolor sit amet customField123: 123 customComment123: Because it is 123! _links: parent: href: "/api/v3/projects/123" customField456: href: "/api/v3/users/315" ProjectCollection: value: _type: Collection count: 2 total: 2 pageSize: 20 offset: 1 _embedded: elements: - _abbreviated: Project resource shortened for brevity id: 1 identifier: initialproject name: DeathStar construction active: true public: true - _abbreviated: Project resource shortened for brevity id: 2 identifier: mysecret name: Palpatine's secret plan active: true public: false _links: self: href: "/api/v3/projects?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/projects?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/projects?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true representations: - href: "/projects.csv?filters=%5B%5D&offset=1&pageSize=20" identifier: csv type: text/csv title: CSV - href: "/projects.xls?filters=%5B%5D&offset=1&pageSize=20" identifier: xls type: application/vnd.ms-excel title: XLS RelationCollectionResponse: description: Simple response of a relation collection. value: _type: Collection total: 40 count: 20 pageSize: 20 offset: 1 _embedded: elements: - _type: Relation id: 650 name: duplicated by type: duplicated reverseType: duplicates lag: description: Those are the same... stupid Stormtroopers! _links: self: href: "/api/v3/relations/650" updateImmediately: href: "/api/v3/relations/650" method: patch delete: href: "/api/v3/relations/650" method: delete, title: Remove relation from: href: "/api/v3/work_packages/108" title: Destroy Rebel Base to: href: "/api/v3/work_packages/78" title: Annihilate Yavin 4 - _type: Relation id: 652 name: relates to type: relates reverseType: relates _hint: Relation resource shortened for brevity. - _hint: Further relation resources shortened for brevity. _links: self: href: "/api/v3/relations?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/relations?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/relations?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true nextByOffset: href: "/api/v3/relations?filters=%5B%5D&offset=2&pageSize=20" RelationCreateRequest: description: Example request to create a relation between two work packages. value: type: follows lag: 2 description: Build hangar AFTER improving external skeleton of Death Star. _links: to: href: "/api/v3/work_packages/1337" RelationResponse: description: Simple response of a 'duplicated by' relation between two work packages. value: _type: Relation id: 650 name: duplicated by type: duplicated reverseType: duplicates lag: description: Those are the same... stupid Stormtroopers! _embedded: from: id: 108 _type: WorkPackage _abbreviated: Work package resource shortened for brevity. to: id: 78 _type: WorkPackage _abbreviated: Work package resource shortened for brevity. _links: self: href: "/api/v3/relations/650" updateImmediately: href: "/api/v3/relations/650" method: patch delete: href: "/api/v3/relations/650" method: delete, title: Remove relation from: href: "/api/v3/work_packages/108" title: Destroy Rebel Base to: href: "/api/v3/work_packages/78" title: Annihilate Yavin 4 RelationUpdateRequest: description: Example request to update the relation's description. value: description: This is the new description. SprintResponse: description: A sprint resource example value: _type: Sprint id: 3 name: Sprint 11 startDate: '2026-02-02' finishDate: '2026-02-09' createdAt: '2026-02-06T09:30:49.157Z' updatedAt: '2026-02-10T09:53:21.620Z' _links: self: href: "/api/v3/sprints/3" title: Sprint 11 definingWorkspace: href: "/api/v3/projects/10" title: Scrum project status: href: urn:openproject-org:api:v3:sprints:status:in_planning title: In planning SprintCollectionResponse: description: Simple response of a sprint collection. value: _type: Collection total: 40 count: 20 pageSize: 20 offset: 1 _embedded: elements: - _type: Sprint id: 3 name: Sprint 11 startDate: '2026-02-02' finishDate: '2026-02-09' createdAt: '2026-02-06T09:30:49.157Z' updatedAt: '2026-02-10T09:53:21.620Z' _links: self: href: "/api/v3/sprints/3" title: Sprint 11 definingWorkspace: href: "/api/v3/projects/10" title: Scrum project status: href: urn:openproject-org:api:v3:sprints:status:in_planning title: In planning - _abbreviated: Further sprint resources shortened for brevity. _links: self: href: "/api/v3/sprints?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/sprints?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/sprints?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true nextByOffset: href: "/api/v3/sprints?filters=%5B%5D&offset=2&pageSize=20" StatusCollection: description: A standard, unpaginated collection of statuses. value: _type: Collection count: 6 total: 6 _embedded: elements: - _type: Status id: 1 name: New isClosed: false color: "#3997AD" isDefault: true isReadonly: false excludedFromTotals: false defaultDoneRatio: 0 position: 1 _links: self: href: "/api/v3/statuses/1" - _type: Status id: 3 name: Resolved isClosed: false color: "#93D2AE" isDefault: false isReadonly: false excludedFromTotals: false defaultDoneRatio: 75 position: 3 _links: self: href: "/api/v3/statuses/3" - _type: Status id: 4 name: Feedback isClosed: false color: "#A96FFE" isDefault: false isReadonly: false excludedFromTotals: false defaultDoneRatio: 25 position: 4 _links: self: href: "/api/v3/statuses/4" - _type: Status id: 5 name: Closed isClosed: true color: "#DF6DA1" isDefault: false isReadonly: false excludedFromTotals: false defaultDoneRatio: 100 position: 5 _links: self: href: "/api/v3/statuses/5" - _type: Status id: 6 name: Rejected isClosed: true color: "#D32937" isDefault: false isReadonly: true excludedFromTotals: true defaultDoneRatio: 100 position: 6 _links: self: href: "/api/v3/statuses/6" - _type: Status id: 2 name: In Progress isClosed: false color: "#3852C6" isDefault: false isReadonly: false excludedFromTotals: false defaultDoneRatio: 50 position: 3 _links: self: href: "/api/v3/statuses/2" _links: self: href: "/api/v3/statuses" StatusResponse: description: A standard status resource response. value: _type: Status id: 13 name: Waiting for Darth-approval isClosed: false color: "#FE005D" isDefault: false isReadonly: false excludedFromTotals: false defaultDoneRatio: 66 position: 4 _links: self: href: "/api/v3/statuses/13" title: Waiting for Darth-approval StorageNextcloudResponse: value: _type: Storage id: 1337 name: It's no moon hasApplicationPassword: true createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' configured: true _embedded: oauthApplication: id: 42 _type: OAuthApplication name: It's no moon (Nextcloud) clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA confidential: true createdAt: '2022-12-07T12:56:42.626Z' updatedAt: '2022-12-07T12:56:42.626Z' scopes: - api_v3 _links: self: href: "/api/v3/oauth_applications/42" owner: href: "/api/v3/users/13" title: Darth Vader integration: href: "/api/v3/storages/1337" title: It's no moon redirectUri: - href: https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect oauthClientCredentials: _type: OAuthClientCredentials id: 42 clientId: fGEFWxIpROrpci25TW6qWCZozDFEAKSkonMBkrf3LYvBXRljBbLajBf2vD2fjePm confidential: true createdAt: '2023-12-08T09:49:24.397Z' updatedAt: '2023-12-08T09:49:24.397Z' _links: self: href: "/api/v3/oauth_client_credentials/42" integration: href: "/api/v3/storages/1337" title: It's no moon _links: self: href: "/api/v3/storages/1337" title: It's no moon type: href: urn:openproject-org:api:v3:storages:Nextcloud title: Nextcloud origin: href: https://nextcloud.deathstar.rocks/ prepareUpload: - href: "/api/v3/storages/1337/files/prepare_upload" method: post title: Upload file payload: projectId: 21 fileName: "{fileName}" parent: "{parent}" templated: true - href: "/api/v3/storages/95/files/prepare_upload" method: post title: Upload file payload: projectId: 11 fileName: "{fileName}" parent: "{parent}" templated: true open: href: "/api/v3/storages/1337/open" authorizationState: href: urn:openproject-org:api:v3:storages:authorization:Connected title: Connected projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] oauthApplication: href: "/api/v3/oauth_application/42" title: It's no moon (Nextcloud) oauthClientCredentials: href: "/api/v3/oauth_client_credentials/42" StorageCreateFolderRequestBody: description: A valid request body to create a new folder on a external storage value: name: Uploads parentId: '200' StorageNextcloudResponseForCreation: value: _type: Storage id: 1337 name: My New DeathStar hasApplicationPassword: false createdAt: '2024-05-21T09:11:53.880Z' updatedAt: '2024-05-21T09:11:53.880Z' configured: false _embedded: oauthApplication: id: 42 _type: OAuthApplication name: My New DeathStar (Nextcloud) clientId: gNQ-gi3VX59ruoft5B9aRmukEYbZOhKIsxXE9iT1tcQ confidential: true clientSecret: 79hIlb1Ezj5kPx8LgE6LI9L1-mb8g7jX1-u_a08RJlI createdAt: '2024-05-21T09:11:53.908Z' updatedAt: '2024-05-21T09:11:53.908Z' scopes: - api_v3 _links: self: href: "/api/v3/oauth_applications/42" owner: href: "/api/v3/users/13" title: Darth Vader integration: href: "/api/v3/storages/1337" title: My New DeathStar redirectUri: - href: https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect _links: self: href: "/api/v3/storages/1337" title: My New DeathStar type: href: urn:openproject-org:api:v3:storages:Nextcloud title: Nextcloud origin: href: https://nextcloud.deathstar.rocks/ open: href: "/api/v3/storages/1337/open" prepareUpload: [] authorizationState: href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization title: Authorization failed projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] oauthApplication: href: "/api/v3/oauth_application/42" title: My New DeathStar (Nextcloud) oauthClientCredentials: href: StorageNextcloudUnauthorizedResponse: value: _type: Storage id: 1337 name: It's no moon hasApplicationPassword: false createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' configured: true _embedded: oauthApplication: id: 42 _type: OAuthApplication name: It's no moon (Nextcloud) clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA confidential: true createdAt: '2022-12-07T12:56:42.626Z' updatedAt: '2022-12-07T12:56:42.626Z' scopes: - api_v3 _links: self: href: "/api/v3/oauth_applications/42" owner: href: "/api/v3/users/13" title: Darth Vader integration: href: "/api/v3/storages/1337" title: It's no moon redirectUri: - href: https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect oauthClientCredentials: _type: OAuthClientCredentials id: 42 clientId: fGEFWxIpROrpci25TW6qWCZozDFEAKSkonMBkrf3LYvBXRljBbLajBf2vD2fjePm confidential: true createdAt: '2023-12-08T09:49:24.397Z' updatedAt: '2023-12-08T09:49:24.397Z' _links: self: href: "/api/v3/oauth_client_credentials/42" integration: href: "/api/v3/storages/1337" title: It's no moon _links: self: href: "/api/v3/storages/1337" title: It's no moon type: href: urn:openproject-org:api:v3:storages:Nextcloud title: Nextcloud origin: href: https://nextcloud.deathstar.rocks/ prepareUpload: [] open: href: "/api/v3/storages/1337/open" authorizationState: href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization title: Authorization failed authorize: href: https://nextcloud25.local/index.php/apps/oauth2/authorize?client_id=fnrIeJZqqAKGQlejuDaGhSQfCAVtoayHLACWCYcPJ0w17Pp6daPPUktkM9QaGxca&redirect_uri=https://openproject.local/oauth_clients/fnrIeJZqqAKGQlejuDaGhSQfCAVtoayHLACWCYcPJ0w17Pp6daPPUktkM9QaGxca/callback&response_type=code title: Authorize projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] oauthApplication: href: "/api/v3/oauth_application/42" title: It's no moon (Nextcloud) oauthClientCredentials: href: "/api/v3/oauth_client_credentials/42" StorageOneDriveIncompleteResponse: value: _type: Storage id: 1337 name: It's no moon tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4 driveId: createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' configured: false _links: self: href: "/api/v3/storages/1337" title: It's no moon type: href: urn:openproject-org:api:v3:storages:OneDrive title: OneDrive/SharePoint prepareUpload: [] open: href: "/api/v3/storages/1337/open" authorizationState: href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization title: Authorization failed projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] oauthClientCredentials: href: "/api/v3/oauth_client_credentials/42" StorageOneDriveResponse: value: _type: Storage id: 1337 name: It's no moon tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4 driveId: b!FeOZEMfQx0eGQKqVBLcP__BG8mq-4-9FuRqOyk3MXY8Qconfm2i6SKEoCmuGYqQK createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' configured: true _embedded: oauthClientCredentials: _type: OAuthClientCredentials id: 42 clientId: b8a5bb54-5fb2-4e0e-9427-9d24dbac32ff confidential: true createdAt: '2023-12-08T09:49:24.397Z' updatedAt: '2023-12-08T09:49:24.397Z' _links: self: href: "/api/v3/oauth_client_credentials/42" integration: href: "/api/v3/storages/1337" title: It's no moon _links: self: href: "/api/v3/storages/1337" title: It's no moon type: href: urn:openproject-org:api:v3:storages:OneDrive title: OneDrive prepareUpload: - href: "/api/v3/storages/1337/files/prepare_upload" method: post title: Upload file payload: projectId: 33 fileName: "{fileName}" parent: "{parent}" templated: true open: href: "/api/v3/storages/1337/open" authorizationState: href: urn:openproject-org:api:v3:storages:authorization:Connected title: Connected projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] oauthClientCredentials: href: "/api/v3/oauth_client_credentials/42" StoragesSimpleCollectionModel: value: _type: Collection count: 2 total: 2 offset: 1 pageSize: 20 _embedded: elements: - id: 1337 _type: Storage name: It's no moon hasApplicationPassword: true configured: true createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' _links: self: href: "/api/v3/storages/1337" title: It's no moon type: href: urn:openproject-org:api:v3:storages:nextcloud title: Nextcloud origin: href: https://nextcloud.deathstar.rocks/ open: href: https://nextcloud.deathstar.rocks/apps/files authorizationState: href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization title: Failed Authorization authorize: href: https://nextcloud.deathstar.rocks/authorize/ title: Authorize projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] oauthApplication: href: "/api/v3/oauth_application/42" title: It's no moon (Nextcloud) oauthClientCredentials: href: "/api/v3/oauth_client_credentials/42" - id: 1338 _type: Storage name: EmpireSharepoint tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4 driveId: b!FeOZEMfQx0eGQKqVBLcP__BG8mq-4-9FuRqOyk3MXY8Qconfm2i6SKEoCmuGYqQK createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' configured: true _links: self: href: "/api/v3/storages/1338" title: EmpireSharepoint type: href: urn:openproject-org:api:v3:storages:one-drive title: OneDrive open: href: https://empire.sharepoint.com/sites/Documents authorizationState: href: urn:openproject-org:api:v3:storages:authorization:Connected title: Connected projectStorages: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1338"]}}] oauthClientCredentials: href: "/api/v3/oauth_client_credentials/44" _links: self: href: "/api/v3/storages?filters=%5B%5D&offset=1&pageSize=20" jumpTo: href: "/api/v3/storages?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20" templated: true changeSize: href: "/api/v3/storages?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D" templated: true nextByOffset: href: "/api/v3/storages?filters=%5B%5D&offset=2&pageSize=20" QueriesModel: value: _links: self: href: "/api/v3/queries" total: 1 count: 1 _type: Collection _embedded: elements: - _type: Query id: 9 name: fdsfdsfdsf createdAt: '2015-03-20T12:56:56.413Z' updatedAt: '2015-05-20T18:16:53.392Z' filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] - _type: DueDateQueryFilter name: Finish date values: - '1' _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post _links: self: href: "/api/v3/queries/9" title: fdsfdsfdsf results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: "/api/v3/projects/3" title: copy QueryModel: value: _type: Query id: 9 name: abcdefg createdAt: '2015-03-20T12:56:56.235Z' updatedAt: '2015-05-20T18:16:53.976Z' filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] - _type: DueDateQueryFilter name: Finish date values: - '1' _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post _links: self: href: "/api/v3/queries/9" title: abcdefg results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: "/api/v3/projects/3" title: copy QuerySchemaModel: value: _dependencies: [] _embedded: filtersSchemas: _embedded: elements: - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/assignee" title: Assignee self: href: "/api/v3/queries/filter_instance_schemas/assignee" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false - _dependencies: - _type: SchemaDependency dependencies: "/api/v3/queries/operators/!": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true "/api/v3/queries/operators/=": values: _links: {} hasDefault: false name: Values required: true type: "[]User" writable: true 'on': operator _links: filter: href: "/api/v3/queries/filters/author" title: Author self: href: "/api/v3/queries/filter_instance_schemas/author" _type: QueryFilterInstanceSchema filter: _links: {} hasDefault: false name: Filter required: true type: QueryFilter writable: true name: hasDefault: true name: Name required: true type: String writable: false _links: self: href: "/api/v3/queries/filter_instance_schemas" _type: Collection count: 20 total: 20 _links: self: href: "/api/v3/queries/schema" _type: Schema columns: _links: {} hasDefault: true location: _links name: Columns required: false type: "[]QueryColumn" writable: true createdAt: hasDefault: false name: Created on required: true type: DateTime writable: false filters: _links: allowedValuesSchemas: href: "/api/v3/queries/filter_instance_schemas" hasDefault: true location: _links name: Filters required: false type: "[]QueryFilterInstance" writable: true groupBy: _links: {} hasDefault: false name: Group results by required: false type: "[]QueryGroupBy" writable: true highlightedAttributes: hasDefault: true location: _links name: Highlighted attributes required: false type: "[]QueryColumn" writable: true deprecated: true highlightingMode: hasDefault: true name: Highlighting mode required: false type: String writable: true deprecated: true id: hasDefault: false name: ID required: true type: Integer writable: false name: hasDefault: false maxLength: 255 minLength: 1 name: Name required: true type: String writable: true project: _links: {} hasDefault: false location: _links name: Project required: false type: Project writable: true public: hasDefault: true name: Public required: false type: Boolean writable: true results: hasDefault: false name: Results required: false type: WorkPackageCollection writable: false showHierarchies: hasDefault: true name: Show hierarchies required: false type: Boolean writable: true deprecated: true sortBy: _links: {} hasDefault: true name: Sort by required: false type: "[]QuerySortBy" writable: true starred: hasDefault: true name: Starred required: false type: Boolean writable: true sums: hasDefault: true name: Sums required: false type: Boolean writable: true timelineLabels: hasDefault: true name: Timeline labels required: false type: QueryTimelineLabels writable: true deprecated: true timelineVisible: hasDefault: true name: Timeline visible required: false type: Boolean writable: true deprecated: true timelineZoomLevel: hasDefault: true name: Timeline zoom level required: false type: String writable: true deprecated: true timestamps: hasDefault: true name: Timestamps required: false type: "[]Timestamp" writable: true updatedAt: hasDefault: false name: Updated on required: true type: DateTime writable: false user: hasDefault: true name: User required: true type: User writable: false UserResponse: value: _type: User id: 14 name: Mara Jade createdAt: '2022-04-04T08:07:22.910Z' updatedAt: '2024-02-09T09:01:17.382Z' login: member admin: false firstName: Mara lastName: Jade email: m.jade@empire.org avatar: https://secure.gravatar.com/avatar/17dd23570f3bd129d06db9b48b7a41b8?default=404&secure=true status: active identityUrl: language: en _links: self: href: "/api/v3/users/14" title: Mara Jade memberships: href: "/api/v3/memberships?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2214%22%5D%7D%7D%5D" title: Memberships showUser: href: "/users/14" type: text/html updateImmediately: href: "/api/v3/users/14" title: Update member method: patch lock: href: "/api/v3/users/14/lock" title: Set lock on member method: post delete: href: "/api/v3/users/14" title: Delete member method: delete ValuesPropertyStartDateSchema: value: _type: Schema property: name: Property type: String value: name: Start date type: Date _links: self: href: api/v3/values/schemas/startDate ValuesPropertyDueDateSchema: value: _type: Schema property: name: Property type: String value: name: Due date type: Date _links: self: href: api/v3/values/schemas/dueDate ValuesPropertyDateSchema: value: _type: Schema property: name: Property type: String value: name: Date type: Date _links: self: href: api/v3/values/schemas/date ValuesPropertyStartDate: value: _type: Values::Property property: startDate value: '2021-01-01' _links: self: href: api/v3/notifications/123/details/0 schema: href: api/v3/values/schemas/startDate ValuesPropertyDueDate: value: _type: Values::Property property: dueDate value: '2021-01-01' _links: self: href: api/v3/notifications/123/details/0 schema: href: api/v3/values/schemas/dueDate ValuesPropertyDate: value: _type: Values::Property property: date value: '2021-01-01' _links: self: href: api/v3/notifications/123/details/0 schema: href: api/v3/values/schemas/date VersionSimpleResponse: description: Simple response showing a single version value: _type: Version id: 3 name: v0.9.1-alpha description: format: plain raw: First draft of the energy weapon ... (behold, Alderaan *evil_laughter*) html: "

First draft of the energy weapon ... (behold, Alderaan *evil_laughter*)

" startDate: '2026-02-02' endDate: '2026-02-09' status: closed sharing: none createdAt: '2026-02-06T09:30:49.157Z' updatedAt: '2026-02-10T09:53:21.620Z' customField14: true _links: self: href: "/api/v3/versions/1" title: v0.1.0-alpha schema: href: "/api/v3/versions/schema" update: href: "/api/v3/versions/1/form" method: post updateImmediately: href: "/api/v3/versions/1" method: patch delete: href: "/api/v3/versions/1" method: delete availableInProjects: href: "/api/v3/versions/1/workspaces" definingProject: href: "/api/v3/projects/10" title: Death Star customField23: href: "/api/v3/users/18" title: Mara Jade VersionCreateRequest: description: Request to create a basic version with custom fields value: name: v0.9.1-alpha startDate: '2026-02-02' endDate: '2026-02-09' status: open sharing: tree customField14: true _links: definingProject: href: "/api/v3/projects/10" title: Death Star customField23: href: "/api/v3/users/18" title: Mara Jade VersionUpdateNameRequest: description: Example request body to update the name of a version. value: name: v0.9.1-alpha Views: value: _links: self: href: "/api/v3/views" changeSize: href: "/api/v3/views?pageSize={size}" templated: true jumpTo: href: "/api/v3/views?offset={offset}" templated: true total: 1 count: 1 _type: Collection _embedded: elements: - _type: Views::WorkPackagesTable name: Current work packages timelineVisible: true id: 9 _links: self: href: "/api/v3/views/9" query: href: "/api/v3/queries/18" title: A query columns: - href: "/api/v3/users/id" title: ID - href: "/api/v3/users/subject" title: Subject - href: "/api/v3/users/type" title: Type - href: "/api/v3/users/status" title: Status - href: "/api/v3/users/priority" title: Priority - href: "/api/v3/users/assignee" title: Assignee - href: "/api/v3/users/updated_at" title: Updated on project: href: "/api/v3/project/89" title: The project ViewWorkPackagesTable: value: _type: Views::WorkPackagesTable name: Current work packages id: 9 _links: self: href: "/api/v3/views/9" query: href: "/api/v3/queries/18" title: Current work packages project: href: "/api/v3/project/89" title: The project ViewTeamPlanner: value: _type: Views::TeamPlanner name: Product team id: 9 _links: self: href: "/api/v3/views/9" query: href: "/api/v3/queries/18" title: Product team project: href: "/api/v3/project/89" title: The project WorkPackageCreateOnlySubject: description: |- A request body to create a work package with only a subject. This can only be used, if the project context is already given in the path. All other values will fall back to defaults. value: subject: Replace GNK power droids WorkPackageCreateValid: description: A valid request body to create or edit a work package with a couple of properties. value: subject: Install Dromund Kass planetary shield description: format: markdown raw: |- # TODO The planetary shield of Dromund Kass needs to be installed to protect the planet from orbital bombardment. startDate: '2877-07-21' duration: P1337D estimatedTime: P370DT13H ignoreNonWorkingDays: true project: href: "/api/v3/projects/42" type: href: "/api/v3/types/13" status: href: "/api/v3/statuses/2" WorkPackageEditSubject: description: A request body to edit a work package's subject. value: subject: Replace GNK power droids WorkPackageWithMetaValidation: description: A request body to edit a work package with custom field validation enabled via the _meta object. value: subject: Replace GNK power droids lockVersion: 42 _meta: validateCustomFields: true responses: InvalidQuery: description: Returned if the client sends invalid request parameters e.g. filters content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery message: Filters Invalid filter does not exist. InvalidRequestBody: description: Occurs when the client did not send a valid JSON object in the request body. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody message: The request body was not a single JSON object. MissingContentType: description: Occurs when the client did not send a Content-Type header content: text/plain: schema: type: string example: Missing content-type header UnsupportedMediaType: description: Occurs when the client sends an unsupported Content-Type header. content: application/hal+json: schema: "$ref": "#/components/schemas/ErrorResponse" example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:TypeNotSupported message: Expected CONTENT-TYPE to be (expected value) but got (actual value). schemas: ActivityModel: type: object properties: _type: type: string enum: - Activity::Comment id: type: integer description: Activity id minimum: 1 version: type: integer description: Activity version minimum: 1 comment: "$ref": "#/components/schemas/Formattable" details: type: array items: "$ref": "#/components/schemas/Formattable" internal: type: boolean description: Whether this activity is internal (only visible to users with view_internal_comments permission) createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of update _embedded: type: object properties: attachments: allOf: - "$ref": "#/components/schemas/Attachments_Model" - description: Collection of attachments for this activity workPackage: allOf: - "$ref": "#/components/schemas/WorkPackageModel" - description: |- The work package this activity belongs to # Conditions Only embedded when the `journable` of the activity is a work package emojiReactions: allOf: - "$ref": "#/components/schemas/EmojiReactions_Model" - description: Collection of emoji reactions for this activity _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This activity **Resource**: Activity workPackage: allOf: - "$ref": "#/components/schemas/Link" - description: |- The work package this activity belongs to **Resource**: WorkPackage user: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user who created this activity **Resource**: Principal update: allOf: - "$ref": "#/components/schemas/Link" - description: Update this activity attachments: allOf: - "$ref": "#/components/schemas/Link" - description: |- The attachment collection of this activity **Resource**: Attachments addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Attach a file to the activity # Conditions **Permissions**: - `add_work_package_comments` - for internal comments: `add_internal_comments` emojiReactions: allOf: - "$ref": "#/components/schemas/Link" - description: |- The emoji reactions collection of this activity **Resource**: EmojiReactions example: id: 1 _type: Activity::Comment _embedded: attachments: _type: Collection total: 1 count: 1 _embedded: elements: - _type: Attachment id: 30388 fileName: Task_Ensure_financing___4___OpenProject_DEV.jpeg fileSize: 540992 description: format: plain raw: '' html: '' status: uploaded contentType: image/jpeg digest: algorithm: md5 hash: d02d312b25383b595a9fa10f1a8999fe createdAt: '2025-04-08T15:37:19.275Z' _links: self: href: "/api/v3/attachments/30388" title: Task_Ensure_financing___4___OpenProject_DEV.jpeg author: href: "/api/v3/users/435" title: Firstname container: href: "/api/v3/activities/79090" staticDownloadLocation: href: "/api/v3/attachments/30388/content" downloadLocation: href: "/api/v3/attachments/30388/content" delete: href: "/api/v3/attachments/30388" method: delete _links: self: href: "/api/v3/activities/79090/attachments" emojiReactions: _type: Collection total: 2 count: 2 _embedded: elements: - _type: EmojiReaction id: 1-thumbs_up reaction: thumbs_up emoji: "\U0001F44D" reactionsCount: 3 firstReactionAt: '2024-04-08T15:37:19.275Z' _links: self: href: "/api/v3/emoji_reactions/1-thumbs_up" reactable: href: "/api/v3/activities/1" reactingUsers: - href: "/api/v3/users/435" title: John Doe - href: "/api/v3/users/436" title: Jane Smith - href: "/api/v3/users/437" title: Bob Johnson - _type: EmojiReaction id: 1-heart reaction: heart emoji: "❤️" reactionsCount: 1 firstReactionAt: '2024-04-08T15:38:19.275Z' _links: self: href: "/api/v3/emoji_reactions/1-heart" reactable: href: "/api/v3/activities/1" reactingUsers: - href: "/api/v3/users/435" title: John Doe _links: self: href: "/api/v3/activities/1/emoji_reactions" workPackage: _type: WorkPackage id: 10403 lockVersion: 2 subject: Ensure financing description: format: markdown raw: Lorem ipsum dolor sit amet. html: "

Lorem ipsum dolor sit amet.

" scheduleManually: true startDate: dueDate: derivedStartDate: derivedDueDate: estimatedTime: derivedEstimatedTime: derivedRemainingTime: duration: ignoreNonWorkingDays: false percentageDone: derivedPercentageDone: createdAt: '2025-03-24T13:11:09.480Z' updatedAt: '2025-04-14T11:00:02.411Z' _links: self: href: "/api/v3/work_packages/10403" title: Ensure financing type: href: "/api/v3/types/1" title: Task status: href: "/api/v3/statuses/1" title: New project: href: "/api/v3/projects/918" title: RVC Test schema: href: "/api/v3/work_packages/schemas/11-2" author: href: "/api/v3/users/1" title: OpenProject Admin - admin priority: href: "/api/v3/priorities/2" title: Normal ancestors: [] _links: self: href: "/api/v3/activity/1" title: Priority changed from High to Low workPackage: href: "/api/v3/work_packages/1" title: quis numquam qui voluptatum quia praesentium blanditiis nisi user: href: "/api/v3/users/1" title: John Sheppard - admin attachments: href: "/api/v3/activities/1/attachments" emojiReactions: href: "/api/v3/activities/1/emoji_reactions" addAttachment: href: "/api/v3/activities/1/attachments" method: post update: href: "/api/v3/activities/1" method: patch details: - format: markdown raw: Lorem ipsum dolor sit amet. html: "

Lorem ipsum dolor sit amet.

" comment: format: markdown raw: Lorem ipsum dolor sit amet. html: "

Lorem ipsum dolor sit amet.

" createdAt: '2014-05-21T08:51:20.721Z' updatedAt: '2014-05-21T09:14:02.929Z' version: 31 ActivityCommentWriteModel: type: object properties: comment: type: object properties: raw: type: string description: The raw content of the comment internal: type: boolean description: |- Determines whether this comment is internal. This is only available to users with `add_internal_comments` permission. It defaults to `false`, if unset. default: false example: comment: raw: I think this is awesome! AttachmentModel: type: object required: - fileName - description - status - contentType - digest - createdAt properties: id: type: integer description: Attachment's id minimum: 1 fileName: type: string description: The name of the uploaded file fileSize: type: integer description: The size of the uploaded file in Bytes minimum: 0 description: allOf: - "$ref": "#/components/schemas/Formattable" - description: A user provided description of the file status: type: string enum: - uploaded - prepared - scanned - quarantined - rescan contentType: type: string description: The files MIME-Type as determined by the server digest: type: object description: A checksum for the files content required: - algorithm - hash properties: algorithm: type: string description: The algorithm used to generate the digest. hash: type: string description: The hexadecimal representation of the digested hash value. createdAt: type: string format: date-time description: Time of creation _links: type: object required: - self - container - author - downloadLocation properties: delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Deletes this attachment # Conditions **Permission**: edit on attachment container or being the author for attachments without container self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This attachment **Resource**: Attachment container: allOf: - "$ref": "#/components/schemas/Link" - description: |- The object (e.g. WorkPackage) housing the attachment **Resource**: Anything author: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user who uploaded the attachment **Resource**: User downloadLocation: allOf: - "$ref": "#/components/schemas/Link" - description: |- Direct download link to the attachment **Resource**: - example: _type: Attachment _links: self: href: "/api/v3/attachments/1" container: href: "/api/v3/work_packages/1" author: href: "/api/v3/users/1" staticDownloadLocation: href: "/api/v3/attachments/1/content" downloadLocation: href: "/some/remote/aws/url/image.png" id: 1 fileName: cat.png filesize: 24 status: uploaded description: format: plain raw: A picture of a cute cat html: "

A picture of a cute cat

" contentType: image/png digest: algorithm: md5 hash: 64c26a8403cd796ea4cf913cda2ee4a9 createdAt: '2014-05-21T08:51:20.396Z' Attachments_Model: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The attachments collection **Resource**: AttachmentsCollection readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/AttachmentModel" - description: Collection of Attachments Available_AssigneesModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The available assignees collection **Resource**: AvailableAssigneesCollection readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/UserModel" - description: Collection of Users Available_WatchersModel: type: object example: _links: self: href: "/api/v3/work_packages/1/available_watchers" total: 2 count: 2 _type: Collection _embedded: elements: - _type: User _links: self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard lock: href: "/api/v3/users/1/lock" title: Set lock on j.sheppard method: POST delete: href: "/api/v3/users/1" title: Delete j.sheppard method: DELETE id: 1 login: j.sheppard firstName: John lastName: Sheppard email: shep@mail.com avatar: https://example.org/users/1/avatar status: active createdAt: '2014-05-21T08:51:20.286Z' updatedAt: '2014-05-21T08:51:20.286Z' - _type: User _links: self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 lock: href: "/api/v3/users/2/lock" title: Set lock on j.sheppard2 method: POST delete: href: "/api/v3/users/2" title: Delete j.sheppard2 method: DELETE id: 2 login: j.sheppard2 firstName: Jim lastName: Sheppard email: shep@mail.net avatar: https://example.org/users/1/avatar status: active createdAt: '2014-05-21T08:51:20.286Z' updatedAt: '2014-05-21T08:51:20.286Z' Available_projects_for_queryModel: type: object example: _links: self: href: "/api/v3/queries/available_projects" _type: Collection total: 2 count: 2 _embedded: elements: - _type: Project _links: self: href: "/api/v3/projects/6" title: A project createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post categories: href: "/api/v3/projects/6/categories" versions: href: "/api/v3/projects/6/versions" id: 6 identifier: a_project name: A project description: Eveniet molestias omnis quis aut qui eum adipisci. createdAt: '2015-07-06T13:28:14+00:00' updatedAt: '2015-10-01T09:55:02+00:00' type: Customer Project - _type: Project _links: self: href: "/api/v3/projects/14" title: Another project createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post categories: href: "/api/v3/projects/14/categories" versions: href: "/api/v3/projects/14/versions" id: 14 identifier: another_project name: Another project description: '' createdAt: '2016-02-29T12:50:20+00:00' updatedAt: '2016-02-29T12:50:20+00:00' type: Available_projects_for_time_entriesModel: type: object example: _links: self: href: "/api/v3/time_entries/available_projects" _type: Collection total: 2 count: 2 _embedded: elements: - _type: Project... - _type: Project... Available_projects_for_versionsModel: type: object example: _links: self: href: "/api/v3/versions/available_projects" _type: Collection total: 2 count: 2 _embedded: elements: - _type: Project _links: self: href: "/api/v3/projects/6" title: A project editWorkPackage: href: "/api/v3/work_packages/{id}/form" templated: true method: post createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post categories: href: "/api/v3/projects/6/categories" versions: href: "/api/v3/projects/6/versions" id: 6 identifier: a_project name: A project description: Eveniet molestias omnis quis aut qui eum adipisci. Atque aut aut in exercitationem adipisci amet. Nisi asperiores quia ratione veritatis enim exercitationem magnam. Aut fuga architecto adipisci nihil. Et repellat pariatur. Aliquam et sed perferendis nostrum quaerat. Fugit doloremque voluptatem. createdAt: '2015-07-06T13:28:14+00:00' updatedAt: '2015-10-01T09:55:02+00:00' type: Customer Project - _type: Project _links: self: href: "/api/v3/projects/14" title: Another project createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post categories: href: "/api/v3/projects/14/categories" versions: href: "/api/v3/projects/14/versions" id: 14 identifier: another_project name: Another project description: '' createdAt: '2016-02-29T12:50:20+00:00' updatedAt: '2016-02-29T12:50:20+00:00' type: Available_projects_for_work_packageModel: type: object example: _links: self: href: "/api/v3/work_packages/5/available_projects" _type: Collection total: 2 count: 2 _embedded: elements: - _type: Project _links: self: href: "/api/v3/projects/6" title: A project editWorkPackage: href: "/api/v3/work_packages/{id}/form" templated: true method: post createWorkPackage: href: "/api/v3/projects/6/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/6/work_packages" method: post categories: href: "/api/v3/projects/6/categories" versions: href: "/api/v3/projects/6/versions" id: 6 identifier: a_project name: A project description: Eveniet molestias omnis quis aut qui eum adipisci. Atque aut aut in exercitationem adipisci amet. Nisi asperiores quia ratione veritatis enim exercitationem magnam. Aut fuga architecto adipisci nihil. Et repellat pariatur. Aliquam et sed perferendis nostrum quaerat. Fugit doloremque voluptatem. createdAt: '2015-07-06T13:28:14+00:00' updatedAt: '2015-10-01T09:55:02+00:00' type: Customer Project - _type: Project _links: self: href: "/api/v3/projects/14" title: Another project createWorkPackage: href: "/api/v3/projects/14/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/projects/14/work_packages" method: post categories: href: "/api/v3/projects/14/categories" versions: href: "/api/v3/projects/14/versions" id: 14 identifier: another_project name: Another project description: '' createdAt: '2016-02-29T12:50:20+00:00' updatedAt: '2016-02-29T12:50:20+00:00' type: Available_relation_candidatesModel: type: object example: _links: self: href: "/api/v3/projects/14/work_packages" total: 2 count: 2 _type: Collection _embedded: elements: - _type: WorkPackage _links: self: href: "/api/v3/work_packages/1" id: 1 subject: Skipped other properties for brevity - _type: WorkPackage _links: self: href: "/api/v3/work_packages/2" id: 2 subject: Skipped other properties for brevity BudgetModel: type: object properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This budget **Resource**: Budget readOnly: true example: _type: Budget _links: self: href: "/api/v3/budgets/1" title: Q3 2015 id: 1 subject: Q3 2015 Budgets_by_ProjectModel: type: object example: _links: self: href: "/api/v3/projects/1/budgets" _type: Collection total: 2 count: 2 _embedded: elements: - _type: Budget _links: self: href: "/api/v3/budgets/1" title: Q3 2015 id: 1 subject: Q3 2015 - _type: Budget _links: self: href: "/api/v3/budgets/2" title: Q4 2015 id: 2 subject: Q4 2015 Categories_by_WorkspaceModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The categories collection **Resource**: CategoriesCollection readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/CategoryModel" - description: Collection of Categories CategoryModel: type: object properties: id: type: integer description: Category id readOnly: true exclusiveMinimum: 0 name: type: string description: Category name _links: type: object required: - self - project properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This category **Resource**: Category readOnly: true project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project of this category **Resource**: Project readOnly: true defaultAssignee: allOf: - "$ref": "#/components/schemas/Link" - description: |- Default assignee for work packages of this category **Resource**: User readOnly: true example: _links: self: href: "/api/v3/categories/10" title: Category with assignee project: href: "/api/v3/projects/11" title: Example project defaultAssignee: href: "/api/v3/users/42" title: John Sheppard _type: Category id: 10 name: Foo CollectionLinks: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This collection resource. **Resource**: Collection CollectionModel: type: object required: - _type - total - count - _links properties: _type: type: string enum: - Collection total: type: integer description: The total amount of elements available in the collection. minimum: 0 count: type: integer description: Actual amount of elements in this response. minimum: 0 _links: "$ref": "#/components/schemas/CollectionLinks" ConfigurationModel: type: object properties: maximumAttachmentFileSize: type: integer description: The maximum allowed size of an attachment in Bytes readOnly: true hostName: type: string description: The host name configured for the system readOnly: true perPageOptions: type: array description: Page size steps to be offered in paginated list UI items: type: integer durationFormat: type: string description: The format used to display Work, Remaining Work, and Spent time durations readOnly: true activeFeatureFlags: type: array description: The list of all feature flags that are active items: type: string ProjectConfigurationModel: allOf: - "$ref": "#/components/schemas/ConfigurationModel" - type: object properties: enabledInternalComments: type: boolean description: Whether internal comments are enabled for this project readOnly: true CustomActionModel: type: object properties: _type: type: string enum: - CustomAction name: type: string description: The name of the custom action description: type: string description: The description for the custom action _links: type: object required: - self - executeImmediately properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This custom action **Resource**: CustomAction executeImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: Execute this custom action. example: _type: CustomAction name: Change project and type description: Changes project and type in one go _links: executeImmediately: href: "/api/v3/custom_actions/2/execute" title: Execute Change project and type method: post self: href: "/api/v3/custom_actions/2" title: Change project and type CustomCommentProperties: type: object patternProperties: "^customComment\\d+$": type: - 'null' - string description: |- A plain-text comment associated with a project custom field that has comments enabled. The property is only present when the corresponding `customField{N}` has `has_comment` set to `true`. CustomFieldLinkedProperties: type: object patternProperties: "^customField\\d+$": allOf: - "$ref": "#/components/schemas/Link" - description: |- A custom field value that belongs to a custom field of a reference type: - Hierarchy - List - User - Version - Weighted item list CustomFieldProperties: type: object patternProperties: "^customField\\d+$": type: - 'null' - number - boolean - string - object description: |- A custom field value, that belongs to a custom field of a simple type: - Boolean - Date - Float - Integer - Link (URL) - Text - Long text CustomOptionModel: type: object properties: id: type: integer description: The identifier readOnly: true value: type: string description: The value defined for this custom option readOnly: true _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This custom option. **Resource**: CustomOption readOnly: true example: _links: self: href: "/api/v3/custom_options/1" _type: CustomOption value: Foo DayCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This days collection **Resource**: DayCollectionModel _embedded: type: object required: - elements properties: elements: type: array description: |- The array of days. Each day has a name and a working status indicating if it is a working or a non-working day. items: "$ref": "#/components/schemas/DayModel" example: _type: Collection total: 5 count: 5 _links: self: href: /api/v3/days?filters=[{"interval":{"operator":"<>d","values":["2022-04-29","2022-05-03"]}}] _embedded: elements: - _type: Day date: '2022-04-29' name: Friday working: true _links: self: href: "/api/v3/days/2022-04-29" weekday: href: "/api/v3/days/week/5" title: Friday - _type: Day date: '2022-04-30' name: Saturday working: false _links: self: href: "/api/v3/days/2022-04-30" nonWorkingReasons: - href: "/api/v3/days/week/6" title: Saturday weekday: href: "/api/v3/days/week/6" title: Saturday - _type: Day date: '2022-05-01' name: Sunday (Labour day) working: false _links: self: href: "/api/v3/days/2022-05-01" nonWorkingReasons: - href: "/api/v3/days/week/7" title: Sunday - href: "/api/v3/days/non_working/2022-05-01" title: Labour day weekday: href: "/api/v3/days/week/7" title: Sunday - _type: Day date: '2022-05-02' name: Monday working: true _links: self: href: "/api/v3/days/2022-05-02" weekday: href: "/api/v3/days/week/1" title: Monday - _type: Day date: '2022-05-03' name: Tuesday working: true _links: self: href: "/api/v3/days/2022-05-03" weekday: href: "/api/v3/days/week/2" title: Tuesday DayModel: type: object required: - _type - date - name - working properties: _type: type: string enum: - Day date: type: string format: date description: Date of the day. name: type: string description: Descriptive name for the day. working: type: boolean description: "`true` for a working day, `false` otherwise." _links: type: object required: - self properties: self: "$ref": "#/components/schemas/Link" nonWorkingReasons: type: array description: |- A list of resources describing why this day is a non-working day. Linked resources can be `NonWorkingDay` and `WeekDay` resources. This property is absent for working days. items: "$ref": "#/components/schemas/Link" weekDay: allOf: - "$ref": "#/components/schemas/Link" - description: The week day for this day. example: _type: Day date: '2022-12-25' name: Sunday (Christmas) working: false _links: self: href: "/api/v3/days/2022-12-25" nonWorkingReasons: - href: "/api/v3/days/week/7" title: Sunday - href: "/api/v3/days/non_working/2022-12-25" title: Christmas weekday: href: "/api/v3/days/week/7" title: Sunday Default_QueryModel: type: object example: _type: Query name: default filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] public: false sums: false timelineVisible: false timelineZoomLevel: days timelineLabels: {} highlightingMode: inline timestamps: - P0D showHierarchies: true starred: false _embedded: results: _type: WorkPackageCollection total: 234 count: 30 pageSize: 2 offset: 1 _embedded: elements: - "<--- shortened for brevity --->" _links: self: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post highlightedAttributes: [] _links: self: href: "/api/v3/queries/default" title: Default results: href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on highlightedAttributes: [] groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: Default_Query_for_WorkspaceModel: type: object example: _type: Query name: default filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] public: false sums: false timelineVisible: false timelineZoomLevel: days showHierarchies: true starred: false _embedded: results: _type: WorkPackageCollection total: 234 count: 30 pageSize: 2 offset: 1 _embedded: elements: - "<--- shortened for brevity --->" _links: self: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post _links: self: href: "/api/v3/workspaces/42/queries/default" title: Default results: href: "/api/v3/workspaces/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: "/api/v3/projects/42" title: Lorem ipsum project DocumentModel: type: object properties: id: type: integer description: Document's id readOnly: true exclusiveMinimum: 0 title: type: string description: The title chosen for the document description: allOf: - "$ref": "#/components/schemas/Formattable" - description: A text describing the document createdAt: type: string format: date-time description: The time the document was created at readOnly: true _links: type: object required: - self - project - attachments properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This document **Resource**: Document readOnly: true project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project the document is in **Resource**: Project attachments: allOf: - "$ref": "#/components/schemas/Link" - description: |- The attachments belonging to the document **Resource**: []Attachment example: _type: Document id: 1 title: Some other document description: format: markdown raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" createdAt: '2018-12-10T20:53:39.539Z' _links: attachments: href: "/api/v3/documents/1/attachments" addAttachment: href: "/api/v3/documents/1/attachments" method: post self: href: "/api/v3/documents/1" title: Some document project: href: "/api/v3/projects/19" title: Some project _embedded: project: _type: Project... attachments: _type: Collection total: 2 count: 2 _embedded...: elements: [] _links: self: href: "/api/v3/documents/1/attachments" DocumentsModel: type: object example: _type: Collection total: 2 count: 2 pageSize: 30 offset: 1 _embedded: elements: - description: format: markdown raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" _type: Document id: 1 title: Some other document createdAt: '2018-12-10T20:53:39.966Z' _links: attachments: href: "/api/v3/documents/1/attachments" addAttachment: href: "/api/v3/documents/1/attachments" method: post self: href: "/api/v3/documents/1" title: Some document project: href: "/api/v3/projects/19" title: Some project - description: format: markdown raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" _type: Document id: 2 title: Some other document createdAt: '2018-12-10T20:55:54.886Z' _links: attachments: href: "/api/v3/documents/2/attachments" addAttachment: href: "/api/v3/documents/2/attachments" method: post self: href: "/api/v3/documents/2" title: Some other document project: href: "/api/v3/projects/29" title: Some other project _links: self: href: "/api/v3/documents?offset=1&pageSize=30" jumpTo: href: "/api/v3/documents?offset=%7Boffset%7D&pageSize=30" templated: true changeSize: href: "/api/v3/documents?offset=1&pageSize=%7Bsize%7D" templated: true EmojiReactionModel: type: object properties: _type: type: string enum: - EmojiReaction id: type: string description: 'Emoji reaction id (format: reactable_id-reaction)' example: 1-thumbs_up reaction: type: string description: The reaction identifier example: thumbs_up emoji: type: string description: The emoji character example: "\U0001F44D" reactionsCount: type: integer description: Number of users who reacted with this emoji minimum: 1 example: 3 firstReactionAt: type: string format: date-time description: Time of the first reaction _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: This emoji reaction reactable: allOf: - "$ref": "#/components/schemas/Link" - description: The activity this emoji reaction belongs to reactingUsers: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: The users who reacted with this emoji example: _type: EmojiReaction id: 1-thumbs_up reaction: thumbs_up emoji: "\U0001F44D" reactionsCount: 3 firstReactionAt: '2024-04-08T15:37:19.275Z' _links: self: href: "/api/v3/emoji_reactions/1-thumbs_up" reactable: href: "/api/v3/activities/1" reactingUsers: - href: "/api/v3/users/435" title: John Doe - href: "/api/v3/users/436" title: Jane Smith - href: "/api/v3/users/437" title: Bob Johnson EmojiReactions_Model: type: object properties: _type: type: string enum: - Collection total: type: integer description: Total number of emoji reactions minimum: 0 count: type: integer description: Number of emoji reactions in this response minimum: 0 _embedded: type: object properties: elements: type: array items: "$ref": "#/components/schemas/EmojiReactionModel" _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: This collection example: _type: Collection total: 2 count: 2 _embedded: elements: - _type: EmojiReaction id: 1-thumbs_up reaction: thumbs_up emoji: "\U0001F44D" reactionsCount: 3 firstReactionAt: '2024-04-08T15:37:19.275Z' _links: self: href: "/api/v3/emoji_reactions/1-thumbs_up" reactable: href: "/api/v3/activities/1" reactingUsers: - href: "/api/v3/users/435" title: John Doe - href: "/api/v3/users/436" title: Jane Smith - href: "/api/v3/users/437" title: Bob Johnson - _type: EmojiReaction id: 1-heart reaction: heart emoji: "❤️" reactionsCount: 1 firstReactionAt: '2024-04-08T15:38:19.275Z' _links: self: href: "/api/v3/emoji_reactions/1-heart" reactable: href: "/api/v3/activities/1" reactingUsers: - href: "/api/v3/users/435" title: John Doe _links: self: href: "/api/v3/activities/1/emoji_reactions" ErrorResponse: type: object required: - _type - errorIdentifier - message properties: _embedded: type: object properties: details: type: object properties: attribute: type: string example: project _type: type: string enum: - Error errorIdentifier: type: string example: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: type: string example: Project can't be blank. Example_FormModel: type: object example: _links: self: href: "/api/v3/example/form" validate: href: "/api/v3/example/form" method: POST previewMarkup: href: "/api/v3/render/markdown" method: POST commit: href: "/api/v3/example" method: PATCH _type: Form _embedded: payload: _links: status: href: "/api/v3/statuses/1" _type: Example lockVersion: 5 subject: An example title schema: _type: Schema _links: self: href: "/api/v3/example/schema" lockVersion: type: Integer writable: false subject: type: String minLength: 1 maxLength: 255 status: _links: allowedValues: - href: "/api/v3/statuses/1" title: New - href: "/api/v3/statuses/2" title: Closed type: Status _embedded: allowedValues: - _links: self: href: "/api/v3/statuses/1" _type: Status id: 1 name: New position: 1 isDefault: true isClosed: false defaultDoneRatio: 0 createdAt: '2014-05-21T08:51:20.759Z' updatedAt: '2014-05-21T09:12:00.237Z' - _links: self: href: "/api/v3/statuses/2" _type: Status id: 2 name: Closed position: 2 isDefault: false isClosed: true defaultDoneRatio: 100 createdAt: '2014-05-21T08:51:20.759Z' updatedAt: '2014-05-21T09:12:00.237Z' validationErrors: subject: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:BadExampleError message: For the purpose of this example we need a validation error. The remainder of the response pretends there were no errors. Example_SchemaModel: type: object example: _type: Schema _dependencies: [] _links: self: href: "/api/v3/example/schema" lockVersion: name: Resource Version type: Integer writable: false subject: name: Subject type: String minLength: 1 maxLength: 255 status: _links: allowedValues: - href: "/api/v3/statuses/1" title: New - href: "/api/v3/statuses/2" title: Closed name: Status type: Status location: _links _embedded: allowedValues: - _links: self: href: "/api/v3/statuses/1" _type: Status id: 1 name: New position: 1 isDefault: true isClosed: false defaultDoneRatio: 0 createdAt: '2014-05-21T08:51:20.991Z' updatedAt: '2014-05-21T09:12:00.155Z' - _links: self: href: "/api/v3/statuses/2" _type: Status id: 2 name: Closed position: 2 isDefault: false isClosed: true defaultDoneRatio: 100 createdAt: '2014-05-21T08:51:20.991Z' updatedAt: '2014-05-21T09:12:00.155Z' FileLinkCollectionReadModel: allOf: - "$ref": "#/components/schemas/PaginatedCollectionModel" - type: object properties: _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This file links collection **Resource**: FileLinkCollectionReadModel _embedded: type: object properties: elements: type: array items: "$ref": "#/components/schemas/FileLinkReadModel" example: _type: Collection total: 2 count: 2 pageSize: 30 offset: 1 _links: self: href: "/api/v3/work_packages/42/file_links" jumpTo: href: "/api/v3/work_packages/42/file_links?offset=%7Boffset%7D&pageSize=30" templated: true changeSize: href: "/api/v3/work_packages/42/file_links?offset=1&pageSize=%7Bsize%7D" templated: true _embedded: elements: - id: 1337 _type: FileLink createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' originData: id: '5503' name: logo.png mimeType: image/png size: 16042 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: self: href: "/api/v3/work_package/17/file_links/1337" title: file link storage: href: "/api/v3/storage/42" title: storage container: href: "/api/v3/work_package/17" title: work package creator: href: "/api/v3/users/33" title: Obi-Wan Kenobi delete: href: "/api/v3/work_package/17/file_links/1337" method: delete originOpen: href: https://nextcloud.deathstar.rocks/index.php/f?fileid=5503 staticOriginOpen: href: "/api/v3/work_package/17/file_links/1337/open" - _hint: File Link resource shortened for brevity id: 1338 FileLinkCollectionWriteModel: type: object required: - _embedded properties: _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/FileLinkWriteModel" example: _embedded: elements: - originData: id: '5503' name: logo.png mimeType: image/png size: 16042 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: storage: href: "/api/v3/storage/42" FileLinkOriginDataModel: type: object required: - id - name properties: id: type: string description: Linked file's id on the origin name: type: string description: Linked file's name on the origin mimeType: type: string minLength: 0 description: |- MIME type of the linked file. To link a folder entity, the custom MIME type `application/x-op-directory` MUST be provided. Otherwise it defaults back to an unknown MIME type. size: type: integer minimum: 0 description: file size on origin in bytes createdAt: type: string format: date-time description: Timestamp of the creation datetime of the file on the origin lastModifiedAt: type: string format: date-time description: Timestamp of the datetime of the last modification of the file on the origin createdByName: type: string description: Display name of the author that created the file on the origin lastModifiedByName: type: string description: Display name of the author that modified the file on the origin last FileLinkReadModel: type: object properties: id: type: integer description: File link id _type: type: string enum: - FileLink createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the file link originData: "$ref": "#/components/schemas/FileLinkOriginDataModel" _embedded: type: object required: - storage - container properties: storage: "$ref": "#/components/schemas/StorageReadModel" _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This file link. **Resource**: FileLink storage: allOf: - "$ref": "#/components/schemas/Link" - description: |- The storage resource of the linked file. **Resource**: Storage container: allOf: - "$ref": "#/components/schemas/Link" - description: |- The container the origin file is linked to. Can be one of the following **Resources**: - WorkPackage creator: allOf: - "$ref": "#/components/schemas/Link" - description: |- The creator of the file link. **Resource**: User delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- The uri to delete the file link. **Resource**: N/A status: allOf: - "$ref": "#/components/schemas/Link" - description: |- The urn of the user specific file link status on its storage. Can be one of: - urn:openproject-org:api:v3:file-links:permission:ViewAllowed - urn:openproject-org:api:v3:file-links:permission:ViewNotAllowed - urn:openproject-org:api:v3:file-links:NotFound - urn:openproject-org:api:v3:file-links:Error **Resource**: N/A originOpen: allOf: - "$ref": "#/components/schemas/Link" - description: |- The uri to open the origin file on the origin itself. **Resource**: N/A staticOriginOpen: allOf: - "$ref": "#/components/schemas/Link" - description: |- A static uri to open the origin file on the storage. Responds with a redirect. **Resource**: N/A originOpenLocation: allOf: - "$ref": "#/components/schemas/Link" - description: |- The uri to open the location of origin file on the origin itself. **Resource**: N/A staticOriginOpenLocation: allOf: - "$ref": "#/components/schemas/Link" - description: |- A static uri to open the location of the origin file on the storage. Responds with a redirect. **Resource**: N/A staticOriginDownload: allOf: - "$ref": "#/components/schemas/Link" - description: |- A static uri to generate a new download URL from the storage. Responds with a redirect. **Resource**: N/A example: id: 1337 _type: FileLink createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' originData: id: '5503' name: logo.png mimeType: image/png size: 16042 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _embedded: storage: id: 1337 _type: Storage name: It's no moon createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' _links: self: href: "/api/v3/storages/1337" title: It's no moon type: href: urn:openproject-org:api:v3:storages:nextcloud title: Nextcloud origin: href: https://nextcloud.deathstar.rocks/ open: href: https://example.com/a-link-to-open-the-file authorizationState: href: urn:openproject-org:api:v3:storages:authorization:Connected container: _hint: Work package resource shortened for brevity _type: WorkPackage id: 1528 subject: Develop API _links: self: href: "/api/v3/work_package/17/file_links/1337" storage: href: "/api/v3/storage/42" title: It's no moon container: href: "/api/v3/work_package/17" title: Develop API creator: href: "/api/v3/users/33" title: Obi-Wan Kenobi delete: href: "/api/v3/work_package/17/file_links/1337" status: href: urn:openproject-org:api:v3:file-links:permission:ViewAllowed title: View allowed originOpen: href: https://nextcloud.deathstar.rocks/index.php/f/5503?openfile=1 staticOriginOpen: href: "/api/v3/file_links/1337/open" originOpenLocation: href: https://nextcloud.deathstar.rocks/index.php/f/5503?openfile=0 staticOriginOpenLocation: href: "/api/v3/file_links/1337/open?location=true" staticOriginDownload: href: "/api/v3/file_links/1337/download" FileLinkWriteModel: type: object required: - originData - _links properties: originData: "$ref": "#/components/schemas/FileLinkOriginDataModel" _links: oneOf: - type: object required: - storage properties: storage: allOf: - "$ref": "#/components/schemas/Link" - description: |- The storage resource of the linked file. **Resource**: Storage - type: object required: - storageUrl properties: storageUrl: allOf: - "$ref": "#/components/schemas/Link" - description: |- The storage url the file link references to. **Resource**: N/A example: originData: id: '5503' name: logo.png mimeType: image/png size: 16042 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: storageUrl: href: https://nextcloud.my-deathstar.org FileUploadForm: type: object properties: metadata: type: object properties: fileName: type: string file: type: string format: binary Formattable: type: object required: - format properties: format: type: string enum: - plain - markdown - custom readOnly: true description: Indicates the formatting language of the raw text example: markdown raw: type: string description: The raw text, as entered by the user example: I **am** formatted! html: type: string readOnly: true description: The text converted to HTML according to the format example: I am formatted! example: format: markdown raw: I am formatted! html: I am formatted! GridCollectionModel: allOf: - "$ref": "#/components/schemas/PaginatedCollectionModel" - type: object required: - _embedded properties: _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/GridReadModel" GridReadModel: type: object required: - _type - id - rowCount - columnCount - widgets - _links properties: _type: type: string enum: - Grid id: type: integer description: Grid's id minimum: 1 rowCount: type: integer description: The number of rows the grid has minimum: 1 columnCount: type: integer description: The number of columns the grid has minimum: 1 widgets: type: array description: |- The set of `GridWidget`s selected for the grid. # Conditions - The widgets must not overlap. items: "$ref": "#/components/schemas/GridWidgetModel" createdAt: type: string format: date-time description: The time the grid was created. updatedAt: type: string format: date-time description: The time the grid was last updated. _links: type: object required: - self - scope properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This grid. **Resource**: Grid attachments: allOf: - "$ref": "#/components/schemas/Link" - description: |- The attachment collection of this grid. **Resource**: AttachmentCollection addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: Link for adding an attachment to this grid. scope: allOf: - "$ref": "#/components/schemas/Link" - description: The location where this grid is used, usually represented as a relative URL. updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly perform edits on this grid. # Conditions **Permission**: depends on the page the grid is defined for update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Validate edits on the grid via a form resource before committing # Conditions **Permission**: depends on the page the grid is defined for delete: allOf: - "$ref": "#/components/schemas/Link" - description: Deletes this grid resource. GridWidgetModel: type: object required: - _type - id - identifier - startRow - endRow - startColumn - endColumn properties: _type: type: string enum: - GridWidget id: type: - integer - 'null' description: The grid widget's unique identifier. Can be null, if a new widget is created within a grid. minimum: 1 identifier: type: string description: An alternative, human legible, and unique identifier. startRow: type: integer description: The index of the starting row of the widget. The row is inclusive. minimum: 1 endRow: type: integer description: The index of the ending row of the widget. The row is exclusive. minimum: 1 startColumn: type: integer description: The index of the starting column of the widget. The column is inclusive. minimum: 1 endColumn: type: integer description: The index of the ending column of the widget. The column is exclusive. minimum: 1 options: type: object GridWriteModel: type: object properties: rowCount: type: integer description: The number of rows the grid has minimum: 1 columnCount: type: integer description: The number of columns the grid has minimum: 1 widgets: type: array description: |- The set of `GridWidget`s selected for the grid. # Conditions - The widgets must not overlap. items: "$ref": "#/components/schemas/GridWidgetModel" _links: type: object properties: scope: allOf: - "$ref": "#/components/schemas/Link" - description: The location where this grid is used, usually represented as a relative URL. GroupCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This group collection **Resource**: Collection _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/GroupModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/groups" _embedded: elements: - _type: Group id: 1337 name: Stormtroopers createdAt: '2022-09-23T11:06:36.300Z' updatedAt: '2022-09-23T11:06:36.300Z' _links: self: href: "/api/v3/groups/9" title: Stormtroopers delete: href: "/api/v3/group/9" method: delete memberships: href: /api/v3/memberships?filters=[{"principal":{"operator":"=","values":["9"]}}] title: Memberships updateImmediately: href: "/api/v3/group/9" method: patch members: - href: "/api/v3/users/363" title: ST-097E - href: "/api/v3/users/60" title: ST-C-334 - _abbreviated: Group resource shortened for brevity id: 1338 GroupModel: allOf: - "$ref": "#/components/schemas/PrincipalModel" - "$ref": "#/components/schemas/CustomFieldProperties" - type: object required: - _type - _embedded properties: _type: type: string enum: - Group _embedded: type: object properties: members: type: array description: Embedded list of members. items: "$ref": "#/components/schemas/UserModel" _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This group resource **Resource**: Group members: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A member of the group # Conditions: - user has permission `manage_members` in any project **Resource**: User memberships: allOf: - "$ref": "#/components/schemas/Link" - description: |- An collection of all memberships of the group. **Resource**: MembershipCollection delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- An href to delete the group. # Conditions: - `admin` updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- An href to update the group. # Conditions: - `admin` **Resource**: Group GroupWriteModel: type: object properties: name: type: string description: The new group name. _links: type: object properties: members: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A new member for the group. **Resource**: User example: name: Emperor's guard _links: members: - href: "/api/v3/users/42" - href: "/api/v3/users/43" - href: "/api/v3/users/44" HelpTextCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This help text collection **Resource**: HelpTextCollectionModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/HelpTextModel" example: total: 2 count: 2 _type: Collection _embedded: elements: - _type: HelpText _links: self: href: "/api/v3/help_texts/1" editText: href: "/admin/attribute_help_texts/1/edit" type: text/html attachments: href: "/api/v3/help_texts/1/attachments" addAttachment: href: "/api/v3/help_texts/1/attachments" method: post id: 1 attribute: id attributeCaption: ID scope: WorkPackage helpText: format: markdown raw: Help text for id attribute. html: "

Help text for id attribute.

" - _type: HelpText _links: self: href: "/api/v3/help_texts/2" editText: href: "/admin/attribute_help_texts/2/edit" type: text/html attachments: href: "/api/v3/help_texts/2/attachments" addAttachment: href: "/api/v3/help_texts/2/attachments" method: post id: 2 attribute: status attributeCaption: Status scope: WorkPackage helpText: format: markdown raw: Help text for status attribute. html: "

Help text for status attribute.

" _links: self: href: "/api/v3/help_texts" HelpTextModel: type: object required: - _type - id - attribute - scope - helpText - _links properties: _type: type: string enum: - HelpText id: type: integer format: int64 minimum: 1 attribute: type: string description: The attribute the help text is assigned to. scope: type: string enum: - WorkPackage - Project helpText: "$ref": "#/components/schemas/Formattable" _links: type: object required: - self - editText - attachments - addAttachment properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This help text resource. **Resource**: HelpText editText: allOf: - "$ref": "#/components/schemas/Link" - description: |- Edit the help text entry. **Resource**: text/html attachments: allOf: - "$ref": "#/components/schemas/Link" - description: |- The attachment collection of this help text. **Resource**: AttachmentCollection addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: Add an attachment to the help text. example: _type: HelpText id: 1 attribute: id scope: WorkPackage caption: Some plain text caption helpText: format: markdown raw: Help text for id attribute. html: "

Help text for id attribute.

" _links: self: href: "/api/v3/help_texts/1" editText: href: "/admin/attribute_help_texts/1/edit" type: text/html attachments: href: "/api/v3/help_texts/1/attachments" addAttachment: href: "/api/v3/help_texts/1/attachments" method: post HierarchyItemCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This hierarchy item collection **Resource**: HierarchyItemCollectionModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/HierarchyItemReadModel" HierarchyItemReadModel: type: object required: - _type - id - label - short - weight - formattedWeight - depth - _links properties: _type: type: string enum: - HierarchyItem id: type: integer description: Hierarchy item identifier label: type: - string - 'null' description: The label of the hierarchy item short: type: - string - 'null' description: |- The short name of the hierarchy item. If this attribute is set, the `weight` and the `formattedWeight` are `null`. weight: type: - string - 'null' description: |- The accurate weight of the hierarchy item. As a decimal precision number it is written as a string to not loose precision with conversion to a floating point number. If this attribute is set, the `short` is null. formattedWeight: type: - string - 'null' description: |- The formatted weight of the hierarchy item. The standard formatting of the OpenProject server is used to convert this number into a representable format - i.e. falling back to scientific notation for very small and very big numbers. If this attribute is set, the `short` is null. depth: type: integer description: The hierarchy depth. The root item has a depth of 0. _links: type: object required: - self - children - branch properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This hierarchy item **Resource**: HierarchyItem parent: allOf: - "$ref": "#/components/schemas/Link" - description: |- The hierarchy item that is the parent of the current hierarchy item **Resource**: HierarchyItem children: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A hierarchy item that is a child of the current hierarchy item **Resource**: HierarchyItem branch: allOf: - "$ref": "#/components/schemas/Link" - description: |- The branch of the hierarchy item, ordered from root to node. **Resource**: HierarchyItemCollection Link: type: object required: - href properties: href: type: - string - 'null' description: URL to the referenced resource (might be relative) title: type: string description: Representative label for the resource templated: type: boolean default: false description: If true the href contains parts that need to be replaced by the client method: type: string default: GET description: The HTTP verb to use when requesting the resource payload: type: object description: The payload to send in the request to achieve the desired result identifier: type: string description: An optional unique identifier to the link object type: type: string description: The MIME-Type of the returned resource. example: href: "/api/v3/work_packages" method: POST List_actionsModel: type: object example: _links: self: href: "/api/v3/actions" total: 2 count: 2 _type: Collection _embedded: elements: - _links: self: href: "/api/v3/actions/work_packages/create" title: Add work package _type: Action id: work_packages/create name: Add work package description: Creating a work package within a project including the uploading of attachments. Some attributes might not be selected, e.g version which requires a second permission modules: - work_packages - _links: self: href: "/api/v3/actions/work_packages/assign_versions" title: Assigning version _type: Action id: work_packages/assign_versions name: Assign version description: Assigning a work package to a version when creating/updating a work package. Only principals having this permission can assign a value to the version property of the work package resource. modules: - work_packages - versions List_available_parent_project_candidatesModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project collection **Resource**: ProjectCollection readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/ProjectModel" - "$ref": "#/components/schemas/ProgramModel" - "$ref": "#/components/schemas/PortfolioModel" description: Collection of projects List_capabilitiesModel: type: object example: _links: self: href: "/api/v3/capabilities" changeSize: href: "/api/v3/capabilities?pageSize={size}" templated: true jumpTo: href: "/api/v3/capabilities?offset={offset}" templated: true total: 4 count: 4 _type: Collection _embedded: elements: - _links: self: href: "/api/v3/capabilities/work_packages/create/p123-567" action: href: "/api/v3/actions/work_packages/create" title: Add work package context: href: "/api/v3/projects/123" title: A project principal: href: "/api/v3/users/567" title: Some user _type: Capability id: work_packages/create/p123-567 - _links: self: href: "/api/v3/capabilities/work_packages/assignee/p123-567" action: href: "/api/v3/actions/work_packages/assignee" context: href: "/api/v3/projects/123" title: A project principal: href: "/api/v3/users/567" title: Some user _type: Capability id: work_packages/assignee/p123-567 - _links: self: href: "/api/v3/capabilities/memberships/create/p345-821" title: Create members action: href: "/api/v3/actions/memberships/create" context: href: "/api/v3/projects/345" title: A project principal: href: "/api/v3/users/821" title: Some user _type: Capability id: memberships/create/p345-821 - _links: self: href: "/api/v3/capabilities/users/delete/g-567" title: Delete user context: href: "/api/v3/capabilities/context/global" title: Global principal: href: "/api/v3/users/567" title: Some user _type: Capability id: users/delete/g-567 List_of_NewsModel: type: object example: _type: Collection total: 78 count: 2 pageSize: 2 offset: 1 _embedded: elements: - _type: News id: 1 title: asperiores possimus nam doloribus ab summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus. Comparo crapula depopulo demonstro. description: format: markdown raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" createdAt: '2015-03-20T12:57:01.509Z' _links: self: href: "/api/v3/news/1" title: asperiores possimus nam doloribus ab project: href: "/api/v3/projects/1" title: Seeded Project author: href: "/api/v3/users/2" title: Peggie Feeney updateImmediately: href: api/v3/news/1 method: patch delete: href: api/v3/news/1 method: delete - _type: News id: 2 title: terminatio tutamen. Officia adeptio sp summary: Consequatur sequi surculus creo tui aequitas. description: format: markdown raw: Amicitia alius cattus voluntarius. Virgo viduo terminatio tutamen. Officia adeptio spectaculum atavus nisi cum concido bis. Harum caecus auxilium sol theatrum eaque consequatur. Omnis aeger suus adipisci cicuta. Cur delicate alias curto cursim atqui talio fugiat. html: "

Amicitia alius cattus voluntarius. Virgo viduo terminatio tutamen. Officia adeptio spectaculum atavus nisi cum concido bis. Harum caecus auxilium sol theatrum eaque consequatur. Omnis aeger suus adipisci cicuta. Cur delicate alias curto cursim atqui talio fugiat.

" createdAt: '2015-03-20T12:57:01.509Z' _links: self: href: "/api/v3/news/2" title: terminatio tutamen. Officia adeptio sp project: href: "/api/v3/projects/1" title: Seeded Project author: href: "/api/v3/users/2" title: Peggie Feeney updateImmediately: href: api/v3/news/2 method: patch delete: href: api/v3/news/2 method: delete _links: self: href: "/api/v3/news?offset=1&pageSize=2" jumpTo: href: "/api/v3/news?offset=%7Boffset%7D&pageSize=2" templated: true changeSize: href: "/api/v3/news?offset=1&pageSize=%7Bsize%7D" templated: true nextByOffset: href: "/api/v3/news?offset=2&pageSize=2" List_workspaces_by_versionModel: type: object example: _links: self: href: "/api/v3/versions/2/workspaces" total: 1 count: 1 _type: Collection _embedded: elements: - _type: Project _links: self: href: "/api/v3/projects/1" title: Lorem categories: href: "/api/v3/projects/1/categories" versions: href: "/api/v3/projects/1/versions" status: href: "/api/v3/project_statuses/on_track" title: On track id: 1 identifier: project_identifier name: Project example description: format: markdown raw: Lorem **ipsum** dolor sit amet html: "

Lorem ipsum dolor sit amet

" active: true statusExplanation: format: markdown raw: Everything **fine** html: "

Everything fine

" createdAt: '2014-05-21T08:51:20.142Z' updatedAt: '2014-05-21T08:51:20.142Z' MeetingCollectionModel: allOf: - "$ref": "#/components/schemas/PaginatedCollectionModel" - type: object required: - _embedded - _links properties: _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/MeetingModel" _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The link to this meeting collection resource **Resource**: MeetingCollection MeetingModel: type: object required: - _type - id - lockVersion - title - startTime - endTime - duration - createdAt - updatedAt properties: _type: type: string enum: - Meeting id: type: integer description: Identifier of this meeting minimum: 1 title: type: string description: The meeting's title location: type: string description: The meeting's location lockVersion: type: integer description: The version of the item as used for optimistic locking startTime: type: string format: date-time description: The scheduled meeting start time. endTime: type: string format: date-time description: The scheduled meeting start time. duration: type: number description: The meeting duration in hours. createdAt: type: string format: date-time description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. updatedAt: type: string format: date-time description: Time of the most recent change to the meeting. _embedded: type: object required: - attachments - author properties: attachments: "$ref": "#/components/schemas/Attachments_Model" author: "$ref": "#/components/schemas/UserModel" project: "$ref": "#/components/schemas/ProjectModel" _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This meeting **Resource**: Meeting author: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user having created the meeting **Resource**: User project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project the meeting is in **Resource**: Project attachments: allOf: - "$ref": "#/components/schemas/Link" - description: |- The attachment collection of this grid. **Resource**: AttachmentCollection addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Attach a file to the meeting # Conditions **Permission**: edit meeting MarkdownModel: type: string format: html example:

Hello world! This is markdown!

MembershipCollectionModel: allOf: - "$ref": "#/components/schemas/PaginatedCollectionModel" - type: object required: - _embedded properties: _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/MembershipReadModel" MembershipFormModel: type: object required: - _type - _embedded - _links properties: _type: type: string enum: - Form _embedded: type: object required: - payload - schema - validationError properties: payload: "$ref": "#/components/schemas/MembershipWriteModel" schema: "$ref": "#/components/schemas/MembershipSchemaModel" validationError: type: object properties: base: "$ref": "#/components/schemas/ErrorResponse" principal: "$ref": "#/components/schemas/ErrorResponse" roles: "$ref": "#/components/schemas/ErrorResponse" _links: type: object required: - self - validate - commit properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This form request. **Resource**: Form validate: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: The endpoint to validate the membership payload. commit: allOf: - "$ref": "#/components/schemas/Link" - description: |- The endpoint to create the membership with the same payload, as sent to the form. **Resource**: Membership MembershipReadModel: type: object required: - _type - id - createdAt - updatedAt - _links properties: _type: type: string enum: - Membership id: type: integer description: The membership's id minimum: 1 createdAt: type: string format: date-time description: The time the membership was created. updatedAt: type: string format: date-time description: The time the membership was last updated. _embedded: type: object properties: project: oneOf: - "$ref": "#/components/schemas/ProjectModel" - "$ref": "#/components/schemas/ProgramModel" - "$ref": "#/components/schemas/PortfolioModel" principal: anyOf: - "$ref": "#/components/schemas/UserModel" - "$ref": "#/components/schemas/GroupModel" roles: type: array items: "$ref": "#/components/schemas/RoleModel" _links: type: object required: - self - schema - project - principal - roles properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This membership. **Resource**: Membership schema: allOf: - "$ref": "#/components/schemas/Link" - description: |- This membership schema. **Resource**: Schema update: allOf: - "$ref": "#/components/schemas/Link" - description: |- The endpoint for updating the membership. # Conditions **Permission**: manage_members updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- The endpoint for updating the membership without form validation. # Conditions **Permission**: manage_members project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace the membership is related to. **Resource**: Workspace principal: allOf: - "$ref": "#/components/schemas/Link" - description: |- The principal the membership is related to. **Resource**: Principal roles: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A role the principal has. **Resource**: Role MembershipSchemaModel: allOf: - "$ref": "#/components/schemas/SchemaModel" - type: object required: - id - createdAt - updatedAt - notificationMessage - project - principal - roles properties: id: "$ref": "#/components/schemas/SchemaPropertyModel" createdAt: "$ref": "#/components/schemas/SchemaPropertyModel" updatedAt: "$ref": "#/components/schemas/SchemaPropertyModel" notificationMessage: "$ref": "#/components/schemas/SchemaPropertyModel" project: "$ref": "#/components/schemas/SchemaPropertyModel" principal: "$ref": "#/components/schemas/SchemaPropertyModel" roles: "$ref": "#/components/schemas/SchemaPropertyModel" MembershipWriteModel: type: object required: - _links properties: _links: type: object properties: principal: allOf: - "$ref": "#/components/schemas/Link" - description: |- The principal that is to get a membership. **Resource**: Principal roles: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A role the principal has. **Resource**: Role project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project that is to get a membership. If no project is given, the principal's membership is supposed to be global. **Resource**: Project _meta: type: object properties: notificationMessage: allOf: - "$ref": "#/components/schemas/Formattable" - description: A customised notification message, which will overwrite the standard notification. sendNotification: type: boolean description: Set to false, if no notification should get sent. default: true NewsCreateModel: type: object properties: title: type: string description: The headline of the news readOnly: true summary: type: string description: A short summary readOnly: true description: allOf: - "$ref": "#/components/schemas/Formattable" - description: The main body of the news with all the details _links: type: object required: - project properties: project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project the news is situated in **Resource**: Project example: title: asperiores possimus nam doloribus ab summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus. Comparo crapula depopulo demonstro. description: format: markdown raw: "**Videlicet deserunt aequitas cognatus**. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui." _links: project: href: "/api/v3/projects/1" NewsModel: type: object properties: id: type: integer description: News' id readOnly: true exclusiveMinimum: 0 title: type: string description: The headline of the news readOnly: true summary: type: string description: A short summary readOnly: true description: allOf: - "$ref": "#/components/schemas/Formattable" - description: The main body of the news with all the details readOnly: true createdAt: type: string format: date-time description: The time the news was created at readOnly: true _links: type: object required: - self - project - author properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This news **Resource**: News readOnly: true project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace the news is situated in **Resource**: workspace author: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user having created the news **Resource**: User readOnly: true updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly perform edits on the news **Permission** manage news delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Delete the news **Permission** manage news example: _type: News id: 1 title: asperiores possimus nam doloribus ab summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus. Comparo crapula depopulo demonstro. description: format: markdown raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui. html: "

Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.

" createdAt: '2015-03-20T12:57:01.908Z' _links: self: href: "/api/v3/news/1" title: asperiores possimus nam doloribus ab project: href: "/api/v3/projects/1" title: A project author: href: "/api/v3/users/2" title: Peggie Feeney updateImmediately: href: api/v3/news/1 method: patch delete: href: api/v3/news/1 method: delete _embedded: project: _type: Workspace... author: _type: User... NonWorkingDayCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This non working days collection **Resource**: NonWorkingDayCollectionModel _embedded: type: object required: - elements properties: elements: type: array description: The array of non working days. Each day has a name and a date. items: "$ref": "#/components/schemas/NonWorkingDayModel" example: _type: Collection total: 2 count: 2 _links: self: href: /api/v3/non_working?filters=[{"interval":{"operator":"<>d","values":["2022-04-29","2022-12-24"]}}] _embedded: elements: - _type: NonWorkingDay date: '2022-12-24' name: Christmas Evening _links: self: href: "/api/v3/days/non_working/2022-04-24" weekday: href: "/api/v3/days/week/6" title: Saturday - _type: NonWorkingDay date: '2022-05-01' name: Labour day _links: self: href: "/api/v3/days/non_working/2022-05-01" weekday: href: "/api/v3/days/week/7" title: Sunday NonWorkingDayModel: type: object required: - _type - date - name properties: _type: type: string enum: - NonWorkingDay date: type: string format: date description: Date of the non-working day. name: type: string description: Descriptive name for the non-working day. _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This non-working day. **Resource**: NonWorkingDay example: _type: NonWorkingDay date: '2022-12-25' name: Christmas _links: self: href: "/api/v3/days/non_working/2022-12-25" title: Christmas NotificationCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This notification collection **Resource**: NotificationCollectionModel jumpTo: allOf: - "$ref": "#/components/schemas/Link" - description: |- The notification collection at another offset **Resource**: NotificationCollectionModel changeSize: allOf: - "$ref": "#/components/schemas/Link" - description: |- The notification collection with another size **Resource**: NotificationCollectionModel _embedded: type: object required: - elements - detailsSchemas properties: elements: type: array items: "$ref": "#/components/schemas/NotificationModel" detailsSchemas: type: array items: "$ref": "#/components/schemas/SchemaModel" NotificationModel: type: object properties: _type: type: string enum: - Notification id: type: integer description: Notification id minimum: 1 reason: type: string description: The reason for the notification enum: - assigned - commented - created - dateAlert - mentioned - prioritized - processed - responsible - subscribed - scheduled - watched readIAN: type: boolean description: Whether the notification is marked as read details: type: array items: oneOf: - "$ref": "#/components/schemas/ValuesPropertyModel" description: A list of objects including detailed information about the notification. createdAt: type: string format: date-time description: The time the notification was created at updatedAt: type: string format: date-time description: The time the notification was last updated _embedded: type: object required: - project - resource properties: actor: "$ref": "#/components/schemas/UserModel" project: oneOf: - "$ref": "#/components/schemas/ProjectModel" - "$ref": "#/components/schemas/ProgramModel" - "$ref": "#/components/schemas/PortfolioModel" activity: "$ref": "#/components/schemas/ActivityModel" resource: oneOf: - "$ref": "#/components/schemas/WorkPackageModel" _links: type: object required: - self - project - actor - activity - resource properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This notification **Resource**: Notification readIAN: allOf: - "$ref": "#/components/schemas/Link" - description: Request to mark the notification as read. Only available if the notification is currently unread. unreadIAN: allOf: - "$ref": "#/components/schemas/Link" - description: Request to mark the notification as unread. Only available if the notification is currently read. project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace the notification originated in **Resource**: Workspace actor: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user that caused the notification. This might be null in case no user triggered the notification. **Resource**: User resource: allOf: - "$ref": "#/components/schemas/Link" - description: |- The linked resource of the notification, if any. **Resource**: Polymorphic activity: allOf: - "$ref": "#/components/schemas/Link" - description: |- The journal activity, if the notification originated from a journal entry. This might be null in case no activity triggered the notification. **Resource**: Activity OAuthApplicationReadModel: type: object required: - id - _type - name - clientId - confidential - _links properties: id: type: integer minimum: 1 _type: type: string enum: - OAuthApplication name: type: string description: The name of the OAuth 2 application clientId: type: string description: OAuth 2 client id clientSecret: type: string description: OAuth 2 client secret. This is only returned when creating a new OAuth application. confidential: type: boolean description: true, if OAuth 2 credentials are confidential, false, if no secret is stored createdAt: type: string format: date-time description: The time the OAuth 2 Application was created at updatedAt: type: string format: date-time description: The time the OAuth 2 Application was last updated scopes: type: array description: An array of the scopes of the OAuth 2 Application items: type: string _links: type: object required: - self - owner - redirectUri properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This OAuth application **Resource**: OAuthApplication owner: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user that created the OAuth application. **Resource**: User integration: allOf: - "$ref": "#/components/schemas/Link" - description: |- The resource that integrates this OAuth application into itself. Currently, only `Storage` resources are able to create and maintain own OAuth application. **Resource**: Storage redirectUri: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A redirect URI of the OAuth application **Resource**: N/A example: id: 1337 _type: OAuthApplication name: Vader's secure OAuth app clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA confidential: true createdAt: '2022-12-07T12:56:42.626Z' updatedAt: '2022-12-07T12:56:42.626Z' scopes: - api_v3 _links: self: href: "/api/v3/oauth_applications/1337" owner: href: "/api/v3/users/13" title: Darth Vader integration: href: "/api/v3/storages/42" title: Death Star Cloud redirectUri: - href: https://death-star.cloud.tools/index.php/apps/integration_openproject/oauth-redirect OAuthClientCredentialsReadModel: type: object required: - id - _type - clientId - confidential - _links properties: id: type: integer minimum: 1 _type: type: string enum: - OAuthClientCredentials clientId: type: string description: OAuth 2 client id confidential: type: boolean description: true, if OAuth 2 credentials are confidential, false, if no secret is stored createdAt: type: string format: date-time description: The time the OAuth client credentials were created at updatedAt: type: string format: date-time description: The time the OAuth client credentials were last updated _links: type: object required: - self - integration properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This OAuth Client Credentials object **Resource**: OAuthClientCredentials integration: allOf: - "$ref": "#/components/schemas/Link" - description: |- The resource that integrates this OAuth client credentials. Currently, only `Storage` resources are able to contain OAuth client credentials. **Resource**: Storage example: id: 1337 _type: OAuthClientCredentials clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA confidential: true createdAt: '2022-12-07T12:56:42.836Z' updatedAt: '2022-12-07T12:56:42.836Z' _links: self: href: "/api/v3/oauth_client_credentials/1337" integration: href: "/api/v3/storages/42" title: Death Star Cloud OAuthClientCredentialsWriteModel: type: object required: - clientId - clientSecret properties: clientId: type: string description: OAuth 2 client id clientSecret: type: string description: OAuth 2 client secret example: clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA clientSecret: LSk52mn4jmtSYTgH0NzDj-u2z5LMpT8bsS0BouwJQQw OffsetPaginatedCollectionLinks: allOf: - "$ref": "#/components/schemas/CollectionLinks" - type: object required: - jumpTo - changeSize properties: jumpTo: allOf: - "$ref": "#/components/schemas/Link" - description: A templated link to jump to a given offset. changeSize: allOf: - "$ref": "#/components/schemas/Link" - description: A templated link to change the current page size. previousByOffset: allOf: - "$ref": "#/components/schemas/Link" - description: |- A link to the previous page of the collection. # Conditions - The collection is not on the first page. nextByOffset: allOf: - "$ref": "#/components/schemas/Link" - description: |- A link to the next page of the collection. # Conditions - The collection is not on the last page. OffsetPaginatedCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - pageSize - offset - _links properties: pageSize: type: integer description: |- The amount of elements per page. If not set by the request this value defaults to the server's system settings. minimum: 0 offset: type: integer description: The page offset indicating on which page the element collection starts. minimum: 0 _links: "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks" PaginatedCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - pageSize - offset properties: pageSize: type: integer description: Amount of elements that a response will hold. minimum: 0 offset: type: integer description: The page number that is requested from paginated collection. minimum: 1 _links: type: object required: - jumpTo - changeSize properties: jumpTo: allOf: - "$ref": "#/components/schemas/Link" - description: |- Templated link to another page offset. **Resource**: Collection changeSize: allOf: - "$ref": "#/components/schemas/Link" - description: |- Templated link for another page size. **Resource**: Collection PlaceholderUserCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This placeholder user collection **Resource**: Collection _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/PlaceholderUserModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/placeholder_users" _embedded: elements: - _abbreviated: PlaceholderUser resource shortened for brevity _type: PlaceholderUser id: 1337 - _abbreviated: PlaceholderUser resource shortened for brevity _type: PlaceholderUser id: 1338 PlaceholderUserCreateModel: type: object properties: name: type: string description: The new name of the placeholder user to be created. PlaceholderUserModel: allOf: - "$ref": "#/components/schemas/PrincipalModel" - type: object required: - _type properties: _type: type: string enum: - PlaceholderUser status: type: string description: |- The current activation status of the placeholder user. # Conditions - User has `manage_placeholder_user` permission globally _links: type: object required: - showUser properties: showUser: allOf: - "$ref": "#/components/schemas/Link" - description: A relative path to show the placeholder user in the web application. delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- An href to delete the placeholder user. # Conditions: - `manage_placeholder_user` updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- An href to update the placeholder user. # Conditions: - `manage_placeholder_user` **Resource**: PlaceholderUser Plain_TextModel: type: string format: html example: "

Hello world! This *is* plain text!

" PortfolioCollectionModel: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel" - type: object required: - _links - _embedded properties: _links: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks" - type: object properties: representations: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: A portfolio collection representation in a specific file format. _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/PortfolioModel" PortfolioModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - "$ref": "#/components/schemas/CustomCommentProperties" - type: object properties: _type: type: string enum: - Portfolio id: type: integer description: Portfolios' id minimum: 1 identifier: type: string name: type: string active: type: boolean description: Indicates whether the portfolio is currently active or already archived favorited: type: boolean description: Indicates whether the portfolio is favorited by the current user statusExplanation: allOf: - "$ref": "#/components/schemas/Formattable" - description: A text detailing and explaining why the portfolio has the reported status public: type: boolean description: Indicates whether the portfolio is accessible for everybody description: "$ref": "#/components/schemas/Formattable" createdAt: type: string format: date-time description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. updatedAt: type: string format: date-time description: Time of the most recent change to the portfolio _links: type: object required: - self - categories properties: update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in updating this portfolio # Conditions **Permission**: edit workspace updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly update this portfolio # Conditions **Permission**: edit workspace delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Delete this portfolio # Conditions **Permission**: admin favor: allOf: - "$ref": "#/components/schemas/Link" - description: |- Mark this portfolio as favorited by the current user # Conditions Only present if the portfolio is not yet favorited Permission**: none but login is required disfavor: allOf: - "$ref": "#/components/schemas/Link" - description: |- Mark this portfolio as not favorited by the current user # Conditions Only present if the portfolio is favorited by the current user Permission**: none but login is required createWorkPackage: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in preparing and creating a work package # Conditions **Permission**: add work packages createWorkPackageImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly creates a work package in the portfolio # Conditions **Permission**: add work packages self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This portfolio **Resource**: Portfolio categories: allOf: - "$ref": "#/components/schemas/Link" - description: |- Categories available in this portfolio **Resource**: Collection types: allOf: - "$ref": "#/components/schemas/Link" - description: |- Types available in this portfolio **Resource**: Collection # Conditions **Permission**: view work packages or manage types versions: allOf: - "$ref": "#/components/schemas/Link" - description: |- Versions available in this portfolio **Resource**: Collection # Conditions **Permission**: view work packages or manage versions memberships: allOf: - "$ref": "#/components/schemas/Link" - description: |- Memberships in the portfolio **Resource**: Collection # Conditions **Permission**: view members workPackages: allOf: - "$ref": "#/components/schemas/Link" - description: |- Work Packages of this portfolio **Resource**: Collection parent: allOf: - "$ref": "#/components/schemas/Link" - description: |- Parent of the portfolio **Resource**: Portfolio # Conditions **Permission** edit workspace status: allOf: - "$ref": "#/components/schemas/Link" - description: |- Denotes the status of the portfolio, so whether the portfolio is on track, at risk or is having trouble. **Resource**: ProjectStatus # Conditions **Permission** edit workspace storages: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- The link to a storage that is active for this portfolio. **Resource**: Storage # Conditions **Permission**: view_file_links projectStorages: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project storage collection of this portfolio. **Resource**: Collection # Conditions **Permission**: view_file_links ancestors: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A collection of links to the ancestor portfolios. **Resource**: Portfolio PostModel: type: object required: - subject properties: id: type: integer description: Identifier of this post readOnly: true exclusiveMinimum: 0 subject: type: string description: The post's subject _links: type: object properties: addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Attach a file to the post # Conditions **Permission**: edit messages readOnly: true example: _type: Post id: 1 subject: A post with a subject _embedded: project: _type: Project... _links: self: href: "/api/v3/posts/1" attachments: href: "/api/v3/posts/1/attachments" addAttachment: href: "/api/v3/posts/1/attachments" method: post project: href: "/api/v3/projects/1" title: A project with a title PrincipalCollectionModel: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel" - type: object required: - _embedded properties: _embedded: type: object required: - elements properties: elements: type: array items: anyOf: - "$ref": "#/components/schemas/UserModel" - "$ref": "#/components/schemas/PlaceholderUserModel" - "$ref": "#/components/schemas/GroupModel" example: _type: Collection total: 3 count: 3 _links: self: href: "/api/v3/principals" _embedded: elements: - _abbreviated: User resource shortened for brevity _type: User id: 1337 - _abbreviated: Group resource shortened for brevity _type: Group id: 1338 - _abbreviated: PlaceholderUser resource shortened for brevity _type: PlaceholderUser id: 1339 PrincipalModel: type: object required: - _type - id - name - _links properties: _type: type: string enum: - User - Group - PlaceholderUser id: type: integer description: The principal's unique identifier. minimum: 1 name: type: string description: The principal's display name, layout depends on instance settings. createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the principal _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This principal resource. **Resource**: User|Group|PlaceholderUser memberships: allOf: - "$ref": "#/components/schemas/Link" - description: |- An href to the collection of the principal's memberships. # Conditions: - user has permission `view_members` or `manage_members` in any project **Resource**: Collection PriorityCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This priority collection **Resource**: PriorityCollectionModel readOnly: true _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/PriorityModel" PriorityModel: type: object properties: id: type: integer description: Priority id readOnly: true exclusiveMinimum: 0 name: type: string description: Priority name readOnly: true minLength: 1 position: type: integer description: Sort index of the priority readOnly: true exclusiveMinimum: 0 isDefault: type: boolean description: Indicates whether this is the default value readOnly: true isActive: type: boolean description: Indicates whether the priority is available _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This priority **Resource**: Priority readOnly: true example: _type: Priority _links: self: href: "/api/v3/priorities/1" title: Low id: 1 name: Low position: 1 isDefault: false isActive: true ProgramCollectionModel: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel" - type: object required: - _links - _embedded properties: _links: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks" - type: object properties: representations: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: A program collection representation in a specific file format. _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/ProgramModel" ProgramModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - "$ref": "#/components/schemas/CustomCommentProperties" - type: object properties: _type: type: string enum: - Program id: type: integer description: Programs' id minimum: 1 identifier: type: string name: type: string active: type: boolean description: Indicates whether the program is currently active or already archived favorited: type: boolean description: Indicates whether the program is favorited by the current user statusExplanation: allOf: - "$ref": "#/components/schemas/Formattable" - description: A text detailing and explaining why the program has the reported status public: type: boolean description: Indicates whether the program is accessible for everybody description: "$ref": "#/components/schemas/Formattable" createdAt: type: string format: date-time description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. updatedAt: type: string format: date-time description: Time of the most recent change to the program _links: type: object required: - self - categories properties: update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in updating this program # Conditions **Permission**: edit workspace updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly update this program # Conditions **Permission**: edit workspace delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Delete this program # Conditions **Permission**: admin favor: allOf: - "$ref": "#/components/schemas/Link" - description: |- Mark this program as favorited by the current user # Conditions Only present if the program is not yet favorited Permission**: none but login is required disfavor: allOf: - "$ref": "#/components/schemas/Link" - description: |- Mark this program as not favorited by the current user # Conditions Only present if the program is favorited by the current user Permission**: none but login is required createWorkPackage: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in preparing and creating a work package # Conditions **Permission**: add work packages createWorkPackageImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly creates a work package in the program # Conditions **Permission**: add work packages self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This program **Resource**: Program categories: allOf: - "$ref": "#/components/schemas/Link" - description: |- Categories available in this program **Resource**: Collection types: allOf: - "$ref": "#/components/schemas/Link" - description: |- Types available in this program **Resource**: Collection # Conditions **Permission**: view work packages or manage types versions: allOf: - "$ref": "#/components/schemas/Link" - description: |- Versions available in this program **Resource**: Collection # Conditions **Permission**: view work packages or manage versions memberships: allOf: - "$ref": "#/components/schemas/Link" - description: |- Memberships in the program **Resource**: Collection # Conditions **Permission**: view members workPackages: allOf: - "$ref": "#/components/schemas/Link" - description: |- Work Packages of this program **Resource**: Collection parent: allOf: - "$ref": "#/components/schemas/Link" - description: |- Parent of the program **Resource**: Program # Conditions **Permission** edit workspace status: allOf: - "$ref": "#/components/schemas/Link" - description: |- Denotes the status of the program, so whether the program is on track, at risk or is having trouble. **Resource**: ProjectStatus # Conditions **Permission** edit workspace storages: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- The link to a storage that is active for this program. **Resource**: Storage # Conditions **Permission**: view_file_links projectStorages: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project storage collection of this program. **Resource**: Collection # Conditions **Permission**: view_file_links ancestors: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A collection of links to the ancestor workspace. **Resource**: Workspace ProjectCollectionModel: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel" - type: object required: - _links - _embedded properties: _links: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks" - type: object properties: representations: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: A project collection representation in a specific file format. _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/ProjectModel" ProjectModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - "$ref": "#/components/schemas/CustomCommentProperties" - type: object properties: _type: type: string enum: - Project id: type: integer description: Projects' id minimum: 1 identifier: type: string name: type: string active: type: boolean description: Indicates whether the project is currently active or already archived favorited: type: boolean description: Indicates whether the project is favorited by the current user statusExplanation: allOf: - "$ref": "#/components/schemas/Formattable" - description: A text detailing and explaining why the project has the reported status public: type: boolean description: Indicates whether the project is accessible for everybody description: "$ref": "#/components/schemas/Formattable" createdAt: type: string format: date-time description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. updatedAt: type: string format: date-time description: Time of the most recent change to the project _links: type: object required: - self - categories properties: update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in updating this project # Conditions **Permission**: edit workspace updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly update this project # Conditions **Permission**: edit workspace delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Delete this project # Conditions **Permission**: admin favor: allOf: - "$ref": "#/components/schemas/Link" - description: |- Mark this project as favorited by the current user # Conditions Only present if the project is not yet favorited Permission**: none but login is required disfavor: allOf: - "$ref": "#/components/schemas/Link" - description: |- Mark this project as not favorited by the current user # Conditions Only present if the project is favorited by the current user Permission**: none but login is required createWorkPackage: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in preparing and creating a work package # Conditions **Permission**: add work packages createWorkPackageImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly creates a work package in the project # Conditions **Permission**: add work packages self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This project **Resource**: Project categories: allOf: - "$ref": "#/components/schemas/Link" - description: |- Categories available in this project **Resource**: Collection types: allOf: - "$ref": "#/components/schemas/Link" - description: |- Types available in this project **Resource**: Collection # Conditions **Permission**: view work packages or manage types versions: allOf: - "$ref": "#/components/schemas/Link" - description: |- Versions available in this project **Resource**: Collection # Conditions **Permission**: view work packages or manage versions memberships: allOf: - "$ref": "#/components/schemas/Link" - description: |- Memberships in the project **Resource**: Collection # Conditions **Permission**: view members workPackages: allOf: - "$ref": "#/components/schemas/Link" - description: |- Work Packages of this project **Resource**: Collection parent: allOf: - "$ref": "#/components/schemas/Link" - description: |- Parent of the project **Resource**: Workspace # Conditions **Permission** edit workspace status: allOf: - "$ref": "#/components/schemas/Link" - description: |- Denotes the status of the project, so whether the project is on track, at risk or is having trouble. **Resource**: ProjectStatus # Conditions **Permission** edit workspace storages: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- The link to a storage that is active for this project. **Resource**: Storage # Conditions **Permission**: view_file_links projectStorages: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project storage collection of this project. **Resource**: Collection # Conditions **Permission**: view_file_links ancestors: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A collection of links to the ancestor workspaces. **Resource**: Workspace ProjectPhaseModel: type: object required: - _type - id - name - active - createdAt - updatedAt properties: _type: type: string enum: - ProjectPhase id: type: integer description: The project phase's id minimum: 1 name: type: string active: type: boolean createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the project phase _links: type: object required: - self - definition - project properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This project phase. **Resource**: ProjectPhase definition: allOf: - "$ref": "#/components/schemas/Link" - description: |- The definition this phase relies on. **Resource**: ProjectPhaseDefinition project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project resource, that is the container of this phase. **Resource**: Project example: _type: ProjectPhase id: 1337 name: Initiating active: true createdAt: '2023-01-20T14:30:00.368Z' updatedAt: '2023-05-23T11:57:48.618Z' _links: self: href: "/api/v3/project_phases/23" definition: title: Initiating href: "/api/v3/project_definitions/11" project: title: Death Star 3.0 href: "/api/v3/projects/11" ProjectPhaseDefinitionModel: type: object required: - _type - id - name - startGate - startGateName - finishGate - finishGateName - createdAt - updatedAt properties: _type: type: string enum: - ProjectPhaseDefinition id: type: integer description: The project phase definition's id minimum: 1 name: type: string startGate: type: boolean startGateName: type: - string - 'null' finishGate: type: boolean finishGateName: type: - string - 'null' createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the project phase definition _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This project phase definition. **Resource**: ProjectPhaseDefinition example: _type: ProjectPhaseDefinition id: 1337 name: Initiating startGate: true startGateName: Before Initiating finishGate: true finishGateName: createdAt: '2023-01-20T14:30:00.368Z' updatedAt: '2023-05-23T11:57:48.618Z' _links: self: href: "/api/v3/project_phase_definitions/23" ProjectPhaseDefinitionCollectionModel: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This file links collection **Resource**: ProjectPhaseDefinitionCollectionModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/ProjectPhaseDefinitionModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/project_phase_definitions" _embedded: elements: - id: 14 name: Initiating _type: ProjectPhaseDefinition _abbreviated: project phase definition resource shortened for brevity - id: 15 name: Executing _type: ProjectPhaseDefinition _abbreviated: project phase definition resource shortened for brevity ProjectStorageCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This file links collection **Resource**: ProjectStorageCollectionModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/ProjectStorageModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/project_storages?filters=%5B%7B%22storage%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2281%22%5D%7D%7D%5D" _embedded: elements: - id: 1337 _type: ProjectStorage _abbreviated: project storage resource shortened for brevity - id: 1338 _type: ProjectStorage _abbreviated: File Link resource shortened for brevity ProjectStorageModel: type: object required: - _type - id - projectFolderMode - createdAt - updatedAt properties: _type: type: string enum: - ProjectStorage id: type: integer description: The project storage's id minimum: 1 projectFolderMode: type: string enum: - inactive - manual createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the project storage _links: type: object required: - self - creator - storage - project properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This project storage. **Resource**: ProjectStorage creator: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user who created the project storage. **Resource**: User storage: allOf: - "$ref": "#/components/schemas/Link" - description: |- The storage resource, that is linked to a project with this project storage. **Resource**: Storage project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project resource, that is linked to a storage with this project storage. **Resource**: Project projectFolder: allOf: - "$ref": "#/components/schemas/Link" - description: |- The directory on the storage that is used as a project folder. **Resource**: StorageFile # Conditions Only provided, if the `projectFolderMode` is `manual` or `automatic`. open: allOf: - "$ref": "#/components/schemas/Link" - description: |- A link to OpenProject strorage. # Conditions If the storage has not been configured(oauth client is missing, for instance), then the link is null. openWithConnectionEnsured: allOf: - "$ref": "#/components/schemas/Link" - description: |- A link to OpenProject storage with making sure user has access to it. **Deprecated:** Use `open` instead, which returns a link that will ensure the user's connection to the storage as well, but properly works for all kinds of storage configurations. example: _type: ProjectStorage id: 1337 projectFolderMode: manual createdAt: '2023-01-20T14:30:00.368Z' updatedAt: '2023-05-23T11:57:48.618Z' _links: self: href: "/api/v3/project_storages/23" projectFolder: href: "/api/v3/storages/81/files/30" creator: title: Darth Vader href: "/api/v3/users/3" project: title: Death Star 3.0 href: "/api/v3/projects/11" storage: title: Palpatine's Data Vault href: "/api/v3/storages/81" open: href: "/api/v3/storages/81/open" openWithConnectionEnsured: href: "/api/v3/storages/81/open" QueriesModel: type: object example: _links: self: href: "/api/v3/queries" total: 1 count: 1 _type: Collection _embedded: elements: - _type: Query id: 9 name: fdsfdsfdsf createdAt: '2015-03-20T12:56:56.858Z' updatedAt: '2015-05-20T18:16:53.887Z' filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] - _type: DueDateQueryFilter name: Finish date values: - '1' _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post _links: self: href: "/api/v3/queries/9" title: fdsfdsfdsf results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: "/api/v3/projects/3" title: copy QueryModel: type: object required: - createdAt - updatedAt properties: id: type: integer description: Query id readOnly: true exclusiveMinimum: 0 name: type: string description: Query name readOnly: true filters: type: array description: A set of QueryFilters which will be applied to the work packages to determine the resulting work packages readOnly: false items: "$ref": "#/components/schemas/Query_Filter_Instance_Model" sums: type: boolean description: Should sums (of supported properties) be shown? readOnly: true timelineVisible: type: boolean description: Should the timeline mode be shown? readOnly: true deprecated: true timelineLabels: type: array description: Which labels are shown in the timeline, empty when default readOnly: true deprecated: true items: type: string timelineZoomLevel: type: string description: Which zoom level should the timeline be rendered in? readOnly: true deprecated: true timestamps: type: array description: Timestamps to filter by when showing changed attributes on work packages. readOnly: false highlightingMode: type: string description: Which highlighting mode should the table have? readOnly: true deprecated: true showHierarchies: type: boolean description: Should the hierarchy mode be enabled? readOnly: true deprecated: true hidden: type: boolean description: Should the query be hidden from the query list? readOnly: true deprecated: true public: type: boolean description: Can users besides the owner see the query? readOnly: true starred: type: boolean description: Should the query be highlighted to the user? readOnly: true createdAt: type: string format: date-time description: Time of creation readOnly: true updatedAt: type: string format: date-time description: Time of the most recent change to the query readOnly: true _links: type: object properties: star: allOf: - "$ref": "#/components/schemas/Link" - description: |- Elevates the query to the status of 'starred' # Conditions **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is not yet starred readOnly: true unstar: allOf: - "$ref": "#/components/schemas/Link" - description: |- Removes the 'starred' status # Conditions **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is starred readOnly: true update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Use the Form based process to verify the query before persisting # Conditions **Permission**: view work packages readOnly: true updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Persist the query without using a Form based process for guidance # Conditions **Permission**: save queries for own queries, manage public queries for public queries; readOnly: true Query_ColumnModel: type: object required: - id - name properties: id: type: string description: Query column id readOnly: true name: type: string description: Query column name example: _type: QueryColumn::Property id: priority name: Priority _links: self: href: "/api/v3/queries/columns/priority" title: Priority Query_Create_Form: type: object properties: name: type: string description: Query name. example: name: New query name Query_FilterModel: type: object required: - id properties: id: type: string description: QueryFilter id example: _type: QueryFilter id: status _links: self: href: "/api/v3/queries/filters/status" title: Status Query_Filter_Instance_Model: type: object required: - _links - _type - name properties: _links: type: object required: - filter - schema properties: filter: "$ref": "#/components/schemas/Link" schema: "$ref": "#/components/schemas/Link" operator: "$ref": "#/components/schemas/Link" _type: type: string name: type: string Query_Filter_Instance_SchemaModel: type: object required: - name - _links properties: name: type: string description: Describes the name attribute readOnly: true _links: type: object required: - self - filter properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This QueryFilterInstanceSchema (same as for schema) **Resource**: QueryFilterInstanceSchema readOnly: true filter: allOf: - "$ref": "#/components/schemas/Link" - description: |- The filter for which this schema is specific **Resource**: Filter readOnly: true example: _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} name: A name _links: self: href: "/api/v3/queries/filter_instance_schemas/author" filter: href: "/api/v3/queries/filters/author" title: Author Query_Filter_Instance_SchemasModel: type: object example: _type: Collection total: 2 count: 2 _embedded: elements: - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/assignee" filter: href: "/api/v3/queries/filters/assignee" title: Assignee - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/author" filter: href: "/api/v3/queries/filters/author" title: Author _links: self: href: "/api/v3/queries/filter_instance_schemas" Query_Filter_Instance_Schemas_For_WorkspaceModel: type: object example: _type: Collection total: 2 count: 2 _embedded: elements: - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/assignee" filter: href: "/api/v3/queries/filters/assignee" title: Assignee - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/author" filter: href: "/api/v3/queries/filters/author" title: Author _links: self: href: "/api/v3/workspaces/42/queries/filter_instance_schemas" Query_OperatorModel: type: object required: - id - name properties: id: type: string description: Query operator id readOnly: true name: type: string description: Query operator name example: _type: QueryOperator id: "!" name: is not _links: self: href: "/api/v3/queries/operators/!" title: is not Query_Sort_ByModel: type: object required: - id - name properties: id: type: string description: QuerySortBy id readOnly: true name: type: string description: QuerySortBy name example: _type: QuerySortBy id: status-asc name: Status (Ascending) _links: self: href: "/api/v3/queries/sort_bys/status-asc" title: Status (Ascending) column: href: "/api/v3/queries/columns/status" title: Status direction: href: urn:openproject-org:api:v3:queries:directions:asc title: Ascending Query_Update_Form: type: object properties: name: type: string description: Query name. example: name: Updated query name RelationCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This relation collection **Resource**: RelationCollectionReadModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/RelationReadModel" RelationReadModel: type: object properties: _type: type: string enum: - Relation id: type: integer description: Relation ID name: type: string description: The internationalised name of this type of relation type: type: string description: The relation type. enum: - relates - duplicates - duplicated - blocks - blocked - precedes - follows - includes - partof - requires - required reverseType: type: string description: The type of relation from the perspective of the related work package. enum: - relates - duplicates - duplicated - blocks - blocked - precedes - follows - includes - partof - requires - required description: type: - string - 'null' description: A descriptive text for the relation. lag: type: - integer - 'null' description: The lag in days between closing of `from` and start of `to` minimum: 0 _embedded: type: object properties: from: "$ref": "#/components/schemas/WorkPackageModel" to: "$ref": "#/components/schemas/WorkPackageModel" _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This relation **Resource**: Relation # Conditions **Permission**: view work packages updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Updates the relation between two work packages # Conditions **Permission**: manage work package relations delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Destroys the relation between the two work packages # Conditions **Permission**: manage work package relations from: allOf: - "$ref": "#/components/schemas/Link" - description: |- The emanating work package **Resource**: WorkPackage # Conditions **Permission**: view work packages to: allOf: - "$ref": "#/components/schemas/Link" - description: |- The work package the relation ends in **Resource**: WorkPackage # Conditions **Permission**: view work packages RelationWriteModel: type: object required: - _links - type properties: type: type: string description: The relation type. enum: - relates - duplicates - duplicated - blocks - blocked - precedes - follows - includes - partof - requires - required description: type: - string - 'null' description: A descriptive text for the relation. lag: type: - integer - 'null' description: The lag in days between closing of `from` and start of `to` minimum: 0 _links: type: object properties: to: allOf: - "$ref": "#/components/schemas/Link" - description: |- The work package the relation ends in. Only available on relation creation, not on update. **Resource**: WorkPackage # Conditions **Permission**: view work packages ReminderModel: type: object properties: id: type: integer description: Reminder id readOnly: true minimum: 1 note: type: string description: The note of the reminder remindAt: type: string format: date-time description: The date and time when the reminder is due _links: required: - creator - remindable type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This reminder **Resource**: Reminder creator: allOf: - "$ref": "#/components/schemas/Link" - description: |- The person that created the reminder **Resource**: User remindable: allOf: - "$ref": "#/components/schemas/Link" - description: |- The resource that the reminder is associated with **Resource**: WorkPackage RevisionModel: type: object required: - identifier - formattedIdentifier - authorName - message - createdAt properties: id: type: integer description: Revision's id, assigned by OpenProject readOnly: true exclusiveMinimum: 0 identifier: type: string description: The raw SCM identifier of the revision (e.g. full SHA hash) readOnly: true formattedIdentifier: type: string description: The SCM identifier of the revision, formatted (e.g. shortened unambiguous SHA hash). May be identical to identifier in many cases readOnly: true authorName: type: string description: The name of the author that committed this revision. Note that this name is retrieved from the repository and does not identify a user in OpenProject. readOnly: true message: allOf: - "$ref": "#/components/schemas/Formattable" - description: The commit message of the revision readOnly: true createdAt: type: string format: date-time description: The time this revision was committed to the repository _links: type: object required: - self - project - showRevision properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This revision **Resource**: Revision readOnly: true project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project to which the revision belongs **Resource**: Project readOnly: true author: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user that added this revision, if the authorName was mapped to a user in OpenProject **Resource**: User readOnly: true showRevision: allOf: - "$ref": "#/components/schemas/Link" - description: |- A URL to the repository view (outside APIv3) showing this revision **Resource**: - readOnly: true example: _type: Revision _links: self: href: "/api/v3/revisions/1" project: href: "/api/v3/projects/1" author: href: "/api/v3/users/1" showRevision: href: "/projects/identifier/repository/revision/11f4b07" id: 1 identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6 formattedIdentifier: 11f4b07 authorName: Some Developer message: format: plain raw: |- This revision provides new features An elaborate description html: "

This revision provides new features

An elaborate description

" createdAt: '2015-07-21T13:36:59.859Z' RevisionsModel: type: object example: _links: self: href: "/api/v3/work_packages/42/revisions" total: 2 count: 2 _type: Collection _embedded: elements: - _type: Revision _links: self: href: "/api/v3/revisions/13" project: href: "/api/v3/projects/1" title: A Test Project author: href: "/api/v3/users/1" title: John Sheppard - j.sheppard showRevision: href: "/projects/identifier/repository/revision/11f4b07" id: 13 identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6 formattedIdentifier: 11f4b07 authorName: John Sheppard message: format: plain raw: |- This revision provides new features An elaborate description html: "

This revision provides new features

An elaborate description

" createdAt: '2015-07-21T13:36:59.201Z' - _type: Revision _links: self: href: "/api/v3/revisions/14" project: href: "/api/v3/projects/1" title: A Test Project author: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard showRevision: href: "/projects/identifier/repository/revision/029ed72a" id: 13 identifier: '029ed72a3b7b7c4ab332b1f6eaa6576e7c946059' formattedIdentifier: '029ed72a' authorName: j1msheppard message: format: plain raw: |- This revision fixes some stuff More information here html: "

This revision fixes some stuff

More information here

" createdAt: '2015-06-30T08:47:00.548Z' RoleModel: type: object required: - name properties: _type: type: string enum: - Role id: type: integer description: Role id readOnly: true minimum: 1 name: type: string description: Role name _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This role **Resource**: Role readOnly: true example: _type: Role id: 3 name: Manager _links: self: href: "/api/v3/roles/3" title: Manager RolesModel: type: object example: _type: Collection total: 5 count: 5 _embedded: elements: - _type: Role id: 3 name: Manager _links: self: href: "/api/v3/roles/3" title: Manager - _type: Role id: 2 name: Anonymous _links: self: href: "/api/v3/roles/2" title: Anonymous - _type: Role id: 5 name: Reader _links: self: href: "/api/v3/roles/5" title: Reader - _type: Role id: 4 name: Member _links: self: href: "/api/v3/roles/4" title: Member - _type: Role id: 1 name: Non member _links: self: href: "/api/v3/roles/1" title: Non member _links: self: href: "/api/v3/roles" RootModel: type: object required: - _type - instanceName - _links properties: _type: type: string enum: - Root instanceName: type: string description: The name of the OpenProject instance coreVersion: type: string description: |- The OpenProject core version number for the instance # Conditions **Permission** requires admin privileges _links: type: object required: - self - configuration - memberships - priorities - relations - statuses - time_entries - types - user - userPreferences - workPackages properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This root information object. **Resource**: Root configuration: allOf: - "$ref": "#/components/schemas/Link" - description: |- The configuration resource. **Resource**: Configuration memberships: allOf: - "$ref": "#/components/schemas/Link" - description: |- The collection of memberships. **Resource**: Collection priorities: allOf: - "$ref": "#/components/schemas/Link" - description: |- The collection of priorities. **Resource**: Collection relations: allOf: - "$ref": "#/components/schemas/Link" - description: |- The collection of relations. **Resource**: Collection statuses: allOf: - "$ref": "#/components/schemas/Link" - description: |- The collection of statuses. **Resource**: Collection time_entries: allOf: - "$ref": "#/components/schemas/Link" - description: |- The collection of time entries. **Resource**: Collection types: allOf: - "$ref": "#/components/schemas/Link" - description: |- The collection of types. **Resource**: Collection user: allOf: - "$ref": "#/components/schemas/Link" - description: |- The current user resource. **Resource**: User userPreferences: allOf: - "$ref": "#/components/schemas/Link" - description: |- The current user preferences resource. **Resource**: UserPreferences workPackages: allOf: - "$ref": "#/components/schemas/Link" - description: |- The work package collection. **Resource**: Collection example: _type: Root instanceName: OpenProject coreVersion: 12.1.0 _links: self: href: "/api/v3" configuration: href: "/api/v3/configuration" memberships: href: "/api/v3/memberships" priorities: href: "/api/v3/priorities" relations: href: "/api/v3/relations" statuses: href: "/api/v3/statuses" time_entries: href: "/api/v3/time_entries" types: href: "/api/v3/types" user: href: "/api/v3/users/3" title: Anakin Skywalker userPreferences: href: "/api/v3/users/3/preferences" workPackages: href: "/api/v3/work_packages" SchemaModel: type: object required: - _type - _links properties: _type: type: string enum: - Schema _dependencies: type: array description: A list of dependencies between one property's value and another property items: type: string _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This schema **Resource**: Schema SchemaPropertyModel: type: object required: - type - name - required - hasDefault - writable properties: type: type: string description: The resource type for this property. name: type: string description: The name of the property. required: type: boolean description: Indicates, if the property is required for submitting a request of this schema. hasDefault: type: boolean description: Indicates, if the property has a default. writable: type: boolean description: Indicates, if the property is writable when sending a request of this schema. options: type: object description: Additional options for the property. location: type: string description: Defines the json path where the property is located in the payload. default: '' placeholder: type: string description: A placeholder for the property to display if the property has no value. _links: type: object description: Useful links for this property (e.g. an endpoint to fetch allowed values) Schema_For_Global_QueriesModel: type: object example: _type: Schema _dependencies: [] id: type: Integer name: ID required: true hasDefault: false writable: false name: type: String name: Name required: true hasDefault: false writable: true minLength: 1 maxLength: 255 createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false user: type: User name: User required: true hasDefault: true writable: false project: type: Project name: Project required: false hasDefault: false writable: true location: _links _links: {} public: type: Boolean name: Public required: false hasDefault: true writable: true sums: type: Boolean name: Sums required: false hasDefault: true writable: true timelineVisible: type: Boolean name: Timeline visible required: false hasDefault: true writable: true deprecated: true timelineZoomLevel: type: String name: Timeline zoom level required: false hasDefault: true writable: true deprecated: true timelineLabels: type: QueryTimelineLabels name: Timeline labels required: false hasDefault: true writable: true deprecated: true timestamps: type: "[]Timestamp" name: Timestamps required: false hasDefault: true writable: true highlightingMode: type: String name: Highlighting mode required: false hasDefault: true writable: true deprecated: true highlightedAttributes: type: "[]QueryColumn" name: Highlighted attributes required: false hasDefault: true writable: true location: _links deprecated: true showHierarchies: type: Boolean name: Show hierarchies required: false hasDefault: true writable: true deprecated: true starred: type: Boolean name: Starred required: false hasDefault: true writable: true columns: type: "[]QueryColumn" name: Columns required: false hasDefault: true writable: true location: _links _links: {} filters: type: "[]QueryFilterInstance" name: Filters required: false writable: true hasDefault: true location: _links _links: allowedValuesSchemas: href: "/api/v3/queries/filter_instance_schemas" groupBy: type: "[]QueryGroupBy" name: Group results by required: false hasDefault: false writable: true _links: {} sortBy: type: "[]QuerySortBy" name: Sort by required: false hasDefault: true writable: true _links: {} results: type: WorkPackageCollection name: Results required: false hasDefault: false writable: false _embedded: filtersSchemas: _type: Collection total: 20 count: 20 _embedded: elements: - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/assignee" filter: href: "/api/v3/queries/filters/assignee" title: Assignee - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/author" filter: href: "/api/v3/queries/filters/author" title: Author _links: self: href: "/api/v3/queries/filter_instance_schemas" _links: self: href: "/api/v3/queries/schema" Schema_For_Workspace_QueriesModel: type: object example: _type: Schema _dependencies: [] id: type: Integer name: ID required: true hasDefault: false writable: false name: type: String name: Name required: true hasDefault: false writable: true minLength: 1 maxLength: 255 createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false user: type: User name: User required: true hasDefault: true writable: false project: type: Workspace name: Project required: false hasDefault: false writable: true _links: {} public: type: Boolean name: Public required: false hasDefault: true writable: true sums: type: Boolean name: Sums required: false hasDefault: true writable: true timelineVisible: type: Boolean name: Timeline visible required: false hasDefault: true writable: true timelineZoomLevel: type: String name: Timeline zoom level required: false hasDefault: true writable: true showHierarchies: type: Boolean name: Show hierarchies required: false hasDefault: true writable: true starred: type: Boolean name: Starred required: false hasDefault: true writable: true columns: type: "[]QueryColumn" name: Columns required: false hasDefault: true writable: true _links: {} filters: type: "[]QueryFilterInstance" name: Filters required: false writable: true hasDefault: true _links: allowedValuesSchemas: href: "/api/v3/workspaces/42/queries/filter_instance_schemas" groupBy: type: "[]QueryGroupBy" name: Group results by required: false hasDefault: false writable: true _links: {} sortBy: type: "[]QuerySortBy" name: Sort by required: false hasDefault: true writable: true _links: {} results: type: WorkPackageCollection name: Results required: false hasDefault: false writable: false _embedded: filtersSchemas: _type: Collection total: 20 count: 20 _embedded: elements: - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!*": {} "/api/v3/queries/operators/*": {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/assignee" filter: href: "/api/v3/queries/filters/assignee" title: Assignee - _type: QueryFilterInstanceSchema _dependencies: - _type: SchemaDependency 'on': operator dependencies: "/api/v3/queries/operators/=": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} "/api/v3/queries/operators/!": values: type: "[]User" name: Values required: true hasDefault: false writable: true _links: {} name: type: String name: Name required: true hasDefault: true writable: false filter: type: QueryFilter name: Filter required: true hasDefault: false writable: true _links: {} _links: self: href: "/api/v3/queries/filter_instance_schemas/author" filter: href: "/api/v3/queries/filters/author" title: Author _links: self: href: "/api/v3/workspaces/42/queries/filter_instance_schemas" _links: self: href: "/api/v3/workspaces/42/queries/schema" SprintCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This sprint collection **Resource**: Collection _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/SprintModel" SprintModel: type: object required: - id - _type - name - startDate - finishDate - createdAt - updatedAt properties: id: type: integer description: Sprint id minimum: 1 _type: type: string enum: - Sprint name: type: string description: Sprint name description: "$ref": "#/components/schemas/Formattable" startDate: type: - string - 'null' format: date finishDate: type: - string - 'null' format: date createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the sprint _links: type: object required: - self - definingWorkspace properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This sprint **Resource**: Sprint definingWorkspace: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace to which the sprint belongs. **Resource**: Workspace status: allOf: - "$ref": "#/components/schemas/Link" - description: |- The current status of the sprint which can be any of: - *"urn:openproject-org:api:v3:sprints:status:in_planning"*: The sprint hasn't started yet, it is planned. - *"urn:openproject-org:api:v3:sprints:status:active"*: The sprint is currently active. - *"urn:openproject-org:api:v3:sprints:status:completed"*: The sprint has finished. **Resource**: N/A Star_QueryModel: type: object example: _type: Query id: 9 name: fdsfdsfdsf createdAt: '2015-03-20T12:56:56.085Z' updatedAt: '2015-05-20T18:16:53.619Z' filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] - _type: DueDateQueryFilter name: Finish date values: - '1' _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post _links: self: href: "/api/v3/queries/9" title: fdsfdsfdsf results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: "/api/v3/projects/3" title: copy StatusCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _embedded properties: _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/StatusModel" StatusModel: type: object properties: _type: type: string enum: - Status id: type: integer description: Status id minimum: 1 name: type: string description: Status name isClosed: type: boolean description: Indicates, whether work package of this status are considered closed color: type: - string - 'null' format: hex-code description: The color of the status isDefault: type: boolean description: True, if this status is the default status for new work packages isReadonly: type: boolean description: Indicates, whether work package of this status are readonly excludedFromTotals: type: boolean description: |- Indicates, whether work package of this status are excluded from totals of `Work`, `Remaining work`, and `% Complete` in a hierarchy. defaultDoneRatio: type: integer description: The percentageDone being applied when changing to this status minimum: 0 maximum: 100 position: type: integer description: Sort index of the status _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This status **Resource**: Status StorageCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This storage collection **Resource**: StorageCollectionReadModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/StorageReadModel" StorageFileModel: allOf: - "$ref": "#/components/schemas/FileLinkOriginDataModel" - type: object required: - _type - location - _links properties: _type: type: string enum: - StorageFile location: type: string description: Location identification for file in storage _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- Not provided **Resource**: urn:openproject-org:api:v3:storages:storage_file:no_link_provided example: id: '42' name: readme.md _type: StorageFile location: "/readme.md" _links: self: href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided StorageFilesModel: type: object required: - _type - files - parent - ancestors - _links properties: _type: type: string enum: - StorageFiles files: type: array items: "$ref": "#/components/schemas/StorageFileModel" description: List of files provided by the selected storage. parent: allOf: - "$ref": "#/components/schemas/StorageFileModel" - description: File of the currently selected parent directory. ancestors: type: array items: "$ref": "#/components/schemas/StorageFileModel" description: List of ancestors of the parent directory. Can be empty, if parent directory was root directory. _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- Not provided **Resource**: urn:openproject-org:api:v3:storages:storage_file:no_link_provided example: _type: StorageFiles files: - id: '42' name: readme.md _type: StorageFile location: "/readme.md" mimeType: text/markdown size: 4096 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: self: href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided - id: '43' name: readme.pdf _type: StorageFile location: "/readme.pdf" mimeType: application/pdf size: 2048 createdAt: '2021-12-19T09:42:10.170Z' lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: self: href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided parent: id: '41' name: "/" _type: StorageFile location: "/" mimeType: application/x-op-directory size: 6144 createdAt: '2021-12-20T09:42:10.170Z' lastModifiedAt: '2021-12-21T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker _links: self: href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided ancestors: [] _links: self: href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided StorageFolderWriteModel: type: object required: - name - parentId properties: name: type: string description: Name of the folder to be created parentId: type: string description: Unique identifier of the parent folder in which the new folder should be created in StorageFileUploadPreparationModel: type: object required: - projectId - fileName - parent properties: projectId: type: integer description: The project identifier, from where a user starts uploading a file. minimum: 1 fileName: type: string description: The file name. parent: type: string description: |- The directory to which the file is to be uploaded. For root directories, the value `/` must be provided. StorageFileUploadLinkModel: type: object required: - _type - _links properties: _type: type: string enum: - UploadLink _links: type: object required: - self - destination properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The resource link of the upload link resource. As the upload link is a temporal object, and cannot be retrieved again, the self link usually is `urn:openproject-org:api:v3:storages:upload_link:no_link_provided`. **Resource**: UploadLink destination: allOf: - "$ref": "#/components/schemas/Link" - description: |- The direct upload link. **Resource**: N/A StorageReadModel: type: object required: - id - _type - name - _links properties: id: type: integer description: Storage id _type: type: string enum: - Storage name: type: string description: Storage name storageAudience: type: string description: |- The audience that the storage expects in tokens for requests to it, usually the storage's client ID at the identity provider. This is only required for authentication through single-sign-on and so far only supported for provider type Nextcloud. tokenExchangeScope: type: string description: |- The scope that will be requested when requesting a token for the storage through token exchange. Has no effect if no token exchange is performed. This is only required for authentication through single-sign-on and so far only supported for provider type Nextcloud. tenantId: type: - string - 'null' description: |- The tenant id of a file storage of type OneDrive. Ignored if the provider type is not OneDrive. May be null if the storage is not configured completely. driveId: type: - string - 'null' description: |- The drive id of a file storage of type OneDrive. Ignored if the provider type is not OneDrive. May be null if the storage is not configured completely. hasApplicationPassword: type: boolean description: |- Whether the storage has the application password to use for the Nextcloud storage. Ignored if the provider type is not Nextcloud. forbiddenFileNameCharacters: type: string description: |- A string with all the characters forbidden to be used for file and folder names in the storage. Used by OpenProject to avoid creating files with unsupported names (e.g. when creating project folders). Only supported for provider type Nextcloud so far. createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the storage configured: type: boolean description: Indication, if the storage is fully configured _embedded: type: object properties: oauthApplication: "$ref": "#/components/schemas/OAuthApplicationReadModel" oauthClientCredentials: "$ref": "#/components/schemas/OAuthClientCredentialsReadModel" _links: type: object required: - self - type - open - authorizationState properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This storage resource. Contains the user defined storage name as title. **Resource**: Storage type: allOf: - "$ref": "#/components/schemas/Link" - description: |- The urn of the storage type. Currently Nextcloud and OneDrive storages are supported. - urn:openproject-org:api:v3:storages:Nextcloud - urn:openproject-org:api:v3:storages:OneDrive **Resource**: N/A authenticationMethod: allOf: - "$ref": "#/components/schemas/Link" - description: |- The urn of the authentication method. Currently only Nextcloud storages support this setting. - urn:openproject-org:api:v3:storages:authenticationMethod:TwoWayOAuth2 (default) - urn:openproject-org:api:v3:storages:authenticationMethod:OAuth2SSO **Resource**: N/A origin: allOf: - "$ref": "#/components/schemas/Link" - description: |- Web URI of the storage instance. This link is ignored, if the storage is hosted in a cloud and has no own URL, like file storages of type OneDrive. **Resource**: N/A open: allOf: - "$ref": "#/components/schemas/Link" - description: |- URI of the file storage location, from where the user usually starts browsing files. **Resource**: N/A authorizationState: allOf: - "$ref": "#/components/schemas/Link" - description: |- The urn of the storage connection state. Can be one of: - urn:openproject-org:api:v3:storages:authorization:Connected - urn:openproject-org:api:v3:storages:authorization:FailedAuthorization - urn:openproject-org:api:v3:storages:authorization:Error **Resource**: N/A authorize: allOf: - "$ref": "#/components/schemas/Link" - description: |- The link to the starting point of the authorization cycle for a configured storage provider. # Conditions `authorizationState` is: - urn:openproject-org:api:v3:storages:authorization:FailedAuthorization **Resource**: N/A oauthApplication: allOf: - "$ref": "#/components/schemas/Link" - description: |- The OAuth 2 provider application linked to the storage. # Conditions - User has role `admin` **Resource**: OAuthApplication oauthClientCredentials: allOf: - "$ref": "#/components/schemas/Link" - description: |- The OAuth 2 credentials resource linked to the storage. # Conditions - User has role `admin` **Resource**: OAuthClientCredentials StorageWriteModel: type: object properties: name: type: string description: Storage name, if not provided, falls back to a default. storageAudience: type: string description: |- The audience that the storage expects in tokens for requests to it, usually the storage's client ID at the identity provider. This is only required for authentication through single-sign-on and so far only supported for provider type Nextcloud. tokenExchangeScope: type: string description: |- The scope that will be requested when requesting a token for the storage through token exchange. Has no effect if no token exchange is performed. This is only required for authentication through single-sign-on and so far only supported for provider type Nextcloud. applicationPassword: type: - string - 'null' description: |- The application password to use for the Nextcloud storage. Ignored if the provider type is not Nextcloud. If a string is provided, the password is set and automatic management is enabled for the storage. If null is provided, the password is unset and automatic management is disabled for the storage. forbiddenFileNameCharacters: type: string description: |- A string with all the characters forbidden to be used for file and folder names in the storage. Used by OpenProject to avoid creating files with unsupported names (e.g. when creating project folders). Only supported for provider type Nextcloud so far. _links: type: object required: - origin - type properties: origin: allOf: - "$ref": "#/components/schemas/Link" - description: |- The storage's host URL. **Resource**: N/A type: allOf: - "$ref": "#/components/schemas/Link" - description: |- The urn of the storage type. Currently Nextcloud and OneDrive storages are supported. - urn:openproject-org:api:v3:storages:Nextcloud - urn:openproject-org:api:v3:storages:OneDrive **Resource**: N/A authenticationMethod: allOf: - "$ref": "#/components/schemas/Link" - description: |- The urn of the authentication method. Currently only Nextcloud storages support this setting. - urn:openproject-org:api:v3:storages:authenticationMethod:TwoWayOAuth2 (default) - urn:openproject-org:api:v3:storages:authenticationMethod:OAuth2SSO **Resource**: N/A example: name: Coruscant applicationPassword: qJ_VLNReW@sd-Edz2hyC _links: origin: href: https://nextcloud.deathstar.rocks type: href: urn:openproject-org:api:v3:storages:Nextcloud TimeEntryActivityModel: type: object required: - _type - id - name - position - default - _embedded - _links properties: _type: type: string enum: - TimeEntriesActivity id: type: integer description: Time entry id minimum: 1 name: type: string description: The human readable name chosen for this activity position: type: integer description: The rank the activity has in a list of activities default: type: boolean description: Flag to signal whether this activity is the default activity _embedded: type: object required: - projects properties: projects: type: array items: oneOf: - "$ref": "#/components/schemas/ProjectModel" - "$ref": "#/components/schemas/ProgramModel" - "$ref": "#/components/schemas/PortfolioModel" _links: type: object required: - self - projects properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This time entry activity **Resource**: TimeEntriesActivity projects: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: |- One of the projects the time entry is active in. **Resource**: Project example: _type: TimeEntriesActivity id: 18 name: Management position: 8 default: false _embedded: projects: [] _links: self: href: "/api/v3/time_entries/activities/18" title: Management projects: - href: "/api/v3/projects/death_star_v2" title: DeathStarV2 - href: "/api/v3/projects/star_killer_base" title: StarKillerBase TimeEntryCollectionModel: type: object allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This time entry collection **Resource**: TimeEntryCollectionModel _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/TimeEntryModel" example: _type: Collection total: 39 count: 2 pageSize: 2 offset: 1 _embedded: elements: - _type: TimeEntry id: 5 comment: format: plain raw: Some comment html: "

Some comment

" spentOn: '2015-03-20' hours: PT5H startTime: '2015-03-20T10:00:00.000Z' endTime: '2015-03-20T15:00:00.000Z' createdAt: '2015-03-20T12:56:56.803Z' updatedAt: '2015-03-20T12:56:56.803Z' _links: self: href: "/api/v3/time_entries/1" updateImmediately: href: "/api/v3/time_entries/1" method: patch delete: href: "/api/v3/time_entries/1" method: delete project: href: "/api/v3/projects/1" title: Some project entity: href: "/api/v3/work_packages/1" title: Some work package user: href: "/api/v3/users/2" title: Some user activity: href: "/api/v3/time_entries/activities/18" title: Some time entry activity - _type: TimeEntry id: 10 comment: format: plain raw: Another comment html: "

Another comment

" spentOn: '2015-03-21' hours: PT7H startTime: '2015-03-20T15:00:00.000Z' endTime: '2015-03-20T22:00:00.000Z' createdAt: '2015-03-20T12:56:56.569Z' updatedAt: '2015-03-20T12:56:56.371Z' _links: self: href: "/api/v3/time_entries/2" project: href: "/api/v3/projects/42" title: Some other project entity: href: "/api/v3/work_packages/541" title: Some other work package user: href: "/api/v3/users/6" title: Some other project activity: href: "/api/v3/time_entries/activities/14" title: some other time entry activity _links: self: href: "/api/v3/time_entries?offset=1&pageSize=2" jumpTo: href: "/api/v3/time_entries?offset=%7Boffset%7D&pageSize=2" templated: true changeSize: href: "/api/v3/time_entries?offset=1&pageSize=%7Bsize%7D" templated: true nextByOffset: href: "/api/v3/time_entries?offset=2&pageSize=2" createTimeEntry: href: "/api/v3/time_entries/form" method: post createTimeEntryImmediately: href: "/api/v3/time_entries" method: post TimeEntryModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - type: object properties: id: type: integer description: The id of the time entry minimum: 1 comment: allOf: - "$ref": "#/components/schemas/Formattable" - description: A comment to the time entry spentOn: type: string format: date description: The date the expenditure is booked for hours: type: string format: duration description: The time quantifying the expenditure ongoing: type: boolean description: Whether the time entry is actively tracking time createdAt: type: string format: date-time description: The time the time entry was created startTime: type: - string - 'null' format: date-time description: |- The time the time entry was started, or null if the time entry does not have a start time. The time is returned as UTC time, if presented to the user it should be converted to the user's timezone. This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled. endTime: type: - string - 'null' format: date-time description: |- The time the time entry was ended, or null if the time entry does not have a start time. The time is returned as UTC time, if presented to the user it should be converted to the user's timezone. This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled. updatedAt: type: string format: date-time description: The time the time entry was last updated _links: type: object required: - self - project - user - activity - entity properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This time entry **Resource**: TimeEntry updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly perform edits on this time entry # Conditions **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in preparing and performing edits on a TimeEntry # Conditions **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Delete this time entry # Conditions **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user schema: allOf: - "$ref": "#/components/schemas/Link" - description: |- The time entry schema **Resource**: Schema project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project the time entry is bundled in. The project might be different from the work package's project once the workPackage is moved. **Resource**: Project entity: allOf: - "$ref": "#/components/schemas/Link" - description: |- The entity the time entry is created on **Resource**: WorkPackage, Meeting user: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user the time entry tracks expenditures for **Resource**: User activity: allOf: - "$ref": "#/components/schemas/Link" - description: |- The time entry activity the time entry is categorized as **Resource**: TimeEntriesActivity example: _type: TimeEntry id: 42 comment: format: plain raw: The force shall set me free. html: "

The force shall set me free.

" spentOn: '2023-01-11' hours: PT4H startTime: '2023-01-11T09:58:00.000Z' endTime: '2023-01-11T13:58:00.000Z' createdAt: '2023-01-11T13:58:24.927Z' updatedAt: '2023-01-11T13:58:24.927Z' _links: self: href: "/api/v3/time_entries/42" updateImmediately: href: "/api/v3/time_entries/42" method: patch update: href: "/api/v3/time_entries/42/form" method: post delete: href: "/api/v3/time_entries/42" method: delete schema: href: "/api/v3/time_entries/schema" project: href: "/api/v3/projects/11" title: DeathStarV2 entity: href: "/api/v3/work_packages/77" title: Build new hangar user: href: "/api/v3/users/3" title: Darth Vader activity: href: "/api/v3/time_entries/activities/1" title: Management TypeModel: type: object required: - id - name - color - position - isDefault - isMilestone - createdAt - updatedAt properties: id: type: integer description: Type id readOnly: true exclusiveMinimum: 0 name: type: string description: Type name readOnly: true color: type: - string - 'null' description: The color used to represent this type readOnly: true position: type: integer description: Sort index of the type readOnly: true isDefault: type: boolean description: Is this type active by default in new projects? readOnly: true isMilestone: type: boolean description: Do work packages of this type represent a milestone? readOnly: true createdAt: type: string format: date-time description: Time of creation readOnly: true updatedAt: type: string format: date-time description: Time of the most recent change to the user _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This type **Resource**: Type readOnly: true example: _links: self: href: "/api/v3/types/1" _type: Type id: 1 name: Bug color: "#ff0000" position: 1 isDefault: true isMilestone: false createdAt: '2014-05-21T08:51:20.624Z' updatedAt: '2014-05-21T08:51:20.624Z' TypesModel: type: object example: _links: self: href: "/api/v3/types" total: 2 count: 2 _type: Collection _embedded: elements: - _links: self: href: "/api/v3/types/1" _type: Type id: 1 name: Bug color: "#ff0000" position: 1 isDefault: true isMilestone: false createdAt: '2014-05-21T08:51:20.429Z' updatedAt: '2014-05-21T08:51:20.429Z' - _links: self: href: "/api/v3/types/2" _type: Type id: 2 name: Feature color: "#888" position: 2 isDefault: false isMilestone: false createdAt: '2014-05-21T08:51:20.429Z' updatedAt: '2014-05-21T08:51:20.429Z' Types_by_WorkspaceModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The types collection **Resource**: TypesCollection readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/TypeModel" - description: Collection of Types Unstar_QueryModel: type: object example: _type: Query id: 9 name: fdsfdsfdsf createdAt: '2015-03-20T12:56:56.257Z' updatedAt: '2015-05-20T18:16:53.953Z' filters: - _type: StatusQueryFilter name: Status _links: filter: href: "/api/v3/queries/filters/status" title: Status operator: href: "/api/v3/queries/operators/o" title: open schema: href: "/api/v3/queries/filter_instance_schemas/status" values: [] - _type: DueDateQueryFilter name: Finish date values: - '1' _links: filter: href: "/api/v3/queries/filters/dueDate" title: Finish date operator: href: "/api/v3/queries/operators/" _links: self: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" jumpTo: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true changeSize: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" templated: true createWorkPackage: href: "/api/v3/work_packages/form" method: post createWorkPackageImmediate: href: "/api/v3/work_packages" method: post _links: self: href: "/api/v3/queries/9" title: fdsfdsfdsf results: href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D" columns: - href: "/api/v3/queries/columns/id" title: ID - href: "/api/v3/queries/columns/subject" title: Subject - href: "/api/v3/queries/columns/type" title: Type - href: "/api/v3/queries/columns/status" title: Status - href: "/api/v3/queries/columns/priority" title: Priority - href: "/api/v3/queries/columns/assignee" title: Assignee - href: "/api/v3/queries/columns/updated_at" title: Updated on groupBy: href: title: sortBy: - href: "/api/v3/queries/sort_bys/parent-desc" title: Parent (Descending) user: href: "/api/v3/users/1" title: OpenProject Admin project: href: "/api/v3/projects/3" title: copy UserCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This user collection **Resource**: Collection _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/UserModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/users" _embedded: elements: - _abbreviated: User resource shortened for brevity _type: User id: 1337 - _abbreviated: User resource shortened for brevity _type: User id: 1338 UserCreateModel: type: object required: - admin - email - login - firstName - lastName - language properties: admin: type: boolean email: type: string maxLength: 60 login: type: string maxLength: 256 password: type: string description: |- The user's password. *Conditions:* Writable on create. Writable on update only when: - the caller updates their own account - `currentPassword` is provided and valid currentPassword: type: string description: |- The user's current password. *Conditions:* Required when changing `password` for a self update (`PATCH /api/v3/users/me` or `PATCH /api/v3/users/{id}` where `id` is the caller). Ignored for non-self updates (for example, administrators updating other users). firstName: type: string maxLength: 30 lastName: type: string maxLength: 30 status: type: string description: |- The current activation status of the user. *Conditions:* Only writable on creation, not on update. language: type: string example: login: j.sheppard password: idestroyedsouvereign currentPassword: iusedtobuildstarships firstName: John lastName: Sheppard email: shep@mail.com admin: true status: active language: en UserModel: allOf: - "$ref": "#/components/schemas/PrincipalModel" - "$ref": "#/components/schemas/CustomFieldProperties" - type: object required: - _type - avatar properties: _type: type: string enum: - User avatar: type: - string - 'null' format: uri description: URL to user's avatar login: type: string description: |- The user's login name # Conditions - User is self, or `create_user` or `manage_user` permission globally maxLength: 256 firstName: type: string description: |- The user's first name # Conditions - User is self, or `create_user` or `manage_user` permission globally maxLength: 30 lastName: type: string description: |- The user's last name # Conditions - User is self, or `create_user` or `manage_user` permission globally maxLength: 30 email: type: string description: |- The user's email address # Conditions - E-Mail address not hidden - User is not a new record - User is self, or `create_user` or `manage_user` permission globally maxLength: 60 admin: type: boolean description: |- Flag indicating whether or not the user is an admin # Conditions - `admin` status: type: string description: |- The current activation status of the user. # Conditions - User is self, or `create_user` or `manage_user` permission globally language: type: string description: |- User's language | ISO 639-1 format # Conditions - User is self, or `create_user` or `manage_user` permission globally identityUrl: type: - string - 'null' description: |- User's identity_url for OmniAuth authentication. **Deprecated:** It will be removed in the near future. # Conditions - User is self, or `create_user` or `manage_user` permission globally deprecated: true createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the user _links: type: object properties: showUser: allOf: - "$ref": "#/components/schemas/Link" - description: |- A relative path to show the user in the web application. # Condition - User is not a new record - User is not `locked` updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- A link to update the user resource. # Conditions - `admin` lock: allOf: - "$ref": "#/components/schemas/Link" - description: |- Restrict the user from logging in and performing any actions. # Conditions - User is not locked - `admin` unlock: allOf: - "$ref": "#/components/schemas/Link" - description: |- Allow a locked user to login and act again. # Conditions - User is not locked - `admin` delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Permanently remove a user from the instance # Conditions either: - `admin` - Setting `users_deletable_by_admin` is set or: - User is self - Setting `users_deletable_by_self` is set authSource: allOf: - "$ref": "#/components/schemas/Link" - description: |- Permanently remove a user from the instance # Conditions - LDAP authentication configured - `admin` UserNonWorkingTimeCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This collection of non-working times records. **Resource**: UserNonWorkingTimeCollectionModel _embedded: type: object required: - elements properties: elements: type: array description: The array of personal non-working times for the user, ordered by start date ascending. items: "$ref": "#/components/schemas/UserNonWorkingTimeModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/users/42/non_working_times" _embedded: elements: - _type: UserNonWorkingTime id: 7 startDate: '2025-06-16' endDate: '2025-06-20' _links: self: href: "/api/v3/users/42/non_working_times/7" user: href: "/api/v3/users/42" title: Jane Doe - _type: UserNonWorkingTime id: 8 startDate: '2025-12-24' endDate: '2025-12-24' _links: self: href: "/api/v3/users/42/non_working_times/8" user: href: "/api/v3/users/42" title: Jane Doe UserNonWorkingTimeModel: type: object required: - _type - id - startDate - endDate properties: _type: type: string enum: - UserNonWorkingTime id: type: integer description: The unique identifier of the non-working time record. minimum: 1 startDate: type: string format: date description: The first date of the non-working time range in ISO 8601 format (YYYY-MM-DD). endDate: type: string format: date description: |- The last date of the non-working time range in ISO 8601 format (YYYY-MM-DD). Must be greater than or equal to `startDate`. _links: type: object required: - self - user properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This non-working time record. **Resource**: UserNonWorkingTime user: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user this non-working time belongs to. **Resource**: User example: _type: UserNonWorkingTime id: 7 startDate: '2025-06-16' endDate: '2025-06-20' _links: self: href: "/api/v3/users/42/non_working_times/7" user: href: "/api/v3/users/42" title: Jane Doe UserPreferencesModel: type: object example: _links: self: href: "/api/v3/my_preferences" user: href: "/api/v3/users/1" title: John Sheppard updateImmediately: href: "/api/v3/users/3/preferences" method: patch _type: UserPreferences commentSortDescending: true disableKeyboardShortcuts: false timeZone: Europe/Berlin warnOnLeavingUnsaved: true notifications: - watched: false involved: true mentioned: false shared: true newsAdded: false, newsCommented: false documentAdded: false forumMessages: false wikiPageAdded: false wikiPageUpdated: false membershipAdded: false membershipUpdated: false workPackageCommented: false workPackageProcessed: false workPackagePrioritized: false workPackageScheduled: false _links: project: href: UserWorkingHoursCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This collection of working hours records. **Resource**: UserWorkingHoursCollectionModel _embedded: type: object required: - elements properties: elements: type: array description: The array of working hours records for the user, ordered by `validFrom` descending. items: "$ref": "#/components/schemas/UserWorkingHoursModel" example: _type: Collection total: 2 count: 2 _links: self: href: "/api/v3/users/42/working_hours" _embedded: elements: - _type: UserWorkingHours id: 2 validFrom: '2025-01-01' mondayHours: 6.0 tuesdayHours: 6.0 wednesdayHours: 6.0 thursdayHours: 6.0 fridayHours: 6.0 saturdayHours: 0.0 sundayHours: 0.0 availabilityFactor: 80 _links: self: href: "/api/v3/users/42/working_hours/2" user: href: "/api/v3/users/42" title: Jane Doe - _type: UserWorkingHours id: 1 validFrom: '2024-01-01' mondayHours: 8.0 tuesdayHours: 8.0 wednesdayHours: 8.0 thursdayHours: 8.0 fridayHours: 8.0 saturdayHours: 0.0 sundayHours: 0.0 availabilityFactor: 100 _links: self: href: "/api/v3/users/42/working_hours/1" user: href: "/api/v3/users/42" title: Jane Doe UserWorkingHoursModel: type: object required: - _type - id - validFrom - mondayHours - tuesdayHours - wednesdayHours - thursdayHours - fridayHours - saturdayHours - sundayHours - availabilityFactor properties: _type: type: string enum: - UserWorkingHours id: type: integer description: The unique identifier of the working hours record. minimum: 1 validFrom: type: string format: date description: |- The date from which this working hours configuration is in effect (ISO 8601 format). Multiple records may exist for a user; the one with the latest `validFrom` that is not in the future is the currently active record. mondayHours: type: number format: float description: Hours worked on Monday. minimum: 0 tuesdayHours: type: number format: float description: Hours worked on Tuesday. minimum: 0 wednesdayHours: type: number format: float description: Hours worked on Wednesday. minimum: 0 thursdayHours: type: number format: float description: Hours worked on Thursday. minimum: 0 fridayHours: type: number format: float description: Hours worked on Friday. minimum: 0 saturdayHours: type: number format: float description: Hours worked on Saturday. minimum: 0 sundayHours: type: number format: float description: Hours worked on Sunday. minimum: 0 availabilityFactor: type: integer description: The percentage of working hours the user is available. Must be between 0 and 100. minimum: 0 maximum: 100 _links: type: object required: - self - user properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This working hours record. **Resource**: UserWorkingHours user: allOf: - "$ref": "#/components/schemas/Link" - description: |- The user this working hours record belongs to. **Resource**: User example: _type: UserWorkingHours id: 1 validFrom: '2024-01-01' mondayHours: 8.0 tuesdayHours: 8.0 wednesdayHours: 8.0 thursdayHours: 8.0 fridayHours: 8.0 saturdayHours: 0.0 sundayHours: 0.0 availabilityFactor: 100 _links: self: href: "/api/v3/users/42/working_hours/1" user: href: "/api/v3/users/42" title: Jane Doe ValuesPropertyModel: type: object required: - _type - property - value - _links properties: _type: type: string enum: - Values::Property property: type: string description: The key of the key - value pair represented by the Values::Property value: type: string description: The value of the key - value pair represented by the Values::Property _links: type: object required: - self - schema properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This key - value pair. **Resource**: Storage schema: allOf: - "$ref": "#/components/schemas/Link" - description: |- The schema describing the key - value pair. **Resource**: Schema VersionCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This version collection **Resource**: Collection _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/VersionReadModel" VersionReadModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - type: object required: - id - _type - name - description - startDate - endDate - status - sharing - createdAt - updatedAt properties: id: type: integer description: Version id minimum: 1 _type: type: string enum: - Version name: type: string description: Version name description: "$ref": "#/components/schemas/Formattable" startDate: type: - string - 'null' format: date endDate: type: - string - 'null' format: date status: type: string description: |- The current status of the version. This could be: - *open*: if the version is available to be assigned to work packages in all shared projects - *locked*: if the version is not finished, but locked for further assignments to work packages - *closed*: if the version is finished enum: - open - locked - closed sharing: type: string description: |- The indicator of how the version is shared between projects. This could be: - *none*: if the version is only available in the defining project - *descendants*: if the version is shared with the descendants of the defining project - *hierarchy*: if the version is shared with the descendants and the ancestors of the defining project - *tree*: if the version is shared with the root project of the defining project and all descendants of the root project - *system*: if the version is shared globally enum: - none - descendants - hierarchy - tree - system createdAt: type: string format: date-time description: Time of creation updatedAt: type: string format: date-time description: Time of the most recent change to the version _links: allOf: - "$ref": "#/components/schemas/CustomFieldLinkedProperties" - type: object required: - self - schema - definingProject - availableInProjects properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This version **Resource**: Version schema: allOf: - "$ref": "#/components/schemas/Link" - description: |- The schema of this version **Resource**: VersionSchema update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in preparing and performing edits on the version # Conditions **Permission**: manage versions delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Deletes this version # Conditions **Permission**: manage versions updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly perform edits on the version # Conditions **Permission**: manage versions definingProject: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace to which the version belongs **Resource**: Workspace availableInProjects: allOf: - "$ref": "#/components/schemas/Link" - description: |- Workspaces where this version can be used **Resource**: Workspace VersionWriteModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - type: object properties: name: type: string description: Version name description: "$ref": "#/components/schemas/Formattable" startDate: type: - string - 'null' format: date endDate: type: - string - 'null' format: date status: type: string description: |- The current status of the version. This could be: - *open*: if the version is available to be assigned to work packages in all shared projects - *locked*: if the version is not finished, but locked for further assignments to work packages - *closed*: if the version is finished enum: - open - locked - closed sharing: type: string description: |- The indicator of how the version is shared between projects. This could be: - *none*: if the version is only available in the defining project - *descendants*: if the version is shared with the descendants of the defining project - *hierarchy*: if the version is shared with the descendants and the ancestors of the defining project - *tree*: if the version is shared with the root project of the defining project and all descendants of the root project - *system*: if the version is shared globally enum: - none - descendants - hierarchy - tree - system _links: allOf: - "$ref": "#/components/schemas/CustomFieldLinkedProperties" - type: object properties: definingProject: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace to which the version belongs **Resource**: Workspace Version_schemaModel: type: object example: _type: Schema _dependencies: [] id: type: Integer name: ID required: true hasDefault: false writable: false name: type: String name: Name required: true hasDefault: false writable: true minLength: 1 maxLength: 60 description: type: Formattable name: Description required: false hasDefault: false writable: true startDate: type: Date name: Start date required: false hasDefault: false writable: true endDate: type: Date name: Finish date required: false hasDefault: false writable: false status: type: String name: Status required: true hasDefault: false writable: true visibility: default _links: {} sharing: type: String name: Sharing required: true hasDefault: false writable: true visibility: default _links: {} createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false definingProject: type: Project name: Project required: true hasDefault: false writable: true _links: {} customField14: type: String name: text CF required: false hasDefault: false writable: true visibility: default customField40: type: CustomOption name: List CF required: false hasDefault: false writable: true location: _links visibility: default _links: {} _links: self: href: "/api/v3/versions/schema" Versions_by_WorkspaceModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The versions collection **Resource**: VersionsCollection readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/VersionReadModel" - description: Collection of Versions View_actionModel: type: object example: _links: self: href: "/api/v3/actions/work_packages/create" title: Add work package _type: Action id: work_packages/create name: Add work package description: Creating a work package within a project including the uploading of attachments. Some attributes might not be selected, e.g version which requires a second permission modules: - work_packages View_capabilitiesModel: type: object example: _links: self: href: "/api/v3/capabilities/work_packages/create/p123-567" action: href: "/api/v3/actions/work_packages/create" title: Add work package context: href: "/api/v3/projects/123" title: A project principal: href: "/api/v3/users/567" title: Some user _type: Capability id: work_packages/create/p123-567 View_global_contextModel: type: object example: _links: self: href: "/api/v3/capabilities/context/global" _type: CapabilityContext::Global id: global View_project_statusModel: type: object example: _type: ProjectStatus id: on_track name: On track _links: self: href: "/api/v3/project_statuses/on_track" View_time_entry_schemaModel: type: object example: _type: Schema _dependencies: [] id: type: Integer name: ID required: true hasDefault: false writable: false options: {} createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false options: {} updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false options: {} spentOn: type: Date name: Date required: true hasDefault: false writable: true options: {} hours: type: Duration name: Hours required: true hasDefault: false writable: true options: {} user: type: User name: User required: true hasDefault: false writable: false options: {} workPackage: type: WorkPackage name: Work package required: false hasDefault: false writable: true location: _links _links: {} project: type: Project name: Project required: false hasDefault: false writable: true location: _links _links: {} activity: type: TimeEntriesActivity name: Activity required: true hasDefault: true writable: true location: _links _links: {} customField29: type: String name: sfsdfsdfsdfsdfdsf required: false hasDefault: false writable: true options: rtl: _links: self: href: "/api/v3/time_entries/schema" View_user_schemaModel: type: object example: _type: Schema _dependencies: [] id: type: Integer name: ID required: true hasDefault: false writable: false options: {} login: type: String name: Username required: true hasDefault: false writable: true minLength: 1 maxLength: 255 options: {} admin: type: Boolean name: Administrator required: false hasDefault: false writable: true options: {} mail: type: String name: Email required: true hasDefault: false writable: true minLength: 1 maxLength: 255 options: {} firstName: type: String name: First name required: true hasDefault: false writable: false minLength: 1 maxLength: 255 options: {} lastName: type: String name: Last name required: true hasDefault: false writable: false minLength: 1 maxLength: 255 options: {} avatar: type: String name: Avatar required: false hasDefault: false writable: false options: {} status: type: String name: Status required: false hasDefault: false writable: true options: {} identityUrl: type: String name: Identity url required: false hasDefault: false writable: true options: {} language: type: String name: Language required: false hasDefault: false writable: true options: {} password: type: Password name: Password required: false hasDefault: false writable: false options: {} createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false options: {} updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false options: {} customField1: type: String name: User String CF required: false hasDefault: false writable: true customField2: type: CustomOption name: User List cf required: false hasDefault: false writable: true location: _links _links: self: href: "/api/v3/users/schema" WatchersModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The watcher list **Resource**: WatchersModel readOnly: true _embedded: type: object properties: elements: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/UserModel" - description: Collection of Users example: _links: self: href: "/api/v3/work_packages/14/watchers" total: 2 count: 2 _type: Collection _embedded: elements: - _type: User _links: self: href: "/api/v3/users/1" title: John Sheppard - j.sheppard showUser: href: "/users/1" type: text/html lock: href: "/api/v3/users/1/lock" title: Set lock on j.sheppard method: POST delete: href: "/api/v3/users/1" title: Delete j.sheppard method: DELETE id: 1 login: j.sheppard firstName: John lastName: Sheppard name: John Sheppard mail: shep@mail.com avatar: https://example.org/users/1/avatar status: active createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' - _type: User _links: self: href: "/api/v3/users/2" title: Jim Sheppard - j.sheppard2 lock: href: "/api/v3/users/2/lock" title: Set lock on j.sheppard2 method: POST delete: href: "/api/v3/users/2" title: Delete j.sheppard2 method: DELETE id: 2 login: j.sheppard2 firstName: Jim lastName: Sheppard name: Jim Sheppard mail: shep@mail.net avatar: https://example.org/users/1/avatar status: active createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' WeekDayCollectionModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This week days collection **Resource**: WeekDayCollectionModel _embedded: type: object required: - elements properties: elements: type: array description: The array of week days. minItems: 7 maxItems: 7 items: "$ref": "#/components/schemas/WeekDayModel" example: _type: Collection total: 7 count: 7 _links: self: href: "/api/v3/days/week" _embedded: elements: - _type: WeekDay day: 1 name: Monday working: true _links: self: href: "/api/v3/days/week/1" title: Monday - _type: WeekDay day: 2 name: Tuesday working: true _links: self: href: "/api/v3/days/week/2" title: Tuesday - _type: WeekDay day: 3 name: Wednesday working: true _links: self: href: "/api/v3/days/week/3" title: Wednesday - _type: WeekDay day: 4 name: Thursday working: true _links: self: href: "/api/v3/days/week/4" title: Thursday - _type: WeekDay day: 5 name: Friday working: true _links: self: href: "/api/v3/days/week/5" title: Friday - _type: WeekDay day: 6 name: Saturday working: false _links: self: href: "/api/v3/days/week/6" title: Saturday - _type: WeekDay day: 7 name: Sunday working: false _links: self: href: "/api/v3/days/week/7" title: Sunday WeekDayCollectionWriteModel: type: object required: - _type - _embedded properties: _type: type: string enum: - Collection _embedded: type: object required: - elements properties: elements: type: array description: The array of week days. minItems: 1 maxItems: 7 items: allOf: - "$ref": "#/components/schemas/WeekDayWriteModel" - type: object required: - _links properties: _links: allOf: - "$ref": "#/components/schemas/WeekDaySelfLinkModel" example: _type: Collection _embedded: elements: - _type: WeekDay working: true _links: self: href: "/api/v3/days/week/1" - _type: WeekDay working: true _links: self: href: "/api/v3/days/week/2" - _type: WeekDay working: true _links: self: href: "/api/v3/days/week/4" - _type: WeekDay working: false _links: self: href: "/api/v3/days/week/6" - _type: WeekDay working: false _links: self: href: "/api/v3/days/week/7" WeekDayModel: type: object required: - _type - day - name - working properties: _type: type: string enum: - WeekDay day: type: integer description: The week day from 1 to 7. 1 is Monday. 7 is Sunday. readOnly: true minimum: 1 maximum: 7 name: type: string description: The week day name. working: type: boolean description: "`true` for a working week day, `false` otherwise." _links: allOf: - "$ref": "#/components/schemas/WeekDaySelfLinkModel" example: _type: WeekDay day: 5 name: Friday working: false _links: self: href: "/api/v3/day/week/5" title: Friday WeekDaySelfLinkModel: type: object description: Identify a particular week day by its href. properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This week day resource link. **Resource**: WeekDay readOnly: true example: self: href: "/api/v3/days/week/3" title: Wednesday WeekDayWriteModel: type: object description: Describes a week day as a working day or a non-working day (weekend). required: - _type - working properties: _type: type: string enum: - WeekDay working: type: boolean description: "`true` for a working day. `false` for a weekend day." example: _type: WeekDay working: false Wiki_PageModel: type: object required: - title properties: id: type: integer description: Identifier of this wiki page readOnly: true exclusiveMinimum: 0 title: type: string description: The wiki page's title _links: type: object properties: addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Attach a file to the wiki page # Conditions **Permission**: edit wiki page readOnly: true example: _type: WikiPage id: 72 title: A wiki page with a name _embedded: project: _type: Project... id: 12 _links: self: href: "/api/v3/wiki_pages/72" attachments: href: "/api/v3/wiki_pages/72/attachments" addAttachment: href: "/api/v3/wiki_pages/72/attachments" method: post project: href: "/api/v3/projects/12" title: some project WorkPackageModel: allOf: - "$ref": "#/components/schemas/CustomFieldProperties" - type: object required: - subject - _links properties: id: type: integer description: Work package id readOnly: true minimum: 1 lockVersion: type: integer description: The version of the item as used for optimistic locking readOnly: true subject: type: string description: Work package subject _type: type: string enum: - WorkPackage readOnly: true description: allOf: - "$ref": "#/components/schemas/Formattable" - description: The work package description scheduleManually: type: boolean description: |- Uses manual scheduling mode when true (default). Uses automatic scheduling mode when false. Can be automatic only when predecessors or children are present. readonly: type: boolean description: If true, the work package is in a readonly status so with the exception of the status, no other property can be altered. startDate: type: - string - 'null' format: date description: Scheduled beginning of a work package dueDate: type: - string - 'null' format: date description: Scheduled end of a work package date: type: - string - 'null' format: date description: Date on which a milestone is achieved derivedStartDate: type: - string - 'null' format: date description: Similar to start date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate. readOnly: true derivedDueDate: type: - string - 'null' format: date description: Similar to due date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate. readOnly: true duration: type: - string - 'null' format: duration description: |- **(NOT IMPLEMENTED)** The amount of time in hours the work package needs to be completed. Not available for milestone type of work packages. readOnly: true estimatedTime: type: - string - 'null' format: duration description: Time a work package likely needs to be completed excluding its descendants derivedEstimatedTime: type: - string - 'null' format: duration description: Time a work package likely needs to be completed including its descendants readOnly: true ignoreNonWorkingDays: type: boolean description: |- **(NOT IMPLEMENTED)** When scheduling, whether or not to ignore the non working days being defined. A work package with the flag set to true will be allowed to be scheduled to a non working day. readOnly: true position: type: - integer - 'null' description: |- The position this work package has in a version configured to be backlog (sprint or product). # Conditions **Permission** Backlogs needs to be enabled in the work package's project and the work package's type is configured to be a backlog type. readOnly: true spentTime: type: string format: duration description: |- The time booked for this work package by users working on it # Conditions **Permission** view time entries readOnly: true storyPoints: type: - integer - 'null' description: |- The estimation in story points on how long this work package will take to complete # Conditions **Permission** Backlogs needs to be enabled in the work package's project and the work package's type is configured to be a backlog type. readOnly: false percentageDone: type: - integer - 'null' description: Amount of total completion for a work package minimum: 0 maximum: 100 derivedPercentageDone: type: - integer - 'null' description: Amount of total completion for a work package derived from itself and its descendant work packages readOnly: true minimum: 0 maximum: 100 createdAt: type: string format: date-time description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. readOnly: true updatedAt: type: string format: date-time description: Time of the most recent change to the work package. readOnly: true _links: type: object required: - self - schema - ancestors - author - priority - project - status - type properties: addComment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Post comment to WP # Conditions **Permission**: add work package notes readOnly: true addRelation: allOf: - "$ref": "#/components/schemas/Link" - description: |- Adds a relation to this work package. # Conditions **Permission**: manage wp relations readOnly: true addWatcher: allOf: - "$ref": "#/components/schemas/Link" - description: |- Add any user to WP watchers # Conditions **Permission**: add watcher readOnly: true customActions: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A predefined action that can be applied to the work package. **Resource**: CustomAction readOnly: true previewMarkup: allOf: - "$ref": "#/components/schemas/Link" - description: Post markup (in markdown) here to receive an HTML-rendered response readOnly: true removeWatcher: allOf: - "$ref": "#/components/schemas/Link" - description: |- Remove any user from WP watchers # Conditions **Permission**: delete watcher readOnly: true delete: allOf: - "$ref": "#/components/schemas/Link" - description: |- Delete this work package # Conditions **Permission**: delete_work_packages readOnly: true logTime: allOf: - "$ref": "#/components/schemas/Link" - description: |- Create time entries on the work package # Conditions **Permission**: log_time or log_own_time readOnly: true move: allOf: - "$ref": "#/components/schemas/Link" - description: |- Link to page for moving this work package # Conditions **Permission**: move_work_packages readOnly: true copy: allOf: - "$ref": "#/components/schemas/Link" - description: |- Link to page for copying this work package # Conditions **Permission**: add_work_packages readOnly: true unwatch: allOf: - "$ref": "#/components/schemas/Link" - description: |- Remove current user from WP watchers # Conditions logged in; watching readOnly: true update: allOf: - "$ref": "#/components/schemas/Link" - description: |- Form endpoint that aids in preparing and performing edits on a work package # Conditions **Permission**: edit work package readOnly: true updateImmediately: allOf: - "$ref": "#/components/schemas/Link" - description: |- Directly perform edits on a work package # Conditions **Permission**: edit work package readOnly: true watch: allOf: - "$ref": "#/components/schemas/Link" - description: |- Add current user to WP watchers # Conditions logged in; not watching readOnly: true self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This work package **Resource**: WorkPackage readOnly: true schema: allOf: - "$ref": "#/components/schemas/Link" - description: |- The schema of this work package **Resource**: Schema readOnly: true ancestors: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A visible ancestor work package of the current work package. **Resource**: WorkPackage # Conditions **Permission** view work packages readOnly: true attachments: allOf: - "$ref": "#/components/schemas/Link" - description: |- The files attached to this work package **Resource**: Collection # Conditions - **Setting**: deactivate_work_package_attachments set to false in related workspace addAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Attach a file to the work package # Conditions - **Permission**: edit work package readOnly: true prepareAttachment: allOf: - "$ref": "#/components/schemas/Link" - description: |- Attach a file to the work package # Conditions - **Setting**: direct uploads enabled readOnly: true author: allOf: - "$ref": "#/components/schemas/Link" - description: |- The person that created the work package **Resource**: User readOnly: true assignee: allOf: - "$ref": "#/components/schemas/Link" - description: |- The person that is intended to work on the work package **Resource**: User availableWatchers: allOf: - "$ref": "#/components/schemas/Link" - description: |- All users that can be added to the work package as watchers. **Resource**: User # Conditions **Permission** add work package watchers readOnly: true budget: allOf: - "$ref": "#/components/schemas/Link" - description: |- The budget this work package is associated to **Resource**: Budget # Conditions **Permission** view cost objects category: allOf: - "$ref": "#/components/schemas/Link" - description: |- The category of the work package **Resource**: Category children: type: array readOnly: true items: allOf: - "$ref": "#/components/schemas/Link" - description: |- A visible child work package of the current work package. **Resource**: WorkPackage # Conditions **Permission** view work packages readOnly: true addFileLink: allOf: - "$ref": "#/components/schemas/Link" - description: |- Add a file link to the work package # Conditions **Permission**: manage_file_links fileLinks: allOf: - "$ref": "#/components/schemas/Link" - description: |- Gets the file link collection of this work package # Conditions **Permission**: view_file_links parent: allOf: - "$ref": "#/components/schemas/Link" - description: |- Parent work package **Resource**: WorkPackage priority: allOf: - "$ref": "#/components/schemas/Link" - description: |- The priority of the work package **Resource**: Priority project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The workspace to which the work package belongs **Resource**: Workspace projectPhase: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project phase to which the work package belongs **Resource**: ProjectPhase projectPhaseDefinition: allOf: - "$ref": "#/components/schemas/Link" - description: |- The definition of the project phase the work package belongs to **Resource**: ProjectPhaseDefinition responsible: allOf: - "$ref": "#/components/schemas/Link" - description: |- The person that is responsible for the overall outcome **Resource**: User relations: allOf: - "$ref": "#/components/schemas/Link" - description: |- Relations this work package is involved in **Resource**: Relation # Conditions **Permission** view work packages readOnly: true revisions: allOf: - "$ref": "#/components/schemas/Link" - description: |- Revisions that are referencing the work package **Resource**: Revision # Conditions **Permission** view changesets readOnly: true status: allOf: - "$ref": "#/components/schemas/Link" - description: |- The current status of the work package **Resource**: Status sprint: allOf: - "$ref": "#/components/schemas/Link" - description: |- The sprint the work package is assigned to **Resource**: Sprint # Conditions **Permission** view sprints timeEntries: allOf: - "$ref": "#/components/schemas/Link" - description: |- All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change. **Resource**: N/A # Conditions **Permission** view time entries readOnly: true type: allOf: - "$ref": "#/components/schemas/Link" - description: |- The type of the work package **Resource**: Type version: allOf: - "$ref": "#/components/schemas/Link" - description: |- The version associated to the work package **Resource**: Version watchers: allOf: - "$ref": "#/components/schemas/Link" - description: |- All users that are currently watching this work package **Resource**: Collection # Conditions **Permission** view work package watchers readOnly: true example: _type: WorkPackage _links: self: href: "/api/v3/work_packages/1528" title: Develop API schema: href: "/api/v3/work_packages/schemas/11-2" update: href: "/api/v3/work_packages/1528" method: patch title: Update Develop API delete: href: "/work_packages/bulk?ids=1528" method: delete title: Delete Develop API logTime: href: "/work_packages/1528/time_entries/new" type: text/html title: Log time on Develop API move: href: "/work_packages/1528/move/new" type: text/html title: Move Develop API attachments: href: "/api/v3/work_packages/1528/attachments" addAttachment: href: "/api/v3/work_packages/1528/attachments" method: post author: href: "/api/v3/users/1" title: OpenProject Admin - admin customActions: - href: "/api/v3/work_packages/1528/custom_actions/153/execute" method: post title: Reset - href: "/api/v3/work_packages/1528/custom_actions/94/execute" method: post title: Forward to accounting responsible: href: "/api/v3/users/23" title: Laron Leuschke - Alaina5788 relations: href: "/api/v3/work_packages/1528/relations" title: Show relations revisions: href: "/api/v3/work_packages/1528/revisions" assignee: href: "/api/v3/users/11" title: Emmie Okuneva - Adele5450 priority: href: "/api/v3/priorities/2" title: Normal project: href: "/api/v3/portfolio/1" title: A Test Portfolio status: href: "/api/v3/statuses/1" title: New type: href: "/api/v3/types/1" title: A Type version: href: "/api/v3/versions/1" title: Version 1 availableWatchers: href: "/api/v3/work_packages/1528/available_watchers" watch: href: "/api/v3/work_packages/1528/watchers" method: post payload: user: href: "/api/v3/users/1" addWatcher: href: "/api/v3/work_packages/1528/watchers" method: post payload: user: href: "/api/v3/users/{user_id}" templated: true removeWatcher: href: "/api/v3/work_packages/1528/watchers/{user_id}" method: delete templated: true addRelation: href: "/api/v3/relations" method: post title: Add relation changeParent: href: "/api/v3/work_packages/694" method: patch title: Change parent of Bug in OpenProject addComment: href: "/api/v3/work_packages/1528/activities" method: post title: Add comment parent: href: "/api/v3/work_packages/1298" title: nisi eligendi officiis eos delectus quis voluptas dolores category: href: "/api/v3/categories/1298" title: eligend isi children: - href: "/api/v3/work_packages/1529" title: Write API documentation ancestors: - href: "/api/v3/work_packages/1290" title: Root node of hierarchy - href: "/api/v3/work_packages/1291" title: Intermediate node of hierarchy - href: "/api/v3/work_packages/1298" title: nisi eligendi officiis eos delectus quis voluptas dolores timeEntries: href: "/work_packages/1528/time_entries" type: text/html title: Time entries watchers: href: "/api/v3/work_packages/1528/watchers" customField3: href: api/v3/users/14 id: 1528 subject: Develop API description: format: markdown raw: Develop super cool OpenProject API. html: "

Develop super cool OpenProject API.

" scheduleManually: false readonly: false startDate: dueDate: derivedStartDate: derivedDueDate: estimatedTime: PT2H derivedEstimatedTime: PT10H percentageDone: 0 customField1: Foo customField2: 42 createdAt: '2014-08-29T12:40:53.373Z' updatedAt: '2014-08-29T12:44:41.981Z' WorkPackageFormModel: type: object description: |- The work package creation form. This object is returned, whenever a work package form endpoint is called. It contains an allowed payload definition, the full schema and any validation errors on the current request body. properties: _type: type: string enum: - Form _embedded: type: object properties: payload: "$ref": "#/components/schemas/WorkPackageWriteModel" schema: "$ref": "#/components/schemas/WorkPackageSchemaModel" validationErrors: type: object description: |- All validation errors, where the key is the faulty property. The object is empty, if the request body is valid. _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This form endpoint **Resource** : Form validate: allOf: - "$ref": "#/components/schemas/Link" - description: The endpoint for validating the request bodies. Often referring to this very form endpoint. previewMarkup: allOf: - "$ref": "#/components/schemas/Link" - description: Renders a markup preview for the work package form. customFields: allOf: - "$ref": "#/components/schemas/Link" - description: Link to the HTML page for the custom field definitions. configureForm: allOf: - "$ref": "#/components/schemas/Link" - description: Link to the HTML page for the form configuration. WorkPackagePatchModel: allOf: - "$ref": "#/components/schemas/WorkPackageWriteModel" - type: object required: - lockVersion properties: lockVersion: type: integer description: The version of the item as used for optimistic locking WorkPackageSchemaModel: type: object description: |- A schema for a work package. This schema defines the attributes of a work package. TODO: Incomplete, needs to be updated with the real behaviour of schemas (when does which attribute appear?). properties: _type: type: string enum: - Schema _dependencies: type: array items: type: string description: TBD _attributeGroups: type: array items: type: object description: TBD (WorkPackageFormAttributeGroup) lockVersion: "$ref": "#/components/schemas/SchemaPropertyModel" id: "$ref": "#/components/schemas/SchemaPropertyModel" subject: "$ref": "#/components/schemas/SchemaPropertyModel" description: "$ref": "#/components/schemas/SchemaPropertyModel" duration: "$ref": "#/components/schemas/SchemaPropertyModel" scheduleManually: "$ref": "#/components/schemas/SchemaPropertyModel" ignoreNonWorkingDays: "$ref": "#/components/schemas/SchemaPropertyModel" startDate: "$ref": "#/components/schemas/SchemaPropertyModel" dueDate: "$ref": "#/components/schemas/SchemaPropertyModel" derivedStartDate: "$ref": "#/components/schemas/SchemaPropertyModel" derivedDueDate: "$ref": "#/components/schemas/SchemaPropertyModel" estimatedTime: "$ref": "#/components/schemas/SchemaPropertyModel" derivedEstimatedTime: "$ref": "#/components/schemas/SchemaPropertyModel" remainingTime: "$ref": "#/components/schemas/SchemaPropertyModel" derivedRemainingTime: "$ref": "#/components/schemas/SchemaPropertyModel" percentageDone: "$ref": "#/components/schemas/SchemaPropertyModel" derivedPercentageDone: "$ref": "#/components/schemas/SchemaPropertyModel" readonly: "$ref": "#/components/schemas/SchemaPropertyModel" createdAt: "$ref": "#/components/schemas/SchemaPropertyModel" updatedAt: "$ref": "#/components/schemas/SchemaPropertyModel" author: "$ref": "#/components/schemas/SchemaPropertyModel" position: "$ref": "#/components/schemas/SchemaPropertyModel" project: "$ref": "#/components/schemas/SchemaPropertyModel" projectPhase: "$ref": "#/components/schemas/SchemaPropertyModel" projectPhaseDefinition: "$ref": "#/components/schemas/SchemaPropertyModel" parent: "$ref": "#/components/schemas/SchemaPropertyModel" sprint: "$ref": "#/components/schemas/SchemaPropertyModel" storyPoints: "$ref": "#/components/schemas/SchemaPropertyModel" assignee: "$ref": "#/components/schemas/SchemaPropertyModel" responsible: "$ref": "#/components/schemas/SchemaPropertyModel" type: "$ref": "#/components/schemas/SchemaPropertyModel" status: "$ref": "#/components/schemas/SchemaPropertyModel" category: "$ref": "#/components/schemas/SchemaPropertyModel" version: "$ref": "#/components/schemas/SchemaPropertyModel" priority: "$ref": "#/components/schemas/SchemaPropertyModel" _links: type: object properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- This work package schema **Resource**: Schema WorkPackageWriteModel: type: object description: |- This model is used for creating and updating work packages. It can also be used for validation against the work package form endpoints. properties: subject: type: string description: Work package subject description: allOf: - "$ref": "#/components/schemas/Formattable" - description: The work package description scheduleManually: type: boolean description: |- Uses manual scheduling mode when true (default). Uses automatic scheduling mode when false. Can be automatic only when predecessors or children are present. startDate: type: - string - 'null' format: date description: Scheduled beginning of a work package dueDate: type: - string - 'null' format: date description: Scheduled end of a work package estimatedTime: type: - string - 'null' format: duration description: Time a work package likely needs to be completed excluding its descendants duration: type: - string - 'null' format: duration description: |- The amount of time in hours the work package needs to be completed. This value must be bigger or equal to `P1D`, and any the value will get floored to the nearest day. The duration has no effect, unless either a start date or a due date is set. Not available for milestone type of work packages. ignoreNonWorkingDays: type: boolean description: |- When scheduling, whether or not to ignore the non working days being defined. A work package with the flag set to true will be allowed to be scheduled to a non working day. _links: type: object properties: category: allOf: - "$ref": "#/components/schemas/Link" - description: |- The category of the work package **Resource**: Category type: allOf: - "$ref": "#/components/schemas/Link" - description: |- The type of the work package **Resource**: Type priority: allOf: - "$ref": "#/components/schemas/Link" - description: |- The priority of the work package **Resource**: Priority project: allOf: - "$ref": "#/components/schemas/Link" - description: |- The project to which the work package belongs **Resource**: Project status: allOf: - "$ref": "#/components/schemas/Link" - description: |- The current status of the work package **Resource**: Status responsible: allOf: - "$ref": "#/components/schemas/Link" - description: |- The person that is responsible for the overall outcome **Resource**: User assignee: allOf: - "$ref": "#/components/schemas/Link" - description: |- The person that is intended to work on the work package **Resource**: User version: allOf: - "$ref": "#/components/schemas/Link" - description: |- The version associated to the work package **Resource**: Version parent: allOf: - "$ref": "#/components/schemas/Link" - description: |- Parent work package **Resource**: WorkPackage _meta: type: object description: Meta information for the work package request properties: validateCustomFields: type: boolean description: |- When set to true, explicitly validates all required custom fields on the work package, regardless of whether they are provided in the request body. This overrides the default behavior where only custom fields included in the request are validated. Use this parameter when you need to ensure all required custom fields have valid values before allowing the update to proceed. default: false Work_Package_activitiesModel: type: object example: _links: self: href: "/api/v3/work_packages/1/revisions" total: 2 count: 2 _type: Collection _embedded: elements: - _type: Activity _links: self: href: "/api/v3/activity/1" workPackage: href: "/api/v3/work_packages/1" user: href: "/api/v3/users/1" id: 1 details: [] comment: format: markdown raw: Lorem ipsum dolor sit amet. html: "

Lorem ipsum dolor sit amet.

" createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T09:14:02.324Z' version: 1 - _type: Activity _links: self: href: "/api/v3/activity/2" workPackage: href: "/api/v3/work_packages/1" user: href: "/api/v3/users/1" id: 2 details: [] comment: format: markdown raw: Lorem ipsum dolor sit amet. html: "

Lorem ipsum dolor sit amet.

" createdAt: '2014-05-21T09:51:22.769Z' updatedAt: '2014-05-21T10:14:02.927Z' version: 2 Work_PackagesModel: allOf: - "$ref": "#/components/schemas/CollectionModel" - type: object required: - _links - _embedded properties: _links: type: object required: - self properties: self: allOf: - "$ref": "#/components/schemas/Link" - description: |- The work package collection **Resource**: WorkPackageCollection readOnly: true _embedded: type: object required: - elements properties: elements: type: array items: "$ref": "#/components/schemas/WorkPackageModel" example: _links: self: href: "/api/v3/work_packages" total: 2 count: 2 _type: Collection _embedded: elements: - _abbreviated: Work package resource shortened for brevity _type: WorkPackage _links: self: href: "/api/v3/work_packages/1" id: 1 - _abbreviated: Work package resource shortened for brevity _type: WorkPackage _links: self: href: "/api/v3/work_packages/2" id: 2 WorkspaceCollectionModel: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel" - type: object required: - _links - _embedded properties: _links: allOf: - "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks" - type: object properties: representations: type: array items: allOf: - "$ref": "#/components/schemas/Link" - description: A workspace collection representation in a specific file format. _embedded: type: object required: - elements properties: elements: type: array items: oneOf: - "$ref": "#/components/schemas/PortfolioModel" - "$ref": "#/components/schemas/ProgramModel" - "$ref": "#/components/schemas/ProjectModel" Workspaces_schemaModel: type: object description: A schema for a workspace. This schema defines the attributes of a workspace. properties: _type: type: string enum: - Schema description: The type identifier for this resource _dependencies: type: array description: Schema dependencies (currently empty for workspaces) _attributeGroups: type: array items: type: object properties: _type: type: string enum: - ProjectFormCustomFieldSection description: The type identifier for this resource id: type: integer description: The unique identifier of the custom field section name: type: string description: The human-readable name of the custom field section attributes: type: array items: type: string description: |- Array of camelCase custom field attribute names belonging to this section. Only includes custom fields visible to the current user. description: |- Defines the organizational structure of project custom fields into sections for UI rendering. Each attribute group represents a project attribute section containing related project attributes. The sections determine how project attributes are visually organized and grouped in forms. **Key behaviors:** - Admin-only project attributes appear only for users with admin privileges - Empty sections (with no accessible project attributes) are omitted from the response - The order reflects the configured section positioning in admin settings - Each section contains only project attributes assigned to that specific section **Example structure:** ```json [ { "_type": "ProjectFormCustomFieldSection", "name": "Project Details", "attributes": ["customField1", "customField3"] }, { "_type": "ProjectFormCustomFieldSection", "name": "Budget Information", "attributes": ["customField2", "customField4"] } ] ``` id: "$ref": "#/components/schemas/SchemaPropertyModel" name: "$ref": "#/components/schemas/SchemaPropertyModel" identifier: "$ref": "#/components/schemas/SchemaPropertyModel" description: "$ref": "#/components/schemas/SchemaPropertyModel" public: "$ref": "#/components/schemas/SchemaPropertyModel" active: "$ref": "#/components/schemas/SchemaPropertyModel" status: "$ref": "#/components/schemas/SchemaPropertyModel" statusExplanation: "$ref": "#/components/schemas/SchemaPropertyModel" parent: "$ref": "#/components/schemas/SchemaPropertyModel" createdAt: "$ref": "#/components/schemas/SchemaPropertyModel" updatedAt: "$ref": "#/components/schemas/SchemaPropertyModel" _links: type: object description: Links related to this resource properties: self: type: object properties: href: type: string example: "/api/v3/workspaces/schema" patternProperties: "^customField\\d+$": "$ref": "#/components/schemas/SchemaPropertyModel" "^customComment\\d+$": "$ref": "#/components/schemas/SchemaPropertyModel" example: _type: Schema _dependencies: [] _attributeGroups: - _type: ProjectFormCustomFieldSection name: Project Details attributes: - customField30 - customField34 - _type: ProjectFormCustomFieldSection name: Budget Information attributes: - customField31 - customField32 - customField35 id: type: Integer name: ID required: true hasDefault: false writable: false name: type: String name: Name required: true hasDefault: false writable: true minLength: 1 maxLength: 255 identifier: type: String name: Identifier required: true hasDefault: false writable: true minLength: 1 maxLength: 100 description: type: Formattable name: Description required: false hasDefault: false writable: true public: type: Boolean name: Public required: true hasDefault: false writable: true active: type: Boolean name: Active required: true hasDefault: true writable: true status: type: ProjectStatus name: Status required: false hasDefault: true writable: true _links: allowedValues: - href: "/api/v3/project_statuses/on_track" title: On track - href: "/api/v3/project_statuses/at_risk" title: At risk - href: "/api/v3/project_statuses/off_track" title: Off track statusExplanation: type: Formattable name: Status explanation required: false hasDefault: false writable: true parent: type: Workspace name: Subproject of required: false hasDefault: false writable: true location: _links visibility: default _links: {} createdAt: type: DateTime name: Created on required: true hasDefault: false writable: false updatedAt: type: DateTime name: Updated on required: true hasDefault: false writable: false customField30: type: Integer name: Integer project custom field required: false hasDefault: false writable: true visibility: default customField31: type: CustomOption name: List project custom field required: false hasDefault: false writable: true location: _links visibility: default _links: {} customField32: type: Version name: Version project custom field required: false hasDefault: false writable: true location: _links visibility: default _links: {} customField34: type: Boolean name: Boolean project custom field required: false hasDefault: false writable: true visibility: default customField35: type: String name: Text project custom field required: true hasDefault: false writable: true visibility: default customComment35: type: String name: Text project custom field comment required: false hasDefault: false writable: true _links: self: href: "/api/v3/workspaces/schema" securitySchemes: BasicAuth: type: http scheme: basic tags: - description: |- ## Links Links to other resources in the API are represented uniformly by so called link objects. ### Local Properties | Property | Description | Type | Required | Nullable | Default | |:---------:| ------------------------------------------------------------------------ | ------- |:--------:|:--------:| ----------- | | href | URL to the referenced resource (might be relative) | String | ✓ | ✓ | | | title | Representative label for the resource | String | | | | | templated | If true the `href` contains parts that need to be replaced by the client | Boolean | | | false | | method | The HTTP verb to use when requesting the resource | String | | | GET | | payload | The payload to send in the request to achieve the desired result | String | | | unspecified | | identifier| An optional unique identifier to the link object | String | | | unspecified | All link objects *must* contain the `href` property, though it might be `null`. Thus the following is a valid link object: `{ "href": null }` whereas `{ }` is not a valid link object. The meaning of `"href": null` is that **no** resource is referenced. For example a work package without an assignee will still have an assignee link, but its `href` will be `null`. If a `title` is present, the client can display the title to the user when referring to the resource. Templated links are links that contain client replaceable parts. Replaceable parts are enclosed in braces. For example the link `api/v3/example/{id}` is not complete in itself, but the client needs to replace the string `{id}` itself. As of now the API does not indicate the valid replacement values. The `method` indicates which HTTP verb the client *must* use when following the link for the intended purpose. If a `payload` is specified, it needs to be sent as the body of the request to achieve the desired result (e.g. perform the action represented by the link). If no `payload` is specified, there is either no payload to send or a valid payload is not specified by the link object. A payload might also be templated slightly. If the `templated` property is true, a payload might contain replaceable parts in its strings (e.g. `{ "href": "/api/v3/examples/{example_id}" }`). Note: When writing links (e.g. during a `PATCH` operation) only changes to `href` are accepted. Changes to all other properties will be **silently ignored**. For resources invisible to the client (e.g. because of missing permissions), a link will contain the uri `urn:openproject-org:api:v3:undisclosed` instead of a url. This indicates the existence of a value without revealing the actual value. An example for this is the parent project. A project resource which itself might be visible to the client can have a reference to a parent project invisible to the same client. Revealing the existence of a parent over hiding has the benefit of allowing the client to make an informed decision of whether to keep the existing reference or updating it. Sending ‘{ "href": "urn:openproject-org:api:v3:undisclosed" }` for a resource will have the effect of keeping the original value. This is especially beneficial if the client creates and updates resources based on the payload object provided as part of a form as is recommended when interacting with the API. ## Errors In case of an error, the API will respond with an appropriate HTTP status code. For responses with an HTTP status of `4xx` and `5xx` the body will always contain a single error object. Error objects shall give the client additional details about the cause of an erroneous response. ### General errors * Error objects have their `_type` set to `Error` * The `errorIdentifier` serves as a unique (and machine readable) identifier for a specific error cause * There *may* be multiple possible error identifiers per HTTP status code * There *may* be multiple possible HTTP status codes per error identifier * The "List of Error Identifiers" defines the possible mappings between HTTP status and error identifier * The `message` contains a human readable concise message describing the error * It *optionally* includes specific information, for example which permission would have been needed to perform an action * It is localized depending on the users preferences * It *must not* include HTML or other kind of markup * Error messages form complete sentences including punctuation #### Example ```json { "_type": "Error", "errorIdentifier": "urn:openproject-org:api:v3:errors:InternalServerError", "message": "An internal server error occurred. This is not your fault." } ``` ### Embedded error information Errors might optionally contain embedded objects that contain further information. #### Error details Under the embedded key `details` there might be an object describing the error more verbosely. For example if the error affects a specific field, this field could be defined there. ##### Example ```json { "_type": "Error", "errorIdentifier": "urn:openproject-org:api:v3:examples:ExampleError", "message": "This is an example error.", "_embedded": { "details": { "_type": "ExampleErrorDetailInformation", "erroneousField": "subject" } } } ``` #### Multiple error objects To ease implementation of basic clients it is guaranteed that the response body always only contains a single error object. However it is allowed that an error object *embeds* other error objects under the key `errors`, thereby aggregating them. The `errorIdentifier` of such an object is always `urn:openproject-org:api:v3:errors:MultipleErrors`. The message can either describe one of the embedded errors or simply state that multiple errors occurred. ##### Example ```json { "_type": "Error", "errorIdentifier": "urn:openproject-org:api:v3:errors:MultipleErrors", "message": "Multiple fields violated their constraints.", "_embedded": { "errors": [ { "_type": "Error", "errorIdentifier": "urn:openproject-org:api:v3:errors:PropertyConstraintViolation", "...": "..." }, { "_type": "Error", "errorIdentifier": "urn:openproject-org:api:v3:errors:PropertyConstraintViolation", "...": "..." } ] } } ``` ### List of Error Identifiers * `urn:openproject-org:api:v3:errors:InvalidQuery` (**HTTP 400**) The query contained a value that did not match the servers expectation * `urn:openproject-org:api:v3:errors:InvalidRenderContext` (**HTTP 400**) The client specified a rendering context that does not exist * `urn:openproject-org:api:v3:errors:InvalidRequestBody` (**HTTP 400**) The format of the request body did not match the servers expectation * `urn:openproject-org:api:v3:errors:InvalidSignal` (**HTTP 400**) The client specified a select not available on the resource, e.g because the property/link does not exist on it. * `urn:openproject-org:api:v3:errors:InvalidUserStatusTransition` (**HTTP 400**) The client used an invalid transition in the attempt to change the status of a user account. * `urn:openproject-org:api:v3:errors:Unauthenticated` (**HTTP 401**) The client has to authenticate to access the requested resource. * `urn:openproject-org:api:v3:errors:MissingPermission` (**HTTP 403**) The client does not have the needed permissions to perform the requested action * `urn:openproject-org:api:v3:errors:NotFound` (**HTTP 404**) Default for HTTP 404 when no further information is available * `urn:openproject-org:api:v3:errors:UpdateConflict` (**HTTP 409**) The resource changed between GET-ing it and performing an update on it * `urn:openproject-org:api:v3:errors:TypeNotSupported` (**HTTP 415**) The request contained data in an unsupported media type (Content-Type) * `urn:openproject-org:api:v3:errors:PropertyConstraintViolation` (**HTTP 422**) The client tried to set a property to an invalid value * `urn:openproject-org:api:v3:errors:PropertyIsReadOnly` (**HTTP 422**) The client tried to set or change a property that is not writable * `urn:openproject-org:api:v3:errors:PropertyFormatError` (**HTTP 422**) A property value was provided in a format that the server does not understand or accept * `urn:openproject-org:api:v3:errors:PropertyMissingError` (**HTTP 422**) The request is syntactically correct, but is missing a property to perform the requested action * `urn:openproject-org:api:v3:errors:PropertyValueNotAvailableAnymore` (**HTTP 422**) An unchanged property needs to be changed, because other changes to the resource make it unavailable * `urn:openproject-org:api:v3:errors:ResourceTypeMismatch` (**HTTP 422**) A link to a resource of a specific type was expected, but the link to another type of resource was provided * `urn:openproject-org:api:v3:errors:InternalServerError` (**HTTP 500**) Default for HTTP 500 when no further information is available * `urn:openproject-org:api:v3:errors:MultipleErrors` Multiple errors occurred. See the embedded `errors` array for more details. ## Formattable Text OpenProject supports text formatting in Markdown. Properties that contain formattable text have a special representation in this API. In this specification their type is indicated as `Formattable`. Their representation contains the following properties: | Property | Description | Type | Example | Supported operations | |:--------:| -------------------------------------------------- | ------ | ---------------------------------- | -------------------- | | format | Indicates the formatting language of the raw text | String | markdown | READ | | raw | The raw text, as entered by the user | String | `I **am** formatted!` | READ / WRITE | | html | The text converted to HTML according to the format | String | `I am formatted!` | READ | `format` can as of today have one of the following values: * `plain` - only basic formatting, e.g. inserting paragraphs and line breaks into HTML * `markdown` - formatting using Markdown * `custom` - There is no apparent formatting rule that transforms the raw version to HTML (only used for read only properties) Note that `raw` is the only property supporting the **write** operation. A property of type *Formattable* that is marked as **read and write**, will only accept changes to the `raw` property. Changes to `format` and `html` will be **silently ignored**. It is thus sufficient to solely provide the `raw` property for changes. If the *Formattable* is marked as **read only**, the `raw` attribute also becomes **read only**. ### Example ```json { "format": "markdown", "raw": "I **am** formatted!", "html": "I am formatted!" } ``` ## Dates, Times, Durations and Timestamps Representation of time related values in this API is done according to [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). In this specification the following terms will be used as type specifiers (e.g. in tables): * `Date` - refers to an ISO 8601 date, e.g. "2014-05-21" * `DateTime` - refers to an ISO 8601 combined date and time, optionally with milliseconds, e.g. "2014-05-21T13:37:00Z" or "2014-05-21T13:37:00.396Z" * `Duration` - refers to an ISO 8601 duration, e.g. "P1DT18H" * `Timestamp` - refers to an ISO 8601 combined date and time, e.g. "2014-05-21T13:37:00Z" or to an ISO 8601 duration, e.g. "P1DT18H". The following shorthand values are also being parsed as duration: "1d", "1w", "1m", "1y", "1y-2m", "-2y". It can also refer the following relative date keywords: `"oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM"`. The `"HH:MM"` part represents the zero padded hours and minutes, e.g. `"oneMonthAgo@21:00+00:00"`. The last "+HH:MM" part represents the timezone offset from UTC associated with the time, e.g. `"oneMonthAgo@21:00+02:00"` means a +2 hour timezone offset from UTC. The offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00". Values older than 1 day are accepted only with valid Enterprise Token available. ## Colors Colors are represented in RGB using hexadecimal notation as specified in [CSS Color Module Level 3](https://www.w3.org/TR/css3-color/). That is a `#` followed by either three or six hexadecimal digits. ### Example ``` red: #ff0000 or #f00 green: #00ff00 or #0f0 black: #000000 or #000 white: #ffffff or #fff ``` ## Digests Digests (or Hashes) are one way functions that map data of arbitrary size to data of a fixed size. In OpenProject they are for example used to calculate checksums for (attachment) files. The checksum calculated depends on the hashed data and the algorithm used as hash function. Therefore all digests are represented in the following form: | Property | Description | Type | Example | |:---------:| -------------------------------------------------- | ------ | ---------------------------------- | | algorithm | The algorithm used to compute the digest | String | md5 | | hash | The calculated digest in hexadecimal notation | String | 64c26a8403cd796ea4cf913cda2ee4a9 | ### Example ```json { "algorithm": "md5", "hash": "64c26a8403cd796ea4cf913cda2ee4a9" } ``` name: Basic Objects - description: |- Whenever a client calls a resource that can return more than one element, it will receive a collection of elements. However as collections can become quite large, the API will **not** simply return a JSON array, but a special collection object that will contain the actual elements in its embedded property `elements`. Collections *may* be paginated, this means that a single response from the server will not contain all elements of the collection, but only a subset. In this case the client can issue further requests to retrieve the remaining elements. There are two ways to access the result pages of a paginated collection: * offset based pagination * cursor based pagination The available ways of pagination depend on the collection queried. Some collections feature no pagination at all, meaning they will always return all elements. Others might only offer one of the two pagination methods or both of them. A collection also carries meta information like the total count of elements in the collection or - in case of a paginated collection - the amount of elements returned in this response and action links to retrieve the remaining elements. ## Local Properties | Property | Description | Type | Availability | |:--------:| --------------------------------------------------------------- | ------- | --------------------------- | | total | The total amount of elements available in the collection | Integer | always | | pageSize | Amount of elements that a response will hold | Integer | when paginated | | count | Actual amount of elements in this response | Integer | always | | offset | The page number that is requested from paginated collection | Integer | when offset based available | | groups | Summarized information about aggregation groups | Object | when grouping | | totalSums| Aggregations of supported values for elements of the collection | Object | when showing sums | ## Links | Link | Description | Availability | |:----------------:| ------------------------------------------------------------------------ | --------------------------- | | self | Link to the current page in the collection | always | | changeSize | Templated link to change the page size, might change relative position | when paginated | | jumpTo | Templated link to jump to a specified offset | when offset based available | | nextByOffset | Link to retrieve the following page of elements (offset based) | when offset based available | | previousByOffset | Link to retrieve the preceding page of elements (offset based) | when offset based available | | nextByCursor | Link to retrieve the elements following the current page (cursor based) | when cursor based available | | previousByCursor | Link to retrieve the elements preceding the current page (cursor based) | when cursor based available | name: Collections - description: |- Filter objects can be added to a number of endpoints in the OpenProject APIv3. With them, you can create powerful queries to endpoints to return the data that you want. They all share the following basic properties: - They consist of three items: A property to filter or a specific filter name, one or more values, and a filter operator that defines what query to produce with the given values - You can combine any number of distinct filters can be added to the endpoint definitions in this API documentation - A combination of filter objects are treated as an AND filter. OR filters are not yet possible in a single query. ## Filter syntax The filter syntax is a JSON object that can be passed as a GET parameter to the endpoints as an URL-encoded JSON string looks like the following: ```json5 [ { "": { "operator": "", "values": [, ...] } }, // ... ] ``` **Example** Filtering the work packages API endpoint for a work package that matches the subject or ID "12" and has a status with the ID=5. ```json [ { "subjectOrId": { "operator": "**", "values": ["12"] } }, { "status": { "operator": "=", "values": ["5"] } } ] ``` With the above JSON stringified and URL-encoded, this can be added to the `/api/v3/work_packages` endpoint using the `filter` parameter to form the URL: ``` https://community.openproject.org/api/v3/work_packages?filters=%5B%7B%22subjectOrId%22:%7B%22operator%22:%22**%22,%22values%22:%5B%2212%22%5D%7D%7D,%7B%22status%22:%7B%22operator%22:%22=%22,%22values%22:%5B%225%22%5D%7D%7D%5D ``` ## Compression As the above can become quite long, especially if a lot of filter values are included, the API offers to wrap all query props into a zlib compressed and base64 encoded property (`eprops`). The property will then not only include the filter but the complete query props set (e.g. `pageSize`, `offset` and `columns`. So `eprops` is then a JSON object that is compressed and encoded. **Example** Instead of the request ``` https://community.openproject.org/api/v3/work_packages?filters=[%7B%22subjectOrId%22:%7B%22operator%22:%22**%22,%22values%22:[%2212%22]%7D%7D,%7B%22status%22:%7B%22operator%22:%22=%22,%22values%22:[%225%22]%7D%7D]&pageSize=10&sortBy=[[%22id%22,%20%22asc%22]] ``` Which in a non URL encoded style would be ``` https://community.openproject.org/api/v3/work_packages?filters=[{"subjectOrId":{"operator":"**","values":["12"]}},{"status":{"operator":"=","values":["5"]}}]&pageSize=10&sortBy=[["id", "asc"]] ``` All of the props can be put inside a json object ```json { "filters": "[{\"subjectOrId\":{\"operator\":\"**\",\"values\":[\"12\"]}},{\"status\":{\"operator\":\"=\",\"values\":[\"5\"]}}]", "sortBy": "[[\"id\",\"asc\"]]", "pageSize": 10 } ``` Please note, that all objects that have to be json (e.g `filters`) will be double encoded. That json object can then be compressed and encoded and the result sent over as the combined `eprops` parameter: ``` https://community.openproject.org/api/v3/work_packages?eprops=eJxtjTELwjAUhP%2FLjSWDFVwCLt2cHBz7OsT2VSKFlLwXQUv%2Bu0lXHe%2B7%2B7gN%0As1%2BUo8Ci3wiS7k8e9RovE8EWEFaOTkMsidA0BEN4uSWxFNIT2iNhyNlUV50m%0A%2BaOdf6zTLg0wkBC1e9f3gv20L52Mpa%2Ft6h588x%2BGbQ%2F5C12YN%2BM%3D%0A ``` ## Available filters The availability of filters depend on the endpoint you're querying and will be listed in each endpoint definition. For work packages, you can also [start using filters in the work packages module](https://community.openproject.org/projects/openproject/work_packages) to build your query and then simply copy the URL from your browser to get the resulting filter values and their operators. ## Available operators The following table is a list of all available operators. Not all endpoints and parameters support all values, but this list serves as a lookup table for identifying and using the operators. When building a filter object, you use the **symbol** listed below. | Symbol | Description of filtered properties | Values array contains | | ------ | ------------------------------------------------------------ | -------------------------- | | `=` | are equal to one of the given value(s) | At least one typed value | | `&=` | are containing all of the given value(s) | At least one typed value | | `!` | are not equal one of the given value(s) | At least one typed value | | `>=` | are greater or equal than the given value | One numerical value | | `<=` | are lesser or equal than the given value | One numerical value | | `t-` | are the given number of days in the past | 1 integer (days) | | `t+` | are the given number of days in the future | 1 integer (days) | | `t+` | are *more than* the given number of days in the future | 1 integer (days) | | `>t-` | are *less than* the given number of days in the past | 1 integer (days) | | `d` | are between the two given dates. | 2 ISO8601 date/datetimes | | `w` | are in this week | *nothing, values is empty* | | `t` | are today | *nothing, values is empty* | | `~` | are containing the given words (SQL LIKE) in that order | At least one string value | | `!~` | are *not* containing the given words (SQL LIKE) in that order | At least one string value | ​ **Special operators for work packages** There are some additional operators only in use for work packages: | Symbol | Description of filtered properties | Values array contains | | ------ | ------------------------------------------ | -------------------------- | | `o` | the status of the work package is *open* | *nothing, values is empty* | | `c` | the status of the work package is *closed* | *nothing, values is empty* | | `ow` | the work packages have a manual sort order | *nothing, values is empty* | There are also relation filters for work packages that have the symbols `blocks/blocked` `children/parent` `follows/precedes` `duplicates/duplicated` `partof/includes` `relates` `requires/required` depending on the direction of the relation and take as value the work package ID that is the target node of the relation. **Special values for boolean filters** If you're using an operator that requires boolean values, please note that they need to be presented in this form: - `['f']` for false - `['t']` for true name: Filters - description: |- Baseline comparisons allow to compare work packages or collections of work packages with respect to different points in time. This helps to answer questions like: - Which work packages match a certain set of filters today, which work packages match this set of filters at a certain earlier point in time? - Which properties of these work packages have changed with respect to these points in time? This tool can be used to analyze how a project plan has changed with respect to a certain baseline date. ## Requesting Work Packages for Different Timestamps The work-packages API supports a `timestamps` parameter to gather information about a single work package or a collection of work packages for several points in time. ``` GET /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S ``` ``` GET /api/v3/work_packages/123?timestamps=2022-01-01T00:00:00Z,PT0S ``` Each timestamp should be given as an [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601) string, either an absolute date and time with timezone, e.g. `"2022-01-01T00:00:00Z"`, or a relative timestamp utilizing the [ISO-8601-Duration](https://en.wikipedia.org/wiki/ISO_8601#Durations) format, e.g. `"P-1Y"`, which is composed of an initial `"P"` for "Period", and a duration. `"P-1Y"` is interpreted as the relative timestamp "1 year ago". Furthermore, a set of predefined relative date keywords can also be passed for the timestamps: `"oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM"`. The `"HH:MM"` part represents the zero paded hours and minutes, e.g. `"oneMonthAgo@21:00+00:00"`. The last "+HH:MM" part represents the timezone offset from UTC associated with the time, e.g. `"oneMonthAgo@21:00+02:00"` means a +2 hour timezone offset from UTC. The offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00". Several timestamps should be passed as comma-separated list of these ISO-8601 strings to the `timestamps` parameter, e.g. `"2022-01-01T00:00:00Z,PT0S"`. The timestamps should be given in ascending temporal order, such that the first timestamp is the **baseline** timestamp, and the last timestamp is the **current** timestamp. Values older than 1 day are accepted only with valid Enterprise Token available. ## Response Overview When providing a `timestamps` parameter, the response has several additional properties: | Property | Description | Type | Further information | | ----------------------- | -------------------------------------------------------------------------------------- | ---------------- | --------------------------------------------------- | | `timestamp` | The requested timestamp corresponding to the surrounding embedded object | String | Section *[Timestamps](#timestamps)* below | | `attributesByTimestamp` | Attributes and meta information of the work packages at the respective timestamps | Array of Objects | Section *[Attributes](#attributes)* below | | `matchesFilters` | Marks whether the work package matches the filter criteria at the respective timestamp | Bool | Section *[Filter Matching](#filter-matching)* below | | `exists` | Marks whether the work package exists at the respective timestamp | Bool | Section *[Existence](#existence)* below | Each work-package element has the `attributesByTimestamp` as `_embedded` section. The properties `timestamp`, `matchesFilters`, and `exists` are wrapped in a `_meta` section, which is added to each work-package element as well as to each element of the `attributesByTimestamp` array. ```json5 // /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S { "_type": "WorkPackageCollection", "total": 1, "_embedded": { "elements": [ { "_type": "WorkPackage", "id": 1528, "subject": "Current subject of the work package", // other attributes ..., "_links": { "self": { "href": "/api/v3/work_packages/1528?timestamps=2022-01-01T00:00:00Z,2023-03-01T01:37:10Z" } }, "_meta": { "matchesFilters": true, "exists": true, "timestamp": "PT0S" }, "_embedded": { "attributesByTimestamp": [ { "subject": "Original subject of the work package", "_meta": { "matchesFilters": true, "exists": true, "timestamp": "2022-01-01T00:00:00Z" }, "_links": { "self": { "href": "/api/v3/work_packages/1528?timestamps=2022-01-01T00:00:00Z" } }, }, { "_meta": { "matchesFilters": true, "exists": true, "timestamp": "PT0S" }, "_links": { "self": { "href": "/api/v3/work_packages/1528?timestamps=2023-03-01T01:37:10Z" } } } ], } } ] }, "_links": { "self": { "href": "/api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,2023-03-01T01:37:10Z" } } } ``` ## Meta Information Each `_meta` section describes the surrounding object of the meta section, which may be the main work-package object, or an attributes object within the `attributesByTimestamp` array. Note that the `_meta` information of the most current (rightmost) timestamp is redundant: It is given as `_meta` section of the main work-package object as well as `_meta` section of the last object within the `attributesByTimestamp` array. ## Timestamps Each `_meta` section contains a `timestamp` property, which is to the requested `timestamp` corresponding to the object the `_meta` section describes. The `timestamp` has the same ISO-8601 format as in the `timestamps` request parameter and preserves the absolute or relative character of the requested timestamp. Furthermore, each self link corresponding to an earlier point in time has also a `timestamps` request parameter added to it, which is converted to an absolute ISO-8601 string at the execution time of the query. (in the above example, `PT0S` was converted to `2023-03-01T01:37:10Z` as the query was executed at that time.) ## Attributes To read out the attributes of the work packages at the current timestamp (the last of the given `timestamps`), check the attributes of the work-package objects. To read out the attributes of the work packages at the other given timestamps, check the attributes within `"_embedded"` section `"attributesAtTimestamp"`. To save bandwidth, only attributes that differ from the ones in the main work-package object are included in the `"attributesByTimestamp"`. Attributes with the same value as in the main work-package object are not included in the `"attributesByTimestamp"` section. ```json5 // /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S { "_type": "WorkPackageCollection", "_embedded": { "elements": [ { "_type": "WorkPackage", "subject": "Current subject of the work package", "_meta": { "timestamp": "PT0S" }, "_embedded": { "attributesByTimestamp": [ { "subject": "Original subject of the work package", "_meta": { "timestamp": "2022-01-01T00:00:00Z" } }, { "_meta": { "timestamp": "PT0S" } } ], } } ] } } ``` In the above example, the last of the given `timestamps` is `"PT0S"` (which means 0 seconds ago, i.e. now). The work-package attributes at this time are included in the main work-package object. The `"subject"` of the work package at the timestamp `"PT0S"` (now) is `"Current subject of the work package"`. The `"_embedded"` section `"attributesByTimestamp"` has an array entry for the timestamp `"PT0S"`, which is the last array entry. Because the value of the `"subject"` is the same as up in the main work-package object, the `"subject"` attribute is left out in the `"attributesByTimestamp"` for the timestamp `"PT0S"`. The `"subject"` of the work package at the timestamp `"PT0S"` (now) is `"Current subject of the work package"`. The `"_embedded"` section `"attributesByTimestamp"` has an array entry for the baseline timestamp `"2022-01-01T00:00:00Z"`, which is the first array entry. The `"subject"` of the work package at the timestamp `"2022-01-01T00:00:00Z"` is `"Original subject of the work package"`. It is included in the `"attributesByTimestamp"` for the timestamp `"2022-01-01T00:00:00Z"` because it differs from the `"subject"` in the main work-package object, which is `"Current subject of the work package"`. ## Filter Matching The work-packages API supports filtering the query results by one or several search criteria. See: [Filters](../filters) To find out whether a work package matches the given set of filter criteria at a certain timestamp, check the `"matchesFilters"` property in the `"_meta"` section for that timestamp: ```json5 // /api/v3/work_packages?filters=...×tamps=2022-01-01T00:00:00Z,PT0S { "_type": "WorkPackageCollection", "_embedded": { "elements": [ { "_type": "WorkPackage", "_meta": { "matchesFilters": true, "timestamp": "PT0S" }, "_embedded": { "attributesByTimestamp": [ { "_meta": { "matchesFilters": false, "timestamp": "2022-01-01T00:00:00Z" } }, { "_meta": { "matchesFilters": true, "timestamp": "PT0S" } } ], } } ] } } ``` In the above example, the work package matches the filter criteria at the timestamp `"PT0S"`, but does not match the filter criteria at the timestamp `"2022-01-01T00:00:00Z"`. In another example, it might be the other way around: The work package could match the filter criteria (`"matchesFilters": true`) at the baseline timestamp, but not match the filter criteria anymore (`"matchesFilters": false`) at the current timestamp. The work package is included in the returned collection if it matches the filter criteria at least at one of the requested timestamps. ## Existence To find out whether a work package has existed at a requested timestamp, check the `"exists"` property in the `"_meta"` section for that timestamp: ```json5 // /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S { "_type": "WorkPackageCollection", "_embedded": { "elements": [ { "_type": "WorkPackage", "_meta": { "exists": true, "timestamp": "PT0S" }, "_embedded": { "attributesByTimestamp": [ { "_meta": { "exists": false, "timestamp": "2022-01-01T00:00:00Z" } }, { "_meta": { "exists": true, "timestamp": "PT0S" } } ], } } ] } } ``` In the above example, the work package exists at the timestamp `"PT0S"`, but has not existed at the timestamp `"2022-01-01T00:00:00Z"`. In another example, it might be the other way around: The work package could exist (`"exists": true`) at the baseline time, but could have been deleted after that time such that it does not exist (`"exists": false`) at the current time. Please note, however, that OpenProject does not support [soft deletion](https://community.openproject.org/projects/openproject/work_packages/40015), yet. Currently, when a work package is deleted, its history is deleted as well, so that its history cannot be retrieved through the baseline API anymore. The work package is included in the returned collection if it has existed at least at one of the requested timestamps. ## Usage Example In this example ruby script, the work packages are retrieved at a baseline date and in their current state. Then the subject of the first work package is compared with respect to the baseline date and the current state. ```ruby # Define timestamps baseline_timestamp = "2022-01-01T00:00:00Z" current_timestamp = "PT0S" timestamps = [baseline_timestamp, current_timestamp] # Retrieve work packages url = URI("https://community.openproject.org/api/v3/work_packages?timestamps=#{timestamps.join(',')}") response = JSON.parse(Net::HTTP.get(url), object_class: OpenStruct) work_packages = response.dig("_embedded", "elements") # Extract differing baseline attributes work_package = work_packages.first baseline_attributes = work_package.dig("_embedded", "attributesByTimestamp").first # Compare baseline state to current state of the work package if baseline_attributes.subject.present? and baseline_attributes.subject != work_package.subject puts "The subject of the work package has changed." puts "Subject at the baseline time: #{baseline_attributes.subject}" puts "Current subject: #{work_package.subject}" end # Check existence puts "The work package did exist at the baseline time." if baseline_attributes.dig("_meta", "exists") puts "The work package exists at the current time." if work_package.dig("_meta", "exists") # Check filter matching puts "The work package matches the query filters at the baseline time." if baseline_attributes.dig("_meta", "matchesFilters") puts "The work package matches the query filters at the current time." if work_package.dig("_meta", "matchesFilters") ``` name: Baseline Comparisons - description: |- This API provides forms as a concept to aid in editing or creating resources. The goal of forms is to: * make writable properties of a resource discoverable * show to which values a property can be set * validate changes to a resource and indicate validation errors These benefits aside, a client can freely choose to immediately edit a resource without prior validation by a form. In the case of an invalid request the edit will fail and return appropriate errors nevertheless. A form is associated to a single resource and aids in performing changes on that resource. When posting to a form endpoint with an empty request body or an empty JSON object, you will receive an initial form for the associated resource. Subsequent calls to the form should contain a single JSON object as described by the form. ## Actions | Link | Description | Condition | |:-------------------:| --------------------------------------------------------------------- | -------------------------------- | | validate | Validate changes, show errors and allowed values for changed resource | | | commit | Actually perform changes to the resource | form content is valid | | previewMarkup | Post markup (e.g. markdown) here to receive an HTML-rendered response | | ## Linked Properties | Link | Description | Type | Nullable | Supported operations | |:-------------------:| ------------------------------------------------ | ------------- | -------- | -------------------- | | self | This form | Form | | READ | ## Embedded Properties: Apart from the linked properties, forms contain always three other embedded properties: * `payload` * `schema` * `validationErrors` Their purpose is explained below. ### Payload The payload contains an edited version of the resource that will be modified when committing the form. This representation contains all writable properties of the resource and reflects all changes that the latest call to **validate** included, thereby acting as a preview for the changes. In case the client tries to set the value to something invalid, the invalid change is also reflected here. However a validation error (see below) indicates that a commit of this payload would fail. It might happen that setting one property affects the allowed values for another property. Thus by changing a property A the current value of another property B might become invalid. If the client did not yet touch the value of B, the payload will contain a default value for that property. Nevertheless the client will also receive an appropriate validation error for value B. The content of this element *can* be used as a template for the request body of a call to **validate** or **commit**. A call to **validate** and **commit** does not need to include all properties that were defined in the `payload` section. It is only necessary to include the properties that you want to change, as well as the `lockVersion` if one is present. However you *may* include all the properties sent in the `payload` section. ### Schema The schema embedded in a form is a normal [schema describing the underlying resource](https://www.openproject.org/docs/api/endpoints/schemas/). However, the embedded schema can change with each revalidation of the form. For example it might be possible, that changing the type of a work package affects its available properties, as well as possible values for certain properties. As this makes the embedded schema very dynamic, it is not included as a static link. ### Validation Errors Like a schema the validation errors build a dictionary where the key is a property name. Each value is an error object that indicates the error that occurred validating the corresponding property. There are only key value pairs for properties that failed validation, the element is empty if all validations succeeded. However note that even in the case of validation errors, the response you receive from the form endpoint will be an HTTP 200. That is because the main purpose of a form is helping the client to sort out validation errors. ### Meta object Form resources may have an additional `_meta` object that contains parameters to be sent together with the resource, but that do not belong to the resource itself. For example, parameters on if and how to send notifications for the action performed with the API request can be sent. Each individual endpoint will describe their meta properties, if available. name: Forms - description: |- Some endpoints, especially those returning `Collection` resources, support signaling desired properties. By signaling, the client can convey to the server the properties to include in a response. Currently only `select` is supported which allows to specify the subset of properties a client is interested in. The benefit of using `select` is reduced response time. Other signaling, especially expanding the embedded resources to include as well over multiple layers of embedding are in consideration to be implemented (probably named `embed`) but as of now, they are not supported. Please also see [the specification for OData that inspired this feature](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/). For example, a resource `/api/v3/bogus` that without signaling returns: ```json { "_type": "Collection" "count": 2, "total": 554, "_embedded": { "elements": [ { "id": 1, "name": "Some name" }, { "id": 9, "name": "Another name" } ] }, "_links": { "self": { "href": "/api/v3/bogus", "title": "A bogus collection" }, "bar": { "href": "/api/v3/bar", "title": "Foobar" } } } ``` can via signaling `/api/v3/bogus?select=total,elements/name,bar` be instructed to return: ```json { "total": 554, "_embedded": { "elements": [ { "name": "Some name" }, { "name": "Another name" } ] }, "_links": { "bar": { "href": "/api/v3/bar", "title": "Foobar" } } } ``` The `select` query property is a comma separated list of the properties to include, e.g. `select=total,elements/name,bar`. The API also accepts alternative styles of writing like `select=["total","elements/name","bar"]`. Each individual item in the list is the path inside the resource. So while `total` refers to the property on the top level, `elements/name` refers to the property `name` within the collection of `elements`. The full path has to be provided for every property, e.g. `select=elements/name,elements/id`. The order of the list has no impact on the selection. There is also a wildcard `*` which will result in every property on that level to be selected. To select every property in the example above, the client would have to signal `select=*,elements/*`. Please note that the nesting into `_embedded` and `_links` is not included in the query prop `select` as links in the context of HAL can be considered properties of the resource just the same as unnested properties and forcing clients to write the full nesting would not increase clarity. Link properties are considered to be a single value that cannot be split up further. Every property within a link will be returned if the link is signaled to be selected. The `select` signaling flag has been introduced for performance reasons. Not every endpoint supports it and those that do oftentimes only allow a subset of their resource's properties to be selected. Endpoints supporting the `select` query prop are documented accordingly. name: Signaling - description: |- An action is a change one can trigger within the OpenProject instance. This could be creating a work package, exporting work packages or updating a user. An action can also be something where the user is able to be involved so where the user is in the passive role e.g. when being assigned a work package. A capability combines an action with a context and a principal. It thus communicates, which principal can carry out (or be passively involved) which action within a certain context. E.g. a user might have the capability of creating work packages within a project. In other words, an action is independent of a principal and context while a capability is a relation between an action, the context and the principal. The actions are most of the time derived from permissions which can be configured via the administrative UI where an administrator selects from a set of permissions to be granted per role. But there are other cases, e.g. in order to become assignee or responsible of a work package, a user has to have a role which allows having work packages assigned which is not a permission. Even though user might have a capability, it might still not be possible to carry out the action because some other requirement is not met. E.g. a user might have the capability to update work packages, but if a particular work package is in a readonly state, that work package cannot be updated. *Only a small set of actions that actually already exist in the system are currently exposed via the api. They will be added over time.* ## Action An action describes what can be carried out within the application. Until an action becomes assigned, which turns it into a capability, it remains in the state of "could be". ### Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------------:|----------------------------------------- | ------------- | -------------------------------------------------------------- | -------------------- | | self | The action | Action | not null | READ | ### Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- | | id | Identifier for the action | String | Not null | READ | | name | A human readable name for the action *Not yet implemented* | String | Not null | READ | | description | Describes what can be done by principals having that action *Not yet implemented* | String | Not null | READ | | modules | Clusters the actions into groups into which they belong logically *Not yet implemented* | []String | Not null | READ | ## Capabilities Actions can be assigned to a principal by assigning roles to that principal. E.g. a user might receive the 'work_packages/show' action by having a role called reader assigned within a project. Whenever a principal is assigned an action within a context, the principal has additional capabilities. Exactly which actions can be gained by having a role assigned depends on the configuration of that role. The configuration is adaptable by admins within the administration of the OpenProject instance. ### Linked Properties | Link | Description | Type | Constraints | Supported operations | |-------------------- |----------------------------------------- | ------------- | --------------- | -------------------- | | self | The capability | | | | | action | The action the principal is granted | Action | not null | READ | | context | The context the principal has this the action in. This is typically a workspace or the global context. | Workspace or null | | READ | | principal | The principal being allowed the action. | Action | not null | READ | ### Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- | | id | Identifier for the action | String | Not null | READ | | name | A human readable name for the action | String | Not null | READ | name: Actions & Capabilities - description: |- ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | ------------- | ---- | ----------- | -------------------- | | id | Activity id | Integer | x > 0 | READ | | version | Activity version | Integer | x > 0 | READ | | comment | | Formattable | | READ / WRITE | | details | | Array of Formattable | | READ | | createdAt | Time of creation | DateTime | | READ | | updatedAt | Time of update | DateTime | | READ | Activity can be either _type `Activity` or _type `Activity::Comment`. name: Activities - description: |- Attachments are files that were uploaded to OpenProject. Each attachment belongs to a single container (e.g. a work package or a board message). ## Actions | Link | Description | Condition | |:-------------------:|----------------------------------------------------------------------| -------------------------------------------- | | delete | Deletes this attachment | **Permission**: edit on attachment container or being the author for attachments without container | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:----------------:| --------------------------------------------------- | ------------- | ----------- | -------------------- | | self | This attachment | Attachment | not null | READ | | container | The object (e.g. WorkPackage) housing the attachment| Anything | not null | READ | | author | The user who uploaded the attachment | User | not null | READ | | downloadLocation | Direct download link to the attachment | - | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |:------------:| ----------------------------------------------- | ----------- | ----------- | -------------------- | | id | Attachment's id | Integer | x > 0 | READ | | title | The name of the file | String | not null | READ | | fileName | The name of the uploaded file | String | not null | READ | | fileSize | The size of the uploaded file in Bytes | Integer | x >= 0 | READ | | description | A user provided description of the file | Formattable | not null | READ | | contentType | The files MIME-Type as determined by the server | String | not null | READ | | digest | A checksum for the files content | Digest | not null | READ | | createdAt | Time of creation | DateTime | not null | READ | name: Attachments - description: |- *Note: Budgets are currently only implemented as a stub. Further properties of budgets might be added at a future date, however they will require the view budget permission to be displayed.* ## Linked Properties: | Link | Description | Type | Constraints | Supported operations | |:---------:|-------------------------------------------- | ------------- | --------------------- | -------------------- | | self | This budget | Budget | not null | READ | ## Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :---------: | ------------------------------------------- | ----------- | ----------- | -------------------- | --------------------------- | | id | Budget id | Integer | x > 0 | READ | | | subject | Budget name | String | not empty | READ | | name: Budgets - description: |- The categories endpoints return collections or single entities of type `Category`. The following tables list the different properties of `Category` entities. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:---------------:| --------------------------------------------------- | ------------- | ----------- | -------------------- | | self | This category | Category | not null | READ | | project | The project of this category | Project | not null | READ | | defaultAssignee | Default assignee for work packages of this category | User | | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :--------: | ------------- | ------- | ----------- | -------------------- | | id | Category id | Integer | x > 0 | READ | | name | Category name | String | | READ | name: Categories - description: |- The configuration endpoint allows to read certain configuration parameters of the OpenProject instance. Note that there is no 1:1 relationship between this endpoint and the settings an administrator has at hand to modify the behaviour of the application via configuration.yml or ENV variables. For now this endpoint will only allow access to settings deemed useful for a client to know in general. As clients might rely on the combination of both, the system settings as well as the current user's preferences, the resource embeds the current user's preferences so client can fetch both with one request. | Link | Description | Type | Nullable | Supported operations | |:-------------------:| ------------------------------------------------ | ------------- | -------- | -------------------- | | self | The configuration | Configuration | | READ | | userPreferences | The preferences of the current user | UserPreferences | | READ | ## Local Properties | Property | Description | Type | Condition | Supported operations | | :-----------------------: | -------------------------------------------------------------------------- | ---------- | ----------------- | -------------------- | | maximumAttachmentFileSize | The maximum allowed size of an attachment in Bytes | Integer | | READ | | perPageOptions | Page size steps to be offered in paginated list UI | Integer[] | | READ | | hostName | The host name configured for the system | String | | READ | | durationFormat | The format used to display Work, Remaining Work, and Spent time durations. | String | | READ | | activeFeatureFlags | The list of all feature flags that are active | String[] | | READ | name: Configuration - description: |- Custom actions are a preconfigured set of changes that are applied to a work package. Currently, this resource is a stub. The conditions and changes defined for the custom action are not yet present in the resource. ## Actions | Link | Description | Condition | |:-------------------:|----------------------------------------------------------------------| --------------------------------------- | | executeImmediately | Apply the action to a work package | ## Linked Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | ------------------------------------------------------ | ----------- | -------------------------------- | -------------------- | | self | This custom action | CustomAction | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | ------------------------------------------------------ | ----------- | ------------ | -------------------- | | id | Custom action id | Integer | x > 0 | READ | | name | The user selected name of the custom action | String | | READ | | description | A text describing the custom action | String | | READ | name: Custom actions - description: |- The custom options endpoints return collections or single entities of type `CustomOption`. The following tables list the different properties of `CustomOption` entities. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------:|-------------------------- | ------------- | ----------- | -------------------- | | self | This custom option | CustomOption | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |:----------------:| ---------------------------------------------- | -------- | ----------- | -------------------- | | id | The identifier | Integer | | READ | | value | The value defined for this custom option | String | | READ | custom options are options of list custom fields. name: Custom Options - description: |- A document is a file containing a list of attachments. *Please note, that the endpoint is only a stub for now.* ## Actions None yet ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :-----------: | ------------------------------------- | ------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This document | Document | not null | READ | | | project | The project the document is in | Project | not null | READ / WRITE | | | attachments | The attachments belonging to the document | []Attachment | not null | READ / WRITE | | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | Document's id | Integer | x > 0 | READ | | | title | The title chosen for the collection of documents | String | max 60 characters | READ | | | description | A text describing the documents | String | | READ | | | createdAt | The time the document was created at | DateTime | | READ |   | name: Documents - description: TBD name: File links - description: |- A grid is a layout for a page or a part of the page of the OpenProject application. It defines the structure (number of rows and number of columns) as well as the contents of the page. The contents is defined by `GridWidget`s. While a `GridWidget` is its own type, it is not a resource in its own right as it is an intrinsic part of a `Grid`. Depending on what page a grid is defined for, different widgets may be eligible to be placed on the grid. The page might also define the permissions needed for accessing, creating or modifying the grid. Currently, the following pages employ grids: + /my/page: The My page every user has. Only a user can access or modify their "My page". *The delete action is not yet supported* ## Actions | Link | Description | Condition | |:-------------------:| -------------------------------------------------------------------- | ---------------------------------------------------------------- | | updateImmediately | Directly perform edits on this grid | **Permission**: depends on the page the grid is defined for | | update | Validate edits on the grid via a form resource before committing | **Permission**: depends on the page the grid is defined for | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :-----------: | -------------------------------------------------------------- | ------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This grid | Grid | not null | READ | | | page | The url of the page the grid is defined for | url | not null | READ / WRITE | The page cannot be changed after the creation | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | -------------- | | id | Grid's id | Integer | x > 0 | READ | | | rowCount | The number of rows the grid has | Integer | x > 0 | READ/WRITE | | | columnCount | The number of columns the grid has | Integer | x > 0 | READ/WRITE | | | widgets | The set of `GridWidget`s selected for the grid | []GridWidget | | READ/WRITE | The widgets cannot overlap | | createdAt | The time the grid was created | DateTime | | READ |   | | updatedAt | The time the grid was last updated | DateTime | | READ |   | ## GridWidget Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | -------------- | | identifier | The kind of widget | String | not null | READ/WRITE | | | startRow | The row the widget starts at (1 based) | Integer | x > 0, x < rowCount of the grid, x < endRow | READ/WRITE | | | endRow | The row the widget ends. The widget's area does not include the row itself. | Integer | x > 0, x <= rowCount of the grid, x > startRow | READ/WRITE | | | startColumn | The column the widget starts at (1 based) | Integer | x > 0, x < columnCount of the grid, x < endColumn | READ/WRITE | | | endColumn | The column the widget ends. The widget's area does not include the column itself. | Integer | x > 0, x <= columnCount of the grid, x > startColumn | READ/WRITE | | | options | An options hash of values customizable by the widget | JSON | | READ/WRITE | | name: Grids - description: |- Groups are collections of users. They support assigning/unassigning multiple users to/from a project in one operation. This resource does not yet have the form and schema endpoints. But as all properties are static, clients should still be able to work with this resource. ## Actions ## Actions | Link | Description | Condition | |:-------------------:| -------------------------------------------------------------------- | ---------------------------------------------------------------- | | delete | Deletes the group. | **Permission**: Administrator | | updateImmediately | Updates the group's attributes. | **Permission**: Administrator | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | |:-----------: |-------------------------------------------------------------- | ------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This group | Group | not null | READ | | | memberships | Link to collection of all the group's memberships. The list will only include the memberships in projects in which the requesting user has the necessary permissions. | MemberCollection | | READ | **Permission**: view members or manage members in any project | | members | The list all all the users that are members of the group | UserCollection | | READ/WRITE | **Permission**: manage members in any project to read & admin to write | Depending on custom fields defined for versions, additional linked properties might exist. ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | Group's id | Integer | x > 0 | READ | | | name | Group's full name, formatting depends on instance settings | String | | READ/WRITE | Admin to write | | createdAt | Time of creation | DateTime | | READ | Only visible by admins | | updatedAt | Time of the most recent change to the user | DateTime | | READ | Only visible by admins | Depending on custom fields defined for versions, additional properties might exist. name: Groups - description: |- The help texts endpoints return collections or single entities of type `HelpText`. The following tables list the different properties of `HelpText` entities. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------:|-------------------------- | ------------- | ----------- | -------------------- | | self | This help text | HelpText | not null | READ | | editText | Edit the help text entry | text/htm | Admin | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------- | -------------------- | ----------- | -------------------- | | id | Help text id | Integer | x > 0 | READ | | attribute | Attribute name | String | | READ | | attributeCaption | Attribute caption | String | | READ | | helpText | Help text content | Formattable | | READ | name: Help texts - description: |- Users and groups can become members of a project. Such a membership will also have one or more roles assigned to it. By that, memberships control the permissions a user has within a project. There are also memberships that do not govern the permissions within a certain project but rather govern global permissions. Among the permissions that can be granted like this are the permissions to "Create project" and "Manage users". Those memberships do not have a project associated. When creating and updating memberships, a custom message can be sent to users of new and updated memberships. This message can be provided within the `_meta` group. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------------:|----------------------------------------- | ------------- | -------------------------------------------------------------- | -------------------- | | self | This membership | Membership | not null | READ | | project | The project for which the membership is granted | Project | | READ | | roles | The list of roles the user or group is granted in the project | RoleCollection | not null | READ | | principal | The user or group that was granted membership | User or Group | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- | | id | Membership id | Integer | x > 0 | READ | | createdAt | Time of creation | DateTime | not null | READ | | updatedAt | Time of latest update | DateTime | not null | READ | ## Meta parameters | Meta property | Description | Type | Constraints | Supported operations |Condition | | :------------------------: | --------------------------------------------------- | ---- | ----------- | -------------------- |----------| | notificationMessage | The message included in the email(s) send to the users of new or updated memberships | Formattable | | READ/WRITE | | name: Memberships - description: |- News are articles written by users in order to inform other users of important information. ## Actions | Link | Description | Condition | |:-------------------:|--------------------------------------------------------------------------| ---------------------------------------| | delete | Delete the new | **Permission**: manage news | | updateImmediately | Directly perform edits on the news | **Permission**: manage news | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :-----------: | -------------------------------------| ------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This news | News | not null | READ | | | project | The project the news is situated in | Project | not null | READ / WRITE | | | author | The user having created the news | User | not null | READ | | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | News' id | Integer | x > 0 | READ | | | title | The headline of the news | String | max 60 characters | READ | | | summary | A short summary | String | max 255 characters | READ |   | | description | The main body of the news with all the details | String | | READ | | | createdAt | The time the news was created at | DateTime | | READ |   | name: News - description: |- Notifications are created through notifiable actions in OpenProject. Notifications are triggered by actions carried out in the system by users, e.g. editing a work package, but can also be send out because of time passing e.g. when a user is notified of a work package that is overdue. This endpoint only returns in-app notifications. ## Actions | Link | Description | Condition | |:-------------------:| -------------------------------------------------------------------- | --------------------------- | | read_ian | Marks the notification as read | notification is unread | | unread_ian | Marks the notification as unread | notification is read | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :-----------: | ---------------------------------------- | -------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This notification | Notification | not null | READ | | | project | The project containing the resource | Project | not null | READ | | | actor | The user that caused the notification | User | | READ | optional | | resource | The resource the notification belongs to | Polymorphic | not null | READ | | | activity | The journal the notification belongs to | Polymorphic | | READ | optional | | details | A list of objects including detailed information | Polymorphic | | READ | optional | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | Primary key | Integer | | READ | | | subject | The subject of the notification | String | | READ | | | reason | The reason causing the notification | String | | READ | | | readIAN | Whether the notification is read | Boolean | | READ | | name: Notifications - description: TBD name: OAuth 2 - description: "Portfolios are one of the types of [workspaces](https://www.openproject.org/docs/api/endpoints/workspaces) in OpenProject structuring the information (e.g. work packages, wikis) into smaller sets. They are typically used to group, structure and manage sub-portfolios, programs and projects that\ntarget similar strategic goals of the organization. \n\nAs containers, they also control behaviour of the elements within them. One of the most important aspects of this is that portfolios limit permissions by having members with a certain permission set (roles) assigned to them.\n\n## Actions\n\n| Link | Description | Condition |\n|:--------------------------: \ |----------------------------------------------------------------------| --------------------------------- \ |\n| update | Form endpoint that aids in updating this portfolio | **Permission**: edit workspace |\n| updateImmediately | Directly update this portfolio | **Permission**: edit workspace |\n| delete | Delete this portfolio | **Permission**: admin |\n| favor | Mark this portfolio as favorited by the current user | **Permission**: none but login is required, only present if the portfolio is not yet favorited |\n| disfavor | Mark this portfolio as no longer favorited by the current user | **Permission**: none but login is required, only present if the portfolio is favorited |\n| createWorkPackage | Form endpoint that aids in preparing and creating a work package | **Permission**: add work packages |\n| createWorkPackageImmediately | Directly creates a work package in the portfolio \ | **Permission**: add work packages |\n\n## Linked Properties\n\n| Link | Description | Type | Constraints | Supported operations |Condition |\n| :----------: | ------------- | ---- | ----------- | -------------------- |----------------------------------------- \ |\n| self | This portfolio | Portfolio | not null | READ | |\n| ancestors | Array of all ancestors of the portfolio, down from the root node (first element) to the parent (last element). | Collection | not null \ | READ | **Permission** view portfolio on the ancestor portfolio. Non visible portfolios will be omitted |\n| categories | Categories available in this portfolio | Collection | not null | READ | |\n| types | Types available in this portfolio | Collection | not null | READ | **Permission**: view work packages or manage types |\n| versions \ | Versions available in this portfolio | Collection | not null | READ | **Permission**: view work packages or manage versions |\n| memberships \ | Memberships in the portfolio | Collection | not null | READ | **Permission**: view members \ |\n| workPackages | Work Packages of this portfolio | Collection | not null | READ | |\n| parent | Parent portfolio of the portfolio | Portfolio | | READ/WRITE | **Permission** edit workspace \ |\n| status \ | Denotes the status of the portfolio, so whether the portfolio is on track, at risk or is having trouble. | PortfolioStatus | | READ/WRITE \ | **Permission** edit workspace |\n\nDepending on custom fields defined for portfolios, additional links might exist.\n\nNote, that the parent and ancestor links may contain the \"undisclosed uri\" `urn:openportfolio-org:api:v3:undisclosed` in case an\nancestor portfolio is defined but the client lacks permission to see it. See the\n[general introduction into links' properties](https://www.openportfolio.org/docs/api/basic-objects/#local-properties) for more information.\n\n## Local Properties\n\n| Property | Description \ | Type | Constraints | Supported operations |\n| :---------------------:| ------------- | ---- | ----------- | -------------------- |\n| id | Portfolios' id | Integer | x > 0 | READ/WRITE |\n| identifier | | String | | READ/WRITE |\n| name | | String | | READ/WRITE |\n| active | Indicates whether the portfolio is currently active or already archived | Boolean | | READ/WRITE |\n| favorited | Indicates whether the portfolio is favorited by the current user | Boolean \ | | READ |\n| statusExplanation | A text detailing and explaining why the portfolio has the reported status | Formattable | | READ/WRITE |\n| public | Indicates whether the portfolio is accessible for everybody | Boolean \ | | READ/WRITE |\n| description | | Formattable | | READ/WRITE |\n| createdAt | Time of creation | DateTime | | READ |\n| updatedAt | Time of the most recent change to the portfolio | DateTime | | READ |\n\nDepending on custom fields defined for portfolios, additional properties might exist." name: Portfolios - description: |- Represents a post in a board. Posts are also referred to as messages in the application. *This resource is currently a stub* ## Actions | Link | Description | Condition | |:-------------------:|--------------------------------| --------------------------------------- | | addAttachment | Attach a file to the post | **Permission**: edit messages | ## Linked Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | ------------------------------------------------------ | ----------- | -------------- | -------------------- | | self | This post | Post | not null | READ | | attachments | The files attached to this post | Collection | | READ | | project | The project the post belongs to | Project | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | ------------------------------------------- | ----------- | ------------------------------------ | -------------------- | | id | Identifier of this post | Integer | x > 0 | READ | | subject | The post's subject | String | not null | READ | name: Posts - description: |- Principals are the superclass of users, groups and placeholder users. This endpoint returns all principals within a joined collection but can be filtered to e.g. only return groups or users. name: Principals - description: |- The priorities endpoints return collections or single entities of type `Priority`. The following tables list the different properties of `Priority` entities. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:---------:|-------------------------------------------- | ------------- | --------------------- | -------------------- | | self | This priority | Priority | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | ------------------------------------------- | ---------- | ----------- | -------------------- | | id | Priority id | Integer | x > 0 | READ | | name | Priority name | String | not empty | READ | | position | Sort index of the priority | Integer | x > 0 | READ | | isDefault | Indicates whether this is the default value | Boolean | | READ | | isActive | Indicates whether the priority is available | Boolean | | READ | name: Priorities - description: "Programs are one of the types of [workspaces](https://www.openproject.org/docs/api/endpoints/workspaces) in OpenProject structuring the information \n(e.g. work packages, wikis) into smaller sets. They are typically used to group, structure and manage projects that \ntarget similar strategic goals of the organization and belong to a portfolio. \n\nAs containers, they also control behaviour of the elements within them. One of the most important aspects of this is that programs limit permissions by having members with a certain permission set (roles) assigned to them.\n\n## Actions\n\n| Link | Description | Condition |\n|:--------------------------: \ |----------------------------------------------------------------------| --------------------------------- \ |\n| update | Form endpoint that aids in updating this program | **Permission**: edit workspace |\n| updateImmediately | Directly update this program | **Permission**: edit workspace |\n| delete | Delete this program | **Permission**: admin |\n| favor | Mark this program as favorited by the current user \ | **Permission**: none but login is required, only present if the program is not yet favorited |\n| disfavor | Mark this program as no longer favorited by the current user | **Permission**: none but login is required, only present if the program is favorited |\n| createWorkPackage \ | Form endpoint that aids in preparing and creating a work package \ | **Permission**: add work packages |\n| createWorkPackageImmediately | Directly creates a work package in the program \ | **Permission**: add work packages |\n\n## Linked Properties\n\n| Link | Description | Type | Constraints | Supported operations |Condition |\n| :----------: | ------------- | ---- | ----------- | -------------------- |----------------------------------------- \ |\n| self | This program | Program | not null | READ | |\n| ancestors | Array of all ancestors of the program, down from the root node (first element) to the parent (last element). | Collection | not null | READ | **Permission** view program on the ancestor program. Non visible programs will be omitted |\n| categories | Categories available in this program | Collection | not null | READ | |\n| types | Types available in this program | Collection | not null | READ | **Permission**: view work packages or manage types |\n| versions \ | Versions available in this program | Collection | not null | READ | **Permission**: view work packages or manage versions |\n| memberships \ | Memberships in the program | Collection | not null | READ | **Permission**: view members \ |\n| workPackages | Work Packages of this program | Collection | not null | READ | |\n| parent | Parent program of the program | Program | | READ/WRITE | **Permission** edit workspace \ |\n| status \ | Denotes the status of the program, so whether the program is on track, at risk or is having trouble. | ProgramStatus | | READ/WRITE \ | **Permission** edit workspace |\n\nDepending on custom fields defined for programs, additional links might exist.\n\nNote, that the parent and ancestor links may contain the \"undisclosed uri\" `urn:openprogram-org:api:v3:undisclosed` in case an\nancestor program is defined but the client lacks permission to see it. See the\n[general introduction into links' properties](https://www.openproject.org/docs/api/basic-objects/#local-properties) for more information.\n\n## Local Properties\n\n| Property | Description \ | Type | Constraints | Supported operations |\n| :---------------------:| ------------- | ---- | ----------- | -------------------- |\n| id | Programs' id | Integer | x > 0 | READ/WRITE |\n| identifier | | String | | READ/WRITE |\n| name | | String | | READ/WRITE |\n| active | Indicates whether the program is currently active or already archived | Boolean | | READ/WRITE |\n| favorited | Indicates whether the program is favorited by the current user | Boolean \ | | READ |\n| statusExplanation | A text detailing and explaining why the program has the reported status | Formattable | | READ/WRITE |\n| public | Indicates whether the program is accessible for everybody | Boolean \ | | READ/WRITE |\n| description | | Formattable | | READ/WRITE |\n| createdAt | Time of creation | DateTime | | READ |\n| updatedAt | Time of the most recent change to the program | DateTime | | READ |\n\nDepending on custom fields defined for programs, additional properties might exist." name: Programs - description: |- Project phases separate the whole of the project's duration into smaller, distinct parts where each phase has its own start and end date. Such a phase will then have different focus on certain aspects of project management. E.g. while the first phase might be about gathering requirements, the second phase might be about implementing the requirements and the third phase might be about testing the implementation. Phases within a project are concrete instances of a phase definition. That way, one or a number of project life cycles can be defined throughout the OpenProject instance and then be reused in different projects. Projects can enable or disable the use of a phase definition in a project and assign dates to the phase instances. ## Actions * None currently ## Linked Properties | Link | Description | Type | Constraints | Supported operations |Condition | | :----------: | ------------- | ---- | ----------- | -------------------- |----------------------------------------- | | self | This project phase | ProjectPhase | not null | READ | | | definition | This definition this phase relies on | ProjectPhaseDefinition | not null | READ | | | project | This project this phase is instantiated in | Project | not null | READ | | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------------------:| ------------- | ---- | ----------- | -------------------- | | id | Project phase's id | Integer | x > 0 | READ | | name | | String | | READ | | active | Indicates whether the project phase is currently active within the project | Boolean | | READ | | createdAt | Time of creation | DateTime | | READ | | updatedAt | Time of the most recent change to the project phase | DateTime | | READ | name: Project Phases - description: |- Project phases separate the whole of the project's duration into smaller, distinct parts. Such a phase will then have different focus on certain aspects of project management. E.g. while the first phase might be about gathering requirements, the second phase might be about implementing the requirements and the third phase might be about testing the implementation. The phases within the projects rely on an abstract definition of the project life cycle valid in a number of projects within the OpenProject instance. That definition is a set of ProjectPhaseDefinitions. ## Actions * None currently ## Linked Properties | Link | Description | Type | Constraints | Supported operations |Condition | | :----------: | ------------- | ---- | ----------- | -------------------- |----------------------------------------- | | self | This project phase definition | ProjectPhaseDefinition | not null | READ | | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |--------------- |-------------------------------------------------------------|-----------|-------------|----------------------| | id | Project phase definition's id | Integer | x > 0 | READ | | name | | String | | READ | | startGate | Indicates whether the project phase has a gate at the start | Boolean | | READ | | startGateName | The name of the gate at the start of the phase | String | | READ | | finishGate | Indicates whether the project phase has a gate at the end | Boolean | | READ | | finishGateName | The name of the gate at the end of the phase | String | | READ | | createdAt | Time of creation | DateTime | | READ | | updatedAt | Time of the most recent change to the project phase | DateTime | | READ | name: Project Phase Definitions - description: |- Projects are one of the types of [workspaces](https://www.openproject.org/docs/api/endpoints/workspaces) in OpenProject structuring the information (e.g. work packages, wikis) into smaller sets. They can be used in a classic project management approach but also when structuring work by departments. As containers, they also control behaviour of the elements within them. One of the most important aspects of this is that projects limit permissions by having members with a certain permission set (roles) assigned to them. Prior to OpenProject 17.0, only projects existed and the concept of workspaces wasn't implemented in the API. With 17.0 the other workspace types (program and portfolio) exist and might be returned in places where before, only projects were. ## Actions | Link | Description | Condition | |:--------------------------: |----------------------------------------------------------------------| --------------------------------- | | update | Form endpoint that aids in updating this project | **Permission**: edit workspace | | updateImmediately | Directly update this project | **Permission**: edit workspace | | delete | Delete this project | **Permission**: admin | | favor | Mark this project as favorited by the current user | **Permission**: none but login is required, only present if the project is not yet favorited | | disfavor | Mark this project as no longer favorited by the current user | **Permission**: none but login is required, only present if the project is favorited | | createWorkPackage | Form endpoint that aids in preparing and creating a work package | **Permission**: add work packages | | createWorkPackageImmediately | Directly creates a work package in the project | **Permission**: add work packages | ## Linked Properties | Link | Description | Type | Constraints | Supported operations |Condition | | :----------: | ------------- | ---- | ----------- | -------------------- |----------------------------------------- | | self | This project | Project | not null | READ | | | ancestors | Array of all ancestors of the project, down from the root node (first element) to the parent (last element). | Collection | not null | READ | **Permission** any permission on the ancestor project. Non visible projects will be omitted | | categories | Categories available in this project | Collection | not null | READ | | | types | Types available in this project | Collection | not null | READ | **Permission**: view work packages or manage types | | versions | Versions available in this project | Collection | not null | READ | **Permission**: view work packages or manage versions | | memberships | Memberships in the project | Collection | not null | READ | **Permission**: view members | | workPackages | Work Packages of this project | Collection | not null | READ | | | parent | Parent project of the project | Project | | READ/WRITE | **Permission** edit workspace | | status | Denotes the status of the project, so whether the project is on track, at risk or is having trouble. | ProjectStatus | | READ/WRITE | **Permission** edit workspace | Depending on custom fields defined for projects, additional links might exist. Note, that the parent and ancestor links may contain the "undisclosed uri" `urn:openproject-org:api:v3:undisclosed` in case an ancestor project is defined but the client lacks permission to see it. See the [general introduction into links' properties](https://www.openproject.org/docs/api/basic-objects/#local-properties) for more information. ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------------------:| ------------- | ---- | ----------- | -------------------- | | id | Projects' id | Integer | x > 0 | READ/WRITE | | identifier | | String | | READ/WRITE | | name | | String | | READ/WRITE | | active | Indicates whether the project is currently active or already archived | Boolean | | READ/WRITE | | favorited | Indicates whether the project is favorited by the current user | Boolean | | READ | | statusExplanation | A text detailing and explaining why the project has the reported status | Formattable | | READ/WRITE | | public | Indicates whether the project is accessible for everybody | Boolean | | READ/WRITE | | description | | Formattable | | READ/WRITE | | createdAt | Time of creation | DateTime | | READ | | updatedAt | Time of the most recent change to the project | DateTime | | READ | Depending on custom fields defined for projects, additional properties might exist. name: Projects - description: | A query defines how work packages can be filtered and displayed. Clients can define a query once, store it, and use it later on to load the same set of filters and display options. ## Actions | Link | Description | Condition | |:-------------------:|----------------------------------------------------------------------| --------------------------------------- | | star | Elevates the query to the status of 'starred' | **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is not yet starred | | unstar | Removes the 'starred' status | **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is starred | | update | Use the Form based process to verify the query before persisting | **Permission**: view work packages | | updateImmediately | Persist the query without using a Form based process for guidance | **Permission**: save queries for own queries, manage public queries for public queries; | ## Linked Properties | Property | Description | Type | Constraints | Supported operations | | :--------------------: | ------------------------------------------------------ | --------------------- | ------------------------------------------- | -------------------- | | self | This query | Query | not null | READ | | user | The user that owns this query | User | not null | READ | | project | The project on which this query operates | Project | | READ | | columns | Ordered list of QueryColumns. The columns, when mapped to WorkPackage properties determine which WorkPackage properties to display | []QueryColumn | | READ | | highlightedAttributes | **Only with valid Enterprise Token available:** List of QueryColumns that should get highlighted when `highlightingMode` is set to `inline`. | []QueryColumn | | READ | | sortBy | Ordered list of QuerySortBys. Indicates the WorkPackage property the results will be ordered by as well as the direction | []QuerySortBy | | READ | | groupBy | The WorkPackage property results of this query are grouped by | String | | READ | | results | The list of work packages returned by applying the filters, sorting and grouping defined in the query | WorkPackageCollection | | READ | | schema | This query's schema | Schema | | READ | Please note, that all the properties listed above will also be embedded when individual queries are returned but will not be embedded when a list of queries is returned. Whether the properties are embedded or not may be subject to change in the future. The `columns` and `highlightedAttributes` properties will be moved into `Views::WorkPackagesTable` so it is deprecated to have it listed within the Query directly. ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | -------------------------------------------------------------------------------------------------------- | --------------------- | ----------------------------------------------------------------------------------- | -------------------- | | id | Query id | Integer | x > 0 | READ | | name | Query name | String | | READ/WRITE | | filters | A set of QueryFilters which will be applied to the work packages to determine the resulting work packages| []QueryFilterInstance | | READ/WRITE | | sums | Should sums (of supported properties) be shown? | Boolean | | READ/WRITE | | timelineVisible | Should the timeline mode be shown? | Boolean | | READ/WRITE | | timelineLabels | Which labels are shown in the timeline, empty when default | QueryTimelineLabels | | READ/WRITE | | timelineZoomLevel| Which zoom level should the timeline be rendered in? | String | days, weeks, months, quarters, years | READ/WRITE | | timestamps | The timestamps to filter by when showing changed attributes on work packages.| []Timestamp | | **Values older than 1 day are accepted only with valid Enterprise Token available.**| READ/WRITE | | highlightingMode | Which highlighting mode should the table have? | String | none, inline, status, priority, type | READ/WRITE | | showHierarchies | Should the hierarchy mode be enabled? | Boolean | | READ/WRITE | | hidden | Should the query be hidden from the query list? | Boolean | | READ/WRITE | | public | Can users besides the owner see the query? | Boolean | | READ/WRITE | | starred | Should the query be highlighted to the user? | Boolean | | READ | | createdAt | Time of creation | DateTime | not null | READ | | updatedAt | Time of the most recent change to the query | DateTime | not null | READ | A query that is not assigned to a project (`"project": null`) is called a global query. Global queries filter work packages regardless of the project they are assigned to. As such, a different set of filters exists for those queries. The `hidden` property is deprecated as it is replaced by the `Views` concept. A query that isn't hidden will have a `View` while a query that is hidden won't. The `timelineVisible`, `timelineLabels`, `timelineZoomLevel`, `highlightingMode` and `showHierarchies` properties will be moved into the more appropriate Views (probably `Views::WorkPackagesTable`) so it is deprecated to have them within the Query directly. ## Query Filter Instance A QueryFilterInstance defines a filtering applied to the list of work packages. As such it contains: * the filter type (`QueryFilter`) used * the operator (`QueryOperator`) used * the list of values The list of values can either consist of a list of links or of a list of strings. If the values are primitive (e.g. Integer, Boolean, Date) they will be displayed as strings and the QueryFilterInstance will have a `values` property. ```json { "_type": "DueDateQueryFilter", "name": "Finish date", "values": [ "1" ], "_links": { "filter": { "href": "/api/v3/queries/filters/dueDate", "title": "Finish date" }, "operator": { "href": "/api/v3/queries/operators/ 0 | READ | | name | The internationalized name of this kind of relation | String | | READ | type | Which kind of relation (blocks, precedes, etc.) | String | in: relates, duplicates, duplicated, blocks, blocked, precedes, follows, includes, partof, requires, required | READ / WRITE | | reverseType | The kind of relation from the other WP's perspective | String | in: relates, duplicates, duplicated, blocks, blocked, precedes, follows, includes, partof, requires, required | READ | | description | Short text further describing the relation | String | | READ / WRITE | | lag* | The number of days between closing of `from` and start of `to`| Integer | x >= 0 | READ / WRITE | \* Only applicable for some relation types such as "follows". You can check using the relation by schema endpoint at `/api/v3/relations/schema/{type}`. name: Relations - description: |- Throughout OpenProject user input for many properties can be formatted using *Markdown*. Using the appropriate rendering endpoint it is possible to render custom formatted inputs into HTML and thus receive a preview of the rendered text. The request to a rendering endpoint must always have a MIME-Type of `text/plain`. The request body is the actual string that shall be rendered as HTML string. name: Previewing - description: |- Revisions are sets of updates to files in the context of repositories linked in OpenProject. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:----------------:| --------------------------------------------------------------------------------------------------| ------------- | ----------- | -------------------- | | self | This revision | Revision | not null | READ | | project | The project to which the revision belongs | Project | not null | READ | | author | The user that added this revision, if the authorName was mapped to a user in OpenProject | User | | READ | | showRevision | A URL to the repository view (outside APIv3) showing this revision | - | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |:-----------------------:| ------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------- | ----------- | -------------------- | | id | Revision's id, assigned by OpenProject | Integer | x > 0 | READ | | identifier | The raw SCM identifier of the revision (e.g. full SHA hash) | String | not null | READ | | formattedIdentifier | The SCM identifier of the revision, formatted (e.g. shortened unambiguous SHA hash). May be identical to identifier in many cases | String | not null | READ | | authorName | The name of the author that committed this revision. Note that this name is retrieved from the repository and does not identify a user in OpenProject. | String | not null | READ | | message | The commit message of the revision | Formattable | not null | READ | | createdAt | The time this revision was committed to the repository | DateTime | not null | READ | name: Revisions - description: |- When principals (groups or users) are assigned to a project, they are receive roles in that project. Roles regulate access to specific resources by having permissions configured for them. Currently, this is only a stub. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | | :-------------------: | ----------------------------------------- | ------------- | -------------------------------| -------------------- | | self | This role | Role | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- | | id | Role id | Integer | x > 0 | READ | | name | Role name | String | not null | READ | name: Roles - description: |- The root resource contains links to available resources in the API. By following these links a client should be able to discover further resources in the API. *Note: Currently there is no list action for projects available.* *A client will therefore have to know links to projects and can't (yet) discover them.* | Link | Description | Type | Nullable | Supported operations | Condition | | :-------------------: | ------------------------------------------------ | --------------- | -------- | -------------------- | --------- | | configuration | The configuration of this OpenProject instance | Configuration | | READ | | | user | The user currently logged-in | User | | READ | logged in | | userPreferences | The preferences of the logged-in user | UserPreference | | READ | logged in | | priorities | List of available priorities | Collection | | READ | **Permission** View work packages in any project | | statuses | List of available work package statuses | Collection | | READ | **Permission** View work packages in any project | | types | List of available work package types | Collection | | READ | **Permission** View work packages in any project | | workPackages | List of all work packages | Collection | | READ | **Permission** View work packages in any project | | users | List of all users | Collection | | READ | **Permission** Administrator | ## Local Properties | Property | Description | Type | Condition | Supported operations | | :-----------------------: | ---------------------------------------------------- | ---------- | --------------------------------- | -------------------- | | instanceName | The name of the OpenProject instance | String | | READ | | coreVersion | The OpenProject core version number for the instance | String | **Permission** requires admin privileges | READ | name: Root - description: |- The schema provides detailed information about the properties of a resource. The schema is represented by a dictionary where keys are names of resource properties and values are objects describing the corresponding property. These objects are called **field schema** and form the core of the schema representation. Each of them can contain its own `_links` and `_embedded` section. ## Linked Properties | Link | Description | Type | Nullable | Supported operations | |:-------------------:| ---------------------------------------- | ------------- | -------- | -------------------- | | self | This schema | Schema | | READ | ## Local Properties | Property | Description | Type | | :-----------------: | ---------------------------------------------------------------------------------- | ---------------- | | _dependencies | A list of dependencies between one property's value and another property | SchemaDependency | The `_dependencies` property contains the list of dependencies that exist between the value selected for one of the properties of the described resource and the resource's structure. Depending on the value, additional properties might exist or properties might have other values allowed to be assigned. See [SchemaDependency](https://www.openproject.org/docs/api/endpoints/schemas/#schema-dependencies) for more information. ## Field schema ### Linked Properties | Property | Description | Conditions | | :--------------: | -------------------------------------------------------------- | --------------------------------------------- | | allowedValues | List of resources that are assignable by the current user. | Will not exist if `allowedValuesSchemas` is present. | | allowedValuesSchemas | Link to schemas further describing the property. | Will not exist if `allowedValues` is present. | The `allowedValues` can either contain a list of canonical links or just a single link to a collection resource. This is an optimization to allow efficient handling of both small resource lists (that can be enumerated inline) and large resource lists (requiring one or more separate requests). The `allowedValuesSchemas` will on rare occasions (e.g. for a [Query](https://www.openproject.org/docs/api/endpoints/queries/)) replace `allowedValues`. This is done when there is no fixed set of allowed values. Instead, the allowed values will have to follow a schema, or one of a list of schemas, in its own right. Only one of the links (`allowedValues`, `allowedValuesSchemas`) will exist for any given property. ### Local Properties | Property | Description | Type | Default | |:-----------------:| ---------------------------------------------------------------------------------- | ------------ | ------- | | type | The data type of the property | MetaType | | | name | Human readable name of the property as it could be displayed in a UI | String | | | required | If true this property is not nullable | Boolean | true | | hasDefault | If true this property will have a default value if none is provided | Boolean | false | | writable | If false it is not allowed to **change** the property value | Boolean | true | | minLength | The value of the property must at least contain the specified amount of characters | Integer | 0 | | maxLength | The value of the property must at most contain the specified amount of characters | Integer | ∞ | | regularExpression | The value of the property must match the given regular expression (if not null) | String | null | | formula | If present, contains a formula that is used to calculate the value of the property | String | null | | location | If present, contains a reference to the location of the property in the JSON | String | null | | description | If present, contains a formattable, human readable description | Formattable | null | | deprecated | If present, the client should consider the existence of the property deprecated | Boolean | false | | placeholder | If present, contains the text to display as a placeholder, so if no value is set | String | null | All of the above properties that do not have a default value *must* be present in the schema. For properties that have a default value, the client can assume the default value, if the property is missing. Note that regular expressions used in the API follow the rules of [Ruby Regular Expressions](https://ruby-doc.org/core-2.2.6/Regexp.html). ### Location property The location property gives a hint as to where to find the resource property: * when not set, it is in the resource top level attributes; * when set to `_links`, it is under the path `_links.propertyName`; * when set to `_meta`, it is under the path `_meta.propertyName`. For example, for a work package schema, the field schema of the `user` property has a location property set to `_links`. This means that the `user` property will be found under the path `_links.user` of the json payload of the work package resource. ## Schema Dependencies A `SchemaDependency` describes the dependencies between a value chosen for a resource's property and the resource's structure. By that, additional properties or changes in a property are described. A `SchemaDependency` will never describe a property to disappear, only to appear. As such it always provides additional information. For a property that is depending on another property's value, this can result in not being listed in the resource's schema itself at all. This will be the case if the existence of the property as a whole will be dependent. If only one of the aspects (e.g. *writable*) of the property changes with the selected value, the property itself will already be listed in the schema, but it will lack the dependent aspect. Given that SchemaDependencies will only add information, and the content type of JSON, a client should be able to join the two objects, the schema and the dependency, into one object easily. SchemaDependencies are always embedded inside a Schema's `_dependencies` attribute. As such, they are not independently existing resources. Consequently, they do not have a `self` reference. ### Linked Properties A SchemaDependency does not have any links. ### Local Properties | Property | Description | Type | | :-----------------: | ---------------------------------------------------------------------------------- | ---------------- | | on | The name of the property on which the dependency exists | string | | dependencies | The additions to a schema grouped by the value of the depending property | object | The following excerpt exemplifies the objects that can be found as a value of the `dependencies` property: ```json { "_type": "SchemaDependency", "on": "someProperty", "dependencies": { "1": { "loremIpsum": { "type": "User", "name": "Lorem ipsum", "required": true, "hasDefault": false, "writable": true, "location": "_links", "placeholder": "Lorem ipsum placeholder", "description": { "format": "markdown", "raw": "A description for field Lorem ipsum. This may contain [links](https://example.com).", "html": "

A description for field Lorem ipsum. This may contain links.

" }; "_links": { "allowedValues": { "href": "/api/v3/some/path/to/users" } } } }, "2": { "loremIpsum": { "type": "User", "name": "Lorem ipsum", "required": true, "hasDefault": false, "writable": true, "location": "_links", "_links": { "allowedValues": { "href": "/api/v3/a/totally/different/path/to/other/users" } } } }, "3": { "loremIpsum": { "type": "User", "name": "Lorem ipsum", "required": true, "hasDefault": false, "writable": false, "location": "_links", } }, "4": {} } } ``` Given the example above: * If the depending property is `1`, `2` or `3`: * The client must set the property `loremIpsum`, because of `"required": true` for all three field schemas * When the depending property is `1` or `2`, the values allowed to be set for `loremIpsum` property differ * When the depending property is `3`, the `loremIpsum` property will not be writable * If the depending property is `4`, the `loremIpsum` property does not exist Because of the limitation of JSON objects, all keys will be strings, even when the depending value is actually something different (e.g. Integer, Date). This is also true for resources where the resource url is used as the key. name: Schemas - description: |- Work packages can be assigned to a sprint. This is employed in agile contexts such as Scrum or Kanban to group the work packages to be worked on within a defined time frame towards a defined goal. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------------:|----------------------------------------- | ------------- | -------------------------------------------------------------- | -------------------- | | self | This sprint | Sprint | not null | READ | | definingWorkspace | The workspace in which the sprint is defined | Workspace | | READ | | status | The status the sprint is in | URN | | READ | The status is represented as a URN and can have the following values: - **urn:openproject-org:api:v3:sprints:status:in_planning**: The sprint hasn't started yet, it is planned. - **urn:openproject-org:api:v3:sprints:status:active**: The sprint is currently active. - **urn:openproject-org:api:v3:sprints:status:completed**: The sprint has finished. ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- | | id | Sprint id | Integer | x > 0 | READ | | name | Sprint name | String | not null | READ | | description | | Formattable | | READ | | startDate | | Date | | READ | | finishDate | | Date | | READ | | createdAt | Time of creation | DateTime | not null | READ | | updatedAt | Time of the most recent change to the sprint | DateTime | not null | READ | name: Sprints - name: Statuses description: |- The statuses endpoints return collections or single entities of type `Status`. The following tables list the different properties of `Status` entities. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:----:|-------------|--------|-------------|----------------------| | self | This status | Status | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |:------------------:|--------------------------------------------------------------------------------------------------------------------------------------------|---------|---------------|----------------------| | id | Status id | Integer | x > 0 | READ | | name | Status name | String | | READ | | isClosed | Indicates, whether work package of this status are considered closed | Boolean | | READ | | color | A Hex-coded value of the color assigned to the status. | String | | READ | | isDefault | True, if this status is the default status for new work packages | Boolean | | READ | | isReadonly | Indicates, whether work package of this status are readonly | Boolean | | READ | | excludedFromTotals | Indicates, whether work package of this status are excluded from totals of
`Work`, `Remaining work`, and `% Complete` in a hierarchy. | Boolean | | READ | | defaultDoneRatio | The percentageDone being applied when changing to this status | Integer | 0 <= x <= 100 | READ | | position | Sort index of the status | Integer | | READ | - description: |- The time entries endpoints return collections or single entities of type `TimeEntry`. The following tables list the different properties of `TimeEntry` entities. ## Actions | Link | Description | Condition | |:-------------------:| -------------------------------------------------------------------------- | ---------------------------------------------------------------- | | updateImmediately | Directly perform edits on this time entry | **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user, or 'log own time' if the time entry is ongoing | | update | Form endpoint that aids in preparing and performing edits on a TimeEntry | **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user, or 'log own time' if the time entry is ongoing | | delete | Delete this time entry | **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user, or 'log own time' if the time entry is ongoing | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :-----------: | -------------------------------------------------------------- | ------------- | --------------------- | -------------------- | --------------------------------------------------------- | | self | This time entry | TimeEntry | not null | READ | | | project | The project the time entry is bundled in. The project might be different from the work package's project once the workPackage is moved. | Project | not null | READ / WRITE | | | workPackage | **DEPRECATED** The work package the time entry is created on | WorkPackage | | READ / WRITE | | | entity | The entity for which the time entry is created on | WorkPackage|Meeting | | READ / WRITE | | | user | The user the time entry tracks expenditures for | User | not null | READ / WRITE | **Permission**: Log time for other users permission | | activity | The time entry activity the time entry is categorized as | TimeEntriesActivity | | READ / WRITE | | Depending on custom fields defined for time entries, additional links might exist. Time entries are either linked to a work package or a meeting, the project reference is filled up automatically to point to the entity's project. ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | Time entries' id | Integer | x > 0 | READ | | | comment | A text provided by the user detailing the time entry | String | | READ / WRITE | | | spentOn | The date the expenditure is booked for | Date | | READ / WRITE | | | hours | The time quantifying the expenditure | Time | | READ / WRITE | | | ongoing | Whether the time entry is actively tracking | Boolean | | READ / WRITE | | | createdAt | The time the time entry was created | DateTime | | READ | | | updatedAt | The time the time entry was last updated | DateTime | | READ | | Depending on custom fields defined for time entries, additional properties might exist. name: Time entries - description: |- Time entries are classified by an activity which is one item of a set of user defined activities (e.g. Design, Specification, Development). ## Actions None ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :-----------: | -------------------------------------------------------------- | ------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This time entry activity | TimeEntriesActivity | not null | READ | | | projects | List of projects the time entry is active in | []Project | not null | READ / WRITE | | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | Time entries' id | Integer | x > 0 | READ | | | name | The human readable name chosen for this activity | String | max 30 characters | READ | | | position | The rank the activity has in a list of activities | Date | | READ |   | | default | Flag to signal whether this activity is the default activity | Boolean | | READ |   | name: Time entry activities - description: |- Work package types represented in the system. Types exist globally and are then activated for projects. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------:|-------------------------- | ------------- | ----------- | -------------------- | | self | This type | Type | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |:----------------:| ---------------------------------------------------- | -------- | ----------- | -------------------- | | id | Type id | Integer | x > 0 | READ | | name | Type name | String | | READ | | color | The color used to represent this type | Color | | READ | | position | Sort index of the type | Integer | | READ | | isDefault | Is this type active by default in new projects? | Boolean | | READ | | isMilestone | Do work packages of this type represent a milestone? | Boolean | | READ | | createdAt | Time of creation | DateTime | | READ | | updatedAt | Time of the most recent change to the user | DateTime | | READ | name: Types - description: |- The user preferences endpoints return collections or single entities of type `UserPreferences`. The following tables list the different properties of `UserPreferences` entities. ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:---------:|----------------------------------------------------------| -------------- | --------------------- | -------------------- | | self | This UserPreferences | UserPreferences| not null | READ | | user | The user that this preference belongs to | User | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | |:----------------------:| ----------------------------------------------------------- | ---------- | ----------- | -------------------- | | autoHidePopups | Whether to hide popups (e.g. success messages) after 5 seconds | Boolean | | READ / WRITE | | notifications | The settings for the notifications to be received by the user | NotificationSetting | | READ / WRITE | | timeZone | Current selected time zone | String | | READ / WRITE | | commentSortDescending | Sort comments in descending order | Boolean | | READ / WRITE | | warnOnLeavingUnsaved | Issue warning when leaving a page with unsaved text | Boolean | | READ / WRITE | name: UserPreferences - name: Users description: |- The users endpoints return collections or single entities of type `User`. The following tables list the different properties of `User` entities. ## Actions | Link | Description | Condition | |:-------------------:| -------------------------------------------------------------------- | ---------------------------------------------------------------- | | lock | Restrict the user from logging in and performing any actions | not locked; **Permission**: Administrator | | show | Link to the OpenProject user page (HTML) | | | unlock | Allow a locked user to login and act again | locked; **Permission**: Administrator | | updateImmediately | Updates the user's attributes. | **Permission**: Administrator, manage_user global permission | | delete | Permanently remove a user from the instance | **Permission**: Administrator, self-delete | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | |:-----------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | --------------------- | -------------------- | ----------------------------------------- | | self | This user | User | not null | READ | | | auth_source | Link to the user's auth source (endpoint not yet implemented) | LdapAuthSource | | READ / WRITE | **Permission**: Administrator | | members | Link to collection of all the user's memberships. The list will only include the memberships in projects in which the requesting user has the necessary permissions. | MemberCollection | | READ | **Permission**: view members or manage members in any project | Depending on custom fields defined for users, additional links might exist. ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- | | id | User's id | Integer | x > 0 | READ | | | login | User's login name | String | unique, 256 max length | READ / WRITE | **Permission**: Administrator, manage_user global permission | | firstName | User's first name | String | 30 max length | READ / WRITE | **Permission**: Administrator, manage_user global permission | | lastName | User's last name | String | 30 max length | READ / WRITE | **Permission**: Administrator, manage_user global permission | | name | User's full name, formatting depends on instance settings | String | | READ | | | email | User's email address | String | unique, 60 max length | READ / WRITE | E-Mail address not hidden, **Permission**: Administrator, manage_user global permission | | admin | Flag indicating whether or not the user is an admin | Boolean | in: [true, false] | READ / WRITE | **Permission**: Administrator | | avatar | URL to user's avatar | Url | | READ | | | status | The current activation status of the user (see below) | String | in: ["active", "registered", "locked", "invited"] | READ | | | language | User's language | String | ISO 639-1 | READ / WRITE | **Permission**: Administrator, manage_user global permission | | password | User's password for the default password authentication | String | | WRITE | **Permission**: Administrator | | identity_url | User's identity_url for OmniAuth authentication | String | | READ / WRITE | **Permission**: Administrator | | createdAt | Time of creation | DateTime | | READ | | | updatedAt | Time of the most recent change to the user | DateTime | | READ | | Depending on custom fields defined for users, additional properties might exist. The `status` of a user can be one of: * `active` - the user can log in with the account right away * `invited` - the user is invited and is pending registration If the user's `status` is set to `active` during creation a means of authentication has to be provided which is one of the following: * `password` - The password with which the user logs in. * `auth_source` - Link to an LDAP auth source. * `identity_url` - The identity URL of an OmniAuth authentication provider. If all of these are missing the creation will fail with an "missing password" error. The `language` is limited to those activated in the system. Due to data privacy, the user's properties are limited to reveal as little about the user as possible. Thus `login`, `firstName`, `lastName`, `language`, `createdAt` and `updatedAt` are hidden for all users except for admins or the user themselves. Please note that custom fields are not yet supported by the api although the backend supports them. - name: User Working Times description: |- User working times allow configuring per-user working hours and personal non-working days, in addition to the system-wide work schedule. A `UserWorkingHours` record defines how many hours a user works on each day of the week, along with an availability factor, effective from a given date (`validFrom`). Multiple records can exist for a user, each representing a period of their working time configuration. Only the most recently effective record (i.e., the one with the latest `validFrom` that is not in the future) is used for capacity calculations. A `UserNonWorkingTime` marks a date range as non-working for a user (e.g., a personal day off or a local holiday not covered by the system-wide non-working days). If a personal non-working time overlaps with system-wide non-working days, those days are not counted twice. ## UserWorkingHours Actions | Link | Description | Condition | | :----: | ----------------------------------- | --------------------------------------------------------------------------------------------- | | update | Update this working hours record | Record has not yet taken effect (`validFrom` is in the future); **Permission**: see below | | delete | Delete this working hours record | **Permission**: see below | ## UserWorkingHours Linked Properties | Link | Description | Type | Constraints | Supported operations | | :--: | -------------------------------------------------------- | ----------------- | ----------- | -------------------- | | self | This working hours record | UserWorkingHours | not null | READ | | user | The user this working hours record belongs to | User | not null | READ | ## UserWorkingHours Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------------: | ----------------------------------------------------------------------------------------- | ------- | -------------------- | -------------------- | | id | The unique identifier of the record | Integer | x > 0 | READ | | validFrom | The date from which this working hours configuration takes effect (ISO 8601 format) | Date | not null | READ / WRITE | | mondayHours | Hours worked on Monday | Float | x >= 0 | READ / WRITE | | tuesdayHours | Hours worked on Tuesday | Float | x >= 0 | READ / WRITE | | wednesdayHours | Hours worked on Wednesday | Float | x >= 0 | READ / WRITE | | thursdayHours | Hours worked on Thursday | Float | x >= 0 | READ / WRITE | | fridayHours | Hours worked on Friday | Float | x >= 0 | READ / WRITE | | saturdayHours | Hours worked on Saturday | Float | x >= 0 | READ / WRITE | | sundayHours | Hours worked on Sunday | Float | x >= 0 | READ / WRITE | | availabilityFactor| Percentage of working hours the user is available (0–100) | Integer | 0 <= x <= 100 | READ / WRITE | ## UserWorkingHours Permissions - **Administrators** can read and manage working hours for any user. - Users with the global **`manage_own_working_times`** permission can read and manage their own working hours. - Users with the global **`manage_working_times`** permission can read and manage working hours for any user. - All users can read their own working hours records even without a special permission. - Records that have already taken effect (i.e., `validFrom` is today or in the past) cannot be updated. ## UserNonWorkingTime Actions | Link | Description | Condition | | :----: | -------------------------------- | ------------------------ | | delete | Delete this non-working day | **Permission**: see below | ## UserNonWorkingTime Linked Properties | Link | Description | Type | Constraints | Supported operations | | :--: | ---------------------------------------------------- | ------------------ | ----------- | -------------------- | | self | This non-working day | UserNonWorkingTime | not null | READ | | user | The user this non-working day belongs to | User | not null | READ | ## UserNonWorkingTime Local Properties | Property | Description | Type | Constraints | Supported operations | | :-------: | ------------------------------------------------------------------------------- | ------- | -------------------- | -------------------- | | id | The unique identifier of the record | Integer | x > 0 | READ | | startDate | The first date of the non-working time range (ISO 8601 format) | Date | not null | READ / WRITE | | endDate | The last date of the non-working time range (ISO 8601 format) | Date | not null, >= startDate | READ / WRITE | ## UserNonWorkingTime Permissions - **Administrators** can read and manage personal non-working days for any user. - Users with the global **`manage_own_working_times`** permission can read and manage their own non-working days. - Users with the global **`manage_working_times`** permission can read and manage non-working days for any user. - A personal non-working time must not overlap with another non-working time record for the same user. - description: |- `Values::Property` represents a single key - value pair. That pair typically is an excerpt of the properties of a resource. `Values::Property` itself is not an independent resource. It will always be nested and as such will only exist as part of another resource. It is currently used e.g. in the Notification resource. ## Linked Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :--------------: | ----------------------------| ----------- | --------------------- | -------------------- | ------------------------- | | self | This value | Values::Property | not null | READ | | | schema | This value's schema | Schema | not null | READ | | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :--------------: | ------------------------------------------------------ | ----------- | -------------- | -------------------- | ---------------------------- | | property | The pairs' key name | String | not null | READ | | | value | The pairs' value | Polymorphic | | READ | | name: Values::Property - description: |- Work Packages can be assigned to a version. As such, versions serve to group Work Packages into logical units where each group comprises all the work packages that needs to be finished in order for the version to be finished. ## Actions | Link | Description | Condition | |:-------------------:|--------------------------------------------------------------------------| ---------------------------------------| | update | Form endpoint that aids in preparing and performing edits on the version | **Permission**: manage versions | | updateImmediately | Directly perform edits on the version | **Permission**: manage versions | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | |:-------------------:|----------------------------------------- | ------------- | -------------------------------------------------------------- | -------------------- | | self | This version | Version | not null | READ | | definingProject | The workspace to which the version belongs | Workspace | only present if the workspace is visible for the current user | READ | | availableInProjects | Workspaces where this version can be used | Workspaces | not null | READ | Depending on custom fields defined for versions, additional linked properties might exist. ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- | | id | Version id | Integer | x > 0 | READ | | name | Version name | String | not null, may not exceed 60 characters | READ / WRITE | | description | | Formattable | | READ / WRITE | | startDate | | Date | | READ / WRITE | | endDate | | Date | | READ / WRITE | | status | The current status of the version | String | not null, only 'open', 'finished', 'closed' | READ / WRITE | | sharing | The current status of the version | String | not null, limited to fixed set as defined by form | READ / WRITE | | createdAt | Time of creation | DateTime | not null | READ | | updatedAt | Time of the most recent change to the version | DateTime | not null | READ | Depending on custom fields defined for versions, additional properties might exist. name: Versions - description: "A View is a representation of some information. That information might be a query (currently it always is).\nThe view will store the configuration on how to display the information but not the information itself.\n\nA View might then be a graph, a table, a gantt chart or something completely different.\nThe client will have to choose how to represenent in the view. \n\nA View instance will always be of a subtype of `Views`, e.g. `Views::WorkPackageslist`. The properties between each `Views` type might differ a lot.\n\n**The View is a new concept so it is prone to change.**\n\nCurrently a lot of restrictions still apply:\n * There will always be a query associated to the view when in the complete concept, this limitation should not be necessary.\n * A query can only have one view associated.\n \ * There is neither an update nor a delete endpoint and the schema and form endpoints are also missing. \n To delete a view, simply delete the query.\n * Most of the properties are deduced from the associated query and can thus only be updated via updating the query.\n * The properties are not different between `Views` subtypes.\n\n## Linked Properties\n\n| Link | Description | Type | Constraints | Supported operations |\n| :-------------------: | ---------------------------------------- | ------------- | -------- | -------------------- |\n| self | This view | View (a subtype of it) | not null | READ |\n| query | This query from which to fetch the data | Query | not null | READ/WRITE |\n| project | This project the view is defined in (deduces from the query). If no project is specified, the View is considered global. | Project \ | Deduced from the query | READ |\n\n## Local Properties\n\n| Property | Description | Type | Constraints | Supported operations|\n| :--------------: | ------------------------------------------------------| ----------- | ------------------------------------ | --------------------|\n| _type | The subtype chosen | String \ | | READ |\n| id | View id | Integer \ | x > 0 | READ |\n| name | View name | String \ | Deduced from the query | READ |\n| public | Can users besides the owner see the view? | Boolean \ | Deduced from the query | READ |\n| starred | Should the view be highlighted to the user? | Boolean \ | Deduced from the query | READ |\n| createdAt | Time of creation | DateTime \ | not null | READ |\n| updatedAt | Time of the most recent change to the view | DateTime \ | not null | READ |" name: Views - description: |- Represents an individual page in a project's wiki. *This resource is currently a stub* ## Actions | Link | Description | Condition | |:-------------------:|----------------------------------------------------------------------| --------------------------------------- | | addAttachment | Attach a file to the wiki page | **Permission**: edit wiki page | ## Linked Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | ------------------------------------------------------ | ----------- | -------------- | -------------------- | | self | This wiki page | WikiPage | not null | READ | | attachments | The files attached to this wiki page | Collection | | READ | | project | The project the wiki page belongs to | Project | not null | READ | ## Local Properties | Property | Description | Type | Constraints | Supported operations | | :--------------: | ------------------------------------------- | ----------- | ------------------------------------ | -------------------- | | id | Identifier of this wiki page | Integer | x > 0 | READ | | title | The wiki page's title | String | not null | READ | name: Wiki Pages - description: |- The work packages endpoints return collections or single entities of type `WorkPackage`. The following tables list the different properties of `WorkPackage` entities. ## Actions | Link | Description | Condition | |:-------------------:|--------------------------------------------------------------------------| ---------------------------------------| | addAttachment | Attach a file to the WP | **Permission**: edit work package | | addComment | Post comment to WP | **Permission**: add work package notes | | addRelation | Adds a relation to this work package. | **Permission**: manage wp relations | | addWatcher | Add any user to WP watchers | **Permission**: add watcher | | customActions | Collection of predefined changes that can be applied to the work package | | | logTime | Log time on the work package | **Permission**: Log time, Log own time | | previewMarkup | Post markup (in markdown) here to receive an HTML-rendered response | | | removeWatcher | Remove any user from WP watchers | **Permission**: delete watcher | | unwatch | Remove current user from WP watchers | logged in; watching | | update | Form endpoint that aids in preparing and performing edits on a WP | **Permission**: edit work package | | updateImmediately | Directly perform edits on a work package | **Permission**: edit work package | | watch | Add current user to WP watchers | logged in; not watching | | delete | Delete this work package | **Permission**: delete work package | ## Linked Properties | Link | Description | Type | Constraints | Supported operations | Condition | | :--------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------------------------------- | --------------------- | ----------------------------------------- | | self | This work package | WorkPackage | not null | READ | | | schema | The schema of this work package | Schema | not null | READ | | | ancestors | Array of all visible ancestors of the work package, with the root node being the first element | Collection | not null | READ | **Permission** view work packages | | attachments | The files attached to this work package | Collection | not null | READ / WRITE | | | author | The person that created the work package | User | not null | READ | | | assignee | The person that is intended to work on the work package | User | | READ / WRITE | | | availableWatchers | All users that can be added to the work package as watchers. | User | | READ | **Permission** add work package watchers | | budget | The budget this work package is associated to | Budget | | READ / WRITE | **Permission** view cost objects | | category | The category of the work package | Category | | READ / WRITE | | | children | Array of all visible children of the work package | Collection | not null | READ | **Permission** view work packages | | parent | Parent work package | WorkPackage | Needs to be visible (to the current user) | READ / WRITE | | | priority | The priority of the work package | Priority | not null | READ / WRITE | | | project | The project to which the work package belongs | Project | not null | READ / WRITE | | | projectPhase | The project phase this work package is assigned to | ProjectPhase | | READ / WRITE | **Permission** view project phases. There has to be a project phase active in the project. | | projectPhaseDefinition | The project phase definition for the project phase of this work package. | ProjectPhaseDefinition | | READ | **Permission** view project phases. The associated project phase has to be active. | | responsible | The person that is responsible for the overall outcome | User | | READ / WRITE | | | relations | Relations this work package is involved in | Relation | | READ | **Permission** view work packages | | revisions | Revisions that are referencing the work package | Revision | | READ | **Permission** view changesets | | status | The current status of the work package | Status | not null | READ / WRITE | | | sprint | The sprint the work package is planned in | Sprint | | READ / WRITE | **Permission** view sprints | | subject | The subject of the work package | String | not null; 1 <= length <= 255 | READ / WRITE | | | timeEntries | All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change. | N/A | | READ | **Permission** view time entries | | type | The type of the work package | Type | not null | READ / WRITE | | | version | The version associated to the work package | Version | | READ / WRITE | | | watchers | All users that are currently watching this work package | Collection | | READ | **Permission** view work package watchers | ## Local Properties | Property | Description | Type | Constraints | Supported operations | Condition | | :--------------: | ------------------------------------------------------ | ----------- | ------------------------------------------------------------------------------------------------------ | -------------------- | -------------------------------- | | id | Work package id | Integer | x > 0 | READ | | | lockVersion | The version of the item as used for optimistic locking | Integer | | READ | | | subject | Work package subject | String | not null; 1 <= length <= 255 | READ / WRITE | Is write protected if the type has automatic subject generation configured. | | status | Name of the work package's status | String | not null | READ | | | type | Name of the work package's type | String | not null | READ | | | description | The work package description | Formattable | | READ / WRITE | | | scheduleManually | Uses manual scheduling mode when true (default). Uses automatic scheduling mode when false. Can be automatic only when predecessors or children are present. | Boolean | | READ / WRITE | | | startDate | Scheduled beginning of a work package | Date | Cannot be set for parent work packages unless it is scheduled manually; must be equal or greater than the earliest possible start date; Exists only on work packages of a non milestone type | READ / WRITE | | | dueDate | Scheduled end of a work package | Date | Cannot be set for parent work packages unless it is scheduled manually; must be greater than or equal to the start date; Exists only on work packages of a non milestone type | READ / WRITE | | | date | Date on which a milestone is achieved | Date | Exists only on work packages of a milestone type | READ / WRITE | | | derivedStartDate | Similar to start date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate. | Date | | READ | | | derivedDueDate | Similar to due date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate. | Date | | READ | | | duration | The amount of time in hours the work package needs to be completed. | Duration | Not available for milestone type of work packages. | READ / WRITE | | | estimatedTime | Corresponds to work. Time a work package likely needs to be completed. | Duration | | READ / WRITE | | | derivedEstimatedTime | Corresponds to total work. Time a work package likely needs to be completed including itself and its descendants. | Duration | | READ | | | remainingTime | Corresponds to remaining work. Remaining time a work package likely needs to be completed. | Duration | | READ / WRITE | | | derivedRemainingTime | Corresponds to total remaining work. Remaining time a work package likely needs to be completed including itself and its descendants. | Duration | | READ | | | ignoreNonWorkingDays | When scheduling, whether or not to ignore the non working days being defined. A work package with the flag set to true will be allowed to be scheduled to a non working day. | Boolean | Cannot be set for parent work packages unless it is scheduled manually | READ | | | position | The rank this work package has in a sprint or product backlog | Integer | | READ | The Backlogs module needs to be active in the project and the work package's type configured to be used with backlogs. | | spentTime | The time booked for this work package by users working on it | Duration | | READ | **Permission** view time entries | | storyPoints | The story points the work package is estimated to take to complete | Integer | | READ / WRITE | The Backlogs module needs to be active in the project and the work package's type configured to be used with backlogs. | | percentageDone | Corresponds to % complete. Amount of total completion for a work package. | Integer | 0 <= x <= 100; can be null | READ | | | derivedPercentageDone | Corresponds to total % complete. Amount of total completion for a work package and its descendants. | Integer | 0 <= x <= 100; can be null | READ | | | readonly | If true, the work package is in a readonly status so with the exception of the status, no other property can be altered. | Boolean | | READ | Enterprise edition only | | createdAt | Time of creation | DateTime | | READ | | | updatedAt | Time of the most recent change to the work package | DateTime | | READ | | Note that the properties listed here only cover the built-in properties of the OpenProject Core. Using plug-ins and custom fields a work package might contain various additional properties. A client can consult the schema information to which the work package links. The schema will contain information about all properties of the linking work package, including properties added by plug-ins and custom fields. Custom fields are identified by a key in the form of `customFieldN`, where `N` is an integer. Depending on their type, they can occur as properties or as linked properties. A client has to consult the schema to resolve the human readable name of custom fields. Properties that cannot be set directly on parent work packages are inferred from their children instead: * `startDate` is the earliest start date from its children if automatic scheduling is activated. * `dueDate` is the latest finish date from its children if automatic scheduling is activated. * `derivedEstimatedTime` is the sum of estimated times from its children and the work package's own estimated time. * `derivedRemainingTime` is the sum of remaining times from its children and the work package's own remaining time * `derivedPercentageDone` is computed by the work package's derivedEstimatedTime and derivedRemainingTime. `startDate` can also not be earlier than a finish date of any predecessor. While attachments are returned as a link whose content is to be fetched separately, clients can choose to replace the work package's attachments by providing an array of already uploaded [Attachment resources](https://www.openproject.org/docs/api/endpoints/attachments/) on [create](https://www.openproject.org/docs/api/endpoints/work-packages/#create-work-package) and [update](https://www.openproject.org/docs/api/endpoints/work-packages/#update-a-work-package). The attachments the work package has had prior to the request will be removed. name: Work Packages - name: Work Schedule description: |- The work schedule defines if days are working days or non-working days. A day can be a non-working day if any of these two conditions are met: - the day is a recurring non-working week day: a weekend day. For instance Sunday is not worked in most countries; - the day has been defined as a non-working day: national bank holidays or other days deemed special. For instance the 1st of January is New Year's day and is a bank holiday in most countries. Endpoints can define which week days are working/non-working days, and which dates are non-working days. To represent the work schedule, `Day`, `WeekDay`, and `NonWorkingDay` models are used. ## Day Actions None ## Day Linked Properties | Link | Description | Type | Constraints | Supported operations | | :---------------: | ---------------------------------------------------------------- | ------------------------- | ----------- | -------------------- | | self | This day | Day | not null | READ | | nonWorkingReasons | A list of resources describing why this day is a non-working day | (WeekDay/NonWorkingDay)[] | | READ | | weekDay | The week day for this day | WeekDay | not null | READ | ## Day Local Properties | Property | Description | Type | Constraints | Supported operations | | :--------: | ------------------------------------------- | ------- | -------------- | -------------------- | | date | The date in ISO8601 format (YYYY-MM-DD) | Date | not null | READ | | name | The name of the day | String | not null | READ | | working | `true` for a working day, `false` otherwise | Boolean | not null | READ | ## WeekDay Actions | Link | Description | Condition | | :----: | -------------------- | ---------------------------------- | | update | Update this week day | **Permission**: edit work schedule | ## WeekDay Linked Properties | Link | Description | Type | Constraints | Supported operations | | :--: | ------------- | ------- | ----------- | -------------------- | | self | This week day | WeekDay | not null | READ | ## WeekDay Local Properties | Property | Description | Type | Constraints | Supported operations | | :------: | --------------------------------------------------- | ------- | -------------- | -------------------- | | day | The week day from 1 to 7. 1 is Monday. 7 is Sunday. | Integer | x >= 1, x <= 7 | READ | | name | The name of the week day | String | not null | READ | | working | `true` for a working week day, `false` otherwise | Boolean | not null | READ/WRITE | ## NonWorkingDay Actions | Link | Description | Condition | | :----: | --------------------------- | ---------------------------------- | | update | Update this non-working day | **Permission**: edit work schedule | ## NonWorkingDay Linked Properties | Link | Description | Type | Constraints | Supported operations | | :--: | -------------------- | ------------- | ----------- | -------------------- | | self | This non-working day | NonWorkingDay | not null | READ | ## NonWorkingDay Local Properties | Property | Description | Type | Constraints | Supported operations | | :------: | --------------------------------------- | ------ | ----------- | -------------------- | | date | The date in ISO8601 format (YYYY-MM-DD) | Date | not null | READ | | name | The name of the non-working day day | String | not null | READ/WRITE | - name: Workspaces description: "Workspaces are containers for resources to be worked on and people with sets of permissions that work on the former. There is no actual workspace resource\nin OpenProject. Rather, it is the generic term describing:\n* [Portfolio](https://www.openproject.org/docs/api/endpoints/portfolios)\n* [Program](https://www.openproject.org/docs/api/endpoints/programs)\n* [Project](https://www.openproject.org/docs/api/endpoints/projects)\n\nA lot of resources reference the workspaces they are valid in, e.g. [Work package](https://www.openproject.org/docs/api/endpoints/work-packages/#linked-properties) and\n[Memberships](https://www.openproject.org/docs/api/endpoints/memberships/#linked-properties).\n\nBefore OP 17.0 only projects existed. At that point, the API v3 was already established. That is the reason why quite a number of\nresource have links called \"project\" or similar when they are in fact contained in a different type of workspace. To not break the API, the name of the link was kept. \nBut those links can contain the other types of workspaces as well. It can thus be possible for a work package to have the following:\n\n```\n {\n \"_links\": {\n \"project\": {\n \ \"href\": \"/api/v3/portfolios/48\",\n \"title: \"A portfolio\"\n \ },\n ...\n },\n ...\n }\n```\n\nAccordingly, to set the workspace a resource is in, sending any workspace link to the link property will be accepted by the API.\n\nThe concept of workspaces is planned to be extended to include further types." security: - BasicAuth: []