Documentation
Everything you need to integrate Damper into your product. Add the feedback widget, embed public pages, use the API, or connect AI agents.
Contents
Add 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.
Add 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.
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>
Configuration
Customize the widget appearance and behavior with data attributes.
| Attribute | Default | Description |
|---|---|---|
data-theme | auto | Color theme: auto, light, or dark |
data-position | right | Widget position: right or left |
data-trigger-label | Feedback | Text on the trigger button |
data-enable-sentiment | true | Show sentiment rating step before the feedback form |
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 | {{t.docs.paramDefault}} | 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...'
})To prevent identity spoofing, generate an HMAC hash server-side using your project's secret key and pass it as userHash. Find your secret key in the dashboard under Settings.
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://api.usedamper.com/embed/roadmap?project=YOUR_SLUG" width="100%" height="600" frameborder="0" ></iframe>
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 public feedback board where visitors can browse, submit, and vote on feedback items.
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.
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.
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_..."
}
}
}
}