curl --request POST \
--url http://localhost:3500/v1/alert-topics/{id}/recheck \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost:3500/v1/alert-topics/{id}/recheck', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/alert-topics/{id}/recheck"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"workflow_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invoice_count": 123,
"skipped_count": 1
}{
"error": {
"code": "validation_error",
"message": "Invalid request format, parameters, or body. Details contain up to 20 actionable field errors; the complete encoded request body must be at most 2 MiB (2,097,152 bytes).",
"request_id": "req_example"
}
}{
"error": {
"code": "invalid_token",
"message": "Missing or invalid bearer credential.",
"request_id": "req_example"
}
}{
"error": {
"code": "forbidden",
"message": "Access denied: forbidden, token_disabled, organization_required, insufficient_role, or mfa_required. Check the error code and effective permissions.",
"request_id": "req_example"
}
}{
"error": {
"code": "not_found",
"message": "The resource does not exist in the current organization.",
"request_id": "req_example"
}
}{
"error": {
"code": "agreement_not_checkable",
"message": "agreement_not_checkable: the topic's agreement is not active or not ready. nothing_to_check: none of the topic's invoices can be rechecked now; nothing was started. conflict: the topic covers more than 5000 invoices, or the admitted run ended before its execution was recorded.",
"request_id": "req_example"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "The IP or authenticated credential exceeded its request limit.",
"request_id": "req_example"
}
}{
"error": {
"code": "internal_error",
"message": "Unexpected server failure. Include the request ID when contacting support.",
"request_id": "req_example"
}
}{
"error": {
"code": "service_unavailable",
"message": "Dispatch was not confirmed. Inspect workflow_run_id before retrying. Honor Retry-After when provided.",
"request_id": "req_example"
}
}Recheck a topic's invoices
Checks the agreement again against every invoice behind the topic’s alerts, completed checks included, as one agreement check. Each pair publishes like an invoice check: it replaces all of the pair’s alerts, including those in other topics and dismissed or credited ones, which come back as new pending alerts if the check finds them again. Pairs a claim holds (a claim that is not cancelled holds one of the pair’s alerts that is not dismissed), pairs already being checked and invoices that cannot be checked against the agreement are left as they are and counted in skipped_count. A pair whose check fails keeps its alerts and counts as unchecked, so the next agreement check retries it. The topic’s agreement must be active and ready. A recheck is not idempotent: once its run finishes, the same request starts a new one. Topics are reconciled after the run.
curl --request POST \
--url http://localhost:3500/v1/alert-topics/{id}/recheck \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost:3500/v1/alert-topics/{id}/recheck', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/alert-topics/{id}/recheck"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"workflow_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invoice_count": 123,
"skipped_count": 1
}{
"error": {
"code": "validation_error",
"message": "Invalid request format, parameters, or body. Details contain up to 20 actionable field errors; the complete encoded request body must be at most 2 MiB (2,097,152 bytes).",
"request_id": "req_example"
}
}{
"error": {
"code": "invalid_token",
"message": "Missing or invalid bearer credential.",
"request_id": "req_example"
}
}{
"error": {
"code": "forbidden",
"message": "Access denied: forbidden, token_disabled, organization_required, insufficient_role, or mfa_required. Check the error code and effective permissions.",
"request_id": "req_example"
}
}{
"error": {
"code": "not_found",
"message": "The resource does not exist in the current organization.",
"request_id": "req_example"
}
}{
"error": {
"code": "agreement_not_checkable",
"message": "agreement_not_checkable: the topic's agreement is not active or not ready. nothing_to_check: none of the topic's invoices can be rechecked now; nothing was started. conflict: the topic covers more than 5000 invoices, or the admitted run ended before its execution was recorded.",
"request_id": "req_example"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "The IP or authenticated credential exceeded its request limit.",
"request_id": "req_example"
}
}{
"error": {
"code": "internal_error",
"message": "Unexpected server failure. Include the request ID when contacting support.",
"request_id": "req_example"
}
}{
"error": {
"code": "service_unavailable",
"message": "Dispatch was not confirmed. Inspect workflow_run_id before retrying. Honor Retry-After when provided.",
"request_id": "req_example"
}
}Authorizations
Personal API key. Send X-Organization-Id. The required cumulative level is listed in x-watchdog-permission.
Headers
Required for personal API keys. Target one organization you have access to. Migrated keys may omit it to use their original organization. For Clerk sessions, it must match the active organization.
Path Parameters
Response
Recheck admitted. One item evaluates each of the topic's checkable invoices.
Invoices this recheck evaluates.
The topic's other invoices, left as they are: a claim holds the pair, the pair is being checked, or the invoice cannot be checked against the agreement.
x >= 0