curl --request POST \
--url http://localhost:3500/v1/invoices/{id}/check \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agreement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({agreement_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']})
};
fetch('http://localhost:3500/v1/invoices/{id}/check', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/invoices/{id}/check"
payload = { "agreement_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"
}{
"workflow_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"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": "no_eligible_agreements",
"message": "no_eligible_agreements: no selected agreement is eligible, or a supplied agreement is not (for example, a claim holds the pair); nothing was started or billed. check_in_progress: a selected pair already has unfinished work; workflow_run_id is included when this API owns it. conflict: more agreements are eligible than one check takes and agreement_ids was omitted, the Idempotency-Key was used with a different request, the named run or items cannot be retried, or the admitted run ended concurrently.",
"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 invoice against agreements
Evaluates a completed invoice against its eligible matched agreements. A pair is not eligible while a claim that is not cancelled holds one of its alerts that is not dismissed; a published check replaces all of the pair’s alerts. The selected agreements and the assessed invoice and agreement inputs are captured once at admission. If those inputs change before a pair finishes, that item fails with stale_input and no result is published; submit a new check. A successful evaluation with no findings completes normally and differs from a failed item. Completed evaluations are immutable ComplianceCheck resources. Cancel through the workflow run. This command does not run matching.
curl --request POST \
--url http://localhost:3500/v1/invoices/{id}/check \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agreement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({agreement_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']})
};
fetch('http://localhost:3500/v1/invoices/{id}/check', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/invoices/{id}/check"
payload = { "agreement_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"
}{
"workflow_run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"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": "no_eligible_agreements",
"message": "no_eligible_agreements: no selected agreement is eligible, or a supplied agreement is not (for example, a claim holds the pair); nothing was started or billed. check_in_progress: a selected pair already has unfinished work; workflow_run_id is included when this API owns it. conflict: more agreements are eligible than one check takes and agreement_ids was omitted, the Idempotency-Key was used with a different request, the named run or items cannot be retried, or the admitted run ended concurrently.",
"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.
Optional protection for safely retrying a request after a timeout or lost response. Choose a unique value (for example, a UUID) for each action and reuse it with the same input when retrying. Omit it for a normal request.
1 - 200^[\x21-\x7e]+$Path Parameters
Body
Omit to check every currently eligible matched agreement.
1 - 20 elementsResponse
Replay of an Idempotency-Key. The original workflow run is returned.