Skip to content
Pro feature

Developer API

Submit feedback, manage FAQs, and control your support page directly from your mobile app or CI/CD pipeline. One API key per app.

Quick start

Send your first feedback in under a minute.

1

Generate an API key from your app dashboard

2

Install an SDK or use any HTTP client

3

Start sending feedback and managing FAQs

cURL
curl -X POST https://supportdock.io/api/v1/feedback/remote \
  -H "Content-Type: application/json" \
  -H "x-api-key: sdk_your_key" \
  -d '{"type":"bug","message":"App crashes on launch"}'

Authentication

All requests require a per-app API key in the x-api-key header. Keys start with sdk_ and are scoped to a single app.

Header
x-api-key: sdk_your_key

How to get a key

  1. 1Open your app dashboard in the console
  2. 2Click Generate API key
  3. 3Copy the key and add it to your app's configuration

Keys can be regenerated or revoked at any time from the app dashboard. For mobile apps the key can be embedded safely since it is scoped to one app. For web apps, call the API from your server/backend only.

Base URL

https://supportdock.io

All endpoint paths below are relative to this base URL.

Endpoints

The API has two groups: Feedback for user submissions and FAQ for content management.

MethodPath
POST/api/v1/feedback/remote
GET/api/v1/faqs/remote
POST/api/v1/faqs/remote
PATCH/api/v1/faqs/remote/{faqId}
DELETE/api/v1/faqs/remote/{faqId}
POST/api/v1/feedback/remote

Submit user feedback from your app. Supports bug reports, feature requests, questions, and general feedback — with optional image attachments.

Request body

json
{
  "type": "bug",                    // "bug" | "feature" | "question" | "general"
  "message": "App crashes on launch",
  "email": "user@example.com",     // optional
  "name": "Jane Doe",              // optional
  "subject": "Crash on iOS 18",    // optional — auto-generated if omitted
  "metadata": {                    // optional — any key-value pairs
    "appVersion": "2.1.0",
    "platform": "ios"
  },
  "source": "mobile-app",          // optional
  "images": [                      // optional — max 3 base64 data URLs
    "data:image/png;base64,..."    // PNG, JPEG, WebP, or GIF — each ≤ 2 MB
  ]
}

Response

201  { "success": true }
GET/api/v1/faqs/remote

Returns all FAQ entries for the app, ordered by sort order.

Response

200  [
  {
    "id": "uuid",
    "question": "How do I reset my password?",
    "answer": "Go to Settings > Account > Reset Password",
    "sortOrder": 0,
    "createdAt": "2026-01-15T10:00:00.000Z",
    "updatedAt": "2026-01-15T10:00:00.000Z"
  }
]
POST/api/v1/faqs/remote

Create a new FAQ entry for your app.

Request body

json
{
  "question": "How do I export data?",
  "answer": "Go to Settings > Export.",
  "sortOrder": 0    // optional
}

Response

201  { "id": "uuid", "question": "...", "answer": "...", "sortOrder": 0 }
PATCH/api/v1/faqs/remote/{faqId}

Update any fields on an existing FAQ entry. All fields are optional.

Request body

json
{
  "question": "Updated question?",   // optional
  "answer": "Updated answer.",       // optional
  "sortOrder": 1                     // optional
}

Response

200  { "id": "uuid", "question": "...", "answer": "...", "sortOrder": 1 }
DELETE/api/v1/faqs/remote/{faqId}

Permanently delete a FAQ entry.

Response

200  { "success": true }

Official SDKs

Drop-in SDKs that handle authentication, error handling, retries, and rate limits for you.

JavaScript / React Native

Install

Terminal
npm install @bangkeut-technology/supportdock-sdk

Usage

typescript
import { SupportDockClient } from '@bangkeut-technology/supportdock-sdk';

const sdk = new SupportDockClient({
  apiKey: 'sdk_your_key',
  defaultMetadata: { appVersion: '2.0.0' },
});

// Submit feedback
await sdk.sendFeedback({
  type: 'bug',
  message: 'App crashes on launch',
  images: ['data:image/png;base64,...'],  // optional — up to 3
});

// Manage FAQs
const faqs = await sdk.listFAQs();
await sdk.createFAQ({ question: 'How to export?', answer: 'Go to Settings > Export.' });
await sdk.updateFAQ(faqs[0].id, { answer: 'Updated answer.' });
await sdk.deleteFAQ(faqs[0].id);

React hook (Expo / React Native)

