: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4' \
-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/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4", {
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/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4",
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/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4", 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": "ldr_hz4ngq81vhagynxm3ds9q2acz4",
"object": "license_draft",
"livemode": true,
"status": "open",
"kind": "renew",
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh",
"license_request": null,
"scope": {
"facets": [
"fct_5zba2q8v1m3n7p4r6s9t0wxyhk"
],
"modalities": [
"image"
],
"kinds": [
"depiction"
],
"purposes": [
"advertising"
],
"commercial": true,
"channels": [
"social",
"web"
],
"territories": [
"US",
"CA"
],
"window": {
"starts_at": "2027-04-01T00:00:00-04:00",
"ends_at": "2027-09-30T00:00:00-04:00",
"time_zone": "America/New_York"
},
"adjustments": {
"reframe": true,
"background_extension": true,
"lighting": true,
"text_overlay": true,
"body_and_age": false,
"expression": false,
"hair": false,
"pose": false,
"wardrobe": true,
"objects": true,
"skin_retouch": false,
"endorsement": false
},
"prohibited_changes": [
"body_and_age",
"expression",
"hair",
"pose",
"skin_retouch",
"endorsement"
],
"required_attributes": [
"identity.samePerson",
"appearance.bodyAndAge",
"appearance.expression",
"appearance.hair",
"appearance.pose",
"appearance.skinRetouch",
"context.endorsement"
],
"rules": {
"never": [
"Do not show alcohol or tobacco."
],
"always": [],
"brief": null
},
"release_policy": "per_output_review",
"escalation_window": "P7D",
"final_deliverables": 24,
"sessions": {
"permitted": false
},
"material_access": [],
"platforms": {
"mode": "any_connected",
"accounts": []
},
"sublicense": "none",
"training": "prohibited",
"disclosure": "brand",
"attribution": null,
"post_revocation": {
"policy": "retain"
},
"exclusivity": {
"exclusive": false,
"category": null
},
"conflicts": [],
"compensation": {
"type": "per_unit",
"per_unit": {
"units": "placements",
"rate": {
"amount": 25000,
"currency": "usd"
},
"per": 1
},
"minimum": {
"amount": 500000,
"currency": "usd"
},
"schedule": "monthly"
}
},
"terms_digest": "sha256:d499df2ff47603a092c7a59be9e329a344e6c23590c1ddfdbe6fc5a0ea32274b",
"signer": "talent",
"signing_url": "https://app.reflections.ai/sign/ldr_hz4ngq81vhagynxm3ds9q2acz4",
"signed_as_drafted": null,
"license_revision": null,
"decision_note": null,
"note": "Spring and summer 2027, on the same terms.",
"created_by": "acct_6m8n0p2q4r6s8t0v2w4x6y8z0b",
"expires_at": "2026-11-16T09:00:00Z",
"signed_at": null,
"declined_at": null,
"metadata": {},
"created_at": "2026-10-17T09:00:00Z"
}{
"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 a license draft
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 a draft with the full terms the signer sees and the terms_digest its revision will
carry if it is signed as drafted. Once it is signed, license, license_revision and
signed_as_drafted say what was signed.
Restricted keys need license_drafts:write.
: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4' \
-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/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4", {
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/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4",
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/license_drafts/ldr_hz4ngq81vhagynxm3ds9q2acz4", 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": "ldr_hz4ngq81vhagynxm3ds9q2acz4",
"object": "license_draft",
"livemode": true,
"status": "open",
"kind": "renew",
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh",
"license_request": null,
"scope": {
"facets": [
"fct_5zba2q8v1m3n7p4r6s9t0wxyhk"
],
"modalities": [
"image"
],
"kinds": [
"depiction"
],
"purposes": [
"advertising"
],
"commercial": true,
"channels": [
"social",
"web"
],
"territories": [
"US",
"CA"
],
"window": {
"starts_at": "2027-04-01T00:00:00-04:00",
"ends_at": "2027-09-30T00:00:00-04:00",
"time_zone": "America/New_York"
},
"adjustments": {
"reframe": true,
"background_extension": true,
"lighting": true,
"text_overlay": true,
"body_and_age": false,
"expression": false,
"hair": false,
"pose": false,
"wardrobe": true,
"objects": true,
"skin_retouch": false,
"endorsement": false
},
"prohibited_changes": [
"body_and_age",
"expression",
"hair",
"pose",
"skin_retouch",
"endorsement"
],
"required_attributes": [
"identity.samePerson",
"appearance.bodyAndAge",
"appearance.expression",
"appearance.hair",
"appearance.pose",
"appearance.skinRetouch",
"context.endorsement"
],
"rules": {
"never": [
"Do not show alcohol or tobacco."
],
"always": [],
"brief": null
},
"release_policy": "per_output_review",
"escalation_window": "P7D",
"final_deliverables": 24,
"sessions": {
"permitted": false
},
"material_access": [],
"platforms": {
"mode": "any_connected",
"accounts": []
},
"sublicense": "none",
"training": "prohibited",
"disclosure": "brand",
"attribution": null,
"post_revocation": {
"policy": "retain"
},
"exclusivity": {
"exclusive": false,
"category": null
},
"conflicts": [],
"compensation": {
"type": "per_unit",
"per_unit": {
"units": "placements",
"rate": {
"amount": 25000,
"currency": "usd"
},
"per": 1
},
"minimum": {
"amount": 500000,
"currency": "usd"
},
"schedule": "monthly"
}
},
"terms_digest": "sha256:d499df2ff47603a092c7a59be9e329a344e6c23590c1ddfdbe6fc5a0ea32274b",
"signer": "talent",
"signing_url": "https://app.reflections.ai/sign/ldr_hz4ngq81vhagynxm3ds9q2acz4",
"signed_as_drafted": null,
"license_revision": null,
"decision_note": null,
"note": "Spring and summer 2027, on the same terms.",
"created_by": "acct_6m8n0p2q4r6s8t0v2w4x6y8z0b",
"expires_at": "2026-11-16T09:00:00Z",
"signed_at": null,
"declined_at": null,
"metadata": {},
"created_at": "2026-10-17T09:00:00Z"
}{
"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 draft's ID.
^ldr_[0-9a-hjkmnp-tv-z]{26}$Response
The draft.
The draft's ID, ldr_….
^ldr_[0-9a-hjkmnp-tv-z]{26}$Always license_draft.
"license_draft"true in live mode, false in test mode.
open until the signer signs or declines it, it is discarded, or it passes
expires_at.
open, signed, declined, discarded, expired What signing creates. issue: a new license. change_request: a new revision answering
a request of kind change. amend: new terms for license. renew: a new window for
license.
issue, change_request, amend, renew The talent the license is for.
^tal_[0-9a-hjkmnp-tv-z]{26}$The account that holds or will hold the license. It accepts what is signed on its hosted acceptance page.
^acct_[0-9a-hjkmnp-tv-z]{26}$The full terms the signer will see, with the current revision's values filled in.
Show child attributes
Show child attributes
The terms_digest the revision will carry if it is signed as drafted. Compare it with
the signed revision's to see whether the signer changed anything.
^sha256:[0-9a-f]{64}$Who signs. talent: the talent, in the Talent Portal. representative: a person at
your account with issue_licenses.
talent, representative The representative account that prepared the draft.
^acct_[0-9a-hjkmnp-tv-z]{26}$When the draft can no longer be signed. 30 days after it was created, unless you set an earlier time.
When you created the draft.
The license this draft changes, or, once an issue draft is signed, the license it became.
^lic_[0-9a-hjkmnp-tv-z]{26}$The license request this draft answers. null when it answers none.
^lrq_[0-9a-hjkmnp-tv-z]{26}$The Talent Portal page where the signer reads and signs the draft with a passkey. Present while open.
Once signed, false when the signer changed terms before signing.
The revision that signing created.
^lrv_[0-9a-hjkmnp-tv-z]{26}$The signer's note when they declined.
Shown to the licensee on the acceptance page. null when you sent none.
When the signer signed. null unless signed.
When the signer declined. null unless declined.
Keys and values of your own.
Show child attributes
Show child attributes