Delivery modes: only always_per_alert
delivery_mode accepts only always_per_alert today — one delivery per
alert. The digest modes (digest_above_threshold, digest_only) are
planned but not yet available; sending them to create or update returns
400, and digest batching/suppression is not live for any watch. If you
need batching today, do it on your side: dedupe by webhook-id and roll
alerts up on your own schedule.
Alert latency: bounded by office sync cadence
An alert fires after the office publishes data → Signa ingests it → the evaluator matches it. Webhook delivery itself takes seconds after detection; the dominant term is the office’s publication-to-ingest gap. Concretely for the USPTO: Signa’s daily ingest runs at 01:01 UTC, with retry rails at 05:01 and 13:01 UTC that catch late upstream publication. A new US filing therefore typically alerts within ~24 hours of USPTO’s daily file publication — not within minutes of the filing itself. Other offices follow their own sync cadences (see Data freshness). Intra-day USPTO ingestion is on the roadmap but not committed.Preview latency and the time budget
POST /v1/watches/preview
runs synchronously under a ~20-second server-side budget, with each database
read capped at 10 seconds:
markandownerpreviews and narrowclasspreviews complete in a few seconds. A broad watch without a text query (for example one class inUSover 30 days) can hit the 10-second read cap and return apreview_timeout504after about 10 seconds.similaritypreviews over broad scopes and long trial windows are the heaviest and may approach the budget.- Counts can come back labeled
estimate_basis: "candidacy_upper_bound"(upper-bound estimate), the budget can end a heavy preview with apreview_timeout504(retryable: false— narrow the query), and concurrent previews429with aRetry-After. Full semantics on the Preview Watch page.
Diagnostics: bounded data windows
GET /v1/watches/{id}/diagnostics
reconstructs the evaluation trace from retained provenance, and those
retention windows are finite — change records 90 days, delivery audit
records 30 days, indexing status 14 days, outbox 7 days. Past a horizon the
response says so explicitly (evaluated: false with a reason, and the
data_window object lists every horizon) rather than guessing. Diagnose
recent misses promptly.
Logs page: origin-side only
The dashboard’s request Logs page records requests that reached the API origin. The rare error served directly from the CDN/WAF edge (an edge5xx during a deploy or an edge block) does not appear there — and
edge-served 502 bodies carry a fixed sentinel request_id
(req_edge_static_502) rather than a real origin request id, because the
request never produced one. For those, capture the
x-amz-cf-id response header plus the timestamp, URL, and method, and
email support@signa.so — that is enough for us
to trace the edge hit. (WAF-generated 403/413 blocks and the edge
rate-limit 429 carry the req_unknown sentinel, which is not traceable
on its own — include the x-amz-cf-id header and timestamp for those too.
An oversized URI returns 414, and oversized or malformed request
headers return 400 from the load balancer or 494 when they exceed
the CDN’s larger header cap, all with an HTML body and no sentinel at
all; quote x-amz-cf-id for those as well.) The request_id
in an error body is the thing to quote for JSON errors that came from the
API origin itself.
No public status page yet
Signa does not currently publish a status page. Use the health endpoints for machine-readable liveness and readiness from your side (see Uptime monitoring), and support@signa.so for incident questions.Webhook trademark identity
Thealert.created payload carries the matched trademark at
data.alert.trademark.id, matching the rich nested alert resource. The former
root-level trademark_id and trademark_record_id fields are not present.
Events feed (beta)
The per-org event feed (GET /v1/events,
GET /v1/events/{id}) is
documented and callable. It is beta: the ledger, the evt_* ids and the
sort=id&after= replay rail are stable enough to build on, but the per-event
data payloads are versioned by payload_version and their shape is not yet
promised. Pin payload_version in your consumer.
Retention is 30 days; a checkpoint older than that returns
410 replay_window_expired and you resume from the oldest page instead.
alert.created projection is unconditional, while
trademark.* events are projected when the event projector is enabled and
the mark belongs to one of the organization’s portfolios.
?portfolio_id= filters every family, alert.created included, against the
portfolio membership recorded at event time — an alert on a mark outside the
portfolio is not in that portfolio’s feed.
occurred_at is when Signa produced the event, never the office’s own date:
ingestion time for trademark.* and office_action.*, alert-creation time for
alert.created. Those two direct families also carry source_date, the
office-reported date at day precision (null when the feed reports none), and
portfolios — the membership snapshot with your external_ref, frozen at
record time.
Webhook consumers should route alert-derived trademark changes on
payload.data.alert.event.type; the old flat payload.data.event_type path is
not part of the current envelope.