Version: 3.0.0
Base URL: http://your-domain.com/api
Authentication: JWT Bearer Token (via httpOnly cookies)
Last Updated: 2026-05-24
v3.0 endpoints (Workspaces, Project Templates, Environment Variables, Notification Providers/Channels, Rollback, Log download, Bull Board) are documented in
versions/v3.0-foundation.md§API. This document still reflects the v2.1 endpoint surface and is being incrementally refreshed in v3.0.1 to consolidate everything in one place.
- Authentication
- User Management
- Project Management
- SSH Key Management
- Deployment Operations
- Audit Logs
- GitHub Webhooks
- Error Handling
- Response Format
- Rate Limiting
All authenticated endpoints require a valid JWT access token sent via httpOnly cookies. Tokens are automatically included in requests after login.
accessToken- Short-lived access token (15 minutes)refreshToken- Long-lived refresh token (7 days)
Endpoint: POST /api/auth/register
Authentication: Not required
Description: Create a new user account
Request Body:
{
"Username": "johndoe",
"Email": "john@example.com",
"Password": "SecurePassword123!",
"Role": "Developer"
}Field Validation:
Username: Required, 3-50 characters, alphanumeric + underscoreEmail: Required, valid email formatPassword: Required, minimum 8 charactersRole: Optional, one of:Admin,Manager,Developer,Viewer(default:Developer)
Success Response (201):
{
"success": true,
"message": "User registered successfully",
"data": {
"Id": 1,
"Username": "johndoe",
"Email": "john@example.com",
"Role": "Developer",
"CreatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Error Responses:
400- Validation error (missing fields, invalid format)409- User already exists (duplicate username/email)500- Server error
Endpoint: POST /api/auth/login
Authentication: Not required
Description: Authenticate user and receive JWT tokens
Request Body:
{
"Email": "john@example.com",
"Password": "SecurePassword123!"
}Success Response (200):
{
"success": true,
"message": "Login successful",
"data": {
"user": {
"Id": 1,
"Username": "johndoe",
"Email": "john@example.com",
"Role": "Developer"
}
},
"error": false
}Sets Cookies:
accessToken- HTTP-only, Secure, SameSite=StrictrefreshToken- HTTP-only, Secure, SameSite=Strict
Error Responses:
400- Invalid credentials404- User not found500- Server error
Endpoint: POST /api/auth/logout
Authentication: Required
Description: Invalidate current session and clear tokens
Success Response (200):
{
"success": true,
"message": "Logout successful",
"data": null,
"error": false
}Clears Cookies:
accessTokenrefreshToken
Endpoint: POST /api/auth/refresh
Authentication: Refresh token required (via cookie)
Description: Get a new access token using refresh token
Success Response (200):
{
"success": true,
"message": "Token refreshed successfully",
"data": null,
"error": false
}Sets Cookies:
accessToken- New access token
Error Responses:
401- Invalid or expired refresh token500- Server error
Endpoint: GET /api/auth/me
Authentication: Required
Description: Get currently authenticated user's profile
Success Response (200):
{
"success": true,
"message": "User retrieved successfully",
"data": {
"Id": 1,
"Username": "johndoe",
"Email": "john@example.com",
"Role": "Developer",
"CreatedAt": "2024-12-28T10:00:00.000Z",
"UpdatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Endpoint: POST /api/auth/forgot-password
Authentication: Not required
Description: Request password reset email
Request Body:
{
"Email": "john@example.com"
}Success Response (200):
{
"success": true,
"message": "Password reset link sent to email",
"data": null,
"error": false
}Endpoint: POST /api/auth/reset-password
Authentication: Not required
Description: Reset password using reset token
Request Body:
{
"token": "reset-token-from-email",
"newPassword": "NewSecurePassword123!"
}Success Response (200):
{
"success": true,
"message": "Password reset successfully",
"data": null,
"error": false
}Error Responses:
400- Invalid or expired token500- Server error
Endpoint: GET /api/users
Authentication: Required
Permissions: Admin, Manager
Description: Get list of all users
Query Parameters:
page(optional): Page number (default: 1)limit(optional): Items per page (default: 20, max: 100)role(optional): Filter by rolesearch(optional): Search by username or email
Example Request:
GET /api/users?page=1&limit=10&role=Developer&search=john
Success Response (200):
{
"success": true,
"message": "Users retrieved successfully",
"data": {
"users": [
{
"Id": 1,
"Username": "johndoe",
"Email": "john@example.com",
"Role": "Developer",
"CreatedAt": "2024-12-28T10:00:00.000Z"
}
],
"pagination": {
"total": 50,
"page": 1,
"limit": 10,
"totalPages": 5
}
},
"error": false
}Error Responses:
403- Insufficient permissions500- Server error
Endpoint: GET /api/users/:id
Authentication: Required
Permissions: Admin, Manager, or own profile
Description: Get detailed user information
Success Response (200):
{
"success": true,
"message": "User retrieved successfully",
"data": {
"Id": 1,
"Username": "johndoe",
"Email": "john@example.com",
"Role": "Developer",
"CreatedAt": "2024-12-28T10:00:00.000Z",
"UpdatedAt": "2024-12-28T10:00:00.000Z",
"Projects": [
{
"Id": 1,
"Name": "My Project",
"Role": "owner"
}
]
},
"error": false
}Endpoint: PUT /api/users/:id
Authentication: Required
Permissions: Admin, Manager, or own profile
Description: Update user information
Request Body:
{
"Username": "johndoe_updated",
"Email": "john.new@example.com",
"Role": "Manager"
}Notes:
- Only Admin can change roles
- Users can update their own username and email
Success Response (200):
{
"success": true,
"message": "User updated successfully",
"data": {
"Id": 1,
"Username": "johndoe_updated",
"Email": "john.new@example.com",
"Role": "Manager"
},
"error": false
}Endpoint: PUT /api/users/:id/password
Authentication: Required
Permissions: Own account only
Description: Change user password
Request Body:
{
"oldPassword": "CurrentPassword123!",
"newPassword": "NewSecurePassword123!"
}Success Response (200):
{
"success": true,
"message": "Password changed successfully",
"data": null,
"error": false
}Error Responses:
400- Old password incorrect403- Cannot change other user's password
Endpoint: DELETE /api/users/:id
Authentication: Required
Permissions: Admin only
Description: Delete a user account
Success Response (200):
{
"success": true,
"message": "User deleted successfully",
"data": null,
"error": false
}Notes:
- Cascades delete: ProjectMembers, SSHKeys, AuditLogs
- Cannot delete yourself
Endpoint: POST /api/projects
Authentication: Required
Permissions: Admin, Manager, Developer
Description: Create a new project
Request Body:
{
"Name": "My Awesome Project",
"Description": "A production-ready Node.js application",
"Repository": "https://github.com/user/repo.git",
"Branch": "main",
"ProjectPath": "/var/www/my-project",
"Variables": {
"type": "node",
"pm2Name": "my-app",
"buildCmd": "npm run build",
"port": "3000"
},
"Pipeline": [
{
"name": "Pull Latest Code",
"run": [
"cd {{projectPath}}",
"git pull origin {{branch}}"
]
},
{
"name": "Install Dependencies",
"run": ["npm ci"]
},
{
"name": "Build Application",
"run_if": "hasVar('buildCmd')",
"run": ["{{buildCmd}}"]
},
{
"name": "Restart PM2",
"run": ["pm2 reload {{pm2Name}}"]
}
],
"DiscordWebhook": "https://discord.com/api/webhooks/..."
}Success Response (201):
{
"success": true,
"message": "Project created successfully",
"data": {
"Id": 1,
"Name": "My Awesome Project",
"Description": "A production-ready Node.js application",
"Repository": "https://github.com/user/repo.git",
"Branch": "main",
"CreatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Notes:
- User creating project is automatically assigned as "owner"
- Pipeline steps are executed sequentially
- Variables can be referenced in pipeline using
{{variableName}}
Endpoint: GET /api/projects
Authentication: Required
Description: Get all projects accessible to current user
Query Parameters:
page(optional): Page numberlimit(optional): Items per pagesearch(optional): Search by name or description
Success Response (200):
{
"success": true,
"message": "Projects retrieved successfully",
"data": {
"projects": [
{
"Id": 1,
"Name": "My Awesome Project",
"Description": "A production-ready Node.js application",
"Repository": "https://github.com/user/repo.git",
"Branch": "main",
"CreatedAt": "2024-12-28T10:00:00.000Z",
"UserRole": "owner"
}
],
"pagination": {
"total": 10,
"page": 1,
"limit": 20,
"totalPages": 1
}
},
"error": false
}Access Rules:
- Admin/Manager: See all projects
- Developer/Viewer: See only projects they're members of
Endpoint: GET /api/projects/:id
Authentication: Required
Permissions: Project member, Admin, or Manager
Description: Get detailed project information
Success Response (200):
{
"success": true,
"message": "Project retrieved successfully",
"data": {
"Id": 1,
"Name": "My Awesome Project",
"Description": "A production-ready Node.js application",
"Repository": "https://github.com/user/repo.git",
"Branch": "main",
"ProjectPath": "/var/www/my-project",
"Variables": {
"type": "node",
"pm2Name": "my-app",
"buildCmd": "npm run build"
},
"Pipeline": [...],
"DiscordWebhook": "https://discord.com/api/webhooks/...",
"Members": [
{
"UserId": 1,
"Username": "johndoe",
"Role": "owner",
"AddedAt": "2024-12-28T10:00:00.000Z"
}
],
"CreatedAt": "2024-12-28T10:00:00.000Z",
"UpdatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Endpoint: PUT /api/projects/:id
Authentication: Required
Permissions: Project owner, Admin, or Manager
Description: Update project configuration
Request Body: (all fields optional)
{
"Name": "Updated Project Name",
"Description": "Updated description",
"Branch": "develop",
"Variables": {
"newVar": "value"
},
"Pipeline": [...],
"DiscordWebhook": "https://discord.com/api/webhooks/new"
}Success Response (200):
{
"success": true,
"message": "Project updated successfully",
"data": {
"Id": 1,
"Name": "Updated Project Name",
"UpdatedAt": "2024-12-28T11:00:00.000Z"
},
"error": false
}Endpoint: DELETE /api/projects/:id
Authentication: Required
Permissions: Admin or Manager only
Description: Delete a project
Success Response (200):
{
"success": true,
"message": "Project deleted successfully",
"data": null,
"error": false
}Notes:
- Cascades delete: Deployments, DeploymentLogs, ProjectMembers, ProjectAuditLogs
Endpoint: GET /api/projects/:id/members
Authentication: Required
Permissions: Project member, Admin, or Manager
Description: Get all members of a project
Success Response (200):
{
"success": true,
"message": "Project members retrieved successfully",
"data": [
{
"Id": 1,
"UserId": 1,
"ProjectId": 1,
"Role": "owner",
"AddedAt": "2024-12-28T10:00:00.000Z",
"User": {
"Id": 1,
"Username": "johndoe",
"Email": "john@example.com",
"Role": "Developer"
}
}
],
"error": false
}Endpoint: POST /api/projects/:id/members
Authentication: Required
Permissions: Project owner, Admin, or Manager
Description: Add a user to the project
Request Body:
{
"userId": 2,
"role": "member"
}Role Options:
owner- Can manage members and project settingsmember- Can deploy and view project
Success Response (201):
{
"success": true,
"message": "Member added successfully",
"data": {
"Id": 2,
"UserId": 2,
"ProjectId": 1,
"Role": "member",
"AddedAt": "2024-12-28T12:00:00.000Z"
},
"error": false
}Error Responses:
400- User already a member404- User or project not found
Endpoint: DELETE /api/projects/:projectId/members/:userId
Authentication: Required
Permissions: Project owner, Admin, or Manager
Description: Remove a user from the project
Success Response (200):
{
"success": true,
"message": "Member removed successfully",
"data": null,
"error": false
}Notes:
- Cannot remove the last owner of a project
- Owners can remove themselves if there's another owner
Endpoint: GET /api/projects/:id/audit-logs
Authentication: Required
Permissions: Project member, Admin, or Manager
Description: Get audit trail for project changes
Query Parameters:
page(optional): Page numberlimit(optional): Items per page
Success Response (200):
{
"success": true,
"message": "Audit logs retrieved successfully",
"data": {
"logs": [
{
"Id": 1,
"ProjectId": 1,
"UserId": 1,
"Action": "PROJECT_UPDATED",
"Details": "Updated project configuration",
"CreatedAt": "2024-12-28T11:00:00.000Z",
"User": {
"Username": "johndoe"
}
}
],
"pagination": {...}
},
"error": false
}Endpoint: POST /api/ssh-keys
Authentication: Required
Description: Add a new SSH key pair
Request Body:
{
"Name": "Production Server Key",
"PublicKey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB...",
"PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA...\n-----END RSA PRIVATE KEY-----"
}Success Response (201):
{
"success": true,
"message": "SSH key added successfully",
"data": {
"Id": 1,
"Name": "Production Server Key",
"Fingerprint": "SHA256:abc123...",
"CreatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Notes:
- Private key is encrypted with AES-256-GCM before storage
- Fingerprint is SHA-256 hash of public key
- Private key is NEVER returned in API responses
Endpoint: GET /api/ssh-keys
Authentication: Required
Description: Get all SSH keys for current user
Success Response (200):
{
"success": true,
"message": "SSH keys retrieved successfully",
"data": [
{
"Id": 1,
"Name": "Production Server Key",
"Fingerprint": "SHA256:abc123...",
"CreatedAt": "2024-12-28T10:00:00.000Z"
}
],
"error": false
}Access Rules:
- Users see only their own SSH keys
- Admin/Manager can see all SSH keys
Endpoint: GET /api/ssh-keys/:id
Authentication: Required
Permissions: Key owner, Admin, or Manager
Description: Get SSH key details (without private key)
Success Response (200):
{
"success": true,
"message": "SSH key retrieved successfully",
"data": {
"Id": 1,
"Name": "Production Server Key",
"PublicKey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB...",
"Fingerprint": "SHA256:abc123...",
"CreatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Endpoint: DELETE /api/ssh-keys/:id
Authentication: Required
Permissions: Key owner, Admin, or Manager
Description: Delete an SSH key
Success Response (200):
{
"success": true,
"message": "SSH key deleted successfully",
"data": null,
"error": false
}Endpoint: POST /api/deployments/trigger
Authentication: Required
Permissions: Project member, Admin, or Manager
Description: Manually trigger a deployment
Request Body:
{
"projectId": 1,
"branch": "main",
"commit": "a1b2c3d4e5f6"
}Success Response (201):
{
"success": true,
"message": "Deployment triggered successfully",
"data": {
"Id": 1,
"ProjectId": 1,
"Branch": "main",
"Commit": "a1b2c3d4e5f6",
"Status": "pending",
"TriggeredBy": 1,
"CreatedAt": "2024-12-28T10:00:00.000Z"
},
"error": false
}Deployment Status Flow:
pending→ Deployment queuedrunning→ Pipeline executingsuccess→ Deployment completed successfullyfailed→ Deployment failed (check logs)
Endpoint: GET /api/deployments
Authentication: Required
Description: Get all deployments accessible to current user
Query Parameters:
page(optional): Page numberlimit(optional): Items per pageprojectId(optional): Filter by projectstatus(optional): Filter by status (pending, running, success, failed)branch(optional): Filter by branch
Success Response (200):
{
"success": true,
"message": "Deployments retrieved successfully",
"data": {
"deployments": [
{
"Id": 1,
"ProjectId": 1,
"Branch": "main",
"Commit": "a1b2c3d4e5f6",
"Status": "success",
"TriggeredBy": 1,
"StartedAt": "2024-12-28T10:00:00.000Z",
"CompletedAt": "2024-12-28T10:05:00.000Z",
"Duration": 300,
"Project": {
"Name": "My Awesome Project"
},
"User": {
"Username": "johndoe"
}
}
],
"pagination": {...}
},
"error": false
}Access Rules:
- Admin/Manager: See all deployments
- Developer/Viewer: See only deployments for projects they're members of
Endpoint: GET /api/deployments/:id
Authentication: Required
Permissions: Project member, Admin, or Manager
Description: Get detailed deployment information
Success Response (200):
{
"success": true,
"message": "Deployment retrieved successfully",
"data": {
"Id": 1,
"ProjectId": 1,
"Branch": "main",
"Commit": "a1b2c3d4e5f6",
"Status": "success",
"TriggeredBy": 1,
"StartedAt": "2024-12-28T10:00:00.000Z",
"CompletedAt": "2024-12-28T10:05:00.000Z",
"Duration": 300,
"Logs": [
{
"Id": 1,
"StepName": "Pull Latest Code",
"Output": "Already up to date.\n",
"Error": null,
"ExitCode": 0,
"Timestamp": "2024-12-28T10:01:00.000Z"
},
{
"Id": 2,
"StepName": "Install Dependencies",
"Output": "added 250 packages in 30s\n",
"Error": null,
"ExitCode": 0,
"Timestamp": "2024-12-28T10:02:00.000Z"
}
],
"Project": {...},
"User": {...}
},
"error": false
}WebSocket Connection: ws://your-domain.com
Authentication: Required (via Socket.IO handshake)
Description: Subscribe to real-time deployment logs
Client-Side (JavaScript):
import io from 'socket.io-client';
const socket = io('http://your-domain.com', {
withCredentials: true // Include cookies for auth
});
// Join deployment room
socket.emit('join-deployment', { deploymentId: 1 });
// Listen for log updates
socket.on('deployment-log', (data) => {
console.log('Step:', data.stepName);
console.log('Output:', data.output);
console.log('Status:', data.status);
});
// Listen for deployment status changes
socket.on('deployment-status', (data) => {
console.log('Deployment Status:', data.status);
// status: pending, running, success, failed
});
// Leave deployment room
socket.emit('leave-deployment', { deploymentId: 1 });Events Emitted by Server:
deployment-log- New log entry addeddeployment-status- Deployment status changeddeployment-complete- Deployment finished (success or failed)
Endpoint: POST /api/deployments/:id/rollback
Authentication: Required
Permissions: Project owner, Admin, or Manager
Description: Rollback to a previous deployment
Success Response (200):
{
"success": true,
"message": "Rollback triggered successfully",
"data": {
"newDeploymentId": 15,
"rolledBackFrom": 14,
"rolledBackTo": 13
},
"error": false
}Notes:
- Creates a new deployment that reverts to the specified commit
- Only successful deployments can be rolled back to
Endpoint: GET /api/deployments/queue/:projectId
Authentication: Required
Permissions: Project member, Admin, or Manager
Description: Get current deployment queue for a project
Success Response (200):
{
"success": true,
"message": "Queue status retrieved successfully",
"data": {
"projectId": 1,
"queueLength": 2,
"currentDeployment": {
"Id": 10,
"Status": "running",
"StartedAt": "2024-12-28T10:00:00.000Z"
},
"pendingDeployments": [
{
"Id": 11,
"Status": "pending",
"CreatedAt": "2024-12-28T10:05:00.000Z"
}
]
},
"error": false
}Endpoint: GET /api/audit-logs
Authentication: Required
Permissions: Admin or Manager
Description: Get system-wide audit trail
Query Parameters:
page(optional): Page numberlimit(optional): Items per pageuserId(optional): Filter by useraction(optional): Filter by action typestartDate(optional): Filter from date (ISO 8601)endDate(optional): Filter to date (ISO 8601)
Success Response (200):
{
"success": true,
"message": "Audit logs retrieved successfully",
"data": {
"logs": [
{
"Id": 1,
"UserId": 1,
"Action": "USER_LOGIN",
"Details": "User logged in successfully",
"IpAddress": "192.168.1.100",
"UserAgent": "Mozilla/5.0...",
"CreatedAt": "2024-12-28T10:00:00.000Z",
"User": {
"Username": "johndoe"
}
}
],
"pagination": {...}
},
"error": false
}Audit Action Types:
USER_LOGINUSER_LOGOUTUSER_CREATEDUSER_UPDATEDUSER_DELETEDPROJECT_CREATEDPROJECT_UPDATEDPROJECT_DELETEDDEPLOYMENT_TRIGGEREDDEPLOYMENT_COMPLETEDSSH_KEY_ADDEDSSH_KEY_DELETEDMEMBER_ADDEDMEMBER_REMOVED
Endpoint: POST /api/deploy
Authentication: GitHub webhook signature (HMAC-SHA256)
Description: Receive GitHub push events and trigger deployments
Headers:
X-Hub-Signature-256: HMAC-SHA256 signature for verificationX-GitHub-Event: Event type (should be "push")
GitHub Webhook Payload:
{
"ref": "refs/heads/main",
"repository": {
"name": "my-repo",
"full_name": "user/my-repo"
},
"head_commit": {
"id": "a1b2c3d4e5f6",
"message": "Fix critical bug",
"author": {
"name": "John Doe",
"email": "john@example.com"
}
}
}Success Response (200):
{
"success": true,
"message": "Deployment triggered successfully",
"data": {
"deploymentId": 1,
"projectName": "My Awesome Project",
"branch": "main",
"commit": "a1b2c3d4e5f6"
},
"error": false
}Error Responses:
400- Invalid signature or payload404- No matching project found403- Branch does not match project configuration
Signature Verification:
The webhook secret must match the secret in project configuration. Signature is verified using HMAC-SHA256:
const signature = request.headers['x-hub-signature-256'];
const hmac = crypto.createHmac('sha256', projectSecret);
const digest = 'sha256=' + hmac.update(JSON.stringify(request.body)).digest('hex');
const isValid = crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(digest));{
"success": false,
"message": "Human-readable error message",
"data": null,
"error": true
}| Code | Meaning | Usage |
|---|---|---|
| 200 | OK | Successful GET, PUT, DELETE |
| 201 | Created | Successful POST (resource created) |
| 400 | Bad Request | Validation error, invalid input |
| 401 | Unauthorized | Missing or invalid authentication |
| 403 | Forbidden | Insufficient permissions |
| 404 | Not Found | Resource not found |
| 409 | Conflict | Duplicate resource (username, email, etc.) |
| 429 | Too Many Requests | Rate limit exceeded |
| 500 | Internal Server Error | Server-side error |
Authentication Errors:
{
"success": false,
"message": "Unauthorized - Please login",
"error": true
}Permission Errors:
{
"success": false,
"message": "Forbidden - Insufficient permissions",
"error": true
}Validation Errors:
{
"success": false,
"message": "Validation failed: Email is required",
"error": true
}Resource Not Found:
{
"success": false,
"message": "Project not found",
"error": true
}All API responses follow a consistent format:
{
"success": true,
"message": "Operation completed successfully",
"data": { /* response data */ },
"error": false
}{
"success": false,
"message": "Error description",
"data": null,
"error": true
}{
"success": true,
"message": "Resources retrieved successfully",
"data": {
"items": [...],
"pagination": {
"total": 100,
"page": 1,
"limit": 20,
"totalPages": 5
}
},
"error": false
}- Authentication endpoints: 5 requests per minute per IP
- API endpoints (authenticated): 100 requests per minute per user
- Webhook endpoint: 10 requests per minute per project
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640995200
{
"success": false,
"message": "Rate limit exceeded. Please try again later.",
"error": true
}HTTP Status: 429 Too Many Requests
- Production:
https://deploy.yourdomain.com/api - Staging:
https://staging-deploy.yourdomain.com/api - Development:
http://localhost:9090/api
Login Example:
curl -X POST http://localhost:9090/api/auth/login \
-H "Content-Type: application/json" \
-d '{"Email":"john@example.com","Password":"password123"}' \
-c cookies.txtAuthenticated Request:
curl -X GET http://localhost:9090/api/projects \
-H "Content-Type: application/json" \
-b cookies.txt- Import Collection: Use the OpenAPI/Swagger specification (coming soon)
- Environment Variables:
base_url:http://localhost:9090/apiaccess_token: Automatically captured from login response
- Cookie Management: Enable "Automatically follow redirects" and "Send cookies"
- OpenAPI/Swagger Spec:
/api/docs(coming soon) - Postman Collection: Available in
docs/folder - Example Requests: See
examples/folder - GitHub Repository: https://github.com/FutureSolutionDev/Deploy-Center-Server
- Documentation: https://docs.deploycenter.io
- API Status: https://status.deploycenter.io
- Support Email: support@deploycenter.io
- Discord Community: Join our Discord
Last Updated: December 28, 2024 API Version: v1 Documentation Version: 1.0