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 '