: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/revocations?limit=10' \
-H "Authorization: Bearer $REFLECTIONS_KEY" \
-H "Reflections-Version: 2026-10-15"import { env, exit } from "node:process";
const apiKey = env.REFLECTIONS_KEY;
if (!apiKey) throw new Error("Set REFLECTIONS_KEY before running this example");
const response = await fetch("https://app.reflections.ai/v1/revocations?limit=10", {
method: "GET",
headers: {
Authorization: `Bearer ${apiKey}`,
"Reflections-Version": "2026-10-15",
},
signal: AbortSignal.timeout(30_000),
});
const responseBody = await response.text();
if (!response.ok) {
console.error(`HTTP ${response.status}: ${responseBody}`);
exit(1);
}
console.log(responseBody);
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen
apiKey = os.environ["REFLECTIONS_KEY"]
if not apiKey:
raise ValueError("Set REFLECTIONS_KEY before running this example")
headers = {
"Authorization": f"Bearer {apiKey}",
"Reflections-Version": "2026-10-15",
}
request = Request("https://app.reflections.ai/v1/revocations?limit=10",
method="GET", headers=headers)
try:
with urlopen(request, timeout=30) as response:
print(response.read().decode("utf-8"))
except HTTPError as error:
error_body = error.read().decode("utf-8")
raise RuntimeError(f"HTTP {error.code}: {error_body}") from error
package main
import (
"fmt"
"io"
"net/http"
"os"
"time"
)
func main() {
apiKey := os.Getenv("REFLECTIONS_KEY")
if apiKey == "" {
panic("Set REFLECTIONS_KEY before running this example")
}
request, err := http.NewRequest("GET", "https://app.reflections.ai/v1/revocations?limit=10", nil)
if err != nil {
panic(err)
}
request.Header.Set("Authorization", "Bearer " + apiKey)
request.Header.Set("Reflections-Version", "2026-10-15")
client := &http.Client{Timeout: 30 * time.Second}
response, err := client.Do(request)
if err != nil {
panic(err)
}
defer response.Body.Close()
responseBody, err := io.ReadAll(response.Body)
if err != nil {
panic(err)
}
if response.StatusCode < 200 || response.StatusCode >= 300 {
panic(fmt.Sprintf("HTTP %d: %s", response.StatusCode, responseBody))
}
fmt.Print(string(responseBody))
}
{
"object": "list",
"data": [
{
"id": "rvk_6z4ke43tnnk4h14drgv1tt82q1",
"object": "revocation",
"livemode": true,
"scope": "license",
"targets": {
"talent": "tal_4n6p8r0t2v4x6z8b0d2f4h6j8k",
"licenses": [
"lic_zfjz8gb26kcd5ynj2tpb55e8bp"
],
"facets": [],
"mandate": null
},
"status": "overdue",
"initiated_by": "talent",
"for_cause": true,
"cause": "Outputs used outside the licensed territories.",
"note": null,
"effective_at": "2026-10-02T15:20:00Z",
"post_revocation": {
"policy": "withdraw",
"withdraw_by": "2026-10-09T15:20:00Z"
},
"required_actions": [
"stop_generation",
"purge_cached_decisions",
"withdraw_outputs"
],
"provider_copies": [],
"affected": {
"checks_denied": 0,
"generations_denied": 1,
"sessions_terminated": 0,
"released_outputs": 14
},
"acknowledge_by": "2026-10-03T15:20:00Z",
"acknowledgements": [
{
"account": "acct_7p4r6s9t0wxyhk5zba2q8v1m3n",
"actions": [
"stop_generation",
"purge_cached_decisions"
],
"deleted_copies": [],
"note": "Generation stopped and caches purged. Takedowns are in progress.",
"acknowledged_at": "2026-10-02T15:34:51Z"
}
],
"created_at": "2026-10-02T15:20:00Z"
},
{
"id": "rvk_s9t0wxyhk5zba2q8v1m3n7p4r6",
"object": "revocation",
"livemode": true,
"scope": "license",
"targets": {
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licenses": [
"lic_ba2q8v1m3n7p4r6s9t0wxyhk5z"
],
"facets": [
"fct_v1m3n7p4r6s9t0wxyhk5zba2q8"
],
"mandate": null
},
"status": "pending_acknowledgement",
"initiated_by": "talent",
"for_cause": false,
"cause": null,
"note": null,
"effective_at": "2026-10-17T18:03:40Z",
"post_revocation": {
"policy": "retain",
"withdraw_by": null
},
"required_actions": [
"stop_generation",
"purge_cached_decisions",
"delete_provider_copies"
],
"provider_copies": [
{
"facet": "fct_v1m3n7p4r6s9t0wxyhk5zba2q8",
"provider": "example-voice-provider",
"external_id": "vx_4f9a2c"
}
],
"affected": {
"checks_denied": 3,
"generations_denied": 0,
"sessions_terminated": 1,
"released_outputs": 418
},
"acknowledge_by": "2026-10-18T18:03:40Z",
"acknowledgements": [],
"created_at": "2026-10-17T18:03:40Z"
}
],
"has_more": false,
"next_cursor": null
}{
"type": "https://docs.reflections.ai/errors/parameter_invalid",
"title": "A parameter is invalid",
"status": 400,
"code": "parameter_invalid",
"param": "use.territories[1]",
"detail": "\"UK\" is not an ISO 3166-1 alpha-2 code. Use \"GB\".",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/invalid_api_key",
"title": "The API key is not valid",
"status": 401,
"code": "invalid_api_key",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/account_not_connected",
"title": "The licensee has not connected your platform",
"status": 403,
"code": "account_not_connected",
"detail": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba has no active connection with your account.",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "invalid_request",
"request_id": "<string>",
"detail": "<string>",
"param": "<string>",
"doc_url": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "invalid_request",
"request_id": "<string>",
"detail": "<string>",
"param": "<string>",
"doc_url": "<string>"
}List revocations
Test mode available. Live mode unavailable. The sandbox feed is always empty. Creating and applying revocations is not implemented.
The revocation feed. Pass after with the last revocation ID you processed to read
everything since, oldest first. Platforms that cache decisions must read this feed at least
every 60 seconds; webhooks are the fast path, this is the source of truth. A
representative sees the revocations of every talent it represents, with each platform’s
acknowledgements.
Restricted keys need revocations:read or revocations:write.
: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/revocations?limit=10' \
-H "Authorization: Bearer $REFLECTIONS_KEY" \
-H "Reflections-Version: 2026-10-15"import { env, exit } from "node:process";
const apiKey = env.REFLECTIONS_KEY;
if (!apiKey) throw new Error("Set REFLECTIONS_KEY before running this example");
const response = await fetch("https://app.reflections.ai/v1/revocations?limit=10", {
method: "GET",
headers: {
Authorization: `Bearer ${apiKey}`,
"Reflections-Version": "2026-10-15",
},
signal: AbortSignal.timeout(30_000),
});
const responseBody = await response.text();
if (!response.ok) {
console.error(`HTTP ${response.status}: ${responseBody}`);
exit(1);
}
console.log(responseBody);
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen
apiKey = os.environ["REFLECTIONS_KEY"]
if not apiKey:
raise ValueError("Set REFLECTIONS_KEY before running this example")
headers = {
"Authorization": f"Bearer {apiKey}",
"Reflections-Version": "2026-10-15",
}
request = Request("https://app.reflections.ai/v1/revocations?limit=10",
method="GET", headers=headers)
try:
with urlopen(request, timeout=30) as response:
print(response.read().decode("utf-8"))
except HTTPError as error:
error_body = error.read().decode("utf-8")
raise RuntimeError(f"HTTP {error.code}: {error_body}") from error
package main
import (
"fmt"
"io"
"net/http"
"os"
"time"
)
func main() {
apiKey := os.Getenv("REFLECTIONS_KEY")
if apiKey == "" {
panic("Set REFLECTIONS_KEY before running this example")
}
request, err := http.NewRequest("GET", "https://app.reflections.ai/v1/revocations?limit=10", nil)
if err != nil {
panic(err)
}
request.Header.Set("Authorization", "Bearer " + apiKey)
request.Header.Set("Reflections-Version", "2026-10-15")
client := &http.Client{Timeout: 30 * time.Second}
response, err := client.Do(request)
if err != nil {
panic(err)
}
defer response.Body.Close()
responseBody, err := io.ReadAll(response.Body)
if err != nil {
panic(err)
}
if response.StatusCode < 200 || response.StatusCode >= 300 {
panic(fmt.Sprintf("HTTP %d: %s", response.StatusCode, responseBody))
}
fmt.Print(string(responseBody))
}
{
"object": "list",
"data": [
{
"id": "rvk_6z4ke43tnnk4h14drgv1tt82q1",
"object": "revocation",
"livemode": true,
"scope": "license",
"targets": {
"talent": "tal_4n6p8r0t2v4x6z8b0d2f4h6j8k",
"licenses": [
"lic_zfjz8gb26kcd5ynj2tpb55e8bp"
],
"facets": [],
"mandate": null
},
"status": "overdue",
"initiated_by": "talent",
"for_cause": true,
"cause": "Outputs used outside the licensed territories.",
"note": null,
"effective_at": "2026-10-02T15:20:00Z",
"post_revocation": {
"policy": "withdraw",
"withdraw_by": "2026-10-09T15:20:00Z"
},
"required_actions": [
"stop_generation",
"purge_cached_decisions",
"withdraw_outputs"
],
"provider_copies": [],
"affected": {
"checks_denied": 0,
"generations_denied": 1,
"sessions_terminated": 0,
"released_outputs": 14
},
"acknowledge_by": "2026-10-03T15:20:00Z",
"acknowledgements": [
{
"account": "acct_7p4r6s9t0wxyhk5zba2q8v1m3n",
"actions": [
"stop_generation",
"purge_cached_decisions"
],
"deleted_copies": [],
"note": "Generation stopped and caches purged. Takedowns are in progress.",
"acknowledged_at": "2026-10-02T15:34:51Z"
}
],
"created_at": "2026-10-02T15:20:00Z"
},
{
"id": "rvk_s9t0wxyhk5zba2q8v1m3n7p4r6",
"object": "revocation",
"livemode": true,
"scope": "license",
"targets": {
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licenses": [
"lic_ba2q8v1m3n7p4r6s9t0wxyhk5z"
],
"facets": [
"fct_v1m3n7p4r6s9t0wxyhk5zba2q8"
],
"mandate": null
},
"status": "pending_acknowledgement",
"initiated_by": "talent",
"for_cause": false,
"cause": null,
"note": null,
"effective_at": "2026-10-17T18:03:40Z",
"post_revocation": {
"policy": "retain",
"withdraw_by": null
},
"required_actions": [
"stop_generation",
"purge_cached_decisions",
"delete_provider_copies"
],
"provider_copies": [
{
"facet": "fct_v1m3n7p4r6s9t0wxyhk5zba2q8",
"provider": "example-voice-provider",
"external_id": "vx_4f9a2c"
}
],
"affected": {
"checks_denied": 3,
"generations_denied": 0,
"sessions_terminated": 1,
"released_outputs": 418
},
"acknowledge_by": "2026-10-18T18:03:40Z",
"acknowledgements": [],
"created_at": "2026-10-17T18:03:40Z"
}
],
"has_more": false,
"next_cursor": null
}{
"type": "https://docs.reflections.ai/errors/parameter_invalid",
"title": "A parameter is invalid",
"status": 400,
"code": "parameter_invalid",
"param": "use.territories[1]",
"detail": "\"UK\" is not an ISO 3166-1 alpha-2 code. Use \"GB\".",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/invalid_api_key",
"title": "The API key is not valid",
"status": 401,
"code": "invalid_api_key",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/account_not_connected",
"title": "The licensee has not connected your platform",
"status": 403,
"code": "account_not_connected",
"detail": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba has no active connection with your account.",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "invalid_request",
"request_id": "<string>",
"detail": "<string>",
"param": "<string>",
"doc_url": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "invalid_request",
"request_id": "<string>",
"detail": "<string>",
"param": "<string>",
"doc_url": "<string>"
}Authorizations
Your secret key, rk_test_… or rk_live_…, sent as Authorization: Bearer <key>. Keep it
on your server. Restricted keys carry only the scopes you give them.
Headers
The dated API version. Defaults to the version your account is pinned to.
"2026-10-15"
Act for a connected licensee. The value is the licensee's account ID. Requires an active connection between that account and yours.
^acct_[0-9a-hjkmnp-tv-z]{26}$Query Parameters
Only revocations whose targets.talent is this talent.
^tal_[0-9a-hjkmnp-tv-z]{26}$Return revocations created after this one, oldest first.
^rvk_[0-9a-hjkmnp-tv-z]{26}$Only revocations with this status. pending_acknowledgement and overdue list the ones
that still need acknowledging.
pending_acknowledgement: some required action is not yet acknowledged. acknowledged:
every required action is. overdue: a deadline passed first, acknowledge_by or
post_revocation.withdraw_by.
pending_acknowledgement, acknowledged, overdue Number of objects to return, 1 to 100.
1 <= x <= 100The next_cursor from the previous page.