curl --request POST \
--url http://localhost:3500/v1/agreements/{id}/check \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"invoice_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({invoice_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']})
};
fetch('http://localhost:3500/v1/agreements/{id}/check', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/agreements/{id}/check"
payload = { "invoice_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"workflow_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invoice_count": 123,
"has_more": true
}{
"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 agreement is not active or not ready. nothing_to_check: no selected invoice is unchecked and eligible; nothing was started. conflict: 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"
}
}Check an agreement's unchecked invoices
Checks the agreement against its matched invoices that have no current result: never checked, or whose last check failed or was cancelled. This is the set GET /v1/invoices?agreement_ids={id}&alert_scope=selected_agreements&alert_checked=false&alert_checkable=true lists, apart from invoices already being checked, invoices without a primary document, and pairs a claim holds (a claim that is not cancelled holds one of the pair’s alerts that is not dismissed). Completed checks are kept, including outdated ones; check the invoice, recheck a topic or reset the agreement to evaluate them again, unless a claim holds the pair. invoice_ids limits the check to up to 20 of those invoices. One request admits at most 5000 invoices, newest first; has_more reports that more remain. Each pair reads its invoice and agreement when it starts, and publishes like an invoice check: it replaces all of the pair’s alerts. Cancel through the workflow run.
curl --request POST \
--url http://localhost:3500/v1/agreements/{id}/check \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"invoice_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({invoice_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']})
};
fetch('http://localhost:3500/v1/agreements/{id}/check', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/agreements/{id}/check"
payload = { "invoice_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"workflow_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"invoice_count": 123,
"has_more": true
}{
"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 agreement is not active or not ready. nothing_to_check: no selected invoice is unchecked and eligible; nothing was started. conflict: 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
Body
A sample: check only these of the unchecked invoices. Omit to check all of them.
1 - 20 elements