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 API Keys (Form Submissions)
Used for form submissions and public-facing endpoints. Generated per project.
/api/submissionsSubmit a form with API key authentication
Authorization: Bearer issued_abc123def456
Content-Type: application/json{
"projectId": "issued_abc123def456",
"fields": {
"subject": {
"visible": true,
"required": true
},
"description": {
"visible": true,
"required": true
}
}
}{
"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://api.issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer issued_abc123def456" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": {\n \"visible\": true,\n \"required\": true\n },\n \"description\": {\n \"visible\": true,\n \"required\": true\n }\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://api.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 a support form with embed-level field configuration. POST /api/submissions is the core endpoint for all form submissions.
/api/submissionsBasic form submission with visible fields
{
"projectId": "issued_abc123def456",
"fields": {
"subject": {
"visible": true,
"required": true
},
"description": {
"visible": true,
"required": true
},
"email": {
"visible": true,
"required": false
}
}
}{
"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://api.issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": {\n \"visible\": true,\n \"required\": true\n },\n \"description\": {\n \"visible\": true,\n \"required\": true\n },\n \"email\": {\n \"visible\": true,\n \"required\": false\n }\n }\n}"/api/submissionsForm with authenticated user data (hidden fields)
{
"projectId": "issued_abc123def456",
"fields": {
"subject": {
"visible": true,
"required": true
},
"description": {
"visible": true,
"required": true
},
"email": {
"visible": false,
"value": "user@example.com"
},
"name": {
"visible": false,
"value": "John Doe"
},
"userId": {
"visible": false,
"value": "user_123456"
},
"planType": {
"visible": false,
"value": "premium"
}
},
"metadata": {
"sdkVersion": "1.0.0",
"sdkPlatform": "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://api.issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": {\n \"visible\": true,\n \"required\": true\n },\n \"description\": {\n \"visible\": true,\n \"required\": true\n },\n \"email\": {\n \"visible\": false,\n \"value\": \"user@example.com\"\n },\n \"name\": {\n \"visible\": false,\n \"value\": \"John Doe\"\n },\n \"userId\": {\n \"visible\": false,\n \"value\": \"user_123456\"\n },\n \"planType\": {\n \"visible\": false,\n \"value\": \"premium\"\n }\n },\n \"metadata\": {\n \"sdkVersion\": \"1.0.0\",\n \"sdkPlatform\": \"web\",\n \"pageUrl\": \"https://myapp.com/support\"\n }\n}"/api/submissionsForm with GitHub-specific fields (labels, assignees, milestone)
{
"projectId": "issued_abc123def456",
"fields": {
"subject": {
"visible": true,
"required": true
},
"description": {
"visible": true,
"required": true
},
"email": {
"visible": true,
"required": false
},
"labels": {
"visible": false,
"value": "bug,high-priority,customer-reported"
},
"assignees": {
"visible": false,
"value": "developer1,support-team"
},
"milestone": {
"visible": false,
"value": 5
}
}
}{
"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://api.issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": {\n \"visible\": true,\n \"required\": true\n },\n \"description\": {\n \"visible\": true,\n \"required\": true\n },\n \"email\": {\n \"visible\": true,\n \"required\": false\n },\n \"labels\": {\n \"visible\": false,\n \"value\": \"bug,high-priority,customer-reported\"\n },\n \"assignees\": {\n \"visible\": false,\n \"value\": \"developer1,support-team\"\n },\n \"milestone\": {\n \"visible\": false,\n \"value\": 5\n }\n }\n}"/api/submissionsMobile submission with bundle ID validation
{
"projectId": "issued_abc123def456",
"fields": {
"subject": {
"visible": true,
"required": true
},
"description": {
"visible": true,
"required": true
},
"email": {
"visible": false,
"value": "mobileuser@example.com"
},
"userId": {
"visible": false,
"value": "mobile_user_789"
},
"deviceInfo": {
"visible": false,
"value": {
"platform": "iOS",
"version": "17.2",
"model": "iPhone 15 Pro"
}
}
},
"metadata": {
"sdkVersion": "1.2.0",
"sdkPlatform": "ios",
"bundleId": "com.mycompany.myapp"
}
}{
"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://api.issued.dev/api/submissions" \
-H "Content-Type: application/json" \
-d "{\n \"projectId\": \"issued_abc123def456\",\n \"fields\": {\n \"subject\": {\n \"visible\": true,\n \"required\": true\n },\n \"description\": {\n \"visible\": true,\n \"required\": true\n },\n \"email\": {\n \"visible\": false,\n \"value\": \"mobileuser@example.com\"\n },\n \"userId\": {\n \"visible\": false,\n \"value\": \"mobile_user_789\"\n },\n \"deviceInfo\": {\n \"visible\": false,\n \"value\": {\n \"platform\": \"iOS\",\n \"version\": \"17.2\",\n \"model\": \"iPhone 15 Pro\"\n }\n }\n },\n \"metadata\": {\n \"sdkVersion\": \"1.2.0\",\n \"sdkPlatform\": \"ios\",\n \"bundleId\": \"com.mycompany.myapp\"\n }\n}"Field Configuration Reference
| Property | Type | Description |
|---|---|---|
| visible | boolean | Whether field appears in the form UI |
| required | boolean | Whether visible fields must be completed |
| value | any | Pre-populated value (works for visible and hidden fields) |
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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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://api.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