PyJob supports three authentication methods:
Authorization: Bearer <jwt_token>X-API-Key: <api_key>Authorization: Basic <base64_encoded_credentials>POST /api/auth/register
Content-Type: application/json
{
"username": "myuser",
"email": "user@example.com",
"password": "securepassword",
"role": "user"
}POST /api/auth/login
Content-Type: application/json
{
"username": "myuser",
"password": "securepassword"
}POST /api/auth/token
Authorization: Basic <base64_encoded_credentials>GET /api/auth/me
Authorization: Bearer <jwt_token>POST /api/auth/api-keys
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"name": "My API Key",
"description": "API key for mobile app integration"
}GET /api/auth/api-keys
Authorization: Bearer <jwt_token>DELETE /api/auth/api-keys/:name
Authorization: Bearer <jwt_token>POST /api/auth/tokens
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"description": "API integration token for mobile app"
}GET /api/auth/tokens
Authorization: Bearer <jwt_token>GET /api/auth/tokens/:tokenId
Authorization: Bearer <jwt_token>PUT /api/auth/tokens/:tokenId/description
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"description": "Updated description"
}POST /api/auth/tokens/:tokenId/extend
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"additionalHours": 48
}DELETE /api/auth/tokens/:tokenId
Authorization: Bearer <jwt_token>POST /api/auth/tokens/cleanup
Authorization: Bearer <jwt_token>GET /api/jobs?page=1&limit=10&active=true- Authentication: Optional (filtered data for non-authenticated users)
- Query Parameters:
page: Page number (default: 1)limit: Items per page (default: 10)active: Filter by active status (true/false)
GET /api/jobs/:id- Authentication: Optional (filtered data for non-authenticated users)
GET /api/jobs/:id/details- Authentication: Required
- Description: Returns complete job details including sensitive information (Python script, requirements, environment variables)
GET /api/jobs/:id/script- Authentication: Required
- Description: Returns only the Python script content
GET /api/jobs/:id/requirements- Authentication: Required
- Description: Returns only the Python package requirements
GET /api/jobs/:id/env- Authentication: Required
- Description: Returns only the environment variables
POST /api/jobs
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"name": "my-python-job",
"description": "A sample Python job",
"cronPattern": "0 */6 * * *",
"pythonScript": "print('Hello from Python!')",
"requirements": ["requests", "numpy"],
"environmentVariables": {
"API_KEY": "your-api-key",
"DEBUG": "true"
},
"isActive": true,
"timeout": 300000,
"maxRetries": 3
}PUT /api/jobs/:id
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"name": "updated-job-name",
"description": "Updated description",
"cronPattern": "0 */12 * * *"
}DELETE /api/jobs/:id
Authorization: Bearer <jwt_token>POST /api/jobs/:id/execute
Authorization: Bearer <jwt_token>PATCH /api/jobs/:id/toggle
Authorization: Bearer <jwt_token>GET /api/jobs/:id/executions?page=1&limit=10&status=completed
Authorization: Bearer <jwt_token>GET /api/jobs/:id/logs?page=1&limit=20&status=failed
Authorization: Bearer <jwt_token>GET /api/jobs/stats/overview- Authentication: Optional
GET /api/jobs/search?q=python&page=1&limit=10- Authentication: Optional
GET /api/jobs/scheduled/status
Authorization: Bearer <jwt_token>GET /api/jobs/health/status- Authentication: Optional
GET /api/jobs/export?format=json
Authorization: Bearer <jwt_token>GET /health{
"name": "string (required, unique, 1-100 chars)",
"description": "string (optional, max 500 chars)",
"cronPattern": "string (required, valid CRON pattern)",
"pythonScript": "string (required, Python code)",
"requirements": ["array of strings (Python packages)"],
"environmentVariables": {
"key": "value (string)"
},
"isActive": "boolean (default: true)",
"timeout": "number (milliseconds, 1000-3600000, default: 300000)",
"maxRetries": "number (0-10, default: 3)"
}Standard 5-field CRON pattern:
* * * * *
│ │ │ │ │
│ │ │ │ └─── Day of week (0-6)
│ │ │ └───── Month (1-12)
│ │ └─────── Day of month (1-31)
│ └───────── Hour (0-23)
└─────────── Minute (0-59)
Examples:
0 */6 * * *- Every 6 hours0 9 * * 1-5- Every weekday at 9 AM*/15 * * * *- Every 15 minutes
{
"message": "Operation successful",
"data": { ... }
}{
"error": "Error message",
"details": { ... }
}{
"data": [...],
"pagination": {
"page": 1,
"limit": 10,
"total": 100,
"pages": 10
}
}- General API: 100 requests per 15 minutes per IP
- Authentication: 5 requests per 15 minutes per IP
- Register a user:
curl -X POST http://localhost:3000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"admin","email":"admin@example.com","password":"securepass","role":"admin"}'- Login and get token:
curl -X POST http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"securepass"}'- Create a job:
curl -X POST http://localhost:3000/api/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"name": "data-fetcher",
"description": "Fetch data every hour",
"cronPattern": "0 * * * *",
"pythonScript": "import requests\nprint(\"Fetching data...\")",
"requirements": ["requests"]
}'- Execute job manually:
curl -X POST http://localhost:3000/api/jobs/{job-id}/execute \
-H "Authorization: Bearer <token>"- Check job status:
curl http://localhost:3000/api/jobs/stats/overview \
-H "Authorization: Bearer <token>"curl http://localhost:3000/api/jobs \
-H "X-API-Key: pyjob_your_api_key_here"curl http://localhost:3000/api/jobs \
-H "Authorization: Basic $(echo -n 'username:password' | base64)"