Craft.io Work Items and OKRs API

Work items are the main building blocks of your product’s roadmap, and include Products, Epics, Features and Sub Features. OKRs are the goal-setting framework of your product’s roadmap, and include Objectives and Key Results.

OpenAPI Specification

craft-io-work-items-and-okrs-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Craft.io Feedback Portal Feedback items Work Items and OKRs API
  description: REST API for managing customer feedback portals, including listing portals and categories, retrieving feedback items, and submitting new feedback via POST requests.
  version: 1.0.0
  contact:
    name: Craft.io Support
    url: https://help.craft.io/
    email: support@craft.io
servers:
- url: /
tags:
- name: Work Items and OKRs
  description: Work items are the main building blocks of your product’s roadmap, and include Products, Epics, Features and Sub Features.<br /> OKRs are the goal-setting framework of your product’s roadmap, and include Objectives and Key Results.
paths:
  /item/{itemId}:
    get:
      operationId: GetItem
      responses:
        '200':
          description: The item’s metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
        '400':
          description: Invalid item ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '404':
          description: No item found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while fetching item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Get a specific work item metadata by its ID
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - read:items:craft
      parameters:
      - in: path
        name: itemId
        required: true
        schema:
          type: string
      - description: Comma separated field list to be included in response, set "all" for all fields
        in: query
        name: fields
        required: false
        schema:
          type: string
    delete:
      operationId: DeleteItem
      responses:
        '200':
          description: The item’s metadata
          content:
            application/json:
              schema:
                properties:
                  message:
                    type: string
                required:
                - message
                type: object
        '400':
          description: Invalid item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '404':
          description: No workspace found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while creating item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Delete a work item
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - delete:items:craft
      parameters:
      - in: path
        name: itemId
        required: true
        schema:
          type: string
  /item/{itemId}/flat:
    get:
      operationId: GetItemFlat
      responses:
        '200':
          description: The item’s metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ItemFlat'
              examples:
                Example 1:
                  value:
                    id: string
                    type: string
                    workspaceId: string
                    title: string
                    description: string
                    creationTime: '2022-09-16T06:26:01.000Z'
                    updateTime: '2023-06-14T13:54:34.792Z'
                    status_id: string
                    status_name: string
                    importance_id: string
                    importance_name: string
                    objective_id: string
                    objective_name: string
                    keyResult_id: string
                    keyResult_name: string
                    persona_id: string
                    persona_name: string
                    sprint_id: string
                    sprint_name: string
                    quarter_id: string
                    release_name: string
                    assignee_id: string
                    assignee_team: string
                    assignee_user: string
                    storyPoints: 0
                    estimatedHours: 0
                    actualStartDate: '2023-06-06T06:56:35.000Z'
                    actualEndDate: '2023-06-20T06:56:35.000Z'
                    devToolKey:
                      jira: string
                      ado: string
                      github: string
                      gitlab: string
                      pivotaltracker: string
                      targetprocess: string
                    parent_id: string
                    parent_title: string
                    parent_shortId: string
                    custom_2305843010172190992: string
                    custom_2305843010172191018: string
                    custom_2305843010172191132: string
                    custom_2305843010172191024: string
                    custom_2305843010172191022: string
                    custom_2305843010172191016: '2023-06-20T21:00:00.000Z'
                    custom_2305843010172171351: string
                    custom_2305843010172171349: string
                    custom_2305843010172171347: string
                    custom_2305843010172190959:
                    - string
                    labels:
                    - string
        '400':
          description: Invalid item ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '404':
          description: No item found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while fetching item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Get a specific work item metadata by its ID (flattened format)
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - read:items:craft
      parameters:
      - in: path
        name: itemId
        required: true
        schema:
          type: string
      - description: Comma separated field list to be included in response, set "all" for all fields
        in: query
        name: fields
        required: false
        schema:
          type: string
  /workspace/{workspaceId}/items:
    get:
      operationId: GetItems
      responses:
        '200':
          description: List of workspace items, OKRs and their metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ItemsPaginated_Item_'
        '400':
          description: Invalid workspace ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while fetching item list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Get all workspace working items and OKRs metadata by the workspace ID
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - read:items:craft
      parameters:
      - in: path
        name: workspaceId
        required: true
        schema:
          type: string
      - description: Comma separated field list to be included in response, set "all" for all fields
        in: query
        name: fields
        required: false
        schema:
          type: string
      - in: query
        name: page
        required: false
        schema:
          default: 1
          format: double
          type: number
      - in: query
        name: limit
        required: false
        schema:
          default: 50
          format: double
          type: number
      - description: Get list of items updated after this date (e.g. 2023-08-09T12:33:18.615Z )
        in: query
        name: updated_from
        required: false
        schema:
          format: date-time
          type: string
      - description: Get list of items updated before this date (e.g. 2023-09-09T23:22:10.531Z )
        in: query
        name: updated_to
        required: false
        schema:
          format: date-time
          type: string
      - description: Filter by item type (default term), comma separated
        in: query
        name: type
        required: false
        schema:
          type: string
      - description: Filter by parent/ancestor IDs (comma separated). MUST be internal numeric IDs (e.g. `2305843010635321210`), NOT shortIds like `CRK-25832` — the SQL casts to `::bigint[]`, so a shortId yields zero matches (200 with an empty list, no error). To resolve a shortId first, call the same list endpoint with `?shortId=<KEY-N>` to get the numeric id.
        in: query
        name: parents
        required: false
        schema:
          type: string
      - description: Case-insensitive substring search over title + description. Min 2 chars; shorter values are ignored.
        in: query
        name: keyword
        required: false
        schema:
          type: string
      - description: Exact match on textual short id (e.g. `CRK-20091`). When supplied, takes precedence over `keyword` and resolves via the `(ct_craft_product__id, short_id)` unique index — sub-millisecond, returns at most one item.
        in: query
        name: shortId
        required: false
        schema:
          type: string
      - in: query
        name: status
        required: false
        schema:
          type: string
      - in: query
        name: importance
        required: false
        schema:
          type: string
      - in: query
        name: assignee
        required: false
        schema:
          type: string
      - in: query
        name: sprint
        required: false
        schema:
          type: string
      - in: query
        name: quarter
        required: false
        schema:
          type: string
      - in: query
        name: labels
        required: false
        schema:
          type: string
      - in: query
        name: createdBy
        required: false
        schema:
          type: string
      - in: query
        name: created_from
        required: false
        schema:
          format: date-time
          type: string
      - in: query
        name: created_to
        required: false
        schema:
          format: date-time
          type: string
  /workspace/{workspaceId}/items/flat:
    get:
      operationId: GetItemsFlat
      responses:
        '200':
          description: List of workspace items, OKRS and their metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ItemsPaginated_ItemFlat_'
              examples:
                Example 1:
                  value:
                    items:
                    - id: string
                      type: string
                      workspaceId: string
                      title: string
                      description: string
                      creationTime: '2022-09-16T06:26:01.000Z'
                      updateTime: '2023-06-14T13:54:34.792Z'
                      status_id: string
                      status_name: string
                      importance_id: string
                      importance_name: string
                      objective_id: string
                      objective_name: string
                      keyResult_id: string
                      keyResult_name: string
                      persona_id: string
                      persona_name: string
                      sprint_id: string
                      sprint_name: string
                      quarter_id: string
                      release_name: string
                      assignee_id: string
                      assignee_team: string
                      assignee_user: string
                      storyPoints: 0
                      estimatedHours: 0
                      actualStartDate: '2023-06-06T06:56:35.000Z'
                      actualEndDate: '2023-06-20T06:56:35.000Z'
                      devToolKey:
                        jira: string
                        ado: string
                        github: string
                        gitlab: string
                        pivotaltracker: string
                        targetprocess: string
                      parent_id: string
                      parent_title: string
                      parent_shortId: string
                      custom_2305843010172190992: string
                      custom_2305843010172191018: string
                      custom_2305843010172191132: string
                      custom_2305843010172191024: string
                      custom_2305843010172191022: string
                      custom_2305843010172191016: '2023-06-20T21:00:00.000Z'
                      custom_2305843010172171351: string
                      custom_2305843010172171349: string
                      custom_2305843010172171347: string
                      custom_2305843010172190959:
                      - string
                      labels:
                      - string
                    metadata:
                      currentPage: 0
                      perPage: 0
                      totalPages: 0
                      totalRecords: 0
        '400':
          description: Invalid workspace ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while fetching item list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Get all workspace working items and OKRs metadata by the workspace ID (flattened format)
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - read:items:craft
      parameters:
      - in: path
        name: workspaceId
        required: true
        schema:
          type: string
      - description: Comma separated field list to be included in response, set "all" for all fields
        in: query
        name: fields
        required: false
        schema:
          type: string
      - in: query
        name: page
        required: false
        schema:
          default: 1
          format: double
          type: number
      - in: query
        name: limit
        required: false
        schema:
          default: 50
          format: double
          type: number
      - description: Get list of items updated after this date (e.g. 2023-08-09T12:33:18.615Z )
        in: query
        name: updated_from
        required: false
        schema:
          format: date-time
          type: string
      - description: Get list of items updated before this date (e.g. 2023-09-09T23:22:10.531Z )
        in: query
        name: updated_to
        required: false
        schema:
          format: date-time
          type: string
      - description: Filter by item types (default term), comma separated
        in: query
        name: type
        required: false
        schema:
          type: string
      - description: Filter by parent/ancestor IDs (comma separated). MUST be internal numeric IDs (e.g. `2305843010635321210`), NOT shortIds like `CRK-25832` — the SQL casts to `::bigint[]`, so a shortId yields zero matches (200 with an empty list, no error). To resolve a shortId first, call the same list endpoint with `?shortId=<KEY-N>` to get the numeric id.
        in: query
        name: parents
        required: false
        schema:
          type: string
      - description: Case-insensitive substring search over title + description. Min 2 chars; shorter values are ignored.
        in: query
        name: keyword
        required: false
        schema:
          type: string
      - description: Exact match on textual short id (e.g. `CRK-20091`). When supplied, takes precedence over `keyword` and resolves via the `(ct_craft_product__id, short_id)` unique index.
        in: query
        name: shortId
        required: false
        schema:
          type: string
      - in: query
        name: status
        required: false
        schema:
          type: string
      - in: query
        name: importance
        required: false
        schema:
          type: string
      - in: query
        name: assignee
        required: false
        schema:
          type: string
      - in: query
        name: sprint
        required: false
        schema:
          type: string
      - in: query
        name: quarter
        required: false
        schema:
          type: string
      - in: query
        name: labels
        required: false
        schema:
          type: string
      - in: query
        name: createdBy
        required: false
        schema:
          type: string
      - in: query
        name: created_from
        required: false
        schema:
          format: date-time
          type: string
      - in: query
        name: created_to
        required: false
        schema:
          format: date-time
          type: string
  /portfolio_item/{itemId}:
    get:
      operationId: GetInitiative
      responses:
        '200':
          description: The item’s metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Initiative'
        '400':
          description: Invalid item ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '404':
          description: No item found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while fetching item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Get a specific portfolio item metadata by its ID
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - read:portfolios:craft
      parameters:
      - in: path
        name: itemId
        required: true
        schema:
          type: string
      - description: Comma separated field list to be included in response, set "all" for all fields
        in: query
        name: fields
        required: false
        schema:
          type: string
  /portfolio/{portfolioId}/items:
    get:
      operationId: GetInitiatives
      responses:
        '200':
          description: List of portfolio initiatives and their metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ItemsPaginated_Initiative_'
        '400':
          description: Invalid portfolio ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to portfolio
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while fetching item list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Get all portfolio initiatives and OKRs metadata by the portfolio ID
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - read:portfolios:craft
      parameters:
      - in: path
        name: portfolioId
        required: true
        schema:
          type: string
      - description: Comma separated field list to be included in response, set "all" for all fields
        in: query
        name: fields
        required: false
        schema:
          type: string
      - in: query
        name: page
        required: false
        schema:
          default: 1
          format: double
          type: number
      - in: query
        name: limit
        required: false
        schema:
          default: 50
          format: double
          type: number
      - description: Get list of items updated after this date (e.g. 2023-08-09T12:33:18.615Z )
        in: query
        name: updated_from
        required: false
        schema:
          format: date-time
          type: string
      - description: Get list of items updated before this date (e.g. 2023-09-09T23:22:10.531Z )
        in: query
        name: updated_to
        required: false
        schema:
          format: date-time
          type: string
      - description: Filter by item type (default term)
        in: query
        name: type
        required: false
        schema:
          type: string
      - description: Filter by parent/ancestor IDs (comma separated). MUST be internal numeric IDs (e.g. `2305843010635321210`), NOT shortIds like `CRK-25832` — the SQL casts to `::bigint[]`, so a shortId yields zero matches (200 with an empty list, no error). To resolve a shortId first, call the same list endpoint with `?shortId=<KEY-N>` to get the numeric id.
        in: query
        name: parents
        required: false
        schema:
          type: string
      - description: Case-insensitive substring search over title + description. Min 2 chars; shorter values are ignored.
        in: query
        name: keyword
        required: false
        schema:
          type: string
      - description: Exact match on textual short id (e.g. `CRK-20091`). When supplied, takes precedence over `keyword`.
        in: query
        name: shortId
        required: false
        schema:
          type: string
      - in: query
        name: status
        required: false
        schema:
          type: string
      - in: query
        name: importance
        required: false
        schema:
          type: string
      - in: query
        name: createdBy
        required: false
        schema:
          type: string
      - in: query
        name: created_from
        required: false
        schema:
          format: date-time
          type: string
      - in: query
        name: created_to
        required: false
        schema:
          format: date-time
          type: string
      - in: query
        name: sprint
        required: false
        schema:
          type: string
      - in: query
        name: quarter
        required: false
        schema:
          type: string
      - in: query
        name: labels
        required: false
        schema:
          type: string
      - in: query
        name: assignee
        required: false
        schema:
          type: string
  /item:
    post:
      operationId: CreateItem
      responses:
        '200':
          description: The item’s metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
        '400':
          description: Invalid item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '404':
          description: No workspace found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while creating item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Create a work item
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - write:items:craft
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ItemCreate'
    put:
      operationId: UpdateItem
      responses:
        '200':
          description: The item’s metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
        '400':
          description: Invalid item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidateErrorJSON'
        '401':
          description: No access to account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '404':
          description: No workspace found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
        '500':
          description: An error occurred while creating item
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralErrorResponse'
      description: Update a work item
      tags:
      - Work Items and OKRs
      security:
      - api_key:
        - write:items:craft
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ItemUpdate'
components:
  schemas:
    NullableType_EntityWithTerminology-and-EntityWithDates_:
      allOf:
      - $ref: '#/components/schemas/EntityWithTerminology'
      - $ref: '#/components/schemas/EntityWithDates'
      nullable: true
    NullableType_EntityParent_:
      allOf:
      - $ref: '#/components/schemas/EntityParent'
      nullable: true
    EntityParent:
      properties:
        id:
          type: string
        title:
          type: string
        shortId:
          type: string
        webUrl:
          type: string
          description: Direct link to the parent item in the Craft.io app.
      required:
      - id
      type: object
      additionalProperties: false
    NullableType_string-Array_:
      items:
        type: string
      type: array
      nullable: true
    NullableType_Entity-Array_:
      items:
        $ref: '#/components/schemas/Entity'
      type: array
      nullable: true
    Entity:
      properties:
        id:
          type: string
        name:
          type: string
          nullable: true
      type: object
      additionalProperties: false
    ValidateErrorJSON:
      properties:
        message:
          type: string
        details:
          properties: {}
          additionalProperties: {}
          type: object
      required:
      - message
      - details
      type: object
      additionalProperties: false
    ItemFlat:
      properties:
        id:
          $ref: '#/components/schemas/NullableType_string_'
        type:
          type: string
        workspaceId:
          type: string
        portfolioId:
          type: string
        shortId:
          type: string
        title:
          type: string
        description:
          type: string
          nullable: true
        creationTime:
          type: string
          format: date-time
        updateTime:
          type: string
          format: date-time
        storyPoints:
          type: number
          format: double
        initiativeId:
          $ref: '#/components/schemas/NullableType_string_'
        value:
          type: number
          format: double
        effort:
          type: number
          format: double
        kano:
          type: string
        estimatedHours:
          type: number
          format: double
        labels:
          items:
            type: string
          type: array
        actualStartDate:
          $ref: '#/components/schemas/NullableType_Date_'
        actualEndDate:
          $ref: '#/components/schemas/NullableType_Date_'
        devToolKey:
          $ref: '#/components/schemas/DevToolKeyList'
        webUrl:
          type: string
          description: Canonical Craft.io app URL for this item. Computed in PublishService.
        status_id:
          type: string
        status_name:
          type: string
        importance_id:
          type: string
        importance_name:
          type: string
        objective_id:
          type: string
        objective_name:
          type: string
        keyResult_id:
          type: string
        keyResult_name:
          type: string
        persona_id:
          type: string
        persona_name:
          type: string
        sprint_id:
          type: string
        sprint_name:
          type: string
        quarter_id:
          type: string
        quarter_name:
          type: string
        assignee_id:
          type: string
        assignee_team:
          type: string
        assignee_user:
          type: string
        parent_id:
          type: string
          nullable: true
        parent_name:
          type: string
          nullable: true
        parent_s

# --- truncated at 32 KB (48 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/craft-io/refs/heads/main/openapi/craft-io-work-items-and-okrs-api-openapi.yml