Skip to main content

API Reference

The UserDispatch REST API lets you submit feedback, manage apps, and query submissions programmatically. For most use cases, connecting via MCP is easier than calling the REST API directly.

Base URL

https://userdispatch.com/api

Authentication

UserDispatch uses two types of authentication depending on the endpoint:

App API key (for submissions)

Used for the submissions endpoint. Pass your app's API key in the X-API-Key header:

POST /api/v1/submissions
X-API-Key: pk_your-app-api-key
Content-Type: application/json

Bearer token (for admin endpoints)

Used for all admin endpoints. Pass your ud_ token in the Authorization header:

GET /api/v1/admin/submissions
Authorization: Bearer ud_your-admin-token

Submit feedback

POST/api/v1/submissions

Request body (JSON)

FieldTypeRequiredDescription
typestringYesfeedback, question, bug_report, or automated_log
messagestringNoFeedback message (max 10,000 chars)
emailstringNoSubmitter email (max 320 chars)
namestringNoSubmitter name (max 200 chars)
subjectstringNoSubject line (max 500 chars, bug reports)
ratingnumberNoStar rating, 1–5 (feedback type)
metadataobjectNoArbitrary JSON metadata (max 50KB serialized)

Example

Request
POST /api/v1/submissions HTTP/1.1
Host: userdispatch.com
X-API-Key: pk_your-app-api-key
Content-Type: application/json

{
  "type": "bug_report",
  "email": "user@example.com",
  "subject": "Checkout page crashes",
  "message": "Page freezes when clicking the Pay button on Safari.",
  "metadata": {
    "page": "/checkout",
    "browser": "Safari 17"
  }
}
Response (201)
{
  "id": "sub_abc123",
  "type": "bug_report",
  "status": "new",
  "created_at": "2026-02-28T12:00:00Z"
}

File uploads are supported via multipart/form-data. Include files as form parts alongside a json part for the submission body. Maximum request body size is 55MB.

Admin endpoints

All admin endpoints require Bearer token authentication. These are the same endpoints the MCP server uses internally.

MethodEndpointDescription
GET/api/v1/admin/submissionsList submissions (with query filters)
GET/api/v1/admin/submissions/:idGet submission details
PATCH/api/v1/admin/submissions/:idUpdate submission status
DELETE/api/v1/admin/submissions/:idDelete submission
POST/api/v1/admin/submissions/:id/repliesReply to submission
GET/api/v1/admin/appsList all apps
POST/api/v1/admin/appsCreate app
PATCH/api/v1/admin/apps/:idUpdate app
DELETE/api/v1/admin/apps/:idDelete app
POST/api/v1/admin/apps/:id/rotate-keyRotate app API key
GET/api/v1/admin/orgGet organization details
PATCH/api/v1/admin/orgUpdate organization
GET/api/v1/admin/org/membersList members
POST/api/v1/admin/org/membersInvite member
PATCH/api/v1/admin/org/members/:idUpdate member
DELETE/api/v1/admin/org/members/:idRemove member
GET/api/v1/admin/statsGet submission statistics

Query parameters

The list submissions endpoint supports these query parameters:

ParameterTypeDefaultDescription
appstringFilter by app slug
typestringFilter by submission type
statusstringFilter by status (new, in_progress, resolved, closed)
sincedateFilter from date (YYYY-MM-DD)
untildateFilter to date (YYYY-MM-DD)
searchstringFull-text search (max 200 chars)
limitnumber50Results per page (1–200)
offsetnumber0Pagination offset
sortstringcreated_atSort field (created_at, updated_at, rating)
orderstringdescSort order (asc, desc)

Error handling

Error responses use a consistent JSON format:

{
  "error": "Validation failed",
  "details": "type: Required"
}

Common error codes

CodeDescription
400Bad request — validation failed or malformed body
401Unauthorized — missing or invalid API key/token
404Resource not found
409Conflict — duplicate slug or name
429Rate limited — too many requests

Rate limits

  • Submissions: 10-second deduplication window per API key (same type + message = rejected)
  • Admin API: Standard rate limiting per token
  • Request size: 55MB maximum content length
API Reference — UserDispatch Docs