curl --request POST \
--url http://localhost:3500/v1/claims/{id}/alerts/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target_claim_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({target_claim_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'})
};
fetch('http://localhost:3500/v1/claims/{id}/alerts/transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/claims/{id}/alerts/transfer"
payload = { "target_claim_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"changed_count": 123,
"skipped_count": 123
}{
"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 claim, a transfer target, an alert in alert_ids, or a selected team was not found.",
"request_id": "req_example"
}
}{
"error": {
"code": "conflict",
"message": "The claim is locked or does not accept alerts, an alert in alert_ids does not qualify, the filter selects too many alerts, a selected alert changed while the command ran, or a selected team has invalid saved rules. Nothing changed.",
"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": "Authentication infrastructure is unavailable or rate limited. Honor Retry-After when provided.",
"request_id": "req_example"
}
}Transfer claim alerts
Moves the selected current members to a different pending/in_progress claim in the same agreement, recording release and reassignment together. Completed sources are locked; cancelled sources may transfer. Pending members become claimed; other statuses are kept. With alert_ids, an alert that is not a current member or whose invoice is not completed returns 409. A filter covers current members and skips alerts whose invoice is not completed. Select alerts with alert_ids or with filter. The command is one transaction and changes at most 5000 alerts; a filter that would change more returns 409 and changes nothing. Matching alerts already in the requested state, or left alone, do not count toward the limit, so a retry is safe.
curl --request POST \
--url http://localhost:3500/v1/claims/{id}/alerts/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target_claim_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({target_claim_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'})
};
fetch('http://localhost:3500/v1/claims/{id}/alerts/transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "http://localhost:3500/v1/claims/{id}/alerts/transfer"
payload = { "target_claim_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"changed_count": 123,
"skipped_count": 123
}{
"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 claim, a transfer target, an alert in alert_ids, or a selected team was not found.",
"request_id": "req_example"
}
}{
"error": {
"code": "conflict",
"message": "The claim is locked or does not accept alerts, an alert in alert_ids does not qualify, the filter selects too many alerts, a selected alert changed while the command ran, or a selected team has invalid saved rules. Nothing changed.",
"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": "Authentication infrastructure is unavailable or rate limited. 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
Explicit alerts. The command applies to every listed alert or fails: an unknown ID returns 404 and an alert that may not be changed returns 409.
1 - 5000 elementsEvery alert matching this filter when the command runs. Takes the GET /v1/alerts filters with JSON lists and booleans. Matching alerts that may not be changed are left alone and counted in skipped_count.
Show child attributes
Show child attributes
Alerts to leave out of a filter selection. Only valid with filter.
1 - 5000 elementsResponse
How many alerts the command changed and how many matching alerts were left alone. Read the claim for its current counts and amounts.