Projects

Projects group monitors together and each carry their own api_key, separate from your account's bearer token. Every account gets a Default Project automatically.

Deleting a project soft-deletes it — it can be restored. Monitors inside it are affected too; see Monitors for restore behavior.
GET/projects
List Projects

Retrieve all projects owned by the authenticated user.

Example Request
curl -X GET /api/v1/projects \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
Example Response
{
  "success": true,
  "data": {
    "projects": [
      {
        "id": 1,
        "name": "Default Project",
        "slug": "default-project-abc123",
        "description": "Default monitoring scope",
        "status": "active",
        "api_key": "ep_proj_abcdef1234567890abcdef1234567890",
        "monitors_count": 5,
        "created_at": "2026-08-22T09:00:00Z",
        "updated_at": "2026-08-22T10:00:00Z"
      },
      {
        "id": 2,
        "name": "Production",
        "slug": "production-xyz789",
        "description": "Production VPN servers",
        "status": "active",
        "api_key": "ep_proj_xyz1234567890xyz1234567890xyz",
        "monitors_count": 3,
        "created_at": "2026-08-20T14:22:00Z",
        "updated_at": "2026-08-21T09:15:00Z"
      }
    ]
  }
}
POST/projects
Create Project

Create a new project to organize monitors. Each project gets a unique API key.

Request Body
name*stringProject name
descriptionstringProject description
Notes
  • •Fails with 422 if your project count is already at or over your plan's project_limit (default 3 on the base plan).
  • •slug and api_key are generated server-side — you cannot set them on create.
Example Request
curl -X POST /api/v1/projects \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production VPN",
    "description": "Production exit nodes for EMEA region"
  }'
Example Response
{
  "success": true,
  "message": "Project created successfully.",
  "data": {
    "project": {
      "id": 3,
      "user_id": 1,
      "name": "Production VPN",
      "slug": "production-vpn-abc12",
      "description": "Production exit nodes for EMEA region",
      "status": "active",
      "api_key": "ep_proj_prod1234567890prod1234567890",
      "created_at": "2026-08-22T11:00:00Z",
      "updated_at": "2026-08-22T11:00:00Z"
    }
  }
}
GET/projects/{id}
Get Project

Retrieve project details and its associated monitors.

Example Request
curl -X GET /api/v1/projects/1 \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
Example Response
{
  "success": true,
  "data": {
    "project": {
      "id": 1,
      "user_id": 1,
      "name": "Default Project",
      "slug": "default-project-abc123",
      "description": "Default monitoring scope",
      "status": "active",
      "api_key": "ep_proj_abcdef1234567890abcdef1234567890",
      "created_at": "2026-08-22T09:00:00Z",
      "updated_at": "2026-08-22T10:00:00Z",
      "monitors": [
        {
          "id": 1,
          "name": "VPN Exit Node 1",
          "protocol": "wireguard",
          "status": "up",
          "check_interval_seconds": 300,
          "last_check_at": "2026-08-22T10:30:00Z"
        }
      ]
    }
  }
}
PUT/projects/{id}
Update Project

Modify project name or description.

Request Body (all optional)
namestringUpdated project name
descriptionstringUpdated project description
statusstringProject status: active or paused
Example Request
curl -X PUT /api/v1/projects/1 \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Staging VPN"
  }'
Example Response
{
  "success": true,
  "message": "Project updated successfully.",
  "data": {
    "project": {
      "id": 1,
      "user_id": 1,
      "name": "Staging VPN",
      "slug": "default-project-abc123",
      "description": "Default monitoring scope",
      "status": "active",
      "api_key": "ep_proj_abcdef1234567890abcdef1234567890",
      "updated_at": "2026-08-22T11:30:00Z"
    }
  }
}
DELETE/projects/{id}
Delete Project

Permanently delete a project and all associated monitors.

Example Request
curl -X DELETE /api/v1/projects/1 \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
Example Response
{
  "success": true,
  "message": "Project deleted successfully."
}
POST/projects/{id}/regenerate-key
Regenerate API Key

Generate a new API key for a project. The old key will be invalidated.

Example Request
curl -X POST /api/v1/projects/1/regenerate-key \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
Example Response
{
  "success": true,
  "message": "Project API key regenerated successfully.",
  "data": {
    "api_key": "ep_proj_newkey1234567890newkey1234567890"
  }
}
DELETE/projects/{id}/checks
Clear Project Check History

Wipe all check history for every monitor in a project — the project and its monitors are kept, only their historical MonitorCheck rows are deleted. Irreversible.

Notes
  • •This does not delete the project or any monitor — use Delete Project for that.
  • •Resets uptime percentages and charts for every monitor in the project back to "no data" until new checks come in.
Example Request
curl -X DELETE /api/v1/projects/1/checks \
  -H "Authorization: Bearer ep_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
Example Response
{
  "success": true,
  "message": "Cleared 4821 check record(s) across this project's monitors."
}