Monitoring Status
curl --request GET \
--url https://api.signa.so/v1/monitoring/status \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/monitoring/status"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signa.so/v1/monitoring/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.signa.so/v1/monitoring/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/monitoring/status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.signa.so/v1/monitoring/status")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/monitoring/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "monitoring_status",
"watches": {
"total": 412,
"by_health": {
"healthy": 401,
"lagging": 6,
"degraded": 2,
"paused": 3,
"pending": 0,
"unsupported": 0
}
},
"offices": [
{
"office_code": "US",
"pipeline_status": "ok",
"coverage_through": "2026-09-13T23:59:59.000Z",
"last_completed_sync_at": "2026-09-14T06:10:00.000Z",
"last_search_indexed_at": "2026-09-14T06:24:00.000Z",
"slo_hours": 48,
"declined_runs_unresolved": 0
},
{
"office_code": "CA",
"pipeline_status": "lagging",
"coverage_through": "2026-09-01T23:59:59.000Z",
"last_completed_sync_at": "2026-09-13T05:40:00.000Z",
"last_search_indexed_at": "2026-09-13T05:52:00.000Z",
"slo_hours": 240,
"declined_runs_unresolved": 1
}
],
"pipeline": {
"last_verified_end_to_end_at": "2026-09-14T08:00:00.000Z",
"last_real_record_alert_at": "2026-09-14T02:14:00.000Z",
"verification": "canary"
},
"request_id": "req_2mR8vNkT"
}
Watches
Monitoring Status
One org-level snapshot of watch health, per-office pipeline freshness, and end-to-end pipeline verification
GET
/
v1
/
monitoring
/
status
Monitoring Status
curl --request GET \
--url https://api.signa.so/v1/monitoring/status \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/monitoring/status"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signa.so/v1/monitoring/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.signa.so/v1/monitoring/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/monitoring/status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.signa.so/v1/monitoring/status")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/monitoring/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "monitoring_status",
"watches": {
"total": 412,
"by_health": {
"healthy": 401,
"lagging": 6,
"degraded": 2,
"paused": 3,
"pending": 0,
"unsupported": 0
}
},
"offices": [
{
"office_code": "US",
"pipeline_status": "ok",
"coverage_through": "2026-09-13T23:59:59.000Z",
"last_completed_sync_at": "2026-09-14T06:10:00.000Z",
"last_search_indexed_at": "2026-09-14T06:24:00.000Z",
"slo_hours": 48,
"declined_runs_unresolved": 0
},
{
"office_code": "CA",
"pipeline_status": "lagging",
"coverage_through": "2026-09-01T23:59:59.000Z",
"last_completed_sync_at": "2026-09-13T05:40:00.000Z",
"last_search_indexed_at": "2026-09-13T05:52:00.000Z",
"slo_hours": 240,
"declined_runs_unresolved": 1
}
],
"pipeline": {
"last_verified_end_to_end_at": "2026-09-14T08:00:00.000Z",
"last_real_record_alert_at": "2026-09-14T02:14:00.000Z",
"verification": "canary"
},
"request_id": "req_2mR8vNkT"
}
Overview
A single, read-only snapshot of your whole monitoring program. It answers two different questions in one response:- How are my watches doing? The
watchesblock is a rollup of every watch in your organization, counted by health state. It is scoped strictly to your org. - How fresh is Signa’s data for each office? The
offices[]block is Signa’s global per-office ingestion freshness. It is the same for every organization, computed once and shared through a 60 second cache, and it is not filtered to the offices your watches cover.
pipeline, carries the continuous end-to-end verification gauges. Every
timestamp in it is null-honest: a missing or stale check is reported as null, never as an
old value dressed up as a fresh verification.
Requires the portfolios:manage scope. Calling it never changes anything.
slo_hours is an internal freshness target, not an SLA. Each office carries an
slo_hours value derived from that office’s update_cadence. It is the ceiling Signa uses to
decide pipeline_status: coverage within slo_hours is ok, coverage older than that (or no
coverage signal at all) is lagging. It is an operational default that Signa can tune as an
office’s publishing behaviour changes. It is not a published service level and not a
contractual commitment.Query Parameters
None. The response is always the full snapshot.How to use it
Gate a “no conflicts” report. Before you tell a client that a watch surfaced nothing, check that every office the watch covers reportspipeline_status: "ok". A lagging office
means the register data behind that negative result is older than Signa’s own freshness
target, so the report should say so or wait.
Drive a dashboard tile. The response is one call, small, and safe to poll. Show
watches.by_health as a status strip and offices[] as a freshness table. Because
offices[] is global, you can cache it across users and orgs.
Run your own alerting. Poll on a schedule and alert when watches.by_health.degraded > 0,
when an office you rely on flips to lagging, or when pipeline.last_verified_end_to_end_at
turns null. This is the same signal the dashboard Monitoring page reads.
For the meaning of each health state and the reasoning behind the null-honest gauges, read the
Monitoring status guide.
Response
string
Always
monitoring_status.object
Org-scoped aggregate over all of your non-deleted watches.
Show watches
Show watches
integer
Count of your non-deleted watches.
object
Count of watches in each health state. All six keys are always present; a state with no
watches reports
0.Show by_health
Show by_health
integer
Every in-scope office is evaluated and current.
integer
Coverage has stopped advancing beyond the expected window (office ingestion behind, or an evaluation backlog). Usually resolves on its own.
integer
The watch itself needs attention: repeated evaluation errors, or an entity filter that no longer resolves.
integer
Paused by you. No new evaluation happens.
integer
Active but not yet evaluated, still within the office refresh window.
integer
The scope includes an office Signa does not yet ingest.
object[]
Global per-office pipeline status, one entry per live office. Not org-specific: identical for
every organization, computed once and shared through a 60 second cache.
Show offices[]
Show offices[]
string
WIPO ST.3 office code, uppercase (
US, EM).'ok' | 'lagging'
ok when coverage_through is within slo_hours of now. lagging when coverage is
older than that, or when there is no coverage signal at all.string | null
Office-data time through which Signa has processed this office. This is source data time,
never wall-clock.
null when no eligible run carries a coverage signal.string | null
Newest completed pull from the office, regardless of whether it is indexed yet.
string | null
When the latest eligible run for this office became searchable.
integer
Internal freshness ceiling in hours, derived from the office cadence. This is the number
pipeline_status is measured against. Not a published SLA.integer
Sync runs for this office in the last 30 days that exceeded the evaluator’s per-run change
budget, were declined without evaluation, and have no audited re-drive recorded. Ingestion
still happened, so
coverage_through can look healthy; a non-zero value means changes
from those runs were not evaluated against any watch. The affected windows appear as
budget_declined gaps in attestations.object
Continuous pipeline-verification gauges. Both timestamps follow one rule: a stale value is
never presented as a fresh verification.
Show pipeline
Show pipeline
string | null
When a synthetic change last passed through the live pipeline end to end.
null when no
check has been recorded or the most recent one is older than the freshness horizon.string | null
When the representative real-record path last saw an office-originated change. A
separate, slower signal than the synthetic heartbeat. Same null rule.
'canary'
The mechanism behind the timestamps.
string
Request identifier for support.
Errors
| Status | type | When |
|---|---|---|
| 403 | forbidden | Caller lacks portfolios:manage |
Code Examples
curl "https://api.signa.so/v1/monitoring/status" \
-H "Authorization: Bearer sig_YOUR_KEY"
// The SDK does not wrap this endpoint yet; call it directly.
const res = await fetch("https://api.signa.so/v1/monitoring/status", {
headers: { Authorization: `Bearer ${process.env.SIGNA_API_KEY}` },
});
const status = await res.json();
if (status.watches.by_health.degraded > 0) {
notifyOps(`${status.watches.by_health.degraded} watches degraded`);
}
const lagging = status.offices.filter((o) => o.pipeline_status === "lagging");
for (const office of lagging) {
console.log(office.office_code, "coverage through", office.coverage_through);
}
{
"object": "monitoring_status",
"watches": {
"total": 412,
"by_health": {
"healthy": 401,
"lagging": 6,
"degraded": 2,
"paused": 3,
"pending": 0,
"unsupported": 0
}
},
"offices": [
{
"office_code": "US",
"pipeline_status": "ok",
"coverage_through": "2026-09-13T23:59:59.000Z",
"last_completed_sync_at": "2026-09-14T06:10:00.000Z",
"last_search_indexed_at": "2026-09-14T06:24:00.000Z",
"slo_hours": 48,
"declined_runs_unresolved": 0
},
{
"office_code": "CA",
"pipeline_status": "lagging",
"coverage_through": "2026-09-01T23:59:59.000Z",
"last_completed_sync_at": "2026-09-13T05:40:00.000Z",
"last_search_indexed_at": "2026-09-13T05:52:00.000Z",
"slo_hours": 240,
"declined_runs_unresolved": 1
}
],
"pipeline": {
"last_verified_end_to_end_at": "2026-09-14T08:00:00.000Z",
"last_real_record_alert_at": "2026-09-14T02:14:00.000Z",
"verification": "canary"
},
"request_id": "req_2mR8vNkT"
}
Related Endpoints
- Watch Attestation - the monthly, per-watch record, as opposed to this live snapshot
- Watch Diagnostics - explain a single expected alert
- List Watches - the individual watches behind
watches.by_health - Monitoring status guide - health states and the null-honest rule