curl --request POST \
--url https://api.example.com/v0/admin/subscriptions/evaluation-retirements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"key": "<string>",
"plugin_id": "<string>",
"version": "<string>",
"reason": "<string>",
"dry_run": true,
"limit": 100
}
'import requests
url = "https://api.example.com/v0/admin/subscriptions/evaluation-retirements"
payload = {
"key": "<string>",
"plugin_id": "<string>",
"version": "<string>",
"reason": "<string>",
"dry_run": True,
"limit": 100
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
key: '<string>',
plugin_id: '<string>',
version: '<string>',
reason: '<string>',
dry_run: true,
limit: 100
})
};
fetch('https://api.example.com/v0/admin/subscriptions/evaluation-retirements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v0/admin/subscriptions/evaluation-retirements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'key' => '<string>',
'plugin_id' => '<string>',
'version' => '<string>',
'reason' => '<string>',
'dry_run' => true,
'limit' => 100
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v0/admin/subscriptions/evaluation-retirements"
payload := strings.NewReader("{\n \"key\": \"<string>\",\n \"plugin_id\": \"<string>\",\n \"version\": \"<string>\",\n \"reason\": \"<string>\",\n \"dry_run\": true,\n \"limit\": 100\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v0/admin/subscriptions/evaluation-retirements")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"<string>\",\n \"plugin_id\": \"<string>\",\n \"version\": \"<string>\",\n \"reason\": \"<string>\",\n \"dry_run\": true,\n \"limit\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/admin/subscriptions/evaluation-retirements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"key\": \"<string>\",\n \"plugin_id\": \"<string>\",\n \"version\": \"<string>\",\n \"reason\": \"<string>\",\n \"dry_run\": true,\n \"limit\": 100\n}"
response = http.request(request)
puts response.read_body{
"key": "<string>",
"plugin_id": "<string>",
"version": "<string>",
"reason": "<string>",
"dry_run": true,
"limit": 250,
"retirement_id": "<string>",
"outcome": "evaluator_retired",
"items": [
{
"subscription_id": "<string>",
"subscription_version_id": "<string>",
"sequence": 123,
"corpus_id": "<string>",
"record_id": "<string>",
"record_version_id": "<string>",
"event_id": "<string>"
}
],
"remaining": 1,
"leased": 1,
"created_at": "2023-11-07T05:31:56Z"
}{
"code": "<string>",
"message": "<string>",
"retryable": true,
"field": "<string>",
"resync_url": "<string>"
}Retire evaluations
Explicitly abandon a bounded batch of pending evaluations pinned to the named evaluator whose latest error is evaluator_unavailable. Only the key’s Organization and granted Corpora are considered. Live leases and withdrawals are left alone. Never migrate an intent, run another evaluator, create a Match or Delivery, or declare no_match. The terminal outcome is evaluator_retired. Each real retirement emits evaluation.retired in the intent’s Corpus, with resource.kind=evaluation_retirement and resource.id=retirement_id. The immutable receipt records the reason, original identities and event ids, and is readable at the Location. A real key replay returns the original batch, including its original counts; another request or Corpus scope using that key is 409 idempotency_conflict. An empty real batch also reserves its key. dry_run selects without writes or reserving the key, and remaining reports how many unavailable intents would remain after that selection. Use new real keys for further batches and recheck live backlog counts after dispatch and leases settle. This action does not establish a policy for future intents. It deliberately discards potential alerts; restore the exact old implementation to drain without losing judgments. Requires plugins:admin.
curl --request POST \
--url https://api.example.com/v0/admin/subscriptions/evaluation-retirements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"key": "<string>",
"plugin_id": "<string>",
"version": "<string>",
"reason": "<string>",
"dry_run": true,
"limit": 100
}
'import requests
url = "https://api.example.com/v0/admin/subscriptions/evaluation-retirements"
payload = {
"key": "<string>",
"plugin_id": "<string>",
"version": "<string>",
"reason": "<string>",
"dry_run": True,
"limit": 100
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
key: '<string>',
plugin_id: '<string>',
version: '<string>',
reason: '<string>',
dry_run: true,
limit: 100
})
};
fetch('https://api.example.com/v0/admin/subscriptions/evaluation-retirements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v0/admin/subscriptions/evaluation-retirements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'key' => '<string>',
'plugin_id' => '<string>',
'version' => '<string>',
'reason' => '<string>',
'dry_run' => true,
'limit' => 100
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v0/admin/subscriptions/evaluation-retirements"
payload := strings.NewReader("{\n \"key\": \"<string>\",\n \"plugin_id\": \"<string>\",\n \"version\": \"<string>\",\n \"reason\": \"<string>\",\n \"dry_run\": true,\n \"limit\": 100\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v0/admin/subscriptions/evaluation-retirements")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"<string>\",\n \"plugin_id\": \"<string>\",\n \"version\": \"<string>\",\n \"reason\": \"<string>\",\n \"dry_run\": true,\n \"limit\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/admin/subscriptions/evaluation-retirements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"key\": \"<string>\",\n \"plugin_id\": \"<string>\",\n \"version\": \"<string>\",\n \"reason\": \"<string>\",\n \"dry_run\": true,\n \"limit\": 100\n}"
response = http.request(request)
puts response.read_body{
"key": "<string>",
"plugin_id": "<string>",
"version": "<string>",
"reason": "<string>",
"dry_run": true,
"limit": 250,
"retirement_id": "<string>",
"outcome": "evaluator_retired",
"items": [
{
"subscription_id": "<string>",
"subscription_version_id": "<string>",
"sequence": 123,
"corpus_id": "<string>",
"record_id": "<string>",
"record_version_id": "<string>",
"event_id": "<string>"
}
],
"remaining": 1,
"leased": 1,
"created_at": "2023-11-07T05:31:56Z"
}{
"code": "<string>",
"message": "<string>",
"retryable": true,
"field": "<string>",
"resync_url": "<string>"
}Authorizations
API key, not necessarily a JWT. Server derives Organization, permitted actions and Corpus scope; every resource access is authorized.
Body
1 - 1281 - 1281 - 128The operator's explanation for deliberately abandoning these evaluations.
1 - 10241 <= x <= 500Response
The dry-run preview or committed audit receipt
1 <= x <= 5001evaluator_retired 500Show child attributes
Show child attributes
Unavailable pending evaluations remaining in this request's scope, including leased ones.
x >= 0Unavailable pending evaluations skipped because their leases have not expired.
x >= 0