: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h' \
-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/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h", {
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/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h",
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/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h", 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))
}
{
"id": "evt_1h3k5m7p9r1t3v5x7z9b1d3f5h",
"object": "event",
"type": "check.resolved",
"api_version": "2026-10-15",
"livemode": true,
"account": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"sequence": 2,
"created_at": "2026-10-17T21:30:01Z",
"data": {
"object": {
"id": "chk_r6s9t0wxyhk5zba2q8v1m3n7p4",
"object": "check",
"livemode": true,
"status": "allowed",
"decision": "allow",
"talent": [
{
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"name": "Maya Okafor",
"matched_by": "name",
"confidence": "high",
"decision": "allow",
"license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh",
"license_revision": "lrv_p4r6s9t0wxyhk5zba2q8v1m3n7",
"escalation": "esc_t0wxyhk5zba2q8v1m3n7p4r6s9"
}
],
"use": {
"modality": "image",
"kind": "depiction",
"purpose": "advertising",
"commercial": true,
"channels": [
"social"
],
"territories": [
"US"
]
},
"reasons": [],
"obligations": [
{
"type": "generation_check",
"required": "all"
}
],
"authorization": {
"token": "eyJhbGciOiJFUzI1NiIs…",
"max_generations": 4,
"generations_used": 0,
"expires_at": "2026-10-17T21:45:00Z"
},
"escalation": {
"id": "esc_t0wxyhk5zba2q8v1m3n7p4r6s9",
"reason": "judgment",
"reviewer": "talent",
"status": "allowed",
"expires_at": "2026-10-24T18:04:00Z",
"resolved_at": "2026-10-17T21:30:00Z",
"note": "Fine as long as the cups hold coffee."
},
"request_digest": "sha256:c3e5a7b9d1f3c5e7a9b1d3f5c7e9a1b3d5f7c9e1a3b5d7f9c1e3a5b7d9f1c3e5",
"created_at": "2026-10-17T18:04:00Z"
},
"previous_attributes": {
"status": "escalated",
"decision": "escalate"
}
}
}{
"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/resource_not_found",
"title": "No such object",
"status": 404,
"code": "resource_not_found",
"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>"
}Retrieve an event
Planned contract — unavailable in test and live modes. This operation is a protocol reference, not a callable endpoint. Start with the working sandbox quickstart.
Returns an event from the last 30 days, with data.object as it was when the event
happened. Retrieve the object itself for its current state.
Restricted keys need events:read.
: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h' \
-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/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h", {
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/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h",
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/events/evt_1h3k5m7p9r1t3v5x7z9b1d3f5h", 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))
}
{
"id": "evt_1h3k5m7p9r1t3v5x7z9b1d3f5h",
"object": "event",
"type": "check.resolved",
"api_version": "2026-10-15",
"livemode": true,
"account": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"sequence": 2,
"created_at": "2026-10-17T21:30:01Z",
"data": {
"object": {
"id": "chk_r6s9t0wxyhk5zba2q8v1m3n7p4",
"object": "check",
"livemode": true,
"status": "allowed",
"decision": "allow",
"talent": [
{
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"name": "Maya Okafor",
"matched_by": "name",
"confidence": "high",
"decision": "allow",
"license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh",
"license_revision": "lrv_p4r6s9t0wxyhk5zba2q8v1m3n7",
"escalation": "esc_t0wxyhk5zba2q8v1m3n7p4r6s9"
}
],
"use": {
"modality": "image",
"kind": "depiction",
"purpose": "advertising",
"commercial": true,
"channels": [
"social"
],
"territories": [
"US"
]
},
"reasons": [],
"obligations": [
{
"type": "generation_check",
"required": "all"
}
],
"authorization": {
"token": "eyJhbGciOiJFUzI1NiIs…",
"max_generations": 4,
"generations_used": 0,
"expires_at": "2026-10-17T21:45:00Z"
},
"escalation": {
"id": "esc_t0wxyhk5zba2q8v1m3n7p4r6s9",
"reason": "judgment",
"reviewer": "talent",
"status": "allowed",
"expires_at": "2026-10-24T18:04:00Z",
"resolved_at": "2026-10-17T21:30:00Z",
"note": "Fine as long as the cups hold coffee."
},
"request_digest": "sha256:c3e5a7b9d1f3c5e7a9b1d3f5c7e9a1b3d5f7c9e1a3b5d7f9c1e3a5b7d9f1c3e5",
"created_at": "2026-10-17T18:04:00Z"
},
"previous_attributes": {
"status": "escalated",
"decision": "escalate"
}
}
}{
"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/resource_not_found",
"title": "No such object",
"status": 404,
"code": "resource_not_found",
"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"
Path Parameters
The event's ID, equal to the webhook-id header of its deliveries.
^evt_[0-9a-hjkmnp-tv-z]{26}$Response
The event.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
- Option 12
- Option 13
- Option 14
An event of any type. type names it, and data.object is the object that type carries.
Equal to the webhook-id header.
^evt_[0-9a-hjkmnp-tv-z]{26}$Always event.
"event"The event type, one of the license.* event types.
license.issued, license.accepted, license.revised, license.revision_pending, license.revision_declined, license.suspended, license.resumed, license.revoked, license.expired, license.declined The API version data.object is rendered in.
true for live events, false for test events.
Increases by one with each event about the same object. Ignore an event whose sequence is lower than one you have processed.
When the event happened.
The license in object and, when the event changed it, the old values of the
changed fields in previous_attributes.
Show child attributes
Show child attributes
The connected licensee the event concerns, when it is not your own account.
^acct_[0-9a-hjkmnp-tv-z]{26}$