Productlane API
Manage your public roadmap, helpdesk, feedback threads, companies, contacts, changelogs, and documentation via Productlane's REST API.
Official docs:
https://productlane.mintlify.dev/docs/api-reference
When to Use
Use this skill when you need to:
- Manage feedback threads — create, list, update, and send messages
- Manage companies and contacts — create, update, delete, and query customer data
- Publish changelogs — create and update changelog entries with markdown content
- View roadmap — list projects and issues from the public portal
- Manage documentation — create and organize help articles
- Manage users — invite members and update roles
Prerequisites
- Log in to Productlane and go to Settings
- Navigate to Integrations > API
- Create or copy your API key
Set environment variable:
export PRODUCTLANE_TOKEN="your-api-key"
Workspaces
Get Workspace
Retrieve workspace information. Replace <workspace-id> with the actual workspace ID:
curl -s "https://productlane.com/api/v1/workspaces/<workspace-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Companies
List Companies
curl -s "https://productlane.com/api/v1/companies?take=20" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
List Companies with Filters
Filter by name or domain:
curl -s "https://productlane.com/api/v1/companies?name=Acme&take=10" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Company by ID
Replace <company-id> with the actual company ID:
curl -s "https://productlane.com/api/v1/companies/<company-id>?groupUpvotes=true" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Create Company
Write to /tmp/productlane_request.json:
{
"name": "Acme Corp",
"domains": ["acme.com"],
"size": 50,
"revenue": 1000000
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/companies" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Update Company
Write to /tmp/productlane_request.json:
{
"name": "Acme Corporation",
"size": 100
}
Then run. Replace <company-id> with the actual company ID:
curl -s -X PATCH "https://productlane.com/api/v1/companies/<company-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Delete Company
Replace <company-id> with the actual company ID:
curl -s -X DELETE "https://productlane.com/api/v1/companies/<company-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Linear Customer Options
Get available Linear customer statuses and tiers. Requires Linear integration with customer:read or customer:write scope:
curl -s "https://productlane.com/api/v1/companies/linear-options" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Contacts
List Contacts
curl -s "https://productlane.com/api/v1/contacts?take=20" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Contact by ID or Email
Replace <contact-id-or-email> with the actual contact ID or email address:
curl -s "https://productlane.com/api/v1/contacts/<contact-id-or-email>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Create Contact
Link to a company using companyId (recommended), companyName, or companyExternalId — these are mutually exclusive.
Write to /tmp/productlane_request.json:
{
"email": "jane@acme.com",
"name": "Jane Doe",
"companyId": "<company-id>"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/contacts" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Update Contact
Write to /tmp/productlane_request.json:
{
"name": "Jane Smith"
}
Then run. Replace <contact-id> with the actual contact ID:
curl -s -X PATCH "https://productlane.com/api/v1/contacts/<contact-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Delete Contact
Replace <contact-id> with the actual contact ID:
curl -s -X DELETE "https://productlane.com/api/v1/contacts/<contact-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Threads (Feedback)
List Threads
curl -s "https://productlane.com/api/v1/threads?take=20" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
List Threads with Filters
Filter by state (NEW, PROCESSED), issue, or project:
curl -s "https://productlane.com/api/v1/threads?state=NEW&take=50" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Thread by ID
Replace <thread-id> with the actual thread ID:
curl -s "https://productlane.com/api/v1/threads/<thread-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Create Thread
Required fields: title, text, contactEmail, painLevel.
Write to /tmp/productlane_request.json:
{
"title": "Feature request: Dark mode",
"text": "<p>It would be great to have a dark mode option for the dashboard.</p>",
"contactEmail": "jane@acme.com",
"actorName": "Jane Doe",
"painLevel": "MEDIUM"
}
Pain level values: UNKNOWN, LOW, MEDIUM, HIGH
Then run:
curl -s -X POST "https://productlane.com/api/v1/threads" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Update Thread
Write to /tmp/productlane_request.json:
{
"title": "Feature request: Dark mode (updated)"
}
Then run. Replace <thread-id> with the actual thread ID:
curl -s -X PATCH "https://productlane.com/api/v1/threads/<thread-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Send Message to Thread
Send an email or Slack message to a thread. Replace <thread-id> with the actual thread ID:
Write to /tmp/productlane_request.json:
{
"text": "Thank you for your feedback! We are working on this feature."
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/threads/<thread-id>/messages" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Changelogs
List Changelogs
Replace <workspace-id> with the actual workspace ID:
curl -s "https://productlane.com/api/v1/changelogs/<workspace-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Changelog
Replace <workspace-id> and <changelog-id> with the actual IDs:
curl -s "https://productlane.com/api/v1/changelogs/<workspace-id>/<changelog-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Create Changelog
Write to /tmp/productlane_request.json:
{
"title": "March 2026 Update",
"content": "## New Features\n\n- Dark mode support\n- Improved search\n- New API endpoints"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/changelogs" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Update Changelog
Write to /tmp/productlane_request.json:
{
"title": "March 2026 Update (Revised)",
"content": "## New Features\n\n- Dark mode support\n- Improved search\n- New API endpoints\n- Bug fixes"
}
Then run. Replace <changelog-id> with the actual changelog ID:
curl -s -X PATCH "https://productlane.com/api/v1/changelogs/<changelog-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Delete Changelog
Replace <changelog-id> with the actual changelog ID:
curl -s -X DELETE "https://productlane.com/api/v1/changelogs/<changelog-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Portal / Roadmap
List Projects
Replace <workspace-id> with the actual workspace ID. The workspace must have its portal published:
curl -s "https://productlane.com/api/v1/projects/<workspace-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Project
Replace <workspace-id> and <project-id> with the actual IDs:
curl -s "https://productlane.com/api/v1/projects/<workspace-id>/<project-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
List Issues
Replace <workspace-id> with the actual workspace ID:
curl -s "https://productlane.com/api/v1/issues/<workspace-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Issue
Replace <workspace-id> and <issue-id> with the actual IDs:
curl -s "https://productlane.com/api/v1/issues/<workspace-id>/<issue-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Upvote a Project or Issue
Write to /tmp/productlane_request.json:
{
"projectId": "<project-id>",
"email": "jane@acme.com"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/portal/upvotes" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Get Upvotes
curl -s "https://productlane.com/api/v1/portal/upvotes?projectId=<project-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Delete Upvote
Replace <upvote-id> with the actual upvote ID:
curl -s -X DELETE "https://productlane.com/api/v1/portal/upvotes/<upvote-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Documentation
List Articles
Replace <workspace-id> with the actual workspace ID:
curl -s "https://productlane.com/api/v1/docs/articles/<workspace-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Get Article
Replace <workspace-id> and <article-id> with the actual IDs:
curl -s "https://productlane.com/api/v1/docs/articles/<workspace-id>/<article-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Create Article
Requires groupId. Create a doc group first if needed.
Write to /tmp/productlane_request.json:
{
"title": "Getting Started",
"content": "## Welcome\n\nThis guide will help you get started with our product.",
"groupId": "<group-id>"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/docs/articles" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Update Article
Write to /tmp/productlane_request.json:
{
"title": "Getting Started (Updated)",
"content": "## Welcome\n\nThis updated guide will help you get started."
}
Then run. Replace <article-id> with the actual article ID:
curl -s -X PATCH "https://productlane.com/api/v1/docs/articles/<article-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Delete Article
Replace <article-id> with the actual article ID:
curl -s -X DELETE "https://productlane.com/api/v1/docs/articles/<article-id>" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Create Doc Group
Write to /tmp/productlane_request.json:
{
"name": "User Guides"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/docs/groups" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Move Articles to Group
Write to /tmp/productlane_request.json:
{
"articleIds": ["<article-id-1>", "<article-id-2>"],
"groupId": "<group-id>"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/docs/groups/move-articles" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Users
List Members
curl -s "https://productlane.com/api/v1/users" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)"
Invite User
Write to /tmp/productlane_request.json:
{
"email": "newuser@acme.com"
}
Then run:
curl -s -X POST "https://productlane.com/api/v1/users/invite" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Update User Role
Only admins can change roles. Valid roles: ADMIN, USER, VIEWER.
Write to /tmp/productlane_request.json:
{
"userId": "<user-id>",
"role": "USER"
}
Then run:
curl -s -X PATCH "https://productlane.com/api/v1/users/role" --header "Authorization: Bearer $(printenv PRODUCTLANE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/productlane_request.json
Guidelines
- Base URL: All endpoints use
https://productlane.com/api/v1/ - Pagination: Use
skipandtakequery parameters for paginated endpoints (defaulttakeis 10) - Markdown support: Changelog and documentation article
contentfields support markdown format - HTML support: Thread
textfield supports HTML content - Thread fields: Use
contactEmail(notemail) and uppercasepainLevelvalues (UNKNOWN,LOW,MEDIUM,HIGH) - Doc articles:
groupIdis required when creating articles — create a doc group first - Company linking: When creating contacts, use exactly one of
companyId(recommended),companyName, orcompanyExternalId - Public endpoints: Workspace, portal issues/projects, and published changelogs/articles can be accessed without authentication
- Security: Never expose API keys in logs or client-side code
API Reference
- Documentation: https://productlane.mintlify.dev/docs/api-reference
- Dashboard: https://productlane.com
- API settings: https://productlane.com/settings/integrations/api