API Documentation
REST API for managing monitors and reading notifications, with an API key created in the dashboard. Monitor, interval and channel limits are those of your plan.
Authentication
All requests need the Authorization: Bearer header. You can use an API key (recommended, see the section below) or the session token returned by login. If two-factor authentication is enabled, login also asks for the code, so use an API key for scripts.
Authorization: Bearer <token>
curl -X POST https://omniwatchguard.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "email@example.com", "password": "your_password"}'{"token": "eyJhbGciOiJIUzI1NiJ9...", "user": {"id": 1, "plan": "pro"}}API keys
Keys are created in the dashboard under API Keys. A key starts with owg_live_ and is shown only once, when created. You can have at most 5 keys per account.
Authorization: Bearer owg_live_...
API keys work on the /api/monitors endpoints (including /api/monitors/ID and /api/monitors/changes) and on /api/notifications. Other endpoints, including /api/export, accept only the session token from login.
Returns the list of all active monitors for your account.
curl https://omniwatchguard.com/api/monitors \ -H "Authorization: Bearer <token>"
const res = await fetch("https://omniwatchguard.com/api/monitors", {
headers: { Authorization: `Bearer ${token}` }
});
const monitors = await res.json();[{"id": 1, "url": "https://example.com", "name": "Test monitor",
"type": "text", "frequency": 60, "status": "active",
"notify_email": 1, "notify_slack": null, "created_at": "2026-03-01T12:00:00Z"}]Creates a new monitor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL of the page to monitor |
| name | string | No | Monitor name |
| type | string | No | text | price | stock | css | api | seo | ssl; with a paid add-on: tech_stack | whois |
| frequency | integer | No | Minutes. Starter and Trial: 60. Pro: 15, 30, 60. Agency: 5, 15, 30, 60. Default 60; a value not in your plan is replaced with 60. |
| notify_email | integer | No | 1 = active, 0 = inactive |
| notify_slack | string | No | Slack webhook URL |
| notify_discord | string | No | Discord webhook URL |
| notify_telegram | string | No | Telegram Chat ID |
| notify_webhook | string | No | Custom webhook URL |
| selector | string | No | CSS selector, for the css type |
| auth_cookie | string | No | Session cookie or token for login-protected pages (Agency plan) |
curl -X POST https://omniwatchguard.com/api/monitors \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/prices", "type": "price", "frequency": 15}'{"success": true, "id": 42}Updates an existing monitor. Send only the fields you want to change.
curl -X PATCH https://omniwatchguard.com/api/monitors/42 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"frequency": 5, "notify_slack": "https://hooks.slack.com/..."}'{"success": true}Deletes a monitor. This action is irreversible.
curl -X DELETE https://omniwatchguard.com/api/monitors/42 \ -H "Authorization: Bearer <token>"
{"success": true}Returns the latest detected changes. Optional parameter: ?limit=20 (default 10, max 50).
curl "https://omniwatchguard.com/api/monitors/changes?limit=20" \ -H "Authorization: Bearer <token>"
[{"id": 1, "url": "https://example.com", "name": "Monitor test", "type": "price",
"ai_summary": "Price dropped from $99 to $79.",
"ai_severity": "major", "detected_at": "2026-03-24T09:15:00Z"}]Exports data in CSV format. Parameters: type=monitors|incidents, optional monitor_id. This endpoint accepts only the session token from login, not API keys.
curl "https://omniwatchguard.com/api/export?type=monitors" \ -H "Authorization: Bearer <token>" -o monitors.csv
curl "https://omniwatchguard.com/api/export?type=incidents&monitor_id=42" \ -H "Authorization: Bearer <token>" -o incidents.csv
Returns the last 100 sent notifications. Optional parameter: ?type=email|slack|discord|telegram|webhook.
curl https://omniwatchguard.com/api/notifications \ -H "Authorization: Bearer <token>"
[{"id": 1, "type": "email", "success": 1, "error": null,
"sent_at": "2026-03-24T09:15:00Z", "url": "https://example.com"}]Error codes
| HTTP Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Monitor created |
| 400 | Invalid request |
| 401 | Unauthorized - token missing or expired |
| 403 | Forbidden - monitor limit reached, or channel or interval not included in your plan |
| 404 | Resource not found |
| 429 | Too many requests - see the Retry-After header |
| 500 | Internal server error |
{"error": "Error description"}Limits
| Plan | Monitors | Intervals (minutes) | Alert channels |
|---|---|---|---|
| Trial | 3 | 60 | email, webhook, Slack, Discord, Telegram |
| Starter | 10 | 60 | |
| Pro | 100 | 15, 30, 60 | email, webhook, Slack |
| Agency | unlimited | 5, 15, 30, 60 | email, webhook, Slack, Discord, Telegram |
The /api/monitors and /api/notifications endpoints have no general request limit. These are limited per IP address: POST /api/auth/login to 10 requests per 15 minutes and POST /api/monitors/preview to 20 requests per hour. When a limit is exceeded you get 429 with the Retry-After header (seconds).
⚡ Zapier & Make Integration
OmniWatchGuard connects to Zapier, Make (Integromat) and other automation platforms through a Custom Webhook (Pro and Agency plans). You paste the webhook URL when creating the monitor.
Zapier
5000+ appsConnect OmniWatchGuard alerts with Gmail, Slack, Google Sheets, Notion, Airtable, Trello and 5000+ other apps.
In Zapier, choose Trigger: Webhooks by Zapier → Catch Hook
Zapier generates a URL like https://hooks.zapier.com/hooks/catch/...
When creating a monitor, in the Custom Webhook section, paste the Zapier URL.
Wait for the first detection or test from dashboard. Zapier receives data automatically.
Make (Integromat)
1500+ appsAutomate complex workflows with Make - send alerts to WhatsApp, update spreadsheets, create Jira tickets or notify your team.
In Make, add a Webhooks → Custom Webhook module as trigger.
Make generates a URL like https://hook.eu1.make.com/...
When creating a monitor, in the Custom Webhook section, paste the Make URL.
Send a test - Make automatically detects the JSON structure and makes it available in your scenario.
Popular automation examples
When price drops - Slack notification + record in Google Sheets
When back in stock - automatic email to customers or SMS via Twilio
When competitor page changes - new task in Trello or Notion
When SSL expires in 14 days - automatic ticket in Jira + email to dev team
When title or meta description changes - notification in Microsoft Teams
On any change - record in Airtable for weekly reports
Webhook Payload
On every major or critical change, OmniWatchGuard sends a POST request with Content-Type: application/json to your URL. Minor changes are only recorded in the dashboard.
{
"event": "change_detected",
"monitor_id": 42,
"monitor_name": "Competitor A prices",
"url": "https://competitor.com/product",
"type": "price",
"summary": "Price dropped from 149.99 to 129.99 (-13%)",
"severity": "major",
"detected_at": "2026-04-29T10:23:45.000Z"
}{
"event": "ssl_expiry_warning",
"monitor_id": 15,
"monitor_name": "SSL Monitor - site.com",
"url": "https://site.com",
"hostname": "site.com",
"ssl_days_left": 12,
"ssl_expires_at": "2026-05-11T00:00:00.000Z",
"ssl_issuer": "Lets Encrypt",
"ssl_error": null,
"detected_at": "2026-04-29T06:00:00.000Z"
}Available fields
| Field | Type | Description |
|---|---|---|
| event | string | change_detected or ssl_expiry_warning |
| monitor_id | integer | Monitor ID in OmniWatchGuard |
| monitor_name | string | Name given to the monitor |
| url | string | Monitored URL |
| type | string | Monitor type: text, price, stock, seo, ssl, css, api |
| summary | string | AI summary of the detected change |
| severity | string | minor, major or critical |
| detected_at | string | Detection date and time in ISO 8601 format |
Use the severity field as a filter - send email only if severity = critical. In Make you can build complex conditional logic based on type and severity.
