{"info":{"name":"HelloCron API","description":"HelloCron monitoring API — cron job, HTTP and SSL monitoring.\n\nTwo APIs, each with its own key (panel: Settings → API key):\n- Ingest API ({{base_url}}) — send monitoring events, key `ck_...` ({{api_key}})\n- Management API ({{app_base_url}}/api/v1) — manage monitors as manifests, key `mk_...` ({{management_api_key}})\n\nSet the `base_url`, `app_base_url`, `api_key` and `management_api_key` variables before use.","version":"1.1.0","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"variable":[{"key":"base_url","value":"https://api.hellocron.com","description":"Ingest API base URL"},{"key":"app_base_url","value":"https://app.hellocron.com","description":"Panel base URL (Management API lives under /api/v1)"},{"key":"api_key","value":"","description":"Ingest API key, prefix ck_ (panel: Settings → API key)"},{"key":"management_api_key","value":"","description":"Management API key, prefix mk_ (panel: Settings → API key, Management API Key section)"},{"key":"monitor_uuid","value":"","description":"Monitor uuid for get/update/delete requests (from List monitors)"}],"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{api_key}}","type":"string"}]},"item":[{"name":"Health","item":[{"name":"GET /health","request":{"method":"GET","url":"{{base_url}}/health","description":"API health check. No authentication required."}}]},{"name":"Ping","item":[{"name":"Job started","request":{"method":"POST","url":"{{base_url}}/ping","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_type\": \"ping\",\n  \"monitor\": \"db-backup\",\n  \"status\": \"run\",\n  \"host\": \"server-01\"\n}"},"description":"Send when a job begins execution."}},{"name":"Job completed","request":{"method":"POST","url":"{{base_url}}/ping","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_type\": \"ping\",\n  \"monitor\": \"db-backup\",\n  \"status\": \"complete\",\n  \"duration\": 47.3,\n  \"exit_code\": 0\n}"},"description":"Send when a job finishes successfully."}},{"name":"Job failed","request":{"method":"POST","url":"{{base_url}}/ping","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_type\": \"ping\",\n  \"monitor\": \"db-backup\",\n  \"status\": \"fail\",\n  \"exit_code\": 1,\n  \"message\": \"pg_dump: connection refused\"\n}"},"description":"Send when a job fails."}},{"name":"Job skipped","request":{"method":"POST","url":"{{base_url}}/ping","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_type\": \"ping\",\n  \"monitor\": \"payment-service\",\n  \"status\": \"skip\"\n}"},"description":"Send when a job was intentionally skipped (e.g. maintenance window)."}},{"name":"GET ping (query params)","request":{"method":"GET","url":{"raw":"{{base_url}}/ping/db-backup?status=complete&duration=47.3&exit_code=0&host=server-01","host":["{{base_url}}"],"path":["ping","db-backup"],"query":[{"key":"status","value":"complete","description":"run | complete | fail | skip (required)"},{"key":"duration","value":"47.3","description":"Seconds","disabled":false},{"key":"exit_code","value":"0"},{"key":"host","value":"server-01"},{"key":"msg","value":"","description":"Free-form message","disabled":true},{"key":"series","value":"","description":"Correlation id for run/complete pairs","disabled":true}]},"description":"URL-based variant of POST /ping for crontab one-liners, IoT and CI. Uses the collection Bearer auth; ad-hoc calls may pass ?api_key= instead (avoid for recurring traffic — tokens in URLs land in access logs)."}}]},{"name":"Management API","description":"Management API — monitors as manifest documents. Base: {{app_base_url}}/api/v1. Uses its OWN key ({{management_api_key}}, prefix mk_) — the ingest key does not work here. Rate limit: 60 requests/min per API key. Deleting monitors is intentionally panel-only (DELETE returns 403).","auth":{"type":"bearer","bearer":[{"key":"token","value":"{{management_api_key}}","type":"string"}]},"item":[{"name":"List monitors","request":{"method":"GET","url":{"raw":"{{app_base_url}}/api/v1/monitors?kind=","host":["{{app_base_url}}"],"path":["api","v1","monitors"],"query":[{"key":"kind","value":"","description":"Optional filter: ping | http_check | ssl_check","disabled":true}]},"description":"Returns manifests of all monitors on the account (ping monitors and uptime checks), each with a read-only uuid."}},{"name":"Get monitor","request":{"method":"GET","url":"{{app_base_url}}/api/v1/monitors/{{monitor_uuid}}","description":"Returns the manifest of a single monitor by uuid. Unknown or foreign uuid returns 404."}},{"name":"Create ping monitor","request":{"method":"POST","url":"{{app_base_url}}/api/v1/monitors","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"manifest_version\": 1,\n  \"kind\": \"ping\",\n  \"name\": \"db-backup\",\n  \"enabled\": true,\n  \"timeout_seconds\": 60,\n  \"expected_interval_seconds\": 86400,\n  \"grace_seconds\": 300,\n  \"tags\": [\"prod\", \"backup\"]\n}"},"description":"Creates a ping monitor from a manifest. Returns 201 with the stored manifest including uuid. Duplicate names and plan limits return 422. The ping name is immutable after creation."}},{"name":"Create HTTP check","request":{"method":"POST","url":"{{app_base_url}}/api/v1/monitors","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"manifest_version\": 1,\n  \"kind\": \"http_check\",\n  \"name\": \"Website health\",\n  \"enabled\": true,\n  \"schedule\": \"*/5 * * * *\",\n  \"config\": {\n    \"url\": \"https://example.com/health\",\n    \"method\": \"GET\",\n    \"timeout\": 30,\n    \"expected_status\": 200\n  }\n}"},"description":"Creates an HTTP uptime check. schedule is a standard 5-field cron expression. At least one of expected_status / expected_content is required."}},{"name":"Create SSL check","request":{"method":"POST","url":"{{app_base_url}}/api/v1/monitors","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"manifest_version\": 1,\n  \"kind\": \"ssl_check\",\n  \"name\": \"example.com certificate\",\n  \"enabled\": true,\n  \"schedule\": \"0 6 * * *\",\n  \"config\": {\n    \"domain\": \"example.com\",\n    \"warning_days\": 30,\n    \"alert_days\": 7\n  }\n}"},"description":"Creates an SSL certificate expiry check."}},{"name":"Update monitor","request":{"method":"PUT","url":"{{app_base_url}}/api/v1/monitors/{{monitor_uuid}}","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"manifest_version\": 1,\n  \"kind\": \"ping\",\n  \"name\": \"db-backup\",\n  \"enabled\": true,\n  \"timeout_seconds\": 120,\n  \"tags\": [\"prod\", \"backup\"]\n}"},"description":"Applies a full manifest to an existing monitor (no partial patch). kind must match and a ping monitor's name is immutable — violations return 422."}},{"name":"Delete monitor (needs ?confirm=true)","request":{"method":"DELETE","url":"{{app_base_url}}/api/v1/monitors/{{monitor_uuid}}?confirm=true","description":"Deletion is irreversible - removing a ping monitor also removes its event history. Without ?confirm=true the request is refused with 403 and a panel_url; with it the monitor is deleted and the response is 204 No Content."}},{"name":"Export account as bundle","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{management_api_key}}"}],"url":"{{app_base_url}}/api/v1/monitors/export","description":"Every monitor on the account as one bundle document, ready to feed back into apply."}},{"name":"Apply bundle (dry run)","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{management_api_key}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"manifest_version\": 1,\n  \"monitors\": [\n    {\n      \"manifest_version\": 1,\n      \"kind\": \"ping\",\n      \"name\": \"db-backup\",\n      \"enabled\": true,\n      \"timeout_seconds\": 60,\n      \"expected_interval_seconds\": 86400,\n      \"grace_seconds\": 300,\n      \"tags\": [\n        \"prod\"\n      ]\n    },\n    {\n      \"manifest_version\": 1,\n      \"kind\": \"http_check\",\n      \"name\": \"Website health\",\n      \"enabled\": true,\n      \"schedule\": \"5m\",\n      \"config\": {\n        \"url\": \"https://example.com/health\",\n        \"method\": \"GET\",\n        \"timeout\": 30,\n        \"expected_status\": 200,\n        \"expected_content\": \"\"\n      }\n    }\n  ]\n}"},"url":"{{app_base_url}}/api/v1/monitors/apply?dry_run=true","description":"Reports what would change without writing anything. Same response shape as a real apply."}},{"name":"Apply bundle","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{management_api_key}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"manifest_version\": 1,\n  \"monitors\": [\n    {\n      \"manifest_version\": 1,\n      \"kind\": \"ping\",\n      \"name\": \"db-backup\",\n      \"enabled\": true,\n      \"timeout_seconds\": 60,\n      \"expected_interval_seconds\": 86400,\n      \"grace_seconds\": 300,\n      \"tags\": [\n        \"prod\"\n      ]\n    },\n    {\n      \"manifest_version\": 1,\n      \"kind\": \"http_check\",\n      \"name\": \"Website health\",\n      \"enabled\": true,\n      \"schedule\": \"5m\",\n      \"config\": {\n        \"url\": \"https://example.com/health\",\n        \"method\": \"GET\",\n        \"timeout\": 30,\n        \"expected_status\": 200,\n        \"expected_content\": \"\"\n      }\n    }\n  ]\n}"},"url":"{{app_base_url}}/api/v1/monitors/apply","description":"Reconciles the account with the bundle. Never deletes: monitors missing from the file are reported as orphaned."}}]}]}