Docs/API Reference

REST API Reference

Complete reference for the Lubes REST API. All endpoints return JSON.

Base URL

https://api.lubes.dev/v1

All API endpoints are prefixed with this base URL. For example, to list projects:

GET https://api.lubes.dev/v1/projects

Authentication

The API uses Bearer token authentication. Include your API key in the Authorization header:

curl https://api.lubes.dev/v1/projects \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

Getting an API Key

You can create API keys in the dashboard settings. Each key can be scoped to specific projects and permissions.

Security tip: Never commit API keys to version control. Use environment variables or a secrets manager in production.

Request Format

Headers

HeaderValueRequired
AuthorizationBearer YOUR_API_KEYYes
Content-Typeapplication/jsonFor POST/PATCH
X-Project-IDYour project IDFor project-scoped endpoints

Pagination

List endpoints support pagination via query parameters:

GET /projects?limit=20&offset=0

# Response includes pagination info:
{
  "data": [...],
  "pagination": {
    "total": 100,
    "limit": 20,
    "offset": 0,
    "has_more": true
  }
}

Error Handling

The API uses conventional HTTP status codes. Errors return a JSON object with details:

{
  "error": {
    "code": "validation_error",
    "message": "Invalid email format",
    "details": {
      "field": "email",
      "constraint": "email"
    }
  }
}

Status Codes

CodeDescription
200Success
201Created
204No content (successful delete)
400Bad request - invalid parameters
401Unauthorized - invalid or missing token
403Forbidden - insufficient permissions
404Not found
422Validation error
429Rate limit exceeded
500Internal server error

Endpoints

Authentication

POST/auth/registerRegister a new user
POST/auth/loginLog in with email/password
POST/auth/logoutLog out current session
POST/auth/refreshRefresh access token
GET/auth/meGet current user
POST/auth/forgot-passwordRequest password reset
POST/auth/reset-passwordReset password with token

Organizations

GET/organizationsList organizations
POST/organizationsCreate organization
GET/organizations/:idGet organization
PATCH/organizations/:idUpdate organization
DELETE/organizations/:idDelete organization
GET/organizations/:id/membersList members
POST/organizations/:id/membersInvite member

Projects

GET/projectsList projects
POST/projectsCreate project
GET/projects/:idGet project
PATCH/projects/:idUpdate project
DELETE/projects/:idDelete project

Database

POST/projects/:id/db/queryExecute SQL query
GET/projects/:id/db/tablesList tables
GET/projects/:id/db/tables/:tableGet table schema
GET/projects/:id/db/branchesList branches
POST/projects/:id/db/branchesCreate branch
GET/projects/:id/db/migrationsList migrations
POST/projects/:id/db/migrationsRun migration

Functions

GET/projects/:id/functionsList functions
POST/projects/:id/functionsCreate function
GET/projects/:id/functions/:slugGet function
PATCH/projects/:id/functions/:slugUpdate function
DELETE/projects/:id/functions/:slugDelete function
POST/projects/:id/functions/:slug/deployDeploy function
GET/projects/:id/functions/:slug/logsGet function logs

Storage

GET/projects/:id/storage/bucketsList buckets
POST/projects/:id/storage/bucketsCreate bucket
DELETE/projects/:id/storage/buckets/:nameDelete bucket
GET/projects/:id/storage/objectsList objects
POST/projects/:id/storage/objectsUpload object
GET/projects/:id/storage/objects/:keyDownload object
DELETE/projects/:id/storage/objects/:keyDelete object
POST/projects/:id/storage/signCreate signed URL

Deployments

GET/projects/:id/deploymentsList deployments
POST/projects/:id/deploymentsCreate deployment
GET/projects/:id/deployments/:deployIdGet deployment
POST/projects/:id/deployments/:deployId/rollbackRollback deployment
GET/projects/:id/deployments/:deployId/logsGet deployment logs

Environment Variables

GET/projects/:id/envList environment variables
POST/projects/:id/envSet environment variable
DELETE/projects/:id/env/:keyDelete environment variable

Example Requests

Create a Project

curl -X POST https://api.lubes.dev/v1/projects \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Project",
    "organization_id": "org_123"
  }'

# Response:
{
  "id": "proj_456",
  "name": "My Project",
  "slug": "my-project",
  "organization_id": "org_123",
  "created_at": "2024-01-15T10:30:00Z"
}

Execute a Query

curl -X POST https://api.lubes.dev/v1/projects/proj_456/db/query \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "SELECT * FROM users WHERE status = $1",
    "params": ["active"]
  }'

# Response:
{
  "rows": [
    { "id": "1", "email": "user@example.com", "status": "active" }
  ],
  "row_count": 1,
  "execution_time_ms": 12
}

Upload a File

curl -X POST https://api.lubes.dev/v1/projects/proj_456/storage/objects \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "bucket=avatars" \
  -F "file=@/path/to/avatar.png"

# Response:
{
  "key": "avatars/abc123.png",
  "url": "https://storage.lubes.dev/proj_456/avatars/abc123.png",
  "size": 12345,
  "content_type": "image/png"
}

Rate Limits

Rate limits vary by plan. Current limits are returned in response headers:

HeaderDescription
X-RateLimit-LimitRequests allowed per minute
X-RateLimit-RemainingRequests remaining in window
X-RateLimit-ResetUnix timestamp when limit resets

Free

100

requests/minute

Pro

1,000

requests/minute

Team

10,000

requests/minute

Next Steps