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.
Generate an API key from your app dashboard
Install an SDK or use any HTTP client
Start sending feedback and managing FAQs
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.
x-api-key: sdk_your_keyHow to get a key
- 1Open your app dashboard in the console
- 2Click Generate API key
- 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.ioAll endpoint paths below are relative to this base URL.
Endpoints
The API has two groups: Feedback for user submissions and FAQ for content management.
| Method | Path |
|---|---|
| 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} |
/api/v1/feedback/remoteSubmit user feedback from your app. Supports bug reports, feature requests, questions, and general feedback — with optional image attachments.
Request body
{
"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 }/api/v1/faqs/remoteReturns 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"
}
]/api/v1/faqs/remoteCreate a new FAQ entry for your app.
Request body
{
"question": "How do I export data?",
"answer": "Go to Settings > Export.",
"sortOrder": 0 // optional
}Response
201 { "id": "uuid", "question": "...", "answer": "...", "sortOrder": 0 }/api/v1/faqs/remote/{faqId}Update any fields on an existing FAQ entry. All fields are optional.
Request body
{
"question": "Updated question?", // optional
"answer": "Updated answer.", // optional
"sortOrder": 1 // optional
}Response
200 { "id": "uuid", "question": "...", "answer": "...", "sortOrder": 1 }/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.
Install
npm install @bangkeut-technology/supportdock-sdkUsage
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)
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
composer require bangkeut-technology/supportdock-sdkUsage
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 -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..."]
}'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)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()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'},
}),
);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 https://supportdock.io/api/v1/faqs/remote \
-H "x-api-key: sdk_your_key"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
| Status | Meaning |
|---|---|
201 | Created successfully |
200 | Success (GET, PATCH, DELETE) |
400 | Validation error |
401 | Missing or invalid API key |
403 | Pro plan required |
404 | Resource not found |
429 | Rate limited — wait and retry |
Rate-limited responses include a Retry-After header with the number of seconds to wait.
Works with any platform
Frequently asked questions
Start building
Generate your API key and start sending feedback in under a minute.