Documentation

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.

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.

Recommended default: enable both hosted boards

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 BoardsBrowsing, submission, voting, detail pages, and public commenting with email verificationStatus filtering, support voting, item details, progress, and automatic shipping updates for verified supportersVisitors 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 WidgetThe 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 embedsEmbed 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 APIGet public feedback items by project slugGet public roadmap items by project slugRead 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

  1. In Settings → Collection, enable Public Feedback and configure plan-based vote weights.
  2. In Settings → Publishing, enable Public Roadmap. Keep backlog candidates private until the team commits to them.
  3. 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>
Identification is required

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-idRequiredProject ID copied from the Damper dashboard
data-server-urlDamper hosted APIOptional 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
titleRequiredShort summary shown in the inbox and public board.
descriptionRequiredDetailed context for the request, bug, or question.
typefeatureFeedback type: bug, feature, improvement, or question.
metadata{}Optional structured context attached to the submission.
isPublictrueSet 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...'
            })
Plan determines vote weight; tier is separate

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.

HMAC Verification

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>
ParameterDescription
projectYour project slug (required)
accountAccount identifier
themeColor theme: auto, light, or dark
accentCustom accent color (hex without #, e.g. FF5733)
branding=falseShow or hide "Powered by Damper" footer
voting=falseShow 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.

Set up from the Status workspace

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>
The feedback iframe is browse-and-vote only

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.

ParameterDescription
projectYour project slug (required)
accountAccount identifier
themeColor theme: auto, light, or dark
accentCustom accent color (hex without #, e.g. FF5733)
branding=falseShow or hide "Powered by Damper" footer
voting=falseShow 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.

  1. Visitor clicks vote or enters a comment
  2. Damper prompts for their email address
  3. A magic link is sent to verify their identity
  4. 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
ParameterDescription
uidExternal user ID (enables authentication)
emailUser email address
nameUser display name
planUser plan name matched to the project's plan-based vote-weight mapping
hashHMAC-SHA256 identity verification hash (see User Identification)
accountAccount identifier
HMAC Verification

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

  1. Redirect the user to the authorization endpoint with your client ID, redirect URI, and requested scopes.
  2. The user approves access on the Damper consent page.
  3. Damper redirects back to your redirect URI with an authorization code.
  4. Exchange the code for an access token via the token endpoint.
Use the OAuth endpoints

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:writeSubmit feedback to the project
feedback:readRead feedback items and linked roadmap tasks
project:readRead project metadata, widget settings, and resource counts
roadmap:readRead roadmap items and linked feedback relationships
context:readRead project specs and context documentation
changelog:readRead changelog entries and shipped work

Endpoints

Method Path Description
GEThttps://api.usedamper.com/oauth/authorizeAuthorization page (redirect users here)
POSThttps://api.usedamper.com/api/oauth/tokenExchange authorization code for access token
GEThttps://api.usedamper.com/api/integrations/projectGet project metadata for the connected project
GEThttps://api.usedamper.com/api/integrations/roadmapList roadmap items for the connected project
GEThttps://api.usedamper.com/api/integrations/contextList context sections or fetch a specific section
GEThttps://api.usedamper.com/api/integrations/changelogList changelog entries for the connected project
POSThttps://api.usedamper.com/api/integrations/feedbackSubmit feedback using OAuth access token
GEThttps://api.usedamper.com/api/integrations/feedback/:idGet 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"
}
Refresh tokens

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

  • roadmap
  • changelog
  • feedback
  • status
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

MethodPathDescription
GET/api/public/feedback/:slugGet public feedback items by project slug
POST/api/public/embed/identifyCreate or update a project visitor and return the visitor ID used for voting
POST/api/public/feedback/voteVote on a public feedback item
GET/api/public/roadmap/:slugGet public roadmap items by project slug
GET/api/public/roadmap/:slug/items/:itemIdGet a single public roadmap item by slug and item ID
POST/api/public/roadmap/voteVote on a public roadmap item
Public reads need no Bearer token; votes need a verified visitor

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 ingestion

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.

Ingest backend errors with an API key

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.

Rate limits and payload limits

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_..."
      }
    }
  }
}