ProductPlan Roadmaps API

Manage roadmaps, lanes, milestones, bars, and comments

OpenAPI Specification

productplan-roadmaps-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: ProductPlan REST Bars Roadmaps API
  description: 'The ProductPlan REST API (v2) provides programmatic access to roadmaps, strategy (objectives and key results), discovery (ideas and opportunities), launch management, users, teams, and account status. It enables synchronization with internal systems and third-party tools such as Jira, GitHub, Slack, and Trello.

    '
  version: v2
  contact:
    name: ProductPlan Support
    url: https://docs.productplan.com/api/
  termsOfService: https://www.productplan.com/terms/
servers:
- url: https://app.productplan.com/api/v2
  description: ProductPlan production API
security:
- bearerAuth: []
tags:
- name: Roadmaps
  description: Manage roadmaps, lanes, milestones, bars, and comments
paths:
  /roadmaps:
    get:
      operationId: listRoadmaps
      summary: List roadmaps
      description: Returns a paginated list of roadmaps for the authenticated account.
      tags:
      - Roadmaps
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/q'
      responses:
        '200':
          description: A paginated list of roadmaps
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoadmapList'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /roadmaps/{id}:
    get:
      operationId: getRoadmap
      summary: Retrieve a roadmap
      tags:
      - Roadmaps
      parameters:
      - $ref: '#/components/parameters/id'
      responses:
        '200':
          description: A single roadmap
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoadmapResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /roadmaps/{roadmap_id}/lanes:
    get:
      operationId: listRoadmapLanes
      summary: List lanes for a roadmap
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/q'
      responses:
        '200':
          description: List of lanes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaneList'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
    post:
      operationId: createRoadmapLane
      summary: Create a lane in a roadmap
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LaneCreate'
      responses:
        '201':
          description: Lane created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaneResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
  /roadmaps/{roadmap_id}/lanes/{id}:
    patch:
      operationId: updateRoadmapLane
      summary: Update a lane
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      - $ref: '#/components/parameters/id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LaneUpdate'
      responses:
        '200':
          description: Lane updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaneResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
    delete:
      operationId: deleteRoadmapLane
      summary: Delete a lane
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      - $ref: '#/components/parameters/id'
      responses:
        '204':
          description: Lane deleted
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /roadmaps/{roadmap_id}/milestones:
    get:
      operationId: listRoadmapMilestones
      summary: List milestones for a roadmap
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      responses:
        '200':
          description: List of milestones
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MilestoneList'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      operationId: createRoadmapMilestone
      summary: Create a milestone
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MilestoneCreate'
      responses:
        '201':
          description: Milestone created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MilestoneResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
  /roadmaps/{roadmap_id}/milestones/{id}:
    patch:
      operationId: updateRoadmapMilestone
      summary: Update a milestone
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      - $ref: '#/components/parameters/id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MilestoneUpdate'
      responses:
        '200':
          description: Milestone updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MilestoneResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
    delete:
      operationId: deleteRoadmapMilestone
      summary: Delete a milestone
      tags:
      - Roadmaps
      parameters:
      - name: roadmap_id
        in: path
        required: true
        schema:
          type: integer
      - $ref: '#/components/parameters/id'
      responses:
        '204':
          description: Milestone deleted
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /roadmaps/{id}/bars:
    get:
      operationId: listRoadmapBars
      summary: List bars for a roadmap
      tags:
      - Roadmaps
      parameters:
      - $ref: '#/components/parameters/id'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/q'
      responses:
        '200':
          description: List of bars
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BarList'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /roadmaps/{id}/comments:
    get:
      operationId: listRoadmapComments
      summary: List comments on a roadmap
      tags:
      - Roadmaps
      parameters:
      - $ref: '#/components/parameters/id'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      responses:
        '200':
          description: List of comments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentList'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    CustomDropdownField:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
    MilestoneList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Milestone'
        meta:
          $ref: '#/components/schemas/Pagination'
    MilestoneResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Milestone'
    CommentList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Comment'
        meta:
          $ref: '#/components/schemas/Pagination'
    CustomTextField:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
    Bar:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        starts_on:
          type: string
          format: date
        ends_on:
          type: string
          format: date
        strategic_value:
          type: string
        notes:
          type: string
        percent_done:
          type: integer
          minimum: 0
          maximum: 100
        tags:
          type: array
          items:
            type: string
        lane:
          type: string
        legend:
          type: string
        is_container:
          type: boolean
        parked:
          type: boolean
        roadmap_id:
          type: integer
        container_bar_id:
          type: integer
          nullable: true
        custom_text_fields:
          type: array
          items:
            $ref: '#/components/schemas/CustomTextField'
        custom_dropdown_fields:
          type: array
          items:
            $ref: '#/components/schemas/CustomDropdownField'
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    Roadmap:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string
        errors:
          type: array
          items:
            type: string
    MilestoneCreate:
      type: object
      required:
      - name
      - date
      properties:
        name:
          type: string
        date:
          type: string
          format: date
    MilestoneUpdate:
      type: object
      properties:
        name:
          type: string
        date:
          type: string
          format: date
    LaneResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Lane'
    Pagination:
      type: object
      properties:
        current_page:
          type: integer
        page_size:
          type: integer
        total_count:
          type: integer
        total_pages:
          type: integer
    LaneUpdate:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        position:
          type: integer
    Comment:
      type: object
      properties:
        id:
          type: integer
        body:
          type: string
        user_id:
          type: integer
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    RoadmapResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Roadmap'
    BarList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Bar'
        meta:
          $ref: '#/components/schemas/Pagination'
    LaneCreate:
      type: object
      required:
      - name
      properties:
        name:
          type: string
        description:
          type: string
        position:
          type: integer
    LaneList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Lane'
        meta:
          $ref: '#/components/schemas/Pagination'
    Milestone:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        date:
          type: string
          format: date
        roadmap_id:
          type: integer
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    Lane:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        position:
          type: integer
        roadmap_id:
          type: integer
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    RoadmapList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Roadmap'
        meta:
          $ref: '#/components/schemas/Pagination'
  responses:
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnprocessableEntity:
      description: Validation errors
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: Insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Invalid authentication credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    id:
      name: id
      in: path
      required: true
      schema:
        type: integer
      description: The unique numeric identifier of the resource
    page:
      name: page
      in: query
      schema:
        type: integer
        default: 1
      description: Page number (1-based)
    page_size:
      name: page_size
      in: query
      schema:
        type: integer
        default: 200
        maximum: 500
      description: Number of results per page (max 500)
    q:
      name: q
      in: query
      schema:
        type: object
      description: 'Filtering and sorting object. Supports attributes such as id, name, description, position, created_at, updated_at depending on resource.

        '
      style: deepObject
      explode: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Personal Access Token (64-character hash). Generate in ProductPlan under Settings > Integrations. Include as: Authorization: Bearer <token>

        '