typescript
import { useSupportDock } from '@bangkeut-technology/supportdock-sdk';
import { Platform } from 'react-native';

function FeedbackScreen() {
  const { sendFeedback, loading, error, success, reset } = useSupportDock({
    apiKey: 'sdk_your_key',
    defaultMetadata: { appVersion: '2.0.0', platform: Platform.OS },
  });

  async function handleSubmit() {
    await sendFeedback({
      type: 'bug',
      message: 'Something went wrong',
      email: 'user@example.com',
    });
  }

  // loading, error, success states are managed for you
}

Install

Terminal
composer require bangkeut-technology/supportdock-sdk

Usage

php
use SupportDock\SupportDockClient;

$client = new SupportDockClient([
    'apiKey' => 'sdk_your_key',
    'defaultMetadata' => ['appVersion' => '2.0.0'],
]);

// Submit feedback
$client->sendFeedback([
    'type' => 'bug',
    'message' => 'App crashes on launch',
    'email' => 'user@example.com',
    'images' => ['data:image/png;base64,...'],  // optional — up to 3
]);

// Manage FAQs
$faqs = $client->listFAQs();
$client->createFAQ(['question' => 'How to export?', 'answer' => 'Go to Settings > Export.']);
$client->updateFAQ($faqs[0]['id'], ['answer' => 'Updated answer.']);
$client->deleteFAQ($faqs[0]['id']);

Examples

Works with any language or framework that can make HTTP requests.

cURL — Submit feedback with an image
curl -X POST https://supportdock.io/api/v1/feedback/remote \
  -H "Content-Type: application/json" \
  -H "x-api-key: sdk_your_key" \
  -d '{
    "type": "bug",
    "message": "App crashes on launch",
    "email": "user@example.com",
    "metadata": { "appVersion": "2.1.0", "platform": "ios" },
    "images": ["data:image/png;base64,iVBOR..."]
  }'
Swift (iOS)
var request = URLRequest(url: URL(string: "https://supportdock.io/api/v1/feedback/remote")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("sdk_your_key", forHTTPHeaderField: "x-api-key")

let body: [String: Any] = [
    "type": "bug",
    "message": "App crashes on launch",
    "metadata": ["appVersion": "2.1.0", "platform": "ios"]
]
request.httpBody = try JSONSerialization.data(withJSONObject: body)

let (data, _) = try await URLSession.shared.data(for: request)
Kotlin (Android)
val client = OkHttpClient()
val json = JSONObject().apply {
    put("type", "bug")
    put("message", "App crashes on launch")
    put("metadata", JSONObject().apply {
        put("appVersion", "2.1.0")
        put("platform", "android")
    })
}

val request = Request.Builder()
    .url("https://supportdock.io/api/v1/feedback/remote")
    .addHeader("x-api-key", "sdk_your_key")
    .post(json.toString().toRequestBody("application/json".toMediaType()))
    .build()

val response = client.newCall(request).execute()
Dart (Flutter)
import 'dart:convert';
import 'package:http/http.dart' as http;

final response = await http.post(
  Uri.parse('https://supportdock.io/api/v1/feedback/remote'),
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'sdk_your_key',
  },
  body: jsonEncode({
    'type': 'bug',
    'message': 'App crashes on launch',
    'metadata': {'appVersion': '2.1.0', 'platform': 'ios'},
  }),
);
Python
import requests

response = requests.post(
    "https://supportdock.io/api/v1/feedback/remote",
    headers={"x-api-key": "sdk_your_key"},
    json={
        "type": "bug",
        "message": "App crashes on launch",
        "metadata": {"appVersion": "2.1.0", "platform": "ios"},
    },
)
cURL — List FAQs
curl https://supportdock.io/api/v1/faqs/remote \
  -H "x-api-key: sdk_your_key"
cURL — Create FAQ
curl -X POST https://supportdock.io/api/v1/faqs/remote \
  -H "Content-Type: application/json" \
  -H "x-api-key: sdk_your_key" \
  -d '{"question":"How do I export data?","answer":"Go to Settings > Export."}'

Error codes

StatusMeaning
201Created successfully
200Success (GET, PATCH, DELETE)
400Validation error
401Missing or invalid API key
403Pro plan required
404Resource not found
429Rate limited — wait and retry

Rate-limited responses include a Retry-After header with the number of seconds to wait.

Works with any platform

Swift / iOS
Kotlin / Android
Flutter / Dart
React Native
PHP
Node.js
Python
Any HTTP client

Frequently asked questions

Start building

Generate your API key and start sending feedback in under a minute.