Documentation
Everything you need to connect Damper to your product — capture demand, publish roadmap and releases, run status, and keep internal notes next to the work.
Contents
Use the hosted feedback board to collect and discuss requests, and the hosted roadmap to show committed progress. Add the widget for in-product intake; choose embeds or APIs only when you need a custom presentation.
Feedback WidgetAdd a single script tag before the closing body tag. Replace YOUR_PROJECT_ID with your project's ID from the dashboard.
User IdentificationIdentify users to enable weighted voting and track who submitted feedback. Call the identify method after the widget script loads.
Public RoadmapEmbed your product roadmap on any page. Visitors can see planned, in-progress, and completed items, and vote on what matters to them.
Public Status PagePublish a hosted status page per project with public checks, incidents, maintenance, subscriptions, and optional Damper-hosted subdomains.
CLIThe Damper CLI creates git worktrees for each task, injects full task context, and launches Claude Code — so AI agents start with everything they need.
Use the hosted feedback board to collect and discuss requests, and the hosted roadmap to show committed progress. Add the widget for in-product intake; choose embeds or APIs only when you need a custom presentation.
Feedback WidgetAdd a single script tag before the closing body tag. Replace YOUR_PROJECT_ID with your project's ID from the dashboard.
User IdentificationIdentify users to enable weighted voting and track who submitted feedback. Call the identify method after the widget script loads.
Public RoadmapEmbed your product roadmap on any page. Visitors can see planned, in-progress, and completed items, and vote on what matters to them.
Public Status PagePublish a hosted status page per project with public checks, incidents, maintenance, subscriptions, and optional Damper-hosted subdomains.
AI Execution (MCP)Connect Claude Code, Cursor, or any MCP-compatible AI assistant to your Damper project. AI agents can pick tasks, track progress, and mark work complete autonomously.
Choose your feedback and voting setup
Damper supports hosted pages, an in-product widget, iframe embeds, and public JSON APIs. Start with the simplest surface that matches where your customers already work.
Use the hosted feedback board to collect and discuss requests, and the hosted roadmap to show committed progress. Add the widget for in-product intake; choose embeds or APIs only when you need a custom presentation.
Integration options
| Surface | Feedback capability | Roadmap capability | Identity | Implementation effort |
|---|---|---|---|---|
| Hosted Boards | Browsing, submission, voting, detail pages, and public commenting with email verification | Status filtering, support voting, item details, progress, and automatic shipping updates for verified supporters | Visitors vote and comment by entering their email. Damper sends a magic link to verify their identity — no account creation required. | Low: enable and share the generated links |
| Feedback Widget | The feedback widget lets your users submit feature requests, bug reports, and improvements directly from your app. | — | Identify users to enable weighted voting and track who submitted feedback. Call the identify method after the widget script loads. | Low–medium: script plus required identify call |
| Iframe embeds | Embed a feedback view where identified visitors can browse and vote. Use the hosted feedback board or widget when visitors also need to submit new feedback. | Embed your product roadmap on any page. Visitors can see planned, in-progress, and completed items, and vote on what matters to them. | Pass identity parameters as URL query strings to enable weighted voting and user tracking in embedded pages. | Medium: iframe plus signed identity parameters for voting |
| Public API | Get public feedback items by project slug | Get public roadmap items by project slug | Read endpoints require the matching project public flag. For a custom integration, identify the signed-in user from your server first, then use the returned visitorId for personalized reads and votes. Keep the identity secret and hash generation on your server. The hash is optional only when identity verification is disabled for the project. | High: build the UI and visitor identity flow |
Recommended project setup
- In Settings → Collection, enable Public Feedback and configure plan-based vote weights.
- In Settings → Publishing, enable Public Roadmap. Keep backlog candidates private until the team commits to them.
- Share both hosted URLs. Add the widget for authenticated in-product intake when appropriate.
Feedback Widget
The feedback widget lets your users submit feature requests, bug reports, and improvements directly from your app.
Installation
Add a single script tag before the closing body tag. Replace YOUR_PROJECT_ID with your project's ID from the dashboard.
<script src="https://api.usedamper.com/widget.js" data-project-id="YOUR_PROJECT_ID" ></script>
Call Damper.identify() after your user signs in. The widget remains hidden until it has a verified project visitor, so the submission and its customer context stay connected.
Configuration
The script tag selects the project and optional server. Configure theme, position, labels, feedback types, sentiment, attachments, and error capture from the project's widget settings in Damper.
| Attribute | Default | Description |
|---|---|---|
data-project-id | Required | Project ID copied from the Damper dashboard |
data-server-url | Damper hosted API | Optional override for self-hosted or local development |
JavaScript API
Use the global Damper object to identify users, open the widget, or submit feedback directly from your frontend without waiting for a click.
| Parameter | Default | Description |
|---|---|---|
title | Required | Short summary shown in the inbox and public board. |
description | Required | Detailed context for the request, bug, or question. |
type | feature | Feedback type: bug, feature, improvement, or question. |
metadata | {} | Optional structured context attached to the submission. |
isPublic | true | Set to false to keep script-submitted feedback off the public board. |
// Identify the current user after login
await Damper.identify({
userId: 'user_123',
email: 'jane@acme.com',
name: 'Jane Smith',
plan: 'enterprise',
tier: 10
})
// Submit feedback directly without opening the widget UI
await Damper.submitFeedback({
title: 'Export fails on large CSV',
description: 'The export returns 500 when the report contains more than 10k rows.',
type: 'bug',
metadata: { area: 'reports', reportId: 'rpt_123' },
isPublic: false // Optional: create as private feedback
})
// Open the widget manually when needed
Damper.open()User Identification
Identify users to enable weighted voting and track who submitted feedback. Call the identify method after the widget script loads.
await Damper.identify({
userId: 'user_123',
email: 'jane@acme.com',
name: 'Jane Smith',
plan: 'enterprise',
tier: 10,
userHash: 'hmac_sha256...'
})Configure plan-to-weight values in Settings → Collection. A visitor's plan selects that weight for feedback and roadmap votes. Tier remains a separate customer-priority signal.
To prevent identity spoofing, generate HMAC-SHA256(identitySecret, userId) on your server and pass the lowercase hexadecimal digest as userHash. Find the identity secret in project Settings.
// Server-side Node.js example
const hash = createHmac('sha256', process.env.DAMPER_IDENTITY_SECRET)
.update(user.id)
.digest('hex')Public Roadmap
Embed your product roadmap on any page. Visitors can see planned, in-progress, and completed items, and vote on what matters to them.
<iframe src="https://usedamper.com/embed/roadmap?project=YOUR_SLUG&account=YOUR_ACCOUNT_ID" width="100%" height="600" frameborder="0" ></iframe>
| Parameter | Description |
|---|---|
project | Your project slug (required) |
account | Account identifier |
theme | Color theme: auto, light, or dark |
accent | Custom accent color (hex without #, e.g. FF5733) |
branding=false | Show or hide "Powered by Damper" footer |
voting=false | Show or hide voting buttons |
Roadmap Item Detail
Link directly to individual roadmap items. Clicking an item title in the roadmap embed opens the detail page with full description, subtasks, and voting.
https://usedamper.com/embed/roadmap-item?project=YOUR_SLUG&account=YOUR_ACCOUNT_ID&item=ITEM_ID
Shipping notifications
On the hosted roadmap, an email-verified visitor who supports an item automatically follows its shipping updates. The iframe does not currently expose a separate subscribe control.
Public Changelog
Embed your product changelog to keep users informed about new features and improvements.
<iframe src="https://api.usedamper.com/embed/changelog?project=YOUR_SLUG" width="100%" height="600" frameborder="0" ></iframe>
Public Status Page
Publish a hosted status page per project with public checks, incidents, maintenance, subscriptions, and optional Damper-hosted subdomains.
Open a project in the dashboard, go to Status, create groups and checks, then enable the public status page in publishing settings. Only public groups, checks, incidents, and maintenance windows are shown externally.
Hosted status page
Damper serves a ready-to-use public status page with project name, uptime summaries, daily uptime bars, incidents, maintenance, and subscriber signup.
https://api.usedamper.com/api/public/render/status/YOUR_PROJECT_SLUG?account=YOUR_ACCOUNT_ID
Supported check types
- HTTP checks monitor a URL with GET or HEAD, timeout, expected status range, and optional headers.
- SSL checks monitor certificate validity and warn before expiration.
- Heartbeat checks monitor background jobs or cron tasks that must ping Damper within a configured interval and grace window.
Heartbeat endpoint
Each heartbeat check gets a unique tokenized endpoint. Call it from your worker or cron job whenever the job completes successfully.
curl -X POST "https://api.usedamper.com/api/status/heartbeats/YOUR_HEARTBEAT_TOKEN"
Subscriber notifications
Visitors can subscribe directly on the public status page. Damper sends a confirmation email first, then delivers public incident, recovery, update, and maintenance notifications.
Managed status subdomains
You can choose a Damper-hosted status subdomain such as acme.status.usedamper.com in project publishing settings without asking customers to change DNS.
status.example.com
Public Feedback Board
Embed a feedback view where identified visitors can browse and vote. Use the hosted feedback board or widget when visitors also need to submit new feedback.
<iframe src="https://usedamper.com/embed/feedback?project=YOUR_SLUG&account=YOUR_ACCOUNT_ID" width="100%" height="600" frameborder="0" ></iframe>
It does not include feedback submission, comments, or detail pages. For the complete collection experience, link to the hosted feedback board or install the widget.
| Parameter | Description |
|---|---|
project | Your project slug (required) |
account | Account identifier |
theme | Color theme: auto, light, or dark |
accent | Custom accent color (hex without #, e.g. FF5733) |
branding=false | Show or hide "Powered by Damper" footer |
voting=false | Show or hide voting buttons |
Hosted Boards
Hosted boards are standalone, fully interactive pages served directly by Damper. No iframe or embed code needed — just link to the URL. They include voting, filtering, sorting, detail pages, and email-based identity verification.
Feedback Board
A full-page interactive feedback board where visitors can browse, submit, vote, open detail pages, and comment.
https://api.usedamper.com/api/public/board/YOUR_SLUG?account=YOUR_ACCOUNT_ID
Roadmap Board
A full-page interactive roadmap with status filtering, voting, and item detail pages.
https://api.usedamper.com/api/public/roadmap-board/YOUR_SLUG?account=YOUR_ACCOUNT_ID
Identity & Voting
Visitors vote and comment by entering their email. Damper sends a magic link to verify their identity — no account creation required.
- Visitor clicks vote or enters a comment
- Damper prompts for their email address
- A magic link is sent to verify their identity
- After clicking the link, the vote completes or the visitor returns to the submission or comment they started
Theming
Append a theme query parameter to force light or dark mode. Without it, the board follows the visitor's system preference.
Embed Authentication
Pass identity parameters as URL query strings to enable weighted voting and user tracking in embedded pages.
https://usedamper.com/embed/roadmap?project=YOUR_SLUG&account=YOUR_ACCOUNT_ID&uid=user_123&email=jane%40acme.com&name=Jane%20Smith&plan=enterprise&hash=HMAC_SHA256
| Parameter | Description |
|---|---|
uid | External user ID (enables authentication) |
email | User email address |
name | User display name |
plan | User plan name matched to the project's plan-based vote-weight mapping |
hash | HMAC-SHA256 identity verification hash (see User Identification) |
account | Account identifier |
The hash is computed as HMAC-SHA256(identitySecret, userId). Find your identity secret in the dashboard under Settings. See the User Identification section for server-side hash generation.
When uid is provided, the embed page authenticates the visitor via POST /api/public/embed/identify. This enables personalized voting and vote weighting based on the user's plan.
How feedback demand becomes roadmap priority
When feedback is promoted or linked to roadmap work, its customer evidence remains connected and recalculates with the roadmap item.
- Each distinct visitor is counted once across linked feedback and direct roadmap support.
- If the same visitor supported multiple sources, only that visitor's highest plan-based weight contributes.
- Backlog candidates remain private by default and do not communicate commitment. Planned or active work does.
- Strategic fit, urgency, confidence, and effort remain explicit product inputs rather than being hidden inside customer demand.
Metrics shown in Damper
Unique supporters measure reach. Weighted demand applies project plan weights. Priority score combines normalized demand with strategic fit, urgency, confidence, and effort.
priority = (normalized demand + strategic fit + urgency) × confidence ÷ effort
Slack Integration
Connect your Slack workspace to push messages directly into Damper as feedback. Use the "Push to Damper" message shortcut to save any Slack message as a feedback item.
OAuth 2.0 Provider
Create OAuth applications to let external services submit and read feedback from your Damper project. Supports the authorization code flow with optional PKCE.
Creating an OAuth App
Go to your project's Settings > OAuth Apps in the dashboard. Create a new app with a name and redirect URI. You'll receive a client ID and client secret.
Authorization Flow
- Redirect the user to the authorization endpoint with your client ID, redirect URI, and requested scopes.
- The user approves access on the Damper consent page.
- Damper redirects back to your redirect URI with an authorization code.
- Exchange the code for an access token via the token endpoint.
OAuth access tokens are only valid for /api/integrations/* or /api/external/* routes. Do not send OAuth tokens to /api/projects/* or /api/agent/*.
Scopes
| Scope | Description |
|---|---|
feedback:write | Submit feedback to the project |
feedback:read | Read feedback items and linked roadmap tasks |
project:read | Read project metadata, widget settings, and resource counts |
roadmap:read | Read roadmap items and linked feedback relationships |
context:read | Read project specs and context documentation |
changelog:read | Read changelog entries and shipped work |
Endpoints
| Method | Path | Description |
|---|---|---|
GET | https://api.usedamper.com/oauth/authorize | Authorization page (redirect users here) |
POST | https://api.usedamper.com/api/oauth/token | Exchange authorization code for access token |
GET | https://api.usedamper.com/api/integrations/project | Get project metadata for the connected project |
GET | https://api.usedamper.com/api/integrations/roadmap | List roadmap items for the connected project |
GET | https://api.usedamper.com/api/integrations/context | List context sections or fetch a specific section |
GET | https://api.usedamper.com/api/integrations/changelog | List changelog entries for the connected project |
POST | https://api.usedamper.com/api/integrations/feedback | Submit feedback using OAuth access token |
GET | https://api.usedamper.com/api/integrations/feedback/:id | Get a feedback item with linked roadmap tasks |
Canonical token response
Damper returns a stable snake_case token payload. Treat the following fields as the canonical response contract.
{
"access_token": "dat_...",
"token_type": "Bearer",
"expires_in": 2592000,
"scope": "feedback:read project:read roadmap:read context:read changelog:read",
"project_id": "proj_123"
}Damper OAuth currently returns only an access token. Refresh tokens are not supported at this time.
Auth error responses
OAuth auth failures return structured error codes so integrations can distinguish invalid tokens, insufficient scope, and incorrect route usage.
{
"error": "Invalid or expired token",
"code": "oauth_token_invalid"
}
{
"error": "Insufficient scope. Required: roadmap:read",
"code": "oauth_insufficient_scope",
"requiredScope": "roadmap:read"
}
{
"error": "OAuth access tokens can only be used with /api/integrations/* or /api/external/* endpoints.",
"code": "oauth_wrong_endpoint",
"allowedPrefixes": ["/api/integrations/", "/api/external/"]
}Integration examples
Use these example calls as your starting point for third-party integrations.
GET /api/integrations/project
curl -H "Authorization: Bearer dat_..." \ "https://api.usedamper.com/api/integrations/project"
GET /api/integrations/roadmap
curl -H "Authorization: Bearer dat_..." \ "https://api.usedamper.com/api/integrations/roadmap?status=planned&limit=20"
GET /api/integrations/context
curl -H "Authorization: Bearer dat_..." \ "https://api.usedamper.com/api/integrations/context" curl -H "Authorization: Bearer dat_..." \ "https://api.usedamper.com/api/integrations/context/specs%2Foauth-dashboard"
GET /api/integrations/changelog
curl -H "Authorization: Bearer dat_..." \ "https://api.usedamper.com/api/integrations/changelog?status=published&limit=10"
Custom HTML & Markdown Pages
Besides iframe embeds, you can fetch your public pages as raw HTML or Markdown. Use these for full design control or to integrate with static site generators.
Available page types
roadmapchangelogfeedbackstatus
https://api.usedamper.com/api/public/render/status/YOUR_PROJECT_SLUG https://api.usedamper.com/api/public/render/status/YOUR_PROJECT_SLUG?format=md
Public API
Access your project data programmatically. Public endpoints require no authentication. Authenticated endpoints use a Bearer token from your dashboard.
Public Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/public/feedback/:slug | Get public feedback items by project slug |
POST | /api/public/embed/identify | Create or update a project visitor and return the visitor ID used for voting |
POST | /api/public/feedback/vote | Vote on a public feedback item |
GET | /api/public/roadmap/:slug | Get public roadmap items by project slug |
GET | /api/public/roadmap/:slug/items/:itemId | Get a single public roadmap item by slug and item ID |
POST | /api/public/roadmap/vote | Vote on a public roadmap item |
Read endpoints require the matching project public flag. For a custom integration, identify the signed-in user from your server first, then use the returned visitorId for personalized reads and votes. Keep the identity secret and hash generation on your server. The hash is optional only when identity verification is disabled for the project.
# Identify the signed-in user from your server. Generate HASH with the
# identity secret as shown in User Identification above.
curl -X POST "https://api.usedamper.com/api/public/embed/identify" \
-H "Content-Type: application/json" \
-d '{"projectSlug":"YOUR_SLUG","accountId":"YOUR_ACCOUNT_ID","userId":"user_123","email":"jane@acme.com","name":"Jane Smith","plan":"enterprise","hash":"HASH"}'
# Response: {"visitorId":"VISITOR_ID","votedItemIds":[]}
# Use visitorId for personalized reads and votes.
curl "https://api.usedamper.com/api/public/roadmap/YOUR_SLUG?account=YOUR_ACCOUNT_ID&visitor_id=VISITOR_ID"
curl -X POST "https://api.usedamper.com/api/public/roadmap/vote" \
-H "Content-Type: application/json" \
-d '{"roadmapItemId":"ITEM_ID","visitorId":"VISITOR_ID"}'
curl -X POST "https://api.usedamper.com/api/public/feedback/vote" \
-H "Content-Type: application/json" \
-d '{"feedbackId":"FEEDBACK_ID","visitorId":"VISITOR_ID"}'Authentication
Pass your API key in the Authorization header for authenticated endpoints.
Authorization: Bearer dmp_your_api_key
Status endpoints
Use the public status API to fetch current check states, grouped components, incidents, maintenance, and uptime history for a project.
curl "https://api.usedamper.com/api/public/status/YOUR_PROJECT_SLUG?account=YOUR_ACCOUNT_ID"
Heartbeat checks use a tokenized public endpoint. POST to it from your cron or worker when the job succeeds.
Server-side error ingestion
Use a Damper API key when your backend or worker wants to push grouped error logs into the Inbox. API keys use the dmp_ prefix and are created in Settings > API Keys.
Project-scoped keys can call the endpoint directly. Account-scoped keys must add ?project_id=YOUR_PROJECT_ID to the request URL.
curl -X POST \
-H "Authorization: Bearer dmp_..." \
-H "Content-Type: application/json" \
"https://api.usedamper.com/api/ingest/errors?project_id=proj_123" \
-d '{
"rawLog": "Error: connect ECONNREFUSED 127.0.0.1:5432\\n at connect (db.js:42:11)",
"occurredAt": "2026-03-11T10:12:34.000Z",
"hints": {
"service": "api",
"environment": "production",
"severity": "error"
}
}'Backend log ingestion
Use the ingest endpoint to send redacted backend error groups into Damper. Ingested server errors appear in the internal Logs workspace, where your team can inspect structured context and raise internal bugs from log groups.
The ingest endpoint is rate limited per API key and project, the full request body is capped at 64 KB, and structured context is capped and redacted before storage. Handle 429 responses with retry backoff.
curl -X POST \
-H "Authorization: Bearer dmp_..." \
-H "Content-Type: application/json" \
"https://api.usedamper.com/api/ingest/errors?project_id=proj_123" \
-d '{
"rawLog": "TypeError: Cannot read properties of undefined\\n at handler (server.js:10:4)",
"occurredAt": "2026-03-11T10:05:00.000Z",
"hints": {
"service": "worker",
"environment": "production",
"severity": "error"
},
"fingerprint": "jobs:critical-timeout",
"context": {
"request": {
"method": "POST",
"path": "/api/jobs/run"
},
"job": {
"id": "job_123",
"queue": "critical"
}
}
}'{
"feedbackId": "fb_123",
"action": "created",
"source": "backend",
"feedbackStatus": "new",
"title": "worker: TypeError: Cannot read properties of undefined",
"dedupeKey": "sha256...",
"occurrenceCount": 1,
"firstOccurredAt": "2026-03-11T10:05:00.000Z",
"lastOccurredAt": "2026-03-11T10:05:00.000Z",
"aiTriageScheduled": true
}curl -X POST \
-H "Authorization: Bearer dmp_..." \
-H "Content-Type: application/json" \
"https://api.usedamper.com/api/ingest/errors/batch?project_id=proj_123" \
-d '{
"events": [
{
"rawLog": "Error: queue timeout\\n at run (worker.js:14:3)",
"fingerprint": "queue:timeout",
"hints": {
"service": "worker",
"environment": "production",
"severity": "error"
}
},
{
"rawLog": "Error: queue timeout\\n at run (worker.js:14:3)",
"fingerprint": "queue:timeout",
"hints": {
"service": "worker",
"environment": "production",
"severity": "error"
}
}
]
}'- Project-scoped API keys can call /api/ingest/errors directly. Account-scoped keys must also send the project_id query parameter.
- The request body supports rawLog, occurredAt, hints, an optional fingerprint override for custom grouping, and an optional context object for structured metadata.
- Damper redacts common secrets, truncates oversized values, and stores only the capped redacted context object.
- Equivalent errors aggregate into the same backend log group using a dedupe signature instead of creating duplicate items.
- Under sustained traffic, use batching or sampling on your side, send stable service and environment hints, and retry 429 responses with exponential backoff.
- Custom fingerprints let you merge noisy variants into one operational issue when the default parser-based grouping would split them apart.
- Once ingested, log groups can be assigned, muted, snoozed, and promoted to internal bugs directly from the Logs workspace.
- Use /api/ingest/errors/batch when workers need to send multiple grouped failures in one request. Batches are validated up front and stay under the same 64 KB request cap.
CLI
The Damper CLI creates git worktrees for each task, injects full task context, and launches Claude Code — so AI agents start with everything they need.
npx @damper/cli setup npx @damper/cli
AI Execution (MCP)
Connect Claude Code, Cursor, or any MCP-compatible AI assistant to your Damper project. AI agents can pick tasks, track progress, and mark work complete autonomously.
{
"mcpServers": {
"damper": {
"type": "http",
"url": "https://api.usedamper.com/mcp",
"headers": {
"Authorization": "Bearer dmp_..."
}
}
}
}