: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q' \
-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/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q", {
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/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q",
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/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q", 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": "stmt_0c2e4g6j8k0m2n4p6q8r0s2t4v",
"object": "statement",
"livemode": true,
"license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh",
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"status": "issued",
"period": {
"start": "2026-10-01T00:00:00Z",
"end": "2026-11-01T00:00:00Z"
},
"currency": "usd",
"lines": [
{
"description": "Placements, social and web",
"units": "placements",
"reported": 30,
"observed": 32,
"billable": 32,
"rate": {
"amount": 25000,
"currency": "usd"
},
"amount": 800000
}
],
"amount_due": 800000,
"amount_paid": 0,
"reconciliation": {
"result": "under_reported",
"detail": "32 released outputs were placed; 30 were reported."
},
"payments": [],
"due_at": "2026-11-30T23:59:59Z",
"issued_at": "2026-11-02T08:00:00Z",
"document_url": "https://app.reflections.ai/statements/stmt_0c2e4g6j8k0m2n4p6q8r0s2t4v",
"created_at": "2026-10-01T00: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 statement
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 statement: each line’s reported, observed and billable units, the amounts, the
reconciliation result and the recorded payments. A representative whose mandate has
receive_statements can retrieve the talent’s statements.
Restricted keys need statements:read.
: "${REFLECTIONS_KEY:?Set REFLECTIONS_KEY before running this example}"
curl --fail-with-body --max-time 30 'https://app.reflections.ai/v1/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q' \
-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/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q", {
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/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q",
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/statements/stmt_5p7r9t1v3x5z7b9d1f3h5k7m9q", 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": "stmt_0c2e4g6j8k0m2n4p6q8r0s2t4v",
"object": "statement",
"livemode": true,
"license": "lic_k5zba2q8v1m3n7p4r6s9t0wxyh",
"talent": "tal_9t0wxyhk5zba2q8v1m3n7p4r6s",
"licensee": "acct_2q8v1m3n7p4r6s9t0wxyhk5zba",
"status": "issued",
"period": {
"start": "2026-10-01T00:00:00Z",
"end": "2026-11-01T00:00:00Z"
},
"currency": "usd",
"lines": [
{
"description": "Placements, social and web",
"units": "placements",
"reported": 30,
"observed": 32,
"billable": 32,
"rate": {
"amount": 25000,
"currency": "usd"
},
"amount": 800000
}
],
"amount_due": 800000,
"amount_paid": 0,
"reconciliation": {
"result": "under_reported",
"detail": "32 released outputs were placed; 30 were reported."
},
"payments": [],
"due_at": "2026-11-30T23:59:59Z",
"issued_at": "2026-11-02T08:00:00Z",
"document_url": "https://app.reflections.ai/statements/stmt_0c2e4g6j8k0m2n4p6q8r0s2t4v",
"created_at": "2026-10-01T00: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"
Act for a connected licensee. The value is the licensee's account ID. Requires an active connection between that account and yours.
^acct_[0-9a-hjkmnp-tv-z]{26}$Path Parameters
The statement's ID.
^stmt_[0-9a-hjkmnp-tv-z]{26}$Response
The statement.
The statement's ID. Record, confirm and dispute payments against it.
^stmt_[0-9a-hjkmnp-tv-z]{26}$Always statement.
"statement"true in live mode, false in test mode, where statements are generated daily.
The license the statement covers. Each statement covers one license for one month.
^lic_[0-9a-hjkmnp-tv-z]{26}$The talent the licensee owes.
^tal_[0-9a-hjkmnp-tv-z]{26}$The account that holds the license and pays the talent's payee.
^acct_[0-9a-hjkmnp-tv-z]{26}$open while the month runs, then issued. paid once confirmed payments reach
amount_due, or disputed while the talent's side disputes it.
open, issued, paid, disputed The month the statement covers.
Show child attributes
Show child attributes
The ISO 4217 code, lowercase, of every amount on the statement.
^[a-z]{3}$One line per unit the license bills.
Show child attributes
Show child attributes
What the licensee owes for the period under the license's compensation, in the
currency's smallest unit.
The total of payments, in the currency's smallest unit.
How the units reported compare with the units Reflections observed.
Show child attributes
Show child attributes
When the statement opened, at the start of its period.
Payments the licensee recorded against the statement, in the order recorded.
Show child attributes
Show child attributes
Present while the talent's side disputes the statement.
Show child attributes
Show child attributes
When payment is due. Null while open.
When the statement was issued, or last reissued after a dispute. Null while open.
The statement as a document a person reads. Null while open.