Find the alerts you need
- Resources:
invoice_ids,agreement_ids,supplier_ids,recipient_ids,tag_ids,topic_ids,claim_ids, each with anexcluded_…_idscounterpart where exclusion is useful.topic_ids=nullselects uncategorized alerts andclaim_ids=nullalerts in no claim; combine them, as intopic_ids=TOPIC_ID,null. - Values:
statuses,claim_statuses,confidence_levels(high,mid,low,null),correction_types,currency_codes,freshness. - Ranges:
impact_min/impact_maxon the organization-currency impact,issued_from/issued_throughfor the invoice date, andcreated_from/created_throughas calendar dates in your organization’s timezone. searchmatches alert, invoice, line, supplier, agreement, and topic text.
created_at (default), impact_amount (organization currency), issued_date,
invoice_number, supplier, or status. Each alert carries its confidence, the impact in its own
currency and in your organization’s currency, the invoice with its dates and total, the invoice
line, the agreement and its current version, the topic and whether it is locked, the current
claim, and links to the alerts it replaces or is replaced by.
Groups return the same totals per agreement, invoice, topic, claim, status, or freshness, sorted by
impact, count, or title. Each group’s key is the value to put in that dimension’s filter, so a
group expands into its alerts or into subgroups with one more request. GET /v1/alert-topics
includes empty topics.
GET /v1/alerts/export?format=csv or format=xlsx downloads the matching alerts; XLSX adds a
Topics sheet. GET /v1/compliance-checks/{id}/transcript shows the tool calls and final summary of
the check behind an alert (provenance.retained_check).
Write null as the string null, in query strings and in JSON selection bodies alike.
New alerts join topics when the agreement’s alert_topic_reconciliation workflow run completes.
A compliance check requests one for each agreement whose check completed; if that request fails,
the check is unaffected and the next one requests again. POST /v1/agreements/{id}/alert-topics/reconcile
requests one explicitly and returns its workflow_run_id: 202 when a run starts, 200 when one is
already queued or running.
Responses use data and next_cursor. Keep the same filters and sort when requesting the next
page. Amounts are decimal strings. Individual unknown impacts remain null. Aggregate totals treat null impacts as zero and include a missing amount count.
Invoice fingerprints start tracking on the first evidence edit. A null current invoice fingerprint
does not invalidate an existing check; missing assessment provenance remains unknown.
Edit an alert
FetchGET /v1/alerts/{id}, then send the returned ETag in If-Match:
412 response means the alert changed:
fetch it again and review the changes before retrying. Narrative and citation changes save together.
GET and PATCH use the same expected object for proposed line details, pricing inputs, and
explanations. Supplying one nested field preserves the others. expected.net_price and
expected.total are calculated and read-only.
GET also includes read-only invoiced pricing captured at alert creation and an invoice_item
with the linked line’s ID, product code, description, and unit. These line details reflect the
current invoice; invoice_item is null when no accessible line is linked.
Use POST /v1/alerts/{id}/dismiss with {} or a category and note to dismiss an alert while keeping its claim attachment.
Use POST /v1/alerts/{id}/credit without a body to record that the supplier has credited the finding.
Use POST /v1/alerts/{id}/reopen without a body to set an alert back to pending. A member of an active claim stays attached; a member of a cancelled claim is released.
Repeated commands are no-ops. Alerts in completed claims cannot be changed.
A dismissal with a category or note may teach Watchdog something about the agreement. It starts an
agreement_context_suggestions workflow run that can propose edits to the agreement’s
instructions; review them with
agreement context suggestions. The
dismissal does not wait for the run.
Act on many alerts
POST /v1/alerts/dismiss, /credit, and /reopen apply the same commands to a selection. Send
either alert_ids or a filter that uses the alert list filters as JSON lists and booleans, with
optional excluded_alert_ids:
changed_count and
skipped_count. With alert_ids, an unknown alert returns 404 and an alert in a completed claim
returns 409. With a filter, such alerts are left alone and counted in skipped_count. A filter
also never dismisses or reopens a credited alert; select it with alert_ids instead. The filter
must name agreement_ids, invoice_ids, or topic_ids or claim_ids without null. Count a
selection with the metrics endpoint first: a dismissal of pending and claimed alerts leaves members
of completed claims unchanged, and statuses=pending,claimed&claim_statuses=completed counts those. Alerts already in the requested state are left alone, so a retry is safe. The
claim membership commands and POST /v1/alert-topics/{id}/alerts take the same selection.
Edit topics
PATCH /v1/alert-topics/{id} edits title, description (Markdown), and key_questions.
POST /v1/alert-topics/{id}/lock protects a topic from automatic categorization and edits;
/unlock reverses it. POST /v1/alert-topics/{id}/alerts moves the selected alerts into the topic.
POST /v1/alert-topics/{id}/recheck checks the topic’s invoices again; see
recheck a topic.
GET /v1/alert-topics/{id} includes the topic’s sources under evidence, by the numbers its
inline markers such as [1] use.
To merge or split topics, request a proposal, review it, then apply it:
proposal_id.
GET /v1/alert-topic-proposals/{id} shows the proposed topics and which alert groups go where.
POST /v1/alert-topic-proposals/{id}/apply with {} applies it as proposed; you can also edit the
proposed titles, descriptions and questions and, for a split, move groups between the new topics.
Applying creates the new topics and deletes the selected ones in one step. It works once, and only
if the agreement’s topics have not changed since the proposal was prepared; otherwise it returns
409 and you request a new proposal. Locked topics cannot be merged or split.
A proposal run that cannot produce a proposal fails its item with a code such as topic_locked
(a selected topic, or one holding alerts replaced together with the selection, is locked),
not_splittable (the selection has fewer than two alert groups), stale_input (the selected
topics changed or were removed first) or proposal_failed, besides the workflow codes
dispatch_failed, admission_expired and execution_incomplete.
Change supporting citations
Use explicitupsert and remove operations in the alert PATCH. Existing citations accept partial
field changes. Those changes update the shared citation in every linked alert and topic.
A new reference needs a citation selector:
"citation": { "id": "CITATION_UUID" }, using citation_id
from a read. A selector cannot be combined with outer field edits. Supplying a new citation
changes only this alert’s link; changing fields without a selector edits the shared row everywhere.
Citation and document IDs must belong to your organization, and items must belong to the alert’s
agreement. Shared edits fail if any linked use is protected by a claim or locked topic.
Verification is server-owned. Document edits are re-verified against stored text; unmatched or
unavailable evidence remains visible and unverified. Saving does not fetch external material,
extract documents, invoke models, or run compliance checks. Assessment freshness stays unchanged.
Omitted citations and fields stay unchanged. When removing references, update all affected inline
markers in the same request. Duplicate or missing references fail without saving any changes.
GET /v1/alerts/{id} returns every citation under evidence. Excerpts are bounded to 10,000
characters, and truncated indicates a shortened excerpt. Send only the fields you deliberately
changed; never replace citations from a shortened read. The response ETag can be used for PATCH.
Read invoice coverage
Every invoice list item and invoice detail includesalert_summary:
not_checkable, checking, not_checked,
completed, and incomplete. Reasons preserve missing, failed, cancelled, outdated, and unknown
checks; invoice_changed accompanies outdated when the invoice itself changed after a completed check. Zero alerts alone does not establish that checking completed.
Use alert_checked, alert_checkable, and has_open_alerts to filter invoices. Invoice metrics
provide matching checked/checkable counts and amounts by currency. Dismissed alerts remain in
counts. has_credit_note_match records a relationship independently of full credit.
is_fully_credited requires one completed, nondeleted credit note uniquely linked to the invoice,
with a total including VAT within ±1 currency unit of the invoice total in the same currency.
Partial notes are not summed, and a note linked to another invoice does not qualify.
Any linked completed, nondeleted credit note makes an invoice uncheckable with reason credit_note_matched. Only qualifying full credit automatically marks findings Credited and enables credited success messaging.
Retained links to deleted, unfinished, or reclassified documents do not block checks.
financially_valid remains a separate arithmetic result. The generated endpoint references describe
all fields, filters, permissions, and error responses.
My records and teams
Usemine=true or explicit team_ids to filter by shared team rules. See
My records and teams for matching rules,
empty results, errors, and pagination.