Monitors
Save a search, run it on a schedule, and read the matching content.
Monitors run the same kind of search you can send to the content search endpoint, but the saved configuration is intentionally narrower. A monitor stores the standing query and filters. Omnist supplies the date window and result limit whenever the monitor runs.
Scheduled monitor runs use UTC content dates. Each scheduled run queues four dated jobs: the current UTC day and the trailing three UTC days. Each dated job uses an internal limit of 1000 results, writes into the monitor result store, and can be inspected through the monitor run APIs.
Create a Monitor
/v1/monitors
Create a monitor with a saved search and an hourly or daily schedule. Monitors cannot be reconfigured after creation. To stop a monitor permanently, delete it.
await fetch('https://api.omnist.ai/v1/monitors', {
method: 'POST',
headers: {
'Authorization': 'Bearer omni_live_...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'AI infrastructure',
search: {
query: 'AI infrastructure spending',
media_types: ['news', 'wire'],
include_domains: ['reuters.com', 'ft.com']
},
schedule: {
frequency: 'daily',
timezone: 'America/New_York',
run_time: '07:30'
}
})
});import requests
requests.post(
'https://api.omnist.ai/v1/monitors',
headers={
'Authorization': 'Bearer omni_live_...',
'Content-Type': 'application/json',
},
json={
'name': 'AI infrastructure',
'search': {
'query': 'AI infrastructure spending',
'media_types': ['news', 'wire'],
'include_domains': ['reuters.com', 'ft.com'],
},
'schedule': {
'frequency': 'daily',
'timezone': 'America/New_York',
'run_time': '07:30',
},
},
)Request Body
| Field | Type | Notes |
|---|---|---|
name | string | Required. Display name for the monitor. |
description | string | Optional short description. |
search | object | Required. See Monitor search. |
schedule | object | Optional. Defaults to hourly in UTC at the creation minute. |
status | string | Optional. active or disabled. Defaults to active. |
Monitor Search
| Field | Type | Notes |
|---|---|---|
query | string | Required. Natural-language query. |
media_types | string[] | Optional. news, wire, and/or podcast. |
include_domains | string[] | Optional. Up to 10 domains. Cannot be combined with exclude_domains. |
exclude_domains | string[] | Optional. Up to 10 domains. Cannot be combined with include_domains. |
entity_ids | string[] | Optional. Restrict results to content linked to these entity IDs. |
Monitors do not accept start_date, end_date, or limit. Date windows are computed at run time and each run uses an internal limit of 1000.
Schedule
| Field | Type | Notes |
|---|---|---|
frequency | string | hourly or daily. Defaults to hourly. |
timezone | string | IANA timezone for schedule display and wall-clock timing. Defaults to UTC. |
minute | integer | Hourly schedules only. Minute of the hour, 0-59. Defaults to the creation minute. |
run_time | string | Daily schedules only. HH:MM in the configured timezone. Defaults to the creation time. |
Response
{
"id": "mon_01h...",
"team_id": "team_01h...",
"name": "AI infrastructure",
"description": null,
"status": "active",
"search": {
"query": "AI infrastructure spending",
"media_types": ["news", "wire"],
"include_domains": ["reuters.com", "ft.com"]
},
"schedule": {
"frequency": "daily",
"timezone": "America/New_York",
"run_time": "07:30"
},
"next_run_at": "2026-05-13T11:30:00Z",
"created_at": "2026-05-12T18:08:23Z",
"updated_at": "2026-05-12T18:08:23Z"
}
List Monitors
/v1/monitors
Returns active and disabled monitors for the workspace.
| Query parameter | Type | Notes |
|---|---|---|
limit | integer | Optional. Default 50, maximum 100. |
offset | integer | Optional. Default 0. |
status | string | Optional. Filter by active or disabled. |
Get a Monitor
/v1/monitors/{monitor_id}
Returns the saved search, schedule, status, and next scheduled run time for a monitor.
Update a Monitor
/v1/monitors/{monitor_id}
Updates the monitor name or schedule. The saved search cannot be changed after creation.
| Field | Type | Notes |
|---|---|---|
name | string | Optional. New display name. |
schedule | object | Optional. Same schedule shape as monitor creation. |
{
"name": "AI infrastructure",
"schedule": {
"frequency": "daily",
"timezone": "America/New_York",
"run_time": "07:30"
}
}
Delete a Monitor
/v1/monitors/{monitor_id}
Permanently disables the monitor. The monitor will not be scheduled again.
Run a Monitor Now
/v1/monitors/{monitor_id}/run
Queues the same work as a scheduled run: UTC today and the trailing three UTC days. The response includes a parent task ID. Use the backfill status endpoint to inspect the child dated jobs.
{
"task_id": "2e4efb9a-5e88-4658-9c5f-8e3ec3d56a0e",
"status": "queued",
"queued": [
{
"published_date": "2026-05-12",
"run_id": "7d7c0c5f-7f40-4f7a-a93d-09499e4d8e29",
"task_id": "7d7c0c5f-7f40-4f7a-a93d-09499e4d8e29",
"already_complete": false,
"latest_indexed_content": null
}
],
"summary": {
"requested": 4,
"queued": 4,
"already_complete": 0,
"already_running": 0,
"failed": 0
}
}
Backfill Monitor Dates
/v1/monitors/{monitor_id}/backfills
Queues dated monitor runs for specific UTC published dates. You can submit up to 100 dates in one request.
By default, Omnist skips a date when that date already has a completed backfill whose run date was more than 72 hours after the published date. This keeps ordinary backfills from spending work on days that are already stable.
await fetch('https://api.omnist.ai/v1/monitors/mon_01h.../backfills', {
method: 'POST',
headers: {
'Authorization': 'Bearer omni_live_...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
dates: ['2026-05-09', '2026-05-10', '2026-05-11'],
skip_complete: true
})
});import requests
requests.post(
'https://api.omnist.ai/v1/monitors/mon_01h.../backfills',
headers={
'Authorization': 'Bearer omni_live_...',
'Content-Type': 'application/json',
},
json={
'dates': ['2026-05-09', '2026-05-10', '2026-05-11'],
'skip_complete': True,
},
)Request Body
| Field | Type | Notes |
|---|---|---|
dates | string[] | Required. UTC published dates in YYYY-MM-DD format. Maximum 100. |
skip_complete | boolean | Optional. Defaults to true. |
Response
{
"task_id": "be8c49a7-89ab-46b4-8a89-9f44442ceca9",
"status": "queued",
"queued": [
{
"published_date": "2026-05-10",
"run_id": "75ca688d-8879-4a92-909d-fbd95720dc43",
"task_id": "75ca688d-8879-4a92-909d-fbd95720dc43",
"already_complete": false,
"latest_indexed_content": "2026-05-11T03:12:22Z"
}
],
"skipped": [
{
"published_date": "2026-05-09",
"already_complete": true,
"latest_indexed_content": "2026-05-10T05:41:09Z"
}
],
"summary": {
"requested": 3,
"queued": 2,
"already_complete": 1,
"already_running": 0,
"failed": 0
}
}
latest_indexed_content is the high-water mark used for that date. It refers to the most recent enrichment completion timestamp already recorded in the monitor results for that published date.
List Backfill Status
/v1/monitors/{monitor_id}/backfills
Returns the per-date backfill ledger for a monitor.
| Query parameter | Type | Notes |
|---|---|---|
start_date | string | Optional. Inclusive UTC published date in YYYY-MM-DD format. |
end_date | string | Optional. Inclusive UTC published date in YYYY-MM-DD format. |
status | string | Optional. One of running, succeeded, failed, or skipped. |
limit | integer | Optional. Default 50, maximum 200. |
offset | integer | Optional. Default 0. |
{
"monitor_id": "mon_01h...",
"backfills": [
{
"date": "2026-05-10",
"status": "succeeded",
"run_id": "75ca688d-8879-4a92-909d-fbd95720dc43",
"backfill_run_at": "2026-05-11T04:00:12Z",
"backfill_run_date": "2026-05-11",
"latest_indexed_content_at": "2026-05-11T03:12:22Z",
"result_count": 18,
"error_message": null
}
],
"summary": {
"total": 3,
"running": 0,
"succeeded": 2,
"failed": 0,
"skipped": 1
},
"limit": 50,
"offset": 0,
"next_offset": null,
"has_more": false
}
Get Backfill Task Status
/v1/monitors/{monitor_id}/backfills/{task_id}
Returns the parent task and its child dated jobs.
{
"task_id": "be8c49a7-89ab-46b4-8a89-9f44442ceca9",
"status": "running",
"summary": {
"requested": 3,
"queued": 0,
"running": 1,
"succeeded": 1,
"failed": 0,
"skipped": 1
},
"tasks": [
{
"published_date": "2026-05-10",
"run_id": "75ca688d-8879-4a92-909d-fbd95720dc43",
"task_id": "75ca688d-8879-4a92-909d-fbd95720dc43",
"status": "running",
"latest_indexed_content": "2026-05-11T03:12:22Z"
}
]
}
List Monitor Runs
/v1/monitors/{monitor_id}/runs
Returns scheduled, manual, parent, and dated backfill runs.
| Query parameter | Type | Notes |
|---|---|---|
limit | integer | Optional. Default 50, maximum 100. |
offset | integer | Optional. Default 0. |
List Monitor Results
/v1/monitors/{monitor_id}/results
Returns content items captured by the monitor.
| Query parameter | Type | Notes |
|---|---|---|
limit | integer | Optional. Default 50, maximum 100. |
offset | integer | Optional. Default 0. |
start_date | string | Optional published-date lower bound. |
end_date | string | Optional published-date upper bound. |
Search Monitor Results
/v1/monitors/{monitor_id}/search
Searches within the monitor result store. It accepts the same request shape as content search, including the same date behavior and maximum limit of 100.