Agent skill
productlane
Productlane API for feedback management. Use when user mentions "Productlane", "feedback", "feature request", or product insights.
Install this agent skill to your Project
npx add-skill https://github.com/vm0-ai/vm0-skills/tree/main/productlane
SKILL.md
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
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
brave-search
Brave Search API for web search. Use when user says "search web", "Brave search", or asks to "find on web" without specifying Google.
supadata
Supadata API for YouTube/web data. Use when user mentions "Supadata", "YouTube data", "channel stats", or web scraping data.
roadmap-planning
Build and prioritize product roadmaps using scoring models like RICE, ICE, and value-effort matrices. Activate when creating a product roadmap, prioritizing features, sequencing initiatives, mapping dependencies, balancing team capacity, choosing between Now/Next/Later or quarterly planning, or communicating roadmap tradeoffs to executives and stakeholders.
qdrant
Qdrant API for vector search. Use when user mentions "Qdrant", "vector database", "semantic search", or embeddings storage.
calendly
Calendly scheduling API. Use when user mentions "Calendly", "calendly.com", "schedule a meeting", "booking link", "event types", or asks about interview scheduling.
stripe
Stripe API for payments. Use when user mentions "Stripe", "payment", "subscription", "billing", "invoice", or asks about payment processing.
Didn't find tool you were looking for?