curl --fail-with-body --max-time 30 'https://app.reflections.ai/.well-known/talent-license'import { exit } from "node:process";
const response = await fetch("https://app.reflections.ai/.well-known/talent-license", {
method: "GET",
headers: {
},
signal: AbortSignal.timeout(30_000),
});
const responseBody = await response.text();
if (!response.ok) {
console.error(`HTTP ${response.status}: ${responseBody}`);
exit(1);
}
console.log(responseBody);
from urllib.error import HTTPError
from urllib.request import Request, urlopen
headers = {
}
request = Request("https://app.reflections.ai/.well-known/talent-license",
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"
"time"
)
func main() {
request, err := http.NewRequest("GET", "https://app.reflections.ai/.well-known/talent-license", nil)
if err != nil {
panic(err)
}
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))
}
{
"issuer": "https://app.reflections.ai",
"protocol": "tlp",
"protocol_versions": [
"1.0"
],
"api_base": "https://app.reflections.ai/v1",
"api_versions": [
"2026-10-15"
],
"jwks_uri": "https://app.reflections.ai/.well-known/jwks.json",
"check_endpoint": "https://app.reflections.ai/v1/checks",
"generation_endpoint": "https://app.reflections.ai/v1/generations",
"session_endpoint": "https://app.reflections.ai/v1/sessions",
"verification_endpoint": "https://app.reflections.ai/v1/verifications",
"receipt_endpoint": "https://app.reflections.ai/v1/receipts/{receipt_id}",
"revocation_feed": "https://app.reflections.ai/v1/revocations",
"talent_index": "https://app.reflections.ai/v1/talent/index",
"authorization_endpoint": "https://app.reflections.ai/oauth/authorize",
"token_endpoint": "https://app.reflections.ai/oauth/token",
"introspection_endpoint": "https://app.reflections.ai/oauth/introspect",
"mcp_endpoint": "https://app.reflections.ai/mcp",
"receipt_page": "https://app.reflections.ai/r/{receipt_id}",
"token_types": [
"tlp-auth+jwt",
"tlp-session+jwt",
"tlp-receipt+jwt"
],
"obligation_types": [
"generation_check",
"hold_until_release",
"draft_watermark",
"generation_instructions",
"disclosure",
"attribution",
"c2pa_manifest",
"no_training",
"delete_material",
"usage_report"
],
"c2pa_assertion_label": "ai.reflections.license"
}{
"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 the discovery document
Test mode available. Live mode available. One public document serves both modes; it needs no key.
Lists this license server’s endpoints, supported protocol and API versions, signed token
types and obligation types. Platforms, generation tools and verifiers read it instead of
hard-coding URLs. Public; cache it for its Cache-Control max-age. See
Discovery.
curl --fail-with-body --max-time 30 'https://app.reflections.ai/.well-known/talent-license'import { exit } from "node:process";
const response = await fetch("https://app.reflections.ai/.well-known/talent-license", {
method: "GET",
headers: {
},
signal: AbortSignal.timeout(30_000),
});
const responseBody = await response.text();
if (!response.ok) {
console.error(`HTTP ${response.status}: ${responseBody}`);
exit(1);
}
console.log(responseBody);
from urllib.error import HTTPError
from urllib.request import Request, urlopen
headers = {
}
request = Request("https://app.reflections.ai/.well-known/talent-license",
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"
"time"
)
func main() {
request, err := http.NewRequest("GET", "https://app.reflections.ai/.well-known/talent-license", nil)
if err != nil {
panic(err)
}
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))
}
{
"issuer": "https://app.reflections.ai",
"protocol": "tlp",
"protocol_versions": [
"1.0"
],
"api_base": "https://app.reflections.ai/v1",
"api_versions": [
"2026-10-15"
],
"jwks_uri": "https://app.reflections.ai/.well-known/jwks.json",
"check_endpoint": "https://app.reflections.ai/v1/checks",
"generation_endpoint": "https://app.reflections.ai/v1/generations",
"session_endpoint": "https://app.reflections.ai/v1/sessions",
"verification_endpoint": "https://app.reflections.ai/v1/verifications",
"receipt_endpoint": "https://app.reflections.ai/v1/receipts/{receipt_id}",
"revocation_feed": "https://app.reflections.ai/v1/revocations",
"talent_index": "https://app.reflections.ai/v1/talent/index",
"authorization_endpoint": "https://app.reflections.ai/oauth/authorize",
"token_endpoint": "https://app.reflections.ai/oauth/token",
"introspection_endpoint": "https://app.reflections.ai/oauth/introspect",
"mcp_endpoint": "https://app.reflections.ai/mcp",
"receipt_page": "https://app.reflections.ai/r/{receipt_id}",
"token_types": [
"tlp-auth+jwt",
"tlp-session+jwt",
"tlp-receipt+jwt"
],
"obligation_types": [
"generation_check",
"hold_until_release",
"draft_watermark",
"generation_instructions",
"disclosure",
"attribution",
"c2pa_manifest",
"no_training",
"delete_material",
"usage_report"
],
"c2pa_assertion_label": "ai.reflections.license"
}{
"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>"
}Response
The discovery document.
The iss of every token and receipt this server signs.
Always tlp, the Talent License Protocol.
"tlp"Talent License Protocol versions, such as 1.0.
The base URL of the API.
Dated versions accepted in Reflections-Version.
The JWKS that holds the keys for tokens and receipts.
Where to create a check.
Where to create a generation.
Where to verify content.
A URL template with {receipt_id}.
The revocation feed.
A URL template with {receipt_id}.
The typ of each signed format: authorization token, session token and receipt.
tlp-auth+jwt, tlp-session+jwt, tlp-receipt+jwt Every obligation type this server can issue. Treat any other type as unmet.
generation_check: submit outputs before delivery. hold_until_release: deliver nothing
until the reviewer releases it. draft_watermark: mark drafts shown while held.
generation_instructions: pass the instructions to the model. disclosure,
attribution: label the output as stated. c2pa_manifest: embed the c2pa assertion.
no_training: never train on the material. delete_material: delete it within within.
usage_report: report usage within within.
generation_check, hold_until_release, draft_watermark, generation_instructions, disclosure, attribution, c2pa_manifest, no_training, delete_material, usage_report The label of the C2PA assertion that carries the receipt.
"ai.reflections.license"Where to create a session.
The signed name index.
OAuth authorization, for connections and MCP.
OAuth token exchange.
OAuth token introspection, for the RSL Open License Protocol.
The MCP server for agents.