ProductPlan Strategy API
Manage OKR objectives and key results
Manage OKR objectives and key results
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/productplan-strategy-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: ProductPlan REST Bars Strategy 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: Strategy
description: Manage OKR objectives and key results
paths:
/strategy/objectives:
get:
operationId: listObjectives
summary: List objectives
tags:
- Strategy
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
- $ref: '#/components/parameters/q'
responses:
'200':
description: List of objectives
content:
application/json:
schema:
$ref: '#/components/schemas/ObjectiveList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createObjective
summary: Create an objective
tags:
- Strategy
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ObjectiveCreate'
responses:
'201':
description: Objective created
content:
application/json:
schema:
$ref: '#/components/schemas/ObjectiveResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/strategy/objectives/{id}:
get:
operationId: getObjective
summary: Retrieve an objective
tags:
- Strategy
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: A single objective
content:
application/json:
schema:
$ref: '#/components/schemas/ObjectiveResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateObjective
summary: Update an objective
tags:
- Strategy
parameters:
- $ref: '#/components/parameters/id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ObjectiveUpdate'
responses:
'200':
description: Objective updated
content:
application/json:
schema:
$ref: '#/components/schemas/ObjectiveResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
delete:
operationId: deleteObjective
summary: Delete an objective
tags:
- Strategy
parameters:
- $ref: '#/components/parameters/id'
responses:
'204':
description: Objective deleted
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/strategy/objectives/{objective_id}/key-results:
get:
operationId: listKeyResults
summary: List key results for an objective
tags:
- Strategy
parameters:
- name: objective_id
in: path
required: true
schema:
type: integer
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
responses:
'200':
description: List of key results
content:
application/json:
schema:
$ref: '#/components/schemas/KeyResultList'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
post:
operationId: createKeyResult
summary: Create a key result
tags:
- Strategy
parameters:
- name: objective_id
in: path
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/KeyResultCreate'
responses:
'201':
description: Key result created
content:
application/json:
schema:
$ref: '#/components/schemas/KeyResultResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/strategy/objectives/{objective_id}/key-results/{id}:
get:
operationId: getKeyResult
summary: Retrieve a key result
tags:
- Strategy
parameters:
- name: objective_id
in: path
required: true
schema:
type: integer
- $ref: '#/components/parameters/id'
responses:
'200':
description: A single key result
content:
application/json:
schema:
$ref: '#/components/schemas/KeyResultResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateKeyResult
summary: Update a key result
tags:
- Strategy
parameters:
- name: objective_id
in: path
required: true
schema:
type: integer
- $ref: '#/components/parameters/id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/KeyResultUpdate'
responses:
'200':
description: Key result updated
content:
application/json:
schema:
$ref: '#/components/schemas/KeyResultResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
delete:
operationId: deleteKeyResult
summary: Delete a key result
tags:
- Strategy
parameters:
- name: objective_id
in: path
required: true
schema:
type: integer
- $ref: '#/components/parameters/id'
responses:
'204':
description: Key result deleted
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
components:
schemas:
KeyResultResponse:
type: object
properties:
data:
$ref: '#/components/schemas/KeyResult'
ObjectiveCreate:
type: object
required:
- title
properties:
title:
type: string
description:
type: string
KeyResult:
type: object
properties:
id:
type: integer
title:
type: string
description:
type: string
progress:
type: number
minimum: 0
maximum: 100
objective_id:
type: integer
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
KeyResultUpdate:
type: object
properties:
title:
type: string
description:
type: string
progress:
type: number
minimum: 0
maximum: 100
ObjectiveResponse:
type: object
properties:
data:
$ref: '#/components/schemas/Objective'
ObjectiveUpdate:
type: object
properties:
title:
type: string
description:
type: string
ObjectiveList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Objective'
meta:
$ref: '#/components/schemas/Pagination'
Error:
type: object
properties:
error:
type: string
message:
type: string
errors:
type: array
items:
type: string
Pagination:
type: object
properties:
current_page:
type: integer
page_size:
type: integer
total_count:
type: integer
total_pages:
type: integer
KeyResultCreate:
type: object
required:
- title
properties:
title:
type: string
description:
type: string
progress:
type: number
minimum: 0
maximum: 100
KeyResultList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/KeyResult'
meta:
$ref: '#/components/schemas/Pagination'
Objective:
type: object
properties:
id:
type: integer
title:
type: string
description:
type: string
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
parameters:
page:
name: page
in: query
schema:
type: integer
default: 1
description: Page number (1-based)
id:
name: id
in: path
required: true
schema:
type: integer
description: The unique numeric identifier of the resource
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
responses:
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Invalid authentication credentials
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
UnprocessableEntity:
description: Validation errors
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'Personal Access Token (64-character hash). Generate in ProductPlan under Settings > Integrations. Include as: Authorization: Bearer <token>
'