> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reflections.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The OpenAPI document at /api-reference/openapi.yaml defines the target contract. Its x-reflections-availability field and each operation's availability notice identify supported test and live forms. Do not infer implementation from a schema or code sample. Live keys support account details, reads of the licenses the calling account holds as licensee or issued as talent (GET /v1/licenses?role=issuer), and GET /v1/generations?license=… for the state of outputs under such a license (summaries only: no prompt, reference, bytes or metadata). Live image checks, submissions and receipts are built but not activated: until activation, a live POST /v1/checks or /v1/generations returns 403 live_not_activated, which must not be retried. Discovery and JWKS are at the origin root (https://app.reflections.ai/.well-known/...), not under /v1.
> Three rules hold everywhere: a decision is never an error (deny and escalate are 200 responses, and a live check still evaluating is a 202 with status checking); generate nothing for a named talent without an allow; deliver nothing until the generation is allow.
> The sandbox accepts personal rk_test_ keys. Persist a separate Idempotency-Key and body for each logical /v1 POST; retry an unknown outcome with the same key and body. OAuth and Talent API MCP remain planned.

# Parties

> Talent, representatives, licensees, platforms and end users, and who answers for what.

<Note>
  Protocol reference. The sandbox represents fictional talent and licenses under your test
  account. OAuth delegation, mandates and production account roles described below are not
  available through the current Talent API.
  Start with the [runnable quickstart](/quickstart) and [sandbox support matrix](/sandbox).
</Note>

Every licensed use involves the same small set of parties. This page names each one, says what it
can do in the API, and shows how they appear on a check.

## The chain

```mermaid theme={null}
flowchart LR
    T[Talent] -->|mandate| R[Representative]
    T -->|signs license| L[Licensee]
    R -->|signs license| L
    L -->|connection| P[Platform]
    P -->|check for| E[End user]
```

A talent, or a representative acting for them, signs a license with a licensee. The licensee
connects the platforms it generates on. The platform runs checks, each attributed to one end user.

## Talent

