API Documentation

Everything you need to send feedback from your app.

Quick Start

Send your first feedback in 3 steps:

1. Get your API key

Sign in, go to Settings, and copy your App ID and API Key.

2. Send a POST request

curl -X POST https://api.feedback-dock.com/v1/ingest/YOUR_APP_ID \
  -H "Content-Type: application/json" \
  -H "X-API-Key: fb_live_YOUR_KEY" \
  -d '{
    "type": "bug",
    "channel": "contact",
    "message": "The map does not load"
  }'

3. Check your dashboard

The feedback appears in your inbox immediately.

Endpoint

POST https://api.feedback-dock.com/v1/ingest/{app_id}

Headers

Content-Typeapplication/json
X-API-KeyYour API key. Live keys start with fb_live_, test keys with fb_test_

Request Body

typerequiredOne of: "bug", "feedback", "inquiry"
messagerequiredThe feedback text. Max 5,000 characters.
channeloptionalWhere in your app this came from. Default: "default". Examples: "contact", "report", "settings".
user_idoptionalYour app's user identifier. Include this to enable replies from the dashboard.
metadataoptionalAny extra context. Common: app_version, os, device, screen, locale.

Examples

React Native / Expo

const sendFeedback = async (
  type: 'bug' | 'feedback' | 'inquiry',
  channel: string,
  message: string,
) => {
  await fetch('https://api.feedback-dock.com/v1/ingest/YOUR_APP_ID', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'fb_live_YOUR_KEY',
    },
    body: JSON.stringify({
      type,
      channel,
      message,
      metadata: {
        app_version: Constants.expoConfig?.version,
        os: Platform.OS,
      },
    }),
  });
};

Swift (iOS)

func sendFeedback(type: String, message: String) async throws {
    var request = URLRequest(url: URL(string: "https://api.feedback-dock.com/v1/ingest/YOUR_APP_ID")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("fb_live_YOUR_KEY", forHTTPHeaderField: "X-API-Key")
    request.httpBody = try JSONEncoder().encode([
        "type": type,
        "channel": "contact",
        "message": message,
    ])
    let (_, _) = try await URLSession.shared.data(for: request)
}

Kotlin (Android)

suspend fun sendFeedback(type: String, message: String) {
    val client = OkHttpClient()
    val body = JSONObject().apply {
        put("type", type)
        put("channel", "contact")
        put("message", message)
    }.toString().toRequestBody("application/json".toMediaType())

    val request = Request.Builder()
        .url("https://api.feedback-dock.com/v1/ingest/YOUR_APP_ID")
        .addHeader("X-API-Key", "fb_live_YOUR_KEY")
        .post(body)
        .build()

    client.newCall(request).execute()
}

Retrieving Replies

If you included a user_id when submitting feedback, you can check if the developer has replied:

GET https://api.feedback-dock.com/v1/feedback/YOUR_APP_ID/replies?user_id=user_001
X-API-Key: fb_live_YOUR_KEY

Returns feedback items with their replies, so you can display them in your app.

Rate Limits

Free100 requests/day per app
Pro5,000 requests/day per app
Team50,000 requests/day per app

Exceeding the limit returns 429 Too Many Requests.

OpenAPI Spec

The full API specification is available as an OpenAPI 3.0 YAML file. AI coding assistants (Claude, Cursor, Copilot) can read this directly to generate integration code.

View openapi.yaml on GitHub