ProductPlan Discovery API
Manage ideas, opportunities, customers, and idea forms
Manage ideas, opportunities, customers, and idea forms
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-discovery-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 Discovery 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: Discovery
description: Manage ideas, opportunities, customers, and idea forms
paths:
/discovery/ideas:
get:
operationId: listIdeas
summary: List ideas
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
- $ref: '#/components/parameters/q'
responses:
'200':
description: List of ideas
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createIdea
summary: Create an idea
tags:
- Discovery
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaCreate'
responses:
'201':
description: Idea created
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/discovery/ideas/{id}:
get:
operationId: getIdea
summary: Retrieve an idea
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: A single idea
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateIdea
summary: Update an idea
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaUpdate'
responses:
'200':
description: Idea updated
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/discovery/ideas/customers:
get:
operationId: listIdeaCustomers
summary: List idea customers
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
responses:
'200':
description: List of customers associated with ideas
content:
application/json:
schema:
$ref: '#/components/schemas/CustomerList'
'401':
$ref: '#/components/responses/Unauthorized'
/discovery/ideas/tags:
get:
operationId: listIdeaTags
summary: List idea tags
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
responses:
'200':
description: List of tags used on ideas
content:
application/json:
schema:
$ref: '#/components/schemas/TagList'
'401':
$ref: '#/components/responses/Unauthorized'
/discovery/opportunities:
get:
operationId: listOpportunities
summary: List opportunities
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
- $ref: '#/components/parameters/q'
responses:
'200':
description: List of opportunities
content:
application/json:
schema:
$ref: '#/components/schemas/OpportunityList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createOpportunity
summary: Create an opportunity
tags:
- Discovery
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OpportunityCreate'
responses:
'201':
description: Opportunity created
content:
application/json:
schema:
$ref: '#/components/schemas/OpportunityResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/discovery/opportunities/{id}:
get:
operationId: getOpportunity
summary: Retrieve an opportunity
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: A single opportunity
content:
application/json:
schema:
$ref: '#/components/schemas/OpportunityResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateOpportunity
summary: Update an opportunity
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OpportunityUpdate'
responses:
'200':
description: Opportunity updated
content:
application/json:
schema:
$ref: '#/components/schemas/OpportunityResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/discovery/idea-forms:
get:
operationId: listIdeaForms
summary: List idea forms
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/page_size'
responses:
'200':
description: List of idea forms
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaFormList'
'401':
$ref: '#/components/responses/Unauthorized'
/discovery/idea-forms/{id}:
get:
operationId: getIdeaForm
summary: Retrieve an idea form
tags:
- Discovery
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: A single idea form
content:
application/json:
schema:
$ref: '#/components/schemas/IdeaFormResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
components:
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
schemas:
OpportunityList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Opportunity'
meta:
$ref: '#/components/schemas/Pagination'
IdeaForm:
type: object
properties:
id:
type: integer
name:
type: string
description:
type: string
created_at:
type: string
format: date-time
IdeaList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Idea'
meta:
$ref: '#/components/schemas/Pagination'
OpportunityCreate:
type: object
required:
- title
properties:
title:
type: string
description:
type: string
IdeaFormResponse:
type: object
properties:
data:
$ref: '#/components/schemas/IdeaForm'
OpportunityUpdate:
type: object
properties:
title:
type: string
description:
type: string
CustomerList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Customer'
meta:
$ref: '#/components/schemas/Pagination'
Tag:
type: object
properties:
id:
type: integer
name:
type: string
Opportunity:
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
Customer:
type: object
properties:
id:
type: integer
name:
type: string
email:
type: string
format: email
Error:
type: object
properties:
error:
type: string
message:
type: string
errors:
type: array
items:
type: string
Idea:
type: object
properties:
id:
type: integer
title:
type: string
description:
type: string
tags:
type: array
items:
type: string
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
Pagination:
type: object
properties:
current_page:
type: integer
page_size:
type: integer
total_count:
type: integer
total_pages:
type: integer
IdeaUpdate:
type: object
properties:
title:
type: string
description:
type: string
tags:
type: array
items:
type: string
IdeaFormList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/IdeaForm'
meta:
$ref: '#/components/schemas/Pagination'
IdeaCreate:
type: object
required:
- title
properties:
title:
type: string
description:
type: string
tags:
type: array
items:
type: string
IdeaResponse:
type: object
properties:
data:
$ref: '#/components/schemas/Idea'
OpportunityResponse:
type: object
properties:
data:
$ref: '#/components/schemas/Opportunity'
TagList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Tag'
meta:
$ref: '#/components/schemas/Pagination'
responses:
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'
NotFound:
description: Resource not found
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>
'