# StatusHive > Website uptime monitoring SaaS with public status pages, incident management, and multi-channel alerts. ## API Base URL: `https://statushive-gamma.vercel.app/api` Authentication: Bearer token (Supabase access token) in Authorization header. ``` Authorization: Bearer ``` ## Endpoints ### Monitors - GET /api/monitors — List all monitors. Query: ?active=true&limit=50&offset=0 - POST /api/monitors — Create monitor. Body: { name, url, interval_seconds? } - GET /api/monitors/:id — Get monitor with 30-day stats - PUT /api/monitors/:id — Update monitor. Body: { name, url, method?, interval_seconds?, timeout_ms?, expected_status?, active? } - DELETE /api/monitors/:id — Delete monitor - GET /api/monitors/:id/heartbeats — Get recent checks. Query: ?limit=50 ### Incidents - GET /api/incidents — List incidents. Query: ?status=investigating&limit=20&offset=0 - POST /api/incidents — Create incident. Body: { title, severity?, status?, status_page_id?, monitor_id?, message? } - GET /api/incidents/:id — Get incident with updates - PUT /api/incidents/:id — Update incident. Body: { title?, severity?, status? } - DELETE /api/incidents/:id — Delete incident - POST /api/incidents/:id/updates — Add update. Body: { status, message } ### Status Pages - GET /api/status-pages — List status pages - POST /api/status-pages — Create status page. Body: { name, slug?, theme?, is_public?, monitor_ids? } - GET /api/status-pages/:id — Get status page with linked monitors - PUT /api/status-pages/:id — Update status page. Body: { name?, slug?, theme?, is_public?, monitor_ids? } - DELETE /api/status-pages/:id — Delete status page ## Objects ### Monitor - id: string (UUID) - name: string - url: string - method: "GET" | "HEAD" | "POST" - interval_seconds: number (30, 60, or 180 depending on plan) - timeout_ms: number (1000-60000) - expected_status: number (HTTP status code) - active: boolean - last_status: "up" | "down" | null - last_checked_at: string (ISO 8601) | null - created_at: string (ISO 8601) ### Incident - id: string (UUID) - title: string - status: "investigating" | "identified" | "monitoring" | "resolved" - severity: "minor" | "major" | "critical" - monitor_id: string | null - status_page_id: string | null - started_at: string (ISO 8601) - resolved_at: string (ISO 8601) | null - created_at: string (ISO 8601) ### StatusPage - id: string (UUID) - name: string - slug: string (used in public URL: /{locale}/status/{slug}) - theme: "light" | "dark" | "auto" - is_public: boolean - created_at: string (ISO 8601) ## Plan Limits | Feature | Free | Starter (9EUR/mo) | Pro (24EUR/mo) | |---------|------|--------------|------------------| | Monitors | 10 | 50 | 200 | | Check interval | 3 min | 1 min | 30 sec | | Status pages | 1 | 5 | Unlimited | | History | 7 days | 90 days | 1 year | ## Errors All errors return JSON: { "error": "message" } - 400: Bad request (validation error) - 401: Unauthorized (missing or invalid token) - 403: Forbidden (plan limit or ownership) - 404: Not found - 409: Conflict (slug already taken) - 500: Internal server error