Projects API¶
The Projects API provides endpoints for organizing monitoring services into logical groups. Projects help categorize services by environment, customer, application, or any criteria relevant to your use case.
Overview¶
Projects serve as organizational containers for services, allowing you to:
- Group related services together
- Apply visual categorization with colors and icons
- Maintain ordered project lists
- Bulk manage service assignments
- Track service counts per project
Authentication¶
All Projects API endpoints require JWT authentication. Include your access token in the Authorization header:
See the Authentication Guide for details on obtaining tokens.
Project Object Schema¶
Project Model¶
{
"id": 1,
"name": "Production Services",
"description": "All production environment monitoring services",
"color": "#EF4444",
"icon": "server",
"order": 0,
"service_count": 12,
"date_created": "2024-01-15T10:30:00Z",
"date_modified": "2024-01-20T14:45:00Z"
}
Field Descriptions¶
| Field | Type | Required | Description |
|---|---|---|---|
id |
integer | Read-only | Unique identifier for the project |
name |
string | Yes | Project name (max 128 characters, unique per user) |
description |
string | No | Detailed description (max 500 characters) |
color |
string | No | Hex color code for visual identification (default: #3B82F6) |
icon |
string | No | Icon identifier for visual representation (max 64 characters) |
order |
integer | No | Display order (default: 0) |
service_count |
integer | Read-only | Count of services assigned to this project |
date_created |
datetime | Read-only | Project creation timestamp (ISO 8601) |
date_modified |
datetime | Read-only | Last modification timestamp (ISO 8601) |
Validation Rules¶
Name: - Required field - Maximum 128 characters - Must be unique within user's account - Cannot be empty or whitespace only
Description: - Optional field - Maximum 500 characters
Color:
- Optional field
- Must be valid hex color format: #RRGGBB (6 hex digits)
- Case-insensitive (will be normalized to uppercase)
- Example: #FF5733, #3B82F6
Icon: - Optional field - Maximum 64 characters - No format validation (any string accepted)
Order: - Optional field - Integer value - Used for sorting projects in dashboard - Lower values appear first
Endpoints¶
List All Projects¶
Retrieve all projects for the authenticated user.
Endpoint: GET /api/v1/projects
Authentication: Required
Query Parameters: None
Request Example:
curl -X GET https://app.uptimehunt.io/api/v1/projects \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response: 200 OK
{
"data": [
{
"id": 1,
"name": "Production",
"description": "Production environment services",
"color": "#EF4444",
"icon": "server",
"order": 0,
"service_count": 12,
"date_created": "2024-01-15T10:30:00Z",
"date_modified": "2024-01-20T14:45:00Z"
},
{
"id": 2,
"name": "Staging",
"description": "Staging environment for testing",
"color": "#F59E0B",
"icon": "test-tube",
"order": 1,
"service_count": 8,
"date_created": "2024-01-15T10:35:00Z",
"date_modified": "2024-01-18T09:20:00Z"
}
]
}
Response Fields:
- data: Array of project objects ordered by order field, then by name
Create Project¶
Create a new project for organizing services.
Endpoint: POST /api/v1/projects
Authentication: Required
Request Body:
{
"name": "Production Services",
"description": "All production environment monitoring",
"color": "#EF4444",
"icon": "server",
"order": 0
}
Request Example:
curl -X POST https://app.uptimehunt.io/api/v1/projects \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "Production Services",
"description": "All production environment monitoring",
"color": "#EF4444",
"icon": "server",
"order": 0
}'
Response: 201 Created
{
"data": {
"id": 3,
"name": "Production Services",
"description": "All production environment monitoring",
"color": "#EF4444",
"icon": "server",
"order": 0,
"service_count": 0,
"date_created": "2024-01-25T15:22:00Z",
"date_modified": "2024-01-25T15:22:00Z"
}
}
Error Responses:
400 Bad Request - Validation error:
{
"error": {
"message": "Validation failed",
"details": {
"name": ["A project with this name already exists"]
}
}
}
400 Bad Request - Invalid color format:
{
"error": {
"message": "Validation failed",
"details": {
"color": ["Color must be in hex format (e.g., #3B82F6)"]
}
}
}
Get Project Details¶
Retrieve a specific project by ID.
Endpoint: GET /api/v1/projects/{id}
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Example:
curl -X GET https://app.uptimehunt.io/api/v1/projects/1 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response: 200 OK
{
"data": {
"id": 1,
"name": "Production",
"description": "Production environment services",
"color": "#EF4444",
"icon": "server",
"order": 0,
"service_count": 12,
"date_created": "2024-01-15T10:30:00Z",
"date_modified": "2024-01-20T14:45:00Z"
}
}
Error Responses:
404 Not Found:
Update Project (Full Update)¶
Replace all project fields with new values.
Endpoint: PUT /api/v1/projects/{id}
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Body (all fields required):
{
"name": "Production Environment",
"description": "Updated production services",
"color": "#DC2626",
"icon": "server-stack",
"order": 0
}
Request Example:
curl -X PUT https://app.uptimehunt.io/api/v1/projects/1 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "Production Environment",
"description": "Updated production services",
"color": "#DC2626",
"icon": "server-stack",
"order": 0
}'
Response: 200 OK
{
"data": {
"id": 1,
"name": "Production Environment",
"description": "Updated production services",
"color": "#DC2626",
"icon": "server-stack",
"order": 0,
"service_count": 12,
"date_created": "2024-01-15T10:30:00Z",
"date_modified": "2024-01-25T16:45:00Z"
}
}
Error Responses:
404 Not Found - Project doesn't exist or not owned by user
400 Bad Request - Validation error (see Create Project errors)
Update Project (Partial Update)¶
Update specific project fields without replacing all values.
Endpoint: PATCH /api/v1/projects/{id}
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Body (only include fields to update):
Request Example:
curl -X PATCH https://app.uptimehunt.io/api/v1/projects/1 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"color": "#10B981",
"description": "Updated description only"
}'
Response: 200 OK
{
"data": {
"id": 1,
"name": "Production",
"description": "Updated description only",
"color": "#10B981",
"icon": "server",
"order": 0,
"service_count": 12,
"date_created": "2024-01-15T10:30:00Z",
"date_modified": "2024-01-25T17:00:00Z"
}
}
Error Responses: Same as PUT endpoint
Delete Project¶
Delete a project. Services assigned to this project will be unassigned (moved to "Unassigned" category).
Endpoint: DELETE /api/v1/projects/{id}
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Example:
curl -X DELETE https://app.uptimehunt.io/api/v1/projects/1 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response: 204 No Content
No response body returned on successful deletion.
Error Responses:
404 Not Found:
Service Reassignment
When a project is deleted, all services assigned to it are automatically unassigned (project field set to null). The services themselves are NOT deleted.
Get Project Services¶
Retrieve all services assigned to a specific project.
Endpoint: GET /api/v1/projects/{id}/services
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Example:
curl -X GET https://app.uptimehunt.io/api/v1/projects/1/services \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response: 200 OK
{
"data": [
{
"id": 5,
"name": "Main Website",
"type": "http",
"enabled": true,
"interval": 3,
"config": {
"url": "https://example.com",
"method": "GET"
},
"project_id": 1,
"project": {
"id": 1,
"name": "Production",
"color": "#EF4444",
"icon": "server"
},
"date_created": "2024-01-16T08:15:00Z",
"date_modified": "2024-01-20T10:30:00Z"
}
]
}
Assign Services to Project¶
Assign one or more services to a project.
Endpoint: POST /api/v1/projects/{id}/assign_services
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Body:
Request Example:
curl -X POST https://app.uptimehunt.io/api/v1/projects/1/assign_services \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"service_ids": [5, 7, 12]
}'
Response: 200 OK
Error Responses:
400 Bad Request - Service not found or not owned:
404 Not Found - Project not found
Unassign Services from Project¶
Remove service assignments from a project (services move to "Unassigned").
Endpoint: DELETE /api/v1/projects/{id}/unassign_services
Authentication: Required
Path Parameters:
- id (integer): Project ID
Request Body:
Request Example:
curl -X DELETE https://app.uptimehunt.io/api/v1/projects/1/unassign_services \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"service_ids": [5, 7]
}'
Response: 200 OK
Notes:
- Only services that belong to this project and are owned by the user will be unassigned
- Services not found or not in this project are silently ignored
- Unassigned services have their project field set to null
Reorder Projects¶
Update the display order of multiple projects at once.
Endpoint: PUT /api/v1/projects/reorder
Authentication: Required
Request Body:
Request Example:
curl -X PUT https://app.uptimehunt.io/api/v1/projects/reorder \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"projects": [
{"id": 1, "order": 0},
{"id": 3, "order": 1},
{"id": 2, "order": 2}
]
}'
Response: 200 OK
Notes: - Only updates projects that exist and are owned by the user - Projects not included in the request maintain their current order - Invalid project IDs are silently ignored
Common Use Cases¶
Creating a Project with Color Coding¶
Environment-based projects with color coding:
# Production (Red)
curl -X POST https://app.uptimehunt.io/api/v1/projects \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Production",
"description": "Production environment services",
"color": "#EF4444",
"icon": "server",
"order": 0
}'
# Staging (Yellow)
curl -X POST https://app.uptimehunt.io/api/v1/projects \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Staging",
"description": "Staging environment",
"color": "#F59E0B",
"icon": "test-tube",
"order": 1
}'
# Development (Green)
curl -X POST https://app.uptimehunt.io/api/v1/projects \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Development",
"description": "Development environment",
"color": "#10B981",
"icon": "code",
"order": 2
}'
Bulk Service Assignment¶
Assign multiple services to a project:
# Get all services to find IDs
curl -X GET https://app.uptimehunt.io/api/v1/services \
-H "Authorization: Bearer <token>"
# Assign services 1, 3, 5, 7 to project 1
curl -X POST https://app.uptimehunt.io/api/v1/projects/1/assign_services \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"service_ids": [1, 3, 5, 7]
}'
Moving Services Between Projects¶
Move services from one project to another:
# First, get services from old project
curl -X GET https://app.uptimehunt.io/api/v1/projects/1/services \
-H "Authorization: Bearer <token>"
# Unassign from old project
curl -X DELETE https://app.uptimehunt.io/api/v1/projects/1/unassign_services \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"service_ids": [5, 7]}'
# Assign to new project
curl -X POST https://app.uptimehunt.io/api/v1/projects/2/assign_services \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"service_ids": [5, 7]}'
Alternatively, update services directly (see Services API):
# Update service project directly
curl -X PATCH https://app.uptimehunt.io/api/v1/services/5 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"project_id": 2}'
Reorganizing Project Order¶
Reorder projects for custom display:
curl -X PUT https://app.uptimehunt.io/api/v1/projects/reorder \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"projects": [
{"id": 3, "order": 0},
{"id": 1, "order": 1},
{"id": 2, "order": 2},
{"id": 4, "order": 3}
]
}'
Error Codes¶
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR |
Request validation failed |
| 401 | UNAUTHORIZED |
Missing or invalid authentication token |
| 404 | NOT_FOUND |
Project not found or not owned by user |
| 500 | INTERNAL_ERROR |
Server error |
Best Practices¶
Naming Conventions¶
Use clear, consistent naming:
Environment-Based:
Customer-Based:
Application-Based:
Color Schemes¶
Recommended color coding:
By Environment:
Production: #EF4444 (Red)
Staging: #F59E0B (Yellow)
Development: #10B981 (Green)
QA/Testing: #3B82F6 (Blue)
By Priority:
Critical: #DC2626 (Dark Red)
Important: #EA580C (Orange)
Standard: #3B82F6 (Blue)
Low: #6B7280 (Gray)
Project Organization¶
Small Teams (1-10 services): - Use environment-based projects (Production, Staging, Dev) - Keep it simple with 2-4 projects maximum
Medium Teams (10-50 services): - Combine environment + application - Examples: "Production Web", "Production API", "Staging All"
Large Teams (50+ services): - Use hierarchical naming (no nesting, but naming convention) - Examples: "Prod-Customer-A", "Prod-Customer-B", "Prod-Internal"
Service Providers: - One project per customer/client - Use consistent color coding for quick identification - Include customer name in project name
Related Resources¶
- Services API - Managing monitoring services
- Authentication Guide - API authentication
- User Guide: Projects - Frontend usage guide
- Getting Started - Creating your first service
Changelog¶
v1.0 (Current)¶
- Initial release
- Basic CRUD operations
- Service assignment/unassignment
- Project reordering
- Color and icon support