[Docs](/docs) / Monitors

# Monitors

Beta

A monitor turns a `news_search`, `edgar_search` or `geo_search` request into a webhook: deep.navy keeps the request, matches it against every new document it indexes, and posts the matches to your URL as signed events.

## What a monitor is

Three parts: a saved search, a trigger and a webhook.

**Search.** Exactly one of the three search requests, with the same arguments the tool takes: a news query with `include_domains` and `near`; an EDGAR query, `form_types`, `ticker` or `cik`; a geo `datasets` list with an `area` and `filters`. Recency and date filters are ignored: a monitor only ever sees documents indexed after it was created.

**Trigger.** `realtime` pushes each new match within about a minute of indexing, one run per batch of matches. `interval` collects the new matches and sends one digest every period: `1h`, `6h`, `1d` or `7d`.

**Webhook.** A public HTTPS URL and the events it wants. Every delivery is signed with the monitor's secret, which is returned once at creation.

A document is delivered to a monitor once. If an article is re-indexed, or matches again after a correction, it is not sent again. A manual run (*Trigger now* in the dashboard) delivers the matches waiting since the last run, like a scheduled one would.

## Create one from an agent

The `monitor_*` tools are served on `/monitors` and, like every tool you have switched on, on `/mcp`.

```
https://mcp.deep.navy/monitors
```

```
https://mcp.deep.navy/mcp
```

