{
  "info": {
    "name": "Watchfox — API surfaces: Public API, exports, utilities, UI-managed",
    "version": "v1-updated-2026-06-14",
    "description": "Last updated: 2026-06-14. Keep this collection in sync with /docs/api.md and /docs/openapi.yaml whenever public API behavior changes.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_postman_id": "b9d8e92b-7b3f-4b18-8ddd-991bd0ea0001"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://app.watchfox.io"
    },
    {
      "key": "apiKey",
      "value": "wk_XXXX"
    },
    {
      "key": "authToken",
      "value": ""
    },
    {
      "key": "projectId",
      "value": "00000000-0000-0000-0000-000000000000"
    },
    {
      "key": "reportMonth",
      "value": "2025-11"
    },
    {
      "key": "reportFrom",
      "value": "2025-11-01"
    },
    {
      "key": "reportTo",
      "value": "2025-12-01"
    },
    {
      "key": "monitorId",
      "value": "00000000-0000-0000-0000-000000000000"
    },
    {
      "key": "incidentId",
      "value": ""
    },
    {
      "key": "heartbeatToken",
      "value": "00000000-0000-0000-0000-000000000000"
    },
    {
      "key": "isoNow",
      "value": "2025-10-24T18:55:18Z"
    },
    {
      "key": "keyId",
      "value": "00000000-0000-0000-0000-000000000000"
    },
    {
      "key": "notifId",
      "value": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "item": [
    {
      "name": "Public API — X-Api-Key",
      "item": [
        {
          "name": "GET /api/v1/monitors",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/monitors",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "monitors"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/monitors (Keyword)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/monitors",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "monitors"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"keyword\",\n  \"url\": \"https://example.org\",\n  \"label\": \"Keyword Test\",\n  \"keyword\": \"Example Domain\",\n  \"keyword_should_exist\": true\n}"
            }
          }
        },
        {
          "name": "POST /api/v1/monitors (Domain)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/monitors",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "monitors"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"domain\",\n  \"url\": \"https://watchfox.io\",\n  \"label\": \"Domain Check\"\n}"
            }
          }
        },
        {
          "name": "POST /api/v1/monitors/bulk (Preview import)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/monitors/bulk",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "monitors",
                "bulk"
              ]
            },
            "description": "Bulk monitor import preview. Probe coverage is automatic; probe_groups/locations are accepted only as backward-compatible internal compatibility fields and are normalized to one primary scheduled probe group.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"dry_run\": true,\n  \"items\": [\n    {\n      \"type\": \"uptime\",\n      \"url\": \"https://example.com\",\n      \"label\": \"Homepage\",\n      \"interval_s\": 300\n    }\n  ]\n}"
            }
          }
        },
        {
          "name": "GET /api/v1/incidents",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/incidents?status=all&include=monitor_label",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "incidents"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "all"
                },
                {
                  "key": "include",
                  "value": "monitor_label"
                }
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/incident — open",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/incident",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "incident"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"monitor_id\": \"{{monitorId}}\",\n  \"summary\": \"Manual test incident\",\n  \"details\": { \"source\": \"postman\" }\n}"
            }
          }
        },
        {
          "name": "POST /api/v1/incident — resolve",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/incident",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "incident"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"monitor_id\": \"{{monitorId}}\",\n  \"resolved_at\": \"{{isoNow}}\"\n}"
            }
          }
        },
        {
          "name": "POST /api/v1/test-alert",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/test-alert",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "test-alert"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"monitor_id\": \"{{monitorId}}\"\n}"
            }
          }
        },
        {
          "name": "GET /api/v1/status/:slug (308)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/v1/status/demo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "status",
                "demo"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "CSV exports — X-Api-Key or Bearer project_id",
      "item": [
        {
          "name": "GET /api/export/monitor_checks.csv",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/export/monitor_checks.csv?monitor_id={{monitorId}}&fields=monitor_id,checked_at,probe_group,status_code,latency_ms,ok&limit=100",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "export",
                "monitor_checks.csv"
              ],
              "query": [
                {
                  "key": "monitor_id",
                  "value": "{{monitorId}}"
                },
                {
                  "key": "fields",
                  "value": "monitor_id,checked_at,probe_group,status_code,latency_ms,ok",
                  "description": "Preferred customer-facing fields. Use probe_group for public/customer CSV exports of historical check evidence."
                },
                {
                  "key": "limit",
                  "value": "100"
                }
              ]
            },
            "description": "CSV monitor checks export. Default/customer-facing exports use neutral probe_group labels for historical check evidence; probe_group is not a scheduled probe selection control."
          }
        },
        {
          "name": "GET /api/export/incidents.csv",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/export/incidents.csv?include=monitor_label",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "export",
                "incidents.csv"
              ],
              "query": [
                {
                  "key": "include",
                  "value": "monitor_label"
                }
              ]
            }
          }
        },
        {
          "name": "GET /api/export/report_summary.csv",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/export/report_summary.csv?month={{reportMonth}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "export",
                "report_summary.csv"
              ],
              "query": [
                {
                  "key": "month",
                  "value": "{{reportMonth}}"
                }
              ]
            },
            "description": "CSV report-summary export. Project-scoped by X-Api-Key. Bearer auth is also supported when project_id is provided."
          }
        },
        {
          "name": "GET /api/export/link_errors.csv",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/export/link_errors.csv?url={{baseUrl}}/test/links-mix.html&sample=100",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "export",
                "link_errors.csv"
              ],
              "query": [
                {
                  "key": "url",
                  "value": "{{baseUrl}}/test/links-mix.html"
                },
                {
                  "key": "sample",
                  "value": "100"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Report exports — PDF and summary",
      "item": [
        {
          "name": "GET /api/reports/summary.json",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/reports/summary.json?month={{reportMonth}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reports",
                "summary.json"
              ],
              "query": [
                {
                  "key": "month",
                  "value": "{{reportMonth}}"
                }
              ]
            },
            "description": "Report summary JSON. Project-scoped by X-Api-Key. Use for controlled report/dashboard workflows, not high-frequency polling."
          }
        },
        {
          "name": "GET /api/reports/monthly.pdf",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/reports/monthly.pdf",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reports",
                "monthly.pdf"
              ]
            }
          }
        },
        {
          "name": "GET /api/reports/monthly.pdf (ApiKey, range)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/reports/monthly.pdf?from={{reportFrom}}&to={{reportTo}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reports",
                "monthly.pdf"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "{{reportFrom}}"
                },
                {
                  "key": "to",
                  "value": "{{reportTo}}"
                }
              ]
            }
          }
        },
        {
          "name": "GET /api/reports/monthly.pdf (Bearer)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/reports/monthly.pdf?month={{reportMonth}}&project_id={{projectId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reports",
                "monthly.pdf"
              ],
              "query": [
                {
                  "key": "month",
                  "value": "{{reportMonth}}"
                },
                {
                  "key": "project_id",
                  "value": "{{projectId}}"
                }
              ]
            }
          }
        },
        {
          "name": "GET /api/reports/monthly.pdf (Bearer, range)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/reports/monthly.pdf?from={{reportFrom}}&to={{reportTo}}&project_id={{projectId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "reports",
                "monthly.pdf"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "{{reportFrom}}"
                },
                {
                  "key": "to",
                  "value": "{{reportTo}}"
                },
                {
                  "key": "project_id",
                  "value": "{{projectId}}"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "UI-managed/admin — Notifications",
      "item": [
        {
          "name": "GET /api/notifications",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/notifications?project_id={{projectId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "notifications"
              ],
              "query": [
                {
                  "key": "project_id",
                  "value": "{{projectId}}"
                }
              ]
            }
          }
        },
        {
          "name": "POST /api/notifications",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/notifications",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "notifications"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"project_id\": \"{{projectId}}\",\n  \"channel\": \"email\",\n  \"target\": \"{{alertsEmail}}\",\n  \"rules\": {\"kinds\": [\"uptime_down\",\"tls_unknown\",\"heartbeat_missing\"]}\n}"
            }
          }
        },
        {
          "name": "DELETE /api/notifications",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              },
              {
                "key": "X-Api-Key",
                "value": "{{apiKey}}",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/notifications?id={{notifId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "notifications"
              ],
              "query": [
                {
                  "key": "id",
                  "value": "{{notifId}}"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "UI-managed/admin — API keys",
      "item": [
        {
          "name": "POST /api/keys (create)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/keys",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "keys"
              ]
            }
          }
        },
        {
          "name": "DELETE /api/keys?id=… (revoke)",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{authToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/keys?id={{keyId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "keys"
              ],
              "query": [
                {
                  "key": "id",
                  "value": "{{keyId}}"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Utility validators and heartbeat",
      "item": [
        {
          "name": "GET /api/validate/sitemap",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/validate/sitemap?url={{baseUrl}}/test/sitemap-ok.xml&sample=5",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "validate",
                "sitemap"
              ],
              "query": [
                {
                  "key": "url",
                  "value": "{{baseUrl}}/test/sitemap-ok.xml"
                },
                {
                  "key": "sample",
                  "value": "5"
                }
              ]
            }
          }
        },
        {
          "name": "GET /api/heartbeat/:token (204)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/heartbeat/{{heartbeatToken}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "heartbeat",
                "{{heartbeatToken}}"
              ]
            }
          }
        },
        {
          "name": "GET /api/validate/links",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/validate/links?url={{baseUrl}}/test/links-mix.html&sample=20",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "validate",
                "links"
              ],
              "query": [
                {
                  "key": "url",
                  "value": "{{baseUrl}}/test/links-mix.html"
                },
                {
                  "key": "sample",
                  "value": "20"
                }
              ]
            }
          }
        }
      ]
    }
  ]
}