Skip to main content
Planned Talent API integration guide. License acceptance, OAuth connections, license requests and settlement are not served through the current sandbox. This reference does not describe the separate portal’s current capabilities. Start with the runnable quickstart and sandbox support matrix.
A brand or agency is the licensee: the account that holds a talent’s license and answers for every use made under it. You do not generate through Reflections. You generate on platforms you connect, and they check each use against your licenses. This guide covers accepting and reading licenses, connecting platforms, asking for licenses, and statements. An ad agency that signs licenses for a client is the licensee and works exactly as below. A talent agency or manager that acts for talent is a representative; see Talent representatives.

Accept a license

A license starts with the talent’s signature, in the Talent Portal. When the talent or their representative signs one for you, you receive license.issued and the license is pending_acceptance. Its acceptance_url is the hosted page where you read the signed document and accept it. No endpoint can accept a license; a person on your side does it on that page.
Until you accept, checks under it deny with license_pending_acceptance. After you accept, you receive license.accepted and the license is active, or scheduled if its window has not started. If you decline, you receive license.declined. The handle is a six-character name people can read aloud on a call: Ridgeline’s license from Maya Okafor is K7Q4M2.

Read the terms

GET /v1/licenses/{license_id} returns the license with scope, the terms in normalized form. The signed document itself is a revision: GET /v1/licenses/{license_id}/revisions/{revision_id} returns terms exactly as signed, its terms_digest, the signatures, and enforcement, which says for each term whether Reflections enforces it. You keep recorded terms yourself. If Maya Okafor’s license names a competitor she must not appear beside, no check stops that placement. See What we enforce. To confirm you hold the signed document, compute the digest yourself: SHA-256 over the tlp-json-1 form of the revision’s terms. The terms digest gives the rules and code that reproduces it. A plain json.dumps(..., sort_keys=True) is not enough: it writes 1.0 and 1e-07 where tlp-json-1 writes 1 and 1e-7.

Revisions

Each signed version of a license is a revision with its own terms_digest, and its terms never change. A change request, an amendment or a renewal produces a new one. When the talent’s side signs it, you receive license.revision_pending with pending_revision naming it, and you accept or decline it at the license’s acceptance_url. The current revision stays in force until you accept. Then you receive license.revised with current_revision pointing at the new revision, and new checks use it at once. Authorizations already issued keep the revision they name, and every receipt names the revision and digest its output was made under, so you can always show which terms applied.

Connect the platforms you generate on

A platform can use your licenses only after you connect it. On the platform, choose to connect your Reflections account. You are sent to Reflections, where you sign in and see the platform’s name, the scopes it asks for and which of your licenses it may use: all of them, or the ones you list. When you approve, the platform receives connection.created and sends checks for you with your account ID in Reflections-Account. List your connections, and end one when you stop working with a platform:
From that moment, the platform’s checks for you fail with account_not_connected, and authorizations it already holds stop working when they expire. A license can also restrict platforms itself: with scope.platforms.mode set to listed, only the accounts it lists may run checks under it.

Request a license

When a check for you is denied for lack of a license, its remedy says what to ask for: Pass the denied check’s ID as check so the talent sees the use that prompted the request, use remedy.suggested_scope as a starting requested_scope, and add an offer and a note. A connected platform can send the request for you with license_requests:write.
A request asks; it does not license anything. The talent, in the Talent Portal, or their representative answers it and may change any term. If they sign, you receive license_request.signed, whose license_revision is what they signed, then license.issued for a new license or license.revision_pending for a change. Accept either on its acceptance page as above. If they decline, you receive license_request.declined with their decision_note. Withdraw a request they have not answered with POST /v1/license_requests/{request_id}/withdraw. A deny with talent_prohibits has no remedy: the talent’s posture rules the use out and no license can be requested. A talent whose posture.accepts_requests is false takes no requests through the API. The proposed license-request signing helper would exercise signing and acceptance with fictional talent. License requests and this helper are not served by the current sandbox.

Statements and payments

Licenses with compensation are settled from statements. Each month you receive statement.issued for each license you hold, and GET /v1/statements?license=… lists them.
Each line bills the greater of what your platforms reported and what Reflections observed from checks and generations. Reflections never moves money: you pay the talent’s payee directly, then record the payment so both sides see the same balance.
The payment appears in payments with id pay_vav8qg9xm8hqznbhb4xmm1k47f. When the talent’s side confirms receipt, the payment gets confirmed_at. The statement becomes paid once confirmed payments reach amount_due. See Usage and settlement. A talent or representative can suspend a license during a dispute (license.suspended; checks deny with license_suspended until license.resumed) or revoke it (license.revoked, with a revocation.created for your platforms). What happens to outputs already released follows the license’s post_revocation term: retain keeps them usable within their scope and window, cease_distribution stops new placements, and withdraw requires a takedown, only after a revocation for cause. See Revocation.

Licenses

Revisions, digests and the terms a license can carry.

Parties

Who answers for what: talent, licensees, platforms and end users.

Usage and settlement

Usage records, reconciliation and statements.

Image and video platforms

What the platforms you connect do with your licenses.