# Set a unique key once per new action; persist it and reuse it for every retry.
: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
: "${REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY:?Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example}"
curl --fail-with-body --max-time 30 -X POST 'https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline' \
-H "Authorization: Bearer $REFLECTIONS_KEY" \
-H "Reflections-Version: 2026-10-15" \
-H "Idempotency-Key: $REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
--data-raw '{
"decision_note": "Maya is not licensing her voice for advertising."
}'import { env, exit } from "node:process";
// Set a unique key once per new action; persist it and reuse it for every retry.
const apiKey = env.REFLECTIONS_KEY;
if (!apiKey) throw new Error("Set REFLECTIONS_KEY before running this example");
const idempotencyKey = env.REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY;
if (!idempotencyKey) throw new Error("Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example");
const response = await fetch("https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Reflections-Version": "2026-10-15",
"Idempotency-Key": idempotencyKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
"decision_note": "Maya is not licensing her voice for advertising."
}),
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 json
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen
# Set a unique key once per new action; persist it and reuse it for every retry.
apiKey = os.environ["REFLECTIONS_KEY"]
if not apiKey:
raise ValueError("Set REFLECTIONS_KEY before running this example")
idempotencyKey = os.environ["REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY"]
if not idempotencyKey:
raise ValueError("Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example")
headers = {
"Authorization": f"Bearer {apiKey}",
"Reflections-Version": "2026-10-15",
"Idempotency-Key": idempotencyKey,
"Content-Type": "application/json",
}
data = json.dumps({"decision_note": "Maya is not licensing her voice for advertising."}).encode("utf-8")
request = Request("https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline",
method="POST", headers=headers, data=data)
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"
"strings"
"time"
)
func main() {
// Set a unique key once per new action; persist it and reuse it for every retry.
apiKey := os.Getenv("REFLECTIONS_KEY")
if apiKey == "" {
panic("Set REFLECTIONS_KEY before running this example")
}
idempotencyKey := os.Getenv("REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY")
if idempotencyKey == "" {
panic("Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example")
}
body := strings.NewReader(`{
"decision_note": "Maya is not licensing her voice for advertising."
}`)
request, err := http.NewRequest("POST", "https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline", body)
if err != nil {
panic(err)
}
request.Header.Set("Authorization", "Bearer " + apiKey)
request.Header.Set("Reflections-Version", "2026-10-15")
request.Header.Set("Idempotency-Key", idempotencyKey)
request.Header.Set("Content-Type", "application/json")
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": "lrq_dp9594v61t1wk0mebf6t7dpyae",
"object": "license_request",
"livemode": true,
"kind": "new",
"status": "declined",
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"license": null,
"license_revision": null,
"check": null,
"requested_scope": {
"facet_types": [
"voice"
],
"modalities": [
"speech"
],
"kinds": [
"depiction"
],
"purposes": [
"advertising"
],
"commercial": true,
"channels": [
"audio",
"streaming"
],
"territories": [
"US"
],
"starts_at": "2026-11-01T04:00:00Z",
"ends_at": "2027-02-01T05:00:00Z",
"final_deliverables": 2
},
"offer": {
"type": "flat",
"flat": {
"amount": 2000000,
"currency": "usd"
},
"schedule": "on_acceptance"
},
"note": "Two 30-second radio and streaming spots for the winter campaign, read in Maya's voice.",
"decision_note": "Maya is not licensing her voice for advertising.",
"signed_at": null,
"declined_at": "2026-10-16T12:30:00Z",
"withdrawn_at": null,
"metadata": {},
"created_at": "2026-10-14T16:00:00Z"
}{
"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/mandate_required",
"title": "No mandate with the needed power",
"status": 403,
"code": "mandate_required",
"detail": "Your mandate for tal_9t0wxyhk5zba2q8v1m3n7p4r6s does not include review_outputs.",
"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/idempotency_key_in_use",
"title": "A request with this key is still running",
"status": 409,
"code": "idempotency_key_in_use",
"detail": "Retry with the same key after a short wait.",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/idempotency_key_reused",
"title": "This key was used for a different request",
"status": 422,
"code": "idempotency_key_reused",
"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>"
}Decline a license request
Planned contract — unavailable in test and live modes. This operation is a protocol reference, not a callable endpoint. Start with the working sandbox quickstart.
Declines a request addressed to a talent you represent. Needs a mandate with
issue_licenses. The licensee receives license_request.declined with your
decision_note. To agree instead, draft a license
that names the request.
Restricted keys need license_requests:write.
# Set a unique key once per new action; persist it and reuse it for every retry.
: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
: "${REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY:?Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example}"
curl --fail-with-body --max-time 30 -X POST 'https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline' \
-H "Authorization: Bearer $REFLECTIONS_KEY" \
-H "Reflections-Version: 2026-10-15" \
-H "Idempotency-Key: $REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
--data-raw '{
"decision_note": "Maya is not licensing her voice for advertising."
}'import { env, exit } from "node:process";
// Set a unique key once per new action; persist it and reuse it for every retry.
const apiKey = env.REFLECTIONS_KEY;
if (!apiKey) throw new Error("Set REFLECTIONS_KEY before running this example");
const idempotencyKey = env.REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY;
if (!idempotencyKey) throw new Error("Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example");
const response = await fetch("https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Reflections-Version": "2026-10-15",
"Idempotency-Key": idempotencyKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
"decision_note": "Maya is not licensing her voice for advertising."
}),
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 json
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen
# Set a unique key once per new action; persist it and reuse it for every retry.
apiKey = os.environ["REFLECTIONS_KEY"]
if not apiKey:
raise ValueError("Set REFLECTIONS_KEY before running this example")
idempotencyKey = os.environ["REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY"]
if not idempotencyKey:
raise ValueError("Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example")
headers = {
"Authorization": f"Bearer {apiKey}",
"Reflections-Version": "2026-10-15",
"Idempotency-Key": idempotencyKey,
"Content-Type": "application/json",
}
data = json.dumps({"decision_note": "Maya is not licensing her voice for advertising."}).encode("utf-8")
request = Request("https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline",
method="POST", headers=headers, data=data)
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"
"strings"
"time"
)
func main() {
// Set a unique key once per new action; persist it and reuse it for every retry.
apiKey := os.Getenv("REFLECTIONS_KEY")
if apiKey == "" {
panic("Set REFLECTIONS_KEY before running this example")
}
idempotencyKey := os.Getenv("REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY")
if idempotencyKey == "" {
panic("Set REFLECTIONS_DECLINE_LICENSE_REQUEST_IDEMPOTENCY_KEY before running this example")
}
body := strings.NewReader(`{
"decision_note": "Maya is not licensing her voice for advertising."
}`)
request, err := http.NewRequest("POST", "https://app.reflections.ai/v1/license_requests/lrq_py3xqfvbjjcdhvf33y6c2w26jm/decline", body)
if err != nil {
panic(err)
}
request.Header.Set("Authorization", "Bearer " + apiKey)
request.Header.Set("Reflections-Version", "2026-10-15")
request.Header.Set("Idempotency-Key", idempotencyKey)
request.Header.Set("Content-Type", "application/json")
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": "lrq_dp9594v61t1wk0mebf6t7dpyae",
"object": "license_request",
"livemode": true,
"kind": "new",
"status": "declined",
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"license": null,
"license_revision": null,
"check": null,
"requested_scope": {
"facet_types": [
"voice"
],
"modalities": [
"speech"
],
"kinds": [
"depiction"
],
"purposes": [
"advertising"
],
"commercial": true,
"channels": [
"audio",
"streaming"
],
"territories": [
"US"
],
"starts_at": "2026-11-01T04:00:00Z",
"ends_at": "2027-02-01T05:00:00Z",
"final_deliverables": 2
},
"offer": {
"type": "flat",
"flat": {
"amount": 2000000,
"currency": "usd"
},
"schedule": "on_acceptance"
},
"note": "Two 30-second radio and streaming spots for the winter campaign, read in Maya's voice.",
"decision_note": "Maya is not licensing her voice for advertising.",
"signed_at": null,
"declined_at": "2026-10-16T12:30:00Z",
"withdrawn_at": null,
"metadata": {},
"created_at": "2026-10-14T16:00:00Z"
}{
"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/mandate_required",
"title": "No mandate with the needed power",
"status": 403,
"code": "mandate_required",
"detail": "Your mandate for tal_9t0wxyhk5zba2q8v1m3n7p4r6s does not include review_outputs.",
"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/idempotency_key_in_use",
"title": "A request with this key is still running",
"status": 409,
"code": "idempotency_key_in_use",
"detail": "Retry with the same key after a short wait.",
"request_id": "req_8f2k4m6p8r0t2v4x6z8b0d2f4h"
}{
"type": "https://docs.reflections.ai/errors/idempotency_key_reused",
"title": "This key was used for a different request",
"status": 422,
"code": "idempotency_key_reused",
"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"
A unique key for this operation, up to 255 characters. In test mode, POST keys are scoped to your account and mode and bind the endpoint and body for 24 hours. A different endpoint or body with the same key is refused.
Initial live check and generation creation require a nonempty key. Each operation has a
separate account-scoped namespace; retain the same API key, body and idempotency key for
retries within 24 hours of creation. A pending check returns 202 with status: "checking".
Completed checks replay their sealed response; successful generation POSTs replay the
original accepted 202, so use GET for current state. Live verification is a read-only
query that returns a fresh verification ID on each call, without exact response caching.
The broader delegated-account contract also scopes keys to Reflections-Account;
delegated requests and the other planned live POST operations remain unsupported.
255Path Parameters
The license request's ID.
^lrq_[0-9a-hjkmnp-tv-z]{26}$Body
Shown to the licensee as decision_note.
1000Response
The declined request.
Unique identifier for the request, lrq_….
^lrq_[0-9a-hjkmnp-tv-z]{26}$Always license_request.
"license_request"true for a live-mode request, false for a test-mode one.
new for a new license, or change for a new revision of license.
new, change Where the request stands. Only a sent request can be withdrawn or declined.
sent, signed, declined, withdrawn The talent the request asks.
^tal_[0-9a-hjkmnp-tv-z]{26}$The account that would hold the license: the sender, or the connected licensee a platform sent it for.
^acct_[0-9a-hjkmnp-tv-z]{26}$The terms asked for, as sent.
Show child attributes
Show child attributes
When the request was sent.
For change, the license to change. When signed, the license it became.
^lic_[0-9a-hjkmnp-tv-z]{26}$The revision the talent's side signed. It may differ from what you asked.
^lrv_[0-9a-hjkmnp-tv-z]{26}$The denied check that prompted the request. null if none was named.
^chk_[0-9a-hjkmnp-tv-z]{26}$The compensation offered. null if the request made no offer.
Show child attributes
Show child attributes
The note to the talent, as written. null if none was sent.
The talent's note when they declined or signed.
When the talent's side signed a license or revision from the request. null unless
signed.
When the talent's side declined the request. null unless declined.
When the licensee withdrew the request. null unless withdrawn.
The key-value pairs sent with the request.
Show child attributes
Show child attributes