deep.navy

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 Create a monitor; the response carries the webhook secret once.
monitor_list List your monitors.
monitor_get One monitor by id.
monitor_pause Stop matching and delivering; the saved search is kept.
monitor_resume Resume a paused or disabled monitor.
monitor_delete Delete a monitor and its 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 below.

Create one from the dashboard or the API

The dashboard 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.

{
  "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

25 monitors per customer.

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.
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_…).

{
  "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.
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.

{
  "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.
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.

{
  "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.
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.

{
  "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.
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.

{
  "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.
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.

{
  "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.
(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.

{}

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