A **talent** is a person whose name, likeness and voice are protected through Reflections. The
talent sets their public [posture](/concepts/talent-and-facets#posture), signs or declines
licenses, reviews escalations, and revokes consent. See
[Talent and facets](/concepts/talent-and-facets).

## Representatives

A **representative** is an account that acts for a talent under a **mandate**: an agency, a
manager, an estate, a union or a legal representative. The mandate lists the representative's
powers:

| Power | What it lets the representative do |
| - | - |
| `issue_licenses` | Answer license requests, and draft and sign licenses for the talent |
| `review_outputs` | Decide escalations and release held outputs |
| `revoke` | Revoke or suspend the talent's licenses |
| `receive_statements` | Read statements, confirm payments and dispute statements |

A talent's representatives appear in `talent.representation[]`, with `role` and `powers`. The
talent can end a mandate at any time. Ending one is a [revocation](/concepts/revocation) with
`scope: "mandate"`.

Representatives work in the Talent Portal or through the talent side of the API, which reads
their [mandates](/api-reference/mandates/list-mandates) and checks each call against them. See
[Talent representatives](/guides/talent-representatives).

## Licensees

A **licensee** is the account that holds a license. Every check names exactly one licensee in
`check.licensee`. There are two kinds of license, and the difference is who the licensee is.

| | Customer license | Platform license |
| - | - | - |
| Licensee | The platform's customer, such as a brand | The platform itself |
| Example | Ridgeline's image license for a campaign | Northlight's voice license for its users' personal use |
| How the platform calls | Its own key plus `Reflections-Account: acct_…` | Its own key, no header |
| Who reviews escalations | The talent or a representative with `review_outputs` | Reflections trust and safety |

A platform license covers end users only when its terms say so: `scope.sublicense` is
`end_users_personal`, which allows personal, non-commercial outputs. A platform cannot use its own
license for a customer's commercial work.

## Platforms

A **platform** is the account that generates and calls the API: `POST /v1/checks`,
`POST /v1/generations`, `POST /v1/sessions`. Every check names exactly one platform in
`check.platform`. A license can limit which platforms may run checks under it with
`scope.platforms`: `any_connected`, or `listed` with account IDs.

A platform acts for a licensee through a **connection**. The licensee approves it through OAuth
2.0 (authorization code with PKCE), seeing the platform's `display_name`, the scopes and which
licenses it may use (`all` or `listed`). The platform receives `connection.created` and then sends
`Reflections-Account` with the licensee's ID. Without an active connection, the call fails with
`403 account_not_connected`. Either side can end a connection, and Reflections can too
(`revoked_by`). See [Authentication](/api-reference/authentication).

## End users

An **end user** is the person your product acts for. Send `end_user.id` on every check made for a
person. End users are attributed on checks, but they are never licensees and never hold licenses.
Send a stable ID scoped to your platform, never an email or a name. Reflections stores only an HMAC of it. See
[Privacy](/concepts/privacy).

## Reflections

Reflections runs the license server. It decides checks, generations and session samples against the
signed license revision, signs receipts, and reviews escalations under platform licenses. It
cannot sign, accept or widen a license.

## Accounts

Brands, agencies, studios, platforms and representatives all use one `account` object. Its
`types` describe the account to talent and give no permission. Its `capabilities`, such as
`hold_licenses`, `run_checks`, `act_for_licensees` or `represent_talent`, are what the account may
do, and Reflections approves each one. Read yours with
[`GET /v1/account`](/api-reference/account/retrieve-your-account).

## Example: Northlight checks for Ridgeline

Ridgeline holds license `K7Q4M2` from Maya Okafor and has connected Northlight. A Ridgeline
designer, `usr_48213` on Northlight, asks for a campaign image. Northlight sends the check with its
own key and Ridgeline's account ID:

<CodeGroup>
  ```bash cURL theme={null}
  curl https://app.reflections.ai/v1/checks \
    -H "Authorization: Bearer rk_test_…" \
    -H "Reflections-Version: 2026-10-15" \
    -H "Reflections-Account: acct_2q8v1m3n7p4r6s9t0wxyhk5zba" \
    -H "Idempotency-Key: $(uuidgen)" \
    -H "Content-Type: application/json" \
    -d '{
      "inputs": [{ "role": "prompt", "text": "Maya Okafor lacing up our new trail shoe" }],
      "use": {
        "modality": "image", "kind": "depiction", "purpose": "advertising",
        "commercial": true, "channels": ["social"], "territories": ["US"]
      },
      "end_user": { "id": "usr_48213" }
    }'
  ```

  ```typescript TypeScript theme={null}
  const check = await fetch("https://app.reflections.ai/v1/checks", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.REFLECTIONS_KEY}`,
      "Reflections-Version": "2026-10-15",
      "Reflections-Account": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
      "Idempotency-Key": crypto.randomUUID(),
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      inputs: [{ role: "prompt", text: "Maya Okafor lacing up our new trail shoe" }],
      use: {
        modality: "image", kind: "depiction", purpose: "advertising",
        commercial: true, channels: ["social"], territories: ["US"],
      },
      end_user: { id: "usr_48213" },
    }),
  }).then((r) => r.json());
  ```

  ```python Python theme={null}
  import os, uuid, requests

  check = requests.post(
      "https://app.reflections.ai/v1/checks",
      headers={
          "Authorization": f"Bearer {os.environ['REFLECTIONS_KEY']}",
          "Reflections-Version": "2026-10-15",
          "Reflections-Account": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
          "Idempotency-Key": str(uuid.uuid4()),
      },
      json={
          "inputs": [{"role": "prompt", "text": "Maya Okafor lacing up our new trail shoe"}],
          "use": {
              "modality": "image", "kind": "depiction", "purpose": "advertising",
              "commercial": True, "channels": ["social"], "territories": ["US"],
          },
          "end_user": {"id": "usr_48213"},
      },
  ).json()
  ```
</CodeGroup>

The check names both parties:

```json theme={null}
{
  "id": "chk_3m7p4r6s9t0wxyhk5zba2q8v1n",
  "object": "check",
  "decision": "allow",
  "licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
  "platform": "acct_7p4r6s9t0wxyhk5zba2q8v1m3n",
  "talent": [
    { "talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s", "name": "Maya Okafor", "license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh" }
  ]
}
```

Without the header, Northlight would be the licensee. Its own platform license from Maya Okafor
does not cover advertising images, so the same check would return `deny`.

## Who answers for what

| Party | Answers for |
| - | - |
| Talent | What a license allows, and whether consent continues |
| Representative | What it signs, reviews or revokes within its mandate |
| Licensee | Accepting the license, and every use made under it, on any platform it connects |
| Platform | Sending the request the model receives, meeting obligations, submitting outputs, honoring revocations |
| End user | Their own prompts, under the platform's terms |
| Reflections | Deciding against the signed revision, and stating what it observed |

## Related

<Columns cols={2}>
  <Card title="Licenses" icon="file-signature" href="/concepts/licenses">
    Signed revisions, statuses and terms.
  </Card>

  <Card title="Brands and agencies" icon="briefcase" href="/guides/brands-and-agencies">
    Hold licenses and connect the platforms you use.
  </Card>

  <Card title="Talent representatives" icon="user-tie" href="/guides/talent-representatives">
    Mandates, reviews, revocation and audits.
  </Card>

  <Card title="Authentication" icon="key" href="/api-reference/authentication">
    Keys, scopes, `Reflections-Account` and OAuth.
  </Card>
</Columns>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.