| Tool                              | What it does                                                    |
| --------------------------------- | --------------------------------------------------------------- |
| [monitor_create](#monitor_create) | Create a monitor; the response carries the webhook secret once. |
| [monitor_list](#monitor_list)     | List your monitors.                                             |
| [monitor_get](#monitor_get)       | One monitor by id.                                              |
| [monitor_pause](#monitor_pause)   | Stop matching and delivering; the saved search is kept.         |
| [monitor_resume](#monitor_resume) | Resume a paused or disabled monitor.                            |
| [monitor_delete](#monitor_delete) | Delete a monitor and its runs.                                  |
| [monitor_runs](#monitor_runs)     | The latest runs: matches, delivery status and attempts.         |

`monitor_create` takes the fields below (`name`, `search`, `trigger`, `webhook`, `metadata`) and returns the monitor with its `webhook_secret`. Tell the agent where to store the secret before it creates the monitor; the tool will not return it again. Each tool's response, field by field, and a call captured from production are under [The monitor tools](#tools) below.

## Create one from the dashboard or the API

The [dashboard](/dashboard/monitors) is the path for people. The same operations are Connect endpoints on `api.deep.navy`, called with the signed-in user's JWT (the token the dashboard uses), not an API key.

```
https://api.deep.navy/deepnavy.monitors.v1.MonitorService/CreateMonitor
```

```
{
  "name": "Apple 8-Ks",
  "search": {
    "edgar": {
      "ticker": "AAPL",
      "formTypes": [
        "8-K"
      ]
    }
  },
  "trigger": {
    "type": "TYPE_REALTIME"
  },
  "webhook": {
    "url": "https://example.com/hooks/deepnavy",
    "events": [
      "EVENT_TYPE_RUN_COMPLETED"
    ]
  },
  "metadata": {
    "team": "research"
  }
}
```

```
curl https://api.deep.navy/deepnavy.monitors.v1.MonitorService/CreateMonitor \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  -d @monitor.json
```

For an interval trigger send `{"type":"TYPE_INTERVAL","period":"6h"}`. Field names are protojson (`camelCase`), enums are their proto names, and the response is the monitor plus the secret, once:

```
{
  "monitor": {
    "id": "9b1f3c2e-4d8a-4c1e-9f2b-6a7d8e9f0a1b",
    "name": "Apple 8-Ks",
    "status": "STATUS_ACTIVE",
    "createdAt": "2026-10-05T14:02:11Z"
  },
  "webhookSecret": "whsec_…"
}
```

The other methods on `MonitorService` are `ListMonitors`, `GetMonitor`, `UpdateMonitor`, `PauseMonitor`, `ResumeMonitor`, `TriggerMonitor`, `PreviewMonitor` (runs the search now without saving anything), `ListRuns`, `GetRun`, `DeleteMonitor` and `RotateWebhookSecret`.

## Deliveries

One HTTPS POST per event. The body is the event as protojson; the matches are in the shape the tool returns them.

| Header             | Value                                   |
| ------------------ | --------------------------------------- |
| Deepnavy-Signature | t=\<unix seconds>,v1=\<hex HMAC-SHA256> |
| Deepnavy-Event     | monitor.run.completed                   |
| Deepnavy-Delivery  | \<delivery id>, the same on every retry |
| Content-Type       | application/json                        |

A `monitor.run.completed` delivery for the EDGAR monitor above. `results` is the `edgar_search` response shape (`SearchFilingsResponse`); a news monitor delivers `NewsResult` items and a geo monitor STAC Items. Run events also carry `run`; every event carries the monitor and its `metadata`.

```
{
  "type": "monitor.run.completed",
  "id": "7c0e5b9a-2f31-4d6e-8a4b-1c9d2e3f4a5b",
  "monitorId": "9b1f3c2e-4d8a-4c1e-9f2b-6a7d8e9f0a1b",
  "metadata": {
    "team": "research"
  },
  "createdAt": "2026-10-05T14:30:12Z",
  "monitor": {
    "id": "9b1f3c2e-4d8a-4c1e-9f2b-6a7d8e9f0a1b",
    "name": "Apple 8-Ks",
    "search": {
      "edgar": {
        "ticker": "AAPL",
        "formTypes": [
          "8-K"
        ]
      }
    },
    "trigger": {
      "type": "TYPE_REALTIME"
    },
    "webhook": {
      "url": "https://example.com/hooks/deepnavy",
      "events": [
        "EVENT_TYPE_RUN_COMPLETED"
      ]
    },
    "metadata": {
      "team": "research"
    },
    "status": "STATUS_ACTIVE",
    "createdAt": "2026-10-05T14:02:11Z",
    "updatedAt": "2026-10-05T14:02:11Z"
  },
  "run": {
    "id": "2f6c1d6e-8b4a-4f2c-9e1d-3a5b7c9d1e2f",
    "monitorId": "9b1f3c2e-4d8a-4c1e-9f2b-6a7d8e9f0a1b",
    "status": "RUN_STATUS_COMPLETED",
    "matched": 1,
    "startedAt": "2026-10-05T14:30:02Z",
    "completedAt": "2026-10-05T14:30:11Z"
  },
  "results": {
    "results": [
      {
        "accession": "0000320193-26-000079",
        "cik": "320193",
        "company": "Apple Inc.",
        "tickers": [
          "AAPL"
        ],
        "formType": "8-K",
        "filedAt": "2026-10-05T13:02:41Z",
        "period": "2026-10-05",
        "url": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000079/aapl-20261005.htm",
        "title": "Apple Inc. · 8-K",
        "snippet": "Item 2.02 Results of Operations and Financial Condition …",
        "score": 12.4
      }
    ]
  }
}
```

This delivery was captured from production. It came from a realtime news monitor for "Nobel", so its `results` are `NewsResult` items; the signature in its headers was made with that monitor's secret.

`webhook delivery`

### A signed run.completed delivery

The POST deep.navy sent to the throwaway monitor's receiver after its first run, signed with the webhook secret over the timestamp and the body.

**Headers**

```
{
  "method": "POST",
  "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
  "headers": {
    "Content-Type": "application/json",
    "Deepnavy-Event": "monitor.run.completed",
    "Deepnavy-Delivery": "6865a38a-fc2e-470f-a942-392e7f518c7e",
    "Deepnavy-Signature": "t=1791221292,v1=7414e24280f538238edd5cbb5a159aa235ad8df4987998e5719ca16e7ffc6f31"
  }
}
```

**Body**

```
{
  "id": "2721fffa-0571-497d-8746-c709d7593a09",
  "run": {
    "id": "2721fffa-0571-497d-8746-c709d7593a09",
    "status": "RUN_STATUS_COMPLETED",
    "matched": 1,
    "monitorId": "ca3ab530-437e-4a93-886c-918239be68d2",
    "startedAt": "2026-10-05T17:28:12.754940Z",
    "completedAt": "2026-10-05T17:28:12.758163Z"
  },
  "type": "monitor.run.completed",
  "monitor": {
    "id": "ca3ab530-437e-4a93-886c-918239be68d2",
    "name": "Nobel news",
    "search": {
      "news": {
        "query": "Nobel",
        "numResults": 5
      }
    },
    "status": "STATUS_ACTIVE",
    "trigger": {
      "type": "TYPE_REALTIME"
    },
    "webhook": {
      "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
      "events": [
        "EVENT_TYPE_MONITOR_CREATED",
        "EVENT_TYPE_RUN_COMPLETED"
      ]
    },
    "metadata": {
      "team": "newsroom"
    },
    "createdAt": "2026-10-05T17:27:14.041383Z",
    "updatedAt": "2026-10-05T17:27:14.041383Z"
  },
  "results": {
    "results": [
      {
        "url": "https://www.channelnewsasia.com/world/medicine-nobel-goes-us-german-trio-pioneering-light-based-control-cells-6433586?cid=cna_flip_070214",
        "title": "Medicine Nobel goes to US-German trio for pioneering light-based control of cells",
        "author": "CNA",
        "snippet": "Medicine Nobel goes to US-German trio for pioneering light-based control of cells\nAmerican psychiatrist and neurologist Karl Deisseroth and German scientists Peter Hegemann and Georg Nagel won the Nobel Prize in Medicine for discoveries that",
        "publisher": "Channel NewsAsia",
        "publishedAt": "2026-10-05T14:13:47Z"
      }
    ]
  },
  "metadata": {
    "team": "newsroom"
  },
  "createdAt": "2026-10-05T17:28:12.759673703Z",
  "monitorId": "ca3ab530-437e-4a93-886c-918239be68d2"
}
```

Captured 2026-10-05 17:28 UTC from production

Answer with any 2xx status; the response body is ignored. Answer first and do the work afterwards, so a slow handler is not counted as a failed attempt.

## Verify the signature

`v1` is HMAC-SHA256, keyed with the webhook secret, over the string `<t>.<raw body>`: the timestamp, a dot, and the request body exactly as received.

```
Deepnavy-Signature: t=1791210612,v1=5f1a0c…
```

Compute over the raw bytes, before any JSON parsing or re-serialization.

Compare in constant time.

Reject when `t` is more than 5 minutes from your clock, either way.

`Deepnavy-Delivery` is the same on every retry of a delivery; use it to drop duplicates.

```
import { createHmac, timingSafeEqual } from 'node:crypto';

// rawBody is the request body as received (a Buffer or string), not re-serialized JSON.
export function verify(rawBody, signatureHeader, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries(signatureHeader.split(',').map((kv) => kv.split('=')));
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false;
  const expected = createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest();
  const given = Buffer.from(parts.v1 ?? '', 'hex');
  return given.length === expected.length && timingSafeEqual(given, expected);
}
```

```
import hashlib, hmac, time

def verify(raw_body: bytes, signature_header: str, secret: str, tolerance: int = 300) -> bool:
    parts = dict(kv.split("=", 1) for kv in signature_header.split(","))
    t = int(parts.get("t", "0"))
    if abs(time.time() - t) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts.get("v1", ""))
```

## Retries

A delivery that gets no 2xx is retried with backoff; one that keeps failing disables the monitor.

After a failed attempt the next one follows in **1 min**, **5 min**, **30 min**, **2 h**, **6 h** and **12 h**. After the last failure the monitor's status becomes **Disabled**: it stops matching, and its remaining deliveries are dropped. Fix the endpoint and *Resume* it from the dashboard (or `monitor_resume`).

Each run shows the HTTP status of its last attempt, the attempt count and the delivery time under *Runs* in the dashboard and in `monitor_runs`.

## Limits and retention

**Active monitor allowance.** Your account plan sets the active-monitor cap; see Dashboard → Billing for the current allowance.

**Tenant ownership.** A tenant tool key can manage only its tenant’s monitors. Create a replacement key for the same tenant when rotating credentials so resources and shared budgets remain attached to that tenant.

**Spend caps.** A key or tenant with a spend cap cannot create, resume or trigger monitors because background execution and deliveries are outside synchronous call budgets. Rate-only caps do not limit background monitor execution. See [tenant limits and usage](/docs/platform) and the full [retention statement](/retention).

**HTTPS only, public hosts only.** Private, loopback and link-local addresses are refused when the monitor is created and again at delivery time, after DNS resolution.

**Results are kept 30 days.** After that a run's matches are no longer returned by `GetRun`, and a document delivered more than 30 days ago may be delivered again if it is re-indexed.

**Metadata:** up to 20 string pairs, keys up to 64 and values up to 500 characters.

**Not in this release:** watched-URL monitors (a list of pages to diff) and semantic monitors (matching by embedding rather than by query). Keyword, filter and area matching over the news, EDGAR and geo indexes is what ships now.

## The monitor tools

Every example below is one call in the life of the same throwaway monitor, made on production and deleted at the end.

## monitor_create

Beta

It creates a monitor from a `name`, a `search`, a `trigger`, a `webhook` and optional `metadata`, and returns the monitor with its webhook secret, once.

### What comes back

| Field                          | Type                 | Meaning                                                                                                                |
| ------------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| monitor.​id                    | string               | It is the monitor's id, a UUID.                                                                                        |
| monitor.​name                  | string               | It is the name you gave the monitor.                                                                                   |
| monitor.​search                | Search               | It is the saved request: exactly one of `news`, `edgar` or `geo`, in the shape of that tool's arguments.               |
| monitor.​trigger               | Trigger              | It is `TYPE_REALTIME`, or `TYPE_INTERVAL` with a `period` of `1h`, `6h`, `1d` or `7d`.                                 |
| monitor.​webhook               | Webhook              | It is the HTTPS `url` deliveries go to and the `events` it receives.                                                   |
| monitor.​metadata              | map\<string, string> | They are your own key and value pairs, echoed in every delivery.                                                       |
| monitor.​status                | Status               | It is `STATUS_ACTIVE`, `STATUS_PAUSED`, or `STATUS_DISABLED` when deep.navy stopped it after its webhook kept failing. |
| monitor.​nextRunAt             | timestamp            | It is an interval monitor's next run.                                                                                  |
| monitor.​createdAt · updatedAt | timestamp            | They are when the monitor was created and last changed.                                                                |
| webhookSecret                  | string               | It is the HMAC-SHA256 key for the `Deepnavy-Signature` header. It is returned once, here, and never again.             |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_create`

### A realtime news monitor

A monitor that posts every new article mentioning Nobel to a webhook within about a minute; the webhook secret is returned once (shown here as whsec\_…).

**Request**

```
{
  "name": "Nobel news",
  "search": {
    "news": {
      "query": "Nobel",
      "numResults": 5
    }
  },
  "trigger": {
    "type": "TYPE_REALTIME"
  },
  "webhook": {
    "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
    "events": [
      "EVENT_TYPE_MONITOR_CREATED",
      "EVENT_TYPE_RUN_COMPLETED"
    ]
  },
  "metadata": {
    "team": "newsroom"
  }
}
```

**Response**

```
{
  "monitor": {
    "id": "ca3ab530-437e-4a93-886c-918239be68d2",
    "name": "Nobel news",
    "search": {
      "news": {
        "query": "Nobel",
        "numResults": 5
      }
    },
    "trigger": {
      "type": "TYPE_REALTIME"
    },
    "webhook": {
      "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
      "events": [
        "EVENT_TYPE_MONITOR_CREATED",
        "EVENT_TYPE_RUN_COMPLETED"
      ]
    },
    "metadata": {
      "team": "newsroom"
    },
    "status": "STATUS_ACTIVE",
    "createdAt": "2026-10-05T17:27:14.041383Z",
    "updatedAt": "2026-10-05T17:27:14.041383Z"
  },
  "webhookSecret": "whsec_…"
}
```

Captured 2026-10-05 17:27 UTC from production

## monitor_get

Beta

It returns one monitor by `id`.

### What comes back

| Field                          | Type                 | Meaning                                                                                                                |
| ------------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| monitor.​id                    | string               | It is the monitor's id, a UUID.                                                                                        |
| monitor.​name                  | string               | It is the name you gave the monitor.                                                                                   |
| monitor.​search                | Search               | It is the saved request: exactly one of `news`, `edgar` or `geo`, in the shape of that tool's arguments.               |
| monitor.​trigger               | Trigger              | It is `TYPE_REALTIME`, or `TYPE_INTERVAL` with a `period` of `1h`, `6h`, `1d` or `7d`.                                 |
| monitor.​webhook               | Webhook              | It is the HTTPS `url` deliveries go to and the `events` it receives.                                                   |
| monitor.​metadata              | map\<string, string> | They are your own key and value pairs, echoed in every delivery.                                                       |
| monitor.​status                | Status               | It is `STATUS_ACTIVE`, `STATUS_PAUSED`, or `STATUS_DISABLED` when deep.navy stopped it after its webhook kept failing. |
| monitor.​nextRunAt             | timestamp            | It is an interval monitor's next run.                                                                                  |
| monitor.​createdAt · updatedAt | timestamp            | They are when the monitor was created and last changed.                                                                |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_get`

### Read one monitor

The monitor just created, with its saved search, trigger, webhook and status.

**Request**

```
{
  "id": "ca3ab530-437e-4a93-886c-918239be68d2"
}
```

**Response**

```
{
  "monitor": {
    "id": "ca3ab530-437e-4a93-886c-918239be68d2",
    "name": "Nobel news",
    "search": {
      "news": {
        "query": "Nobel",
        "numResults": 5
      }
    },
    "trigger": {
      "type": "TYPE_REALTIME"
    },
    "webhook": {
      "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
      "events": [
        "EVENT_TYPE_MONITOR_CREATED",
        "EVENT_TYPE_RUN_COMPLETED"
      ]
    },
    "metadata": {
      "team": "newsroom"
    },
    "status": "STATUS_ACTIVE",
    "createdAt": "2026-10-05T17:27:14.041383Z",
    "updatedAt": "2026-10-05T17:27:14.041383Z"
  }
}
```

Captured 2026-10-05 17:27 UTC from production

## monitor_list

Beta

It returns every monitor of the key's account.

### What comes back

| Field                           | Type                 | Meaning                                                                                                                |
| ------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| monitors                        | Monitor\[]           | They are your account's monitors.                                                                                      |
| monitors.​name                  | string               | It is the name you gave the monitor.                                                                                   |
| monitors.​search                | Search               | It is the saved request: exactly one of `news`, `edgar` or `geo`, in the shape of that tool's arguments.               |
| monitors.​trigger               | Trigger              | It is `TYPE_REALTIME`, or `TYPE_INTERVAL` with a `period` of `1h`, `6h`, `1d` or `7d`.                                 |
| monitors.​webhook               | Webhook              | It is the HTTPS `url` deliveries go to and the `events` it receives.                                                   |
| monitors.​metadata              | map\<string, string> | They are your own key and value pairs, echoed in every delivery.                                                       |
| monitors.​status                | Status               | It is `STATUS_ACTIVE`, `STATUS_PAUSED`, or `STATUS_DISABLED` when deep.navy stopped it after its webhook kept failing. |
| monitors.​nextRunAt             | timestamp            | It is an interval monitor's next run.                                                                                  |
| monitors.​createdAt · updatedAt | timestamp            | They are when the monitor was created and last changed.                                                                |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_list`

### List your monitors

Every monitor that belongs to the API key's account.

**Request**

```
{}
```

**Response**

```
{
  "monitors": [
    {
      "id": "ca3ab530-437e-4a93-886c-918239be68d2",
      "name": "Nobel news",
      "search": {
        "news": {
          "query": "Nobel",
          "numResults": 5
        }
      },
      "trigger": {
        "type": "TYPE_REALTIME"
      },
      "webhook": {
        "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
        "events": [
          "EVENT_TYPE_MONITOR_CREATED",
          "EVENT_TYPE_RUN_COMPLETED"
        ]
      },
      "metadata": {
        "team": "newsroom"
      },
      "status": "STATUS_ACTIVE",
      "createdAt": "2026-10-05T17:27:14.041383Z",
      "updatedAt": "2026-10-05T17:27:14.041383Z"
    }
  ]
}
```

Captured 2026-10-05 17:27 UTC from production

## monitor_runs

Beta

It returns a monitor's runs, newest first, 50 by default and up to 200 with `limit`: how many new documents each matched and how its webhook delivery went.

### What comes back

| Field                         | Type      | Meaning                                                                                          |
| ----------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
| runs                          | Run\[]    | They are the runs, newest first.                                                                 |
| runs.​id · monitorId          | string    | They are the run and its monitor.                                                                |
| runs.​status                  | RunStatus | It is `RUN_STATUS_PENDING`, `RUN_STATUS_RUNNING`, `RUN_STATUS_COMPLETED` or `RUN_STATUS_FAILED`. |
| runs.​matched                 | int32     | It is the number of new documents the run matched, never repeated across runs.                   |
| runs.​deliveryStatus          | int32     | It is the HTTP status of the webhook delivery's last attempt.                                    |
| runs.​deliveryAttempts        | int32     | It is how many delivery attempts were made.                                                      |
| runs.​deliveredAt             | timestamp | It is when the delivery succeeded.                                                               |
| runs.​failReason              | string    | It says why the run failed, when it did.                                                         |
| runs.​startedAt · completedAt | timestamp | They are when the run started and finished.                                                      |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_runs`

### A monitor's runs

The runs of the monitor, newest first, with how many new articles each matched and how its webhook delivery went.

**Request**

```
{
  "monitorId": "ca3ab530-437e-4a93-886c-918239be68d2",
  "limit": 3
}
```

**Response**

```
{
  "runs": [
    {
      "id": "2721fffa-0571-497d-8746-c709d7593a09",
      "monitorId": "ca3ab530-437e-4a93-886c-918239be68d2",
      "status": "RUN_STATUS_COMPLETED",
      "matched": 1,
      "deliveryStatus": 200,
      "deliveryAttempts": 1,
      "deliveredAt": "2026-10-05T17:28:13.119390Z",
      "startedAt": "2026-10-05T17:28:12.754940Z",
      "completedAt": "2026-10-05T17:28:12.758163Z"
    }
  ]
}
```

Captured 2026-10-05 17:28 UTC from production

## monitor_pause

Beta

It stops a monitor matching and delivering until it is resumed; the saved search is kept.

### What comes back

| Field                          | Type                 | Meaning                                                                                                                |
| ------------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| monitor.​id                    | string               | It is the monitor's id, a UUID.                                                                                        |
| monitor.​name                  | string               | It is the name you gave the monitor.                                                                                   |
| monitor.​search                | Search               | It is the saved request: exactly one of `news`, `edgar` or `geo`, in the shape of that tool's arguments.               |
| monitor.​trigger               | Trigger              | It is `TYPE_REALTIME`, or `TYPE_INTERVAL` with a `period` of `1h`, `6h`, `1d` or `7d`.                                 |
| monitor.​webhook               | Webhook              | It is the HTTPS `url` deliveries go to and the `events` it receives.                                                   |
| monitor.​metadata              | map\<string, string> | They are your own key and value pairs, echoed in every delivery.                                                       |
| monitor.​status                | Status               | It is `STATUS_ACTIVE`, `STATUS_PAUSED`, or `STATUS_DISABLED` when deep.navy stopped it after its webhook kept failing. |
| monitor.​nextRunAt             | timestamp            | It is an interval monitor's next run.                                                                                  |
| monitor.​createdAt · updatedAt | timestamp            | They are when the monitor was created and last changed.                                                                |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_pause`

### Pause a monitor

The monitor stops matching and delivering until it is resumed.

**Request**

```
{
  "id": "ca3ab530-437e-4a93-886c-918239be68d2"
}
```

**Response**

```
{
  "monitor": {
    "id": "ca3ab530-437e-4a93-886c-918239be68d2",
    "name": "Nobel news",
    "search": {
      "news": {
        "query": "Nobel",
        "numResults": 5
      }
    },
    "trigger": {
      "type": "TYPE_REALTIME"
    },
    "webhook": {
      "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
      "events": [
        "EVENT_TYPE_MONITOR_CREATED",
        "EVENT_TYPE_RUN_COMPLETED"
      ]
    },
    "metadata": {
      "team": "newsroom"
    },
    "status": "STATUS_PAUSED",
    "createdAt": "2026-10-05T17:27:14.041383Z",
    "updatedAt": "2026-10-05T17:28:16.188227Z"
  }
}
```

Captured 2026-10-05 17:28 UTC from production

## monitor_resume

Beta

It makes a paused or disabled monitor active again; an interval monitor's next run is one period from now.

### What comes back

| Field                          | Type                 | Meaning                                                                                                                |
| ------------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| monitor.​id                    | string               | It is the monitor's id, a UUID.                                                                                        |
| monitor.​name                  | string               | It is the name you gave the monitor.                                                                                   |
| monitor.​search                | Search               | It is the saved request: exactly one of `news`, `edgar` or `geo`, in the shape of that tool's arguments.               |
| monitor.​trigger               | Trigger              | It is `TYPE_REALTIME`, or `TYPE_INTERVAL` with a `period` of `1h`, `6h`, `1d` or `7d`.                                 |
| monitor.​webhook               | Webhook              | It is the HTTPS `url` deliveries go to and the `events` it receives.                                                   |
| monitor.​metadata              | map\<string, string> | They are your own key and value pairs, echoed in every delivery.                                                       |
| monitor.​status                | Status               | It is `STATUS_ACTIVE`, `STATUS_PAUSED`, or `STATUS_DISABLED` when deep.navy stopped it after its webhook kept failing. |
| monitor.​nextRunAt             | timestamp            | It is an interval monitor's next run.                                                                                  |
| monitor.​createdAt · updatedAt | timestamp            | They are when the monitor was created and last changed.                                                                |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_resume`

### Resume a monitor

The paused monitor is active again and matches new articles from now on.

**Request**

```
{
  "id": "ca3ab530-437e-4a93-886c-918239be68d2"
}
```

**Response**

```
{
  "monitor": {
    "id": "ca3ab530-437e-4a93-886c-918239be68d2",
    "name": "Nobel news",
    "search": {
      "news": {
        "query": "Nobel",
        "numResults": 5
      }
    },
    "trigger": {
      "type": "TYPE_REALTIME"
    },
    "webhook": {
      "url": "https://webhook.site/3f0698c5-a300-4ea0-a5f5-f72f3d0c90ff",
      "events": [
        "EVENT_TYPE_MONITOR_CREATED",
        "EVENT_TYPE_RUN_COMPLETED"
      ]
    },
    "metadata": {
      "team": "newsroom"
    },
    "status": "STATUS_ACTIVE",
    "createdAt": "2026-10-05T17:27:14.041383Z",
    "updatedAt": "2026-10-05T17:28:16.446076Z"
  }
}
```

Captured 2026-10-05 17:28 UTC from production

## monitor_delete

Beta

It deletes a monitor and its runs; nothing more is delivered to its webhook.

### What comes back

| Field   | Type | Meaning                                                       |
| ------- | ---- | ------------------------------------------------------------- |
| (empty) | {}   | The response is an empty object when the monitor was deleted. |

Unset optional fields are omitted; explicitly set zero and false values are preserved. Empty lists are explicit arrays, and 64-bit integers are strings, as protojson writes them.

`monitor_delete`

### Delete a monitor

The monitor and its schedule are removed; the empty response means it worked.

**Request**

```
{
  "id": "ca3ab530-437e-4a93-886c-918239be68d2"
}
```

**Response**

```
{}
```

Captured 2026-10-05 17:28 UTC from production

Read [provenance and trust](/docs/provenance) for source timestamps, historical limitations and handling untrusted text. See [limits and errors](/docs/limits) for request receipts and retry behavior.

---

This is the Markdown copy of https://deep.navy/docs/monitors.
