API Reference
Complete reference for the Issued API. All endpoints use JSON for requests and responses.
Authentication
The Issued API uses different authentication methods depending on the endpoint and use case.
Project ID and allowlists (Form Submissions)
Form submissions do not use a secret bearer token. Send the project ID in the JSON body and configure domain or bundle ID allowlists on the project.
/api/submissionsSubmit a form with a project ID
Content-Type: application/json{
"projectId": "issued_abc123def456",
"fields": {
"subject": "Account access request",
"description": "I cannot sign in after resetting my password."
}
}{
"success": true,
"ticketId": "PROJ-1238",
"message": "Support request submitted successfully. You will receive an email confirmation shortly.",
"submissionId": "550e8400-e29b-41d4-a716-446655440004"
}curl -X POST "https://issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": \"Account access request\",\n \"description\": \"I cannot sign in after resetting my password.\"\n }\n}"User Session (Dashboard APIs)
Used for project management and dashboard operations. Requires GitHub OAuth login.
/api/projectsList projects (requires user session)
{
"success": true,
"projects": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My App Support",
"githubRepo": "myapp",
"githubOwner": "mycompany",
"whitelistedDomains": [
"myapp.com",
"*.staging.myapp.com"
],
"whitelistedBundleIds": [
"com.mycompany.myapp"
],
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-16T14:20:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}curl -X GET "https://issued.dev/api/projects" \
-H "Content-Type: application/json"Webhook Signature Verification
Incoming webhooks from GitHub and email providers are verified using signatures.
// GitHub webhook signature verification
const signature = req.headers['x-hub-signature-256'];
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', process.env.GITHUB_WEBHOOK_SECRET)
.update(payload)
.digest('hex');Form Submissions
Submit support field values to POST /api/submissions. This is the core endpoint used by web and mobile integrations.
/api/submissionsBasic form submission with visible fields
{
"projectId": "issued_abc123def456",
"fields": {
"subject": "Checkout is not working",
"description": "The Pay button does nothing after I enter my card.",
"email": "customer@example.com"
}
}{
"success": true,
"ticketId": "PROJ-1234",
"message": "Support request submitted successfully. You will receive an email confirmation shortly.",
"submissionId": "550e8400-e29b-41d4-a716-446655440000"
}curl -X POST "https://issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": \"Checkout is not working\",\n \"description\": \"The Pay button does nothing after I enter my card.\",\n \"email\": \"customer@example.com\"\n }\n}"/api/submissionsForm with authenticated user data (hidden fields)
{
"projectId": "issued_abc123def456",
"fields": {
"subject": "Cannot update billing address",
"description": "Saving the new address returns an error.",
"email": "user@example.com",
"name": "John Doe",
"userId": "user_123456",
"planType": "premium"
},
"metadata": {
"sdk_version": "rest-1.0.0",
"sdk_platform": "web",
"pageUrl": "https://myapp.com/support"
}
}{
"success": true,
"ticketId": "PROJ-1235",
"message": "Support request submitted successfully. You will receive an email confirmation shortly.",
"submissionId": "550e8400-e29b-41d4-a716-446655440001"
}curl -X POST "https://issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": \"Cannot update billing address\",\n \"description\": \"Saving the new address returns an error.\",\n \"email\": \"user@example.com\",\n \"name\": \"John Doe\",\n \"userId\": \"user_123456\",\n \"planType\": \"premium\"\n },\n \"metadata\": {\n \"sdk_version\": \"rest-1.0.0\",\n \"sdk_platform\": \"web\",\n \"pageUrl\": \"https://myapp.com/support\"\n }\n}"/api/submissionsForm with GitHub-specific fields (labels, assignees, milestone)
{
"projectId": "issued_abc123def456",
"fields": {
"subject": "Checkout regression",
"description": "Checkout stopped working after the latest release.",
"email": "customer@example.com",
"github_labels": [
"bug",
"high-priority",
"customer-reported"
],
"github_assignees": [
"developer1",
"support-team"
]
}
}{
"success": true,
"ticketId": "PROJ-1236",
"message": "Support request submitted successfully. You will receive an email confirmation shortly.",
"submissionId": "550e8400-e29b-41d4-a716-446655440002"
}curl -X POST "https://issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": \"Checkout regression\",\n \"description\": \"Checkout stopped working after the latest release.\",\n \"email\": \"customer@example.com\",\n \"github_labels\": [\n \"bug\",\n \"high-priority\",\n \"customer-reported\"\n ],\n \"github_assignees\": [\n \"developer1\",\n \"support-team\"\n ]\n }\n}"/api/submissionsMobile submission with bundle ID validation
X-SDK-Platform: react-native
X-SDK-Version: rest-1.0.0
X-Bundle-ID: com.mycompany.myapp{
"projectId": "issued_abc123def456",
"fields": {
"subject": "App crashes on launch",
"description": "The app closes immediately after the splash screen.",
"email": "mobileuser@example.com",
"userId": "mobile_user_789"
},
"metadata": {
"sdk_version": "rest-1.0.0",
"sdk_platform": "react-native",
"device_info": {
"platform": "iOS",
"version": "17.2",
"model": "iPhone 15 Pro"
}
}
}{
"success": true,
"ticketId": "PROJ-1237",
"message": "Support request submitted successfully. You will receive an email confirmation shortly.",
"submissionId": "550e8400-e29b-41d4-a716-446655440003"
}curl -X POST "https://issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-H "X-SDK-Platform: react-native" \
-H "X-SDK-Version: rest-1.0.0" \
-H "X-Bundle-ID: com.mycompany.myapp" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": \"App crashes on launch\",\n \"description\": \"The app closes immediately after the splash screen.\",\n \"email\": \"mobileuser@example.com\",\n \"userId\": \"mobile_user_789\"\n },\n \"metadata\": {\n \"sdk_version\": \"rest-1.0.0\",\n \"sdk_platform\": \"react-native\",\n \"device_info\": {\n \"platform\": \"iOS\",\n \"version\": \"17.2\",\n \"model\": \"iPhone 15 Pro\"\n }\n }\n}"Request Body Reference
| Property | Type | Description |
|---|---|---|
| projectId | string | Project ID from the Issued dashboard |
| fields | object | Submitted field values keyed by field name |
| metadata | object | Optional SDK, device, and app context |
Standard Fields
subject— Issue title (max 200 chars)description— Issue description (max 5000 chars)email— User email for notificationsname— User display name
labels— Comma-separated GitHub labelsassignees— Comma-separated GitHub usernamesmilestone— GitHub milestone number
Project Management
/api/projects?page=1&limit=10&search=my-appList all projects for the authenticated user with optional filtering and pagination.
{
"success": true,
"projects": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My App Support",
"githubRepo": "myapp",
"githubOwner": "mycompany",
"whitelistedDomains": [
"myapp.com",
"*.staging.myapp.com"
],
"whitelistedBundleIds": [
"com.mycompany.myapp"
],
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-16T14:20:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}curl -X GET "https://issued.dev/api/projects?page=1&limit=10&search=my-app" \
-H "Content-Type: application/json"/api/projectsCreate a new project and link it to a GitHub repository or Linear team, with security configuration.
{
"name": "E-commerce Support",
"githubRepo": "ecommerce-app",
"githubOwner": "mycompany",
"notificationPreferences": {
"email": true,
"emailAddress": "support@mycompany.com",
"webhook": true,
"webhookUrl": "https://mycompany.com/webhooks/issued",
"slack": false
},
"whitelistedDomains": [
"mycompany.com",
"*.staging.mycompany.com",
"localhost:3000"
],
"whitelistedBundleIds": [
"com.mycompany.ecommerce",
"com.mycompany.ecommerce.staging"
],
"defaultLabels": [
"customer-support",
"auto-created"
],
"defaultAssignees": [
"support-team"
]
}{
"success": true,
"project": {
"id": "550e8400-e29b-41d4-a716-446655440005",
"name": "E-commerce Support",
"githubRepo": "ecommerce-app",
"githubOwner": "mycompany",
"whitelistedDomains": [
"mycompany.com",
"*.staging.mycompany.com",
"localhost:3000"
],
"whitelistedBundleIds": [
"com.mycompany.ecommerce",
"com.mycompany.ecommerce.staging"
],
"notificationPreferences": {
"email": true,
"emailAddress": "support@mycompany.com",
"webhook": true,
"webhookUrl": "https://mycompany.com/webhooks/issued",
"slack": false
},
"defaultLabels": [
"customer-support",
"auto-created"
],
"defaultAssignees": [
"support-team"
],
"createdAt": "2024-01-17T09:15:00Z",
"updatedAt": "2024-01-17T09:15:00Z"
},
"message": "Project created successfully"
}curl -X POST "https://issued.dev/api/projects" \
-H "Content-Type: application/json" \
-d "{\n \"name\": \"E-commerce Support\",\n \"githubRepo\": \"ecommerce-app\",\n \"githubOwner\": \"mycompany\",\n \"notificationPreferences\": {\n \"email\": true,\n \"emailAddress\": \"support@mycompany.com\",\n \"webhook\": true,\n \"webhookUrl\": \"https://mycompany.com/webhooks/issued\",\n \"slack\": false\n },\n \"whitelistedDomains\": [\n \"mycompany.com\",\n \"*.staging.mycompany.com\",\n \"localhost:3000\"\n ],\n \"whitelistedBundleIds\": [\n \"com.mycompany.ecommerce\",\n \"com.mycompany.ecommerce.staging\"\n ],\n \"defaultLabels\": [\n \"customer-support\",\n \"auto-created\"\n ],\n \"defaultAssignees\": [\n \"support-team\"\n ]\n}"/api/projects/550e8400-e29b-41d4-a716-446655440000Get detailed information about a specific project (GET /api/projects/{id}).
{
"success": true,
"project": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My App Support",
"githubRepo": "myapp",
"githubOwner": "mycompany",
"githubInstallationId": 12345678,
"apiKey": "issued_abc123def456",
"whitelistedDomains": [
"myapp.com",
"*.staging.myapp.com"
],
"whitelistedBundleIds": [
"com.mycompany.myapp"
],
"notificationPreferences": {
"email": true,
"emailAddress": "developer@mycompany.com",
"webhook": false,
"slack": false
},
"defaultLabels": [
"customer-reported"
],
"defaultAssignees": [
"support-team"
],
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-16T14:20:00Z",
"stats": {
"totalSubmissions": 42,
"pendingSubmissions": 3,
"avgResponseTime": "4.2 hours"
}
}
}curl -X GET "https://issued.dev/api/projects/550e8400-e29b-41d4-a716-446655440000" \
-H "Content-Type: application/json"/api/projects/550e8400-e29b-41d4-a716-446655440000Update project configuration including security settings and notification preferences (PUT /api/projects/{id}).
{
"name": "Updated App Support",
"notificationPreferences": {
"email": true,
"emailAddress": "newsupport@mycompany.com",
"webhook": true,
"webhookUrl": "https://api.mycompany.com/webhooks/issued",
"slack": true,
"slackWebhookUrl": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
},
"whitelistedDomains": [
"myapp.com",
"*.staging.myapp.com",
"*.preview.myapp.com"
],
"whitelistedBundleIds": [
"com.mycompany.myapp",
"com.mycompany.myapp.beta"
],
"defaultLabels": [
"customer-reported",
"needs-triage"
],
"defaultAssignees": [
"support-team",
"engineering-lead"
]
}{
"success": true,
"project": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Updated App Support",
"githubRepo": "myapp",
"githubOwner": "mycompany",
"apiKey": "issued_abc123def456",
"whitelistedDomains": [
"myapp.com",
"*.staging.myapp.com",
"*.preview.myapp.com"
],
"whitelistedBundleIds": [
"com.mycompany.myapp",
"com.mycompany.myapp.beta"
],
"notificationPreferences": {
"email": true,
"emailAddress": "newsupport@mycompany.com",
"webhook": true,
"webhookUrl": "https://api.mycompany.com/webhooks/issued",
"slack": true,
"slackWebhookUrl": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
},
"defaultLabels": [
"customer-reported",
"needs-triage"
],
"defaultAssignees": [
"support-team",
"engineering-lead"
],
"updatedAt": "2024-01-17T11:45:00Z"
},
"message": "Project updated successfully"
}curl -X PUT "https://issued.dev/api/projects/550e8400-e29b-41d4-a716-446655440000" \
-H "Content-Type: application/json" \
-d "{\n \"name\": \"Updated App Support\",\n \"notificationPreferences\": {\n \"email\": true,\n \"emailAddress\": \"newsupport@mycompany.com\",\n \"webhook\": true,\n \"webhookUrl\": \"https://api.mycompany.com/webhooks/issued\",\n \"slack\": true,\n \"slackWebhookUrl\": \"https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX\"\n },\n \"whitelistedDomains\": [\n \"myapp.com\",\n \"*.staging.myapp.com\",\n \"*.preview.myapp.com\"\n ],\n \"whitelistedBundleIds\": [\n \"com.mycompany.myapp\",\n \"com.mycompany.myapp.beta\"\n ],\n \"defaultLabels\": [\n \"customer-reported\",\n \"needs-triage\"\n ],\n \"defaultAssignees\": [\n \"support-team\",\n \"engineering-lead\"\n ]\n}"Webhooks
/api/webhooks/githubHandles GitHub webhook events, particularly issue comment notifications.
X-GitHub-Event: issue_comment
X-Hub-Signature-256: sha256=...
Content-Type: application/json{
"action": "created",
"issue": {
"id": 1,
"number": 42,
"title": "Support Request: Cannot login to account",
"body": "**Email**: customer@example.com\n**Name**: Jane Smith\n**Description**: I'm unable to login to my account...",
"state": "open",
"html_url": "https://github.com/mycompany/myapp/issues/42"
},
"comment": {
"id": 123456789,
"body": "Hi Jane, thanks for reaching out. Can you please try clearing your browser cache and cookies?",
"user": {
"login": "support-team",
"avatar_url": "https://avatars.githubusercontent.com/u/12345?v=4"
},
"created_at": "2024-01-17T12:30:00Z",
"html_url": "https://github.com/mycompany/myapp/issues/42#issuecomment-123456789"
},
"repository": {
"name": "myapp",
"full_name": "mycompany/myapp"
}
}{
"success": true,
"message": "Comment notification sent successfully"
}curl -X POST "https://issued.dev/api/webhooks/github" \
-H "Content-Type: application/json" \
-H "X-GitHub-Event: issue_comment" \
-H "X-Hub-Signature-256: sha256=..." \
-d "{\n \"action\": \"created\",\n \"issue\": {\n \"id\": 1,\n \"number\": 42,\n \"title\": \"Support Request: Cannot login to account\",\n \"body\": \"**Email**: customer@example.com\n**Name**: Jane Smith\n**Description**: I'm unable to login to my account...\",\n \"state\": \"open\",\n \"html_url\": \"https://github.com/mycompany/myapp/issues/42\"\n },\n \"comment\": {\n \"id\": 123456789,\n \"body\": \"Hi Jane, thanks for reaching out. Can you please try clearing your browser cache and cookies?\",\n \"user\": {\n \"login\": \"support-team\",\n \"avatar_url\": \"https://avatars.githubusercontent.com/u/12345?v=4\"\n },\n \"created_at\": \"2024-01-17T12:30:00Z\",\n \"html_url\": \"https://github.com/mycompany/myapp/issues/42#issuecomment-123456789\"\n },\n \"repository\": {\n \"name\": \"myapp\",\n \"full_name\": \"mycompany/myapp\"\n }\n}"Email Reply Processing
How email replies are processed and converted to GitHub comments.
To: reply+PROJ-1234@issued.dev
Subject: Re: Support Request #PROJ-1234
This is a reply from the customer that will be posted as a GitHub comment./api/webhooks/emailEmail reply webhook processing
{
"messageId": "msg_abc123def456",
"to": "reply+PROJ-1234@issued.dev",
"from": "customer@example.com",
"subject": "Re: Support Request #PROJ-1234",
"text": "Thanks for the quick response! I tried clearing the cache and it worked. The issue is resolved now.",
"html": "<p>Thanks for the quick response! I tried clearing the cache and it worked. The issue is resolved now.</p>",
"receivedAt": "2024-01-17T13:15:00Z"
}{
"success": true,
"message": "Email reply processed and posted to GitHub",
"githubCommentId": 123456790,
"githubCommentUrl": "https://github.com/mycompany/myapp/issues/42#issuecomment-123456790"
}curl -X POST "https://issued.dev/api/webhooks/email" \
-H "Content-Type: application/json" \
-d "{\n \"messageId\": \"msg_abc123def456\",\n \"to\": \"reply+PROJ-1234@issued.dev\",\n \"from\": \"customer@example.com\",\n \"subject\": \"Re: Support Request #PROJ-1234\",\n \"text\": \"Thanks for the quick response! I tried clearing the cache and it worked. The issue is resolved now.\",\n \"html\": \"<p>Thanks for the quick response! I tried clearing the cache and it worked. The issue is resolved now.</p>\",\n \"receivedAt\": \"2024-01-17T13:15:00Z\"\n}"File Uploads
Upload files for form submissions. Supports images, documents, and text files.
/api/uploadUpload files with form submissions
{
"files": [
{
"name": "screenshot.png",
"type": "image/png",
"size": 1024576,
"data": "base64EncodedImageData..."
},
{
"name": "error.log",
"type": "text/plain",
"size": 8192,
"data": "base64EncodedLogData..."
}
],
"submissionId": "550e8400-e29b-41d4-a716-446655440000"
}{
"success": true,
"files": [
{
"id": "file_abc123def456",
"name": "screenshot.png",
"type": "image/png",
"size": 1024576,
"url": "https://storage.issued.dev/uploads/550e8400-e29b-41d4-a716-446655440000/screenshot.png",
"githubUrl": "https://github.com/mycompany/myapp/assets/..."
},
{
"id": "file_def456ghi789",
"name": "error.log",
"type": "text/plain",
"size": 8192,
"url": "https://storage.issued.dev/uploads/550e8400-e29b-41d4-a716-446655440000/error.log",
"githubUrl": "https://github.com/mycompany/myapp/files/..."
}
],
"message": "Files uploaded successfully"
}curl -X POST "https://issued.dev/api/upload" \
-H "Content-Type: application/json" \
-d "{\n \"files\": [\n {\n \"name\": \"screenshot.png\",\n \"type\": \"image/png\",\n \"size\": 1024576,\n \"data\": \"base64EncodedImageData...\"\n },\n {\n \"name\": \"error.log\",\n \"type\": \"text/plain\",\n \"size\": 8192,\n \"data\": \"base64EncodedLogData...\"\n }\n ],\n \"submissionId\": \"550e8400-e29b-41d4-a716-446655440000\"\n}"File Restrictions
- Maximum file size: 10MB per file
- Maximum total size: 50MB per submission
- Images: JPEG, PNG, GIF, SVG
- Documents: PDF, DOC, DOCX
- Text: TXT, LOG, CSV
Notifications
Manage notification preferences and test notification delivery via GET/POST /api/notifications.
/api/notifications?projectId=550e8400-e29b-41d4-a716-446655440000Get notification preferences for a project
{
"success": true,
"preferences": {
"email": true,
"emailAddress": "developer@example.com",
"webhook": false,
"webhookUrl": null,
"slack": false,
"slackWebhookUrl": null
}
}curl -X GET "https://issued.dev/api/notifications?projectId=550e8400-e29b-41d4-a716-446655440000" \
-H "Content-Type: application/json"/api/notificationsUpdate notification preferences
{
"projectId": "550e8400-e29b-41d4-a716-446655440000",
"preferences": {
"email": true,
"emailAddress": "notifications@mycompany.com",
"webhook": true,
"webhookUrl": "https://myapp.com/webhooks/issued",
"slack": true,
"slackWebhookUrl": "https://hooks.slack.com/services/..."
}
}{
"success": true,
"message": "Notification preferences updated successfully"
}curl -X POST "https://issued.dev/api/notifications" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"preferences\": {\n \"email\": true,\n \"emailAddress\": \"notifications@mycompany.com\",\n \"webhook\": true,\n \"webhookUrl\": \"https://myapp.com/webhooks/issued\",\n \"slack\": true,\n \"slackWebhookUrl\": \"https://hooks.slack.com/services/...\"\n }\n}"/api/notifications/testSend test notifications
{
"projectId": "550e8400-e29b-41d4-a716-446655440000",
"type": "email"
}{
"success": true,
"message": "Test notification sent successfully"
}curl -X POST "https://issued.dev/api/notifications/test" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"type\": \"email\"\n}"The type field accepts "email", "webhook", or "slack".
Health Monitoring
Check system health and service status for monitoring and debugging via GET /api/health.
/api/health?service=all&detailed=trueCheck all services with detailed information
{
"status": "healthy",
"timestamp": "2024-01-17T14:30:00Z",
"uptime": 86400,
"version": "1.0.0",
"services": {
"database": {
"status": "healthy",
"responseTime": 45,
"lastChecked": "2024-01-17T14:30:00Z"
},
"github": {
"status": "healthy",
"responseTime": 123,
"lastChecked": "2024-01-17T14:30:00Z"
},
"email": {
"status": "healthy",
"responseTime": 12,
"lastChecked": "2024-01-17T14:30:00Z"
}
}
}curl -X GET "https://issued.dev/api/health?service=all&detailed=true" \
-H "Content-Type: application/json"/api/health?service=databaseCheck database connectivity
{
"status": "healthy",
"timestamp": "2024-01-17T14:30:00Z",
"uptime": 86400,
"version": "1.0.0",
"services": {
"database": {
"status": "healthy",
"responseTime": 45,
"lastChecked": "2024-01-17T14:30:00Z"
}
}
}curl -X GET "https://issued.dev/api/health?service=database" \
-H "Content-Type: application/json"/api/health?service=githubCheck GitHub API status
{
"status": "healthy",
"timestamp": "2024-01-17T14:30:00Z",
"uptime": 86400,
"version": "1.0.0",
"services": {
"github": {
"status": "healthy",
"responseTime": 123,
"lastChecked": "2024-01-17T14:30:00Z"
}
}
}curl -X GET "https://issued.dev/api/health?service=github" \
-H "Content-Type: application/json"/api/health?service=emailCheck email service configuration
{
"status": "healthy",
"timestamp": "2024-01-17T14:30:00Z",
"uptime": 86400,
"version": "1.0.0",
"services": {
"email": {
"status": "healthy",
"responseTime": 12,
"lastChecked": "2024-01-17T14:30:00Z"
}
}
}curl -X GET "https://issued.dev/api/health?service=email" \
-H "Content-Type: application/json"Error Handling
All API endpoints return errors in a consistent format with appropriate HTTP status codes.
Error Response Structure
{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "Request validation failed",
"details": {
"field": "subject",
"reason": "Field is required but not provided"
}
},
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_abc123"
}Common Error Codes
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | VALIDATION_FAILED | Request data is invalid or missing required fields |
| 401 | UNAUTHORIZED | Authentication required or invalid credentials |
| 403 | INVALID_ORIGIN | Request origin not whitelisted for this project |
| 404 | PROJECT_NOT_FOUND | Specified project does not exist |
| 429 | RATE_LIMIT_EXCEEDED | Too many requests from this IP address |
| 500 | INTERNAL_ERROR | Unexpected server error |
Rate Limiting
All API endpoints are subject to rate limiting to ensure fair usage and system stability.
Operational Rate Limits
- 10 submissions/hour per IP
- 100 API calls/hour per user
- Abuse protection before account context
- 100 submissions/hour per IP
- 1,000 API calls/hour per user
- Normal protected dashboard usage
- 1,000 submissions/hour per IP
- 10,000 API calls/hour per user
- High-throughput operational allowance
Rate Limit Headers
All API responses include rate limit information in the headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1705316400
X-RateLimit-Window: 3600