Documentation

Documentation

Everything you need to integrate Damper into your product. Add the feedback widget, embed public pages, use the API, or connect AI agents.

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-themeautoColor theme: auto, light, or dark
data-positionrightWidget position: right or left
data-trigger-labelFeedbackText on the trigger button
data-enable-sentimenttrueShow 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
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...'
})
HMAC Verification

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.

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 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

  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.

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