API reference
Account and API keys API
Check API health, read the account and available generation balance behind an API key, and create, list, or revoke scoped API keys.
BetaUpdated
- Base URL
- https://lyricwinter.com/api/v1
- Authentication
- Authorization: Bearer lw_…
- Contract
- openapi.json
Check API health
GET/health
Returns a static payload when the LyricWinter API is reachable. It needs no authentication and performs no account checks.
Response 200
Stable API health response. Fields below are inside data.
oktruerequiredservice"lyricwinter"requiredversion"v1"required
curl "https://lyricwinter.com/api/v1/health" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const response = await fetch(`https://lyricwinter.com/api/v1/health`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/health",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"ok": true,
"service": "lyricwinter",
"version": "v1"
},
"request_id": "req_01J9Z3K8QF4"
}Get the current account
GET/me
account:readReturns the profile of the account that owns the API key: its ID, username, display name, avatar URL, and email.
Response 200
Current account profile. Fields below are inside data.
profileobjectrequired5 child attributes
idstringrequiredusernamestring | nullrequired3–30 charsnamestring | nullrequiredmax 100 charsimagestring | nullrequireduriemailstring | nullrequiredemail
Errors 401, 403, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/me" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const response = await fetch(`https://lyricwinter.com/api/v1/me`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/me",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"profile": {
"id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"username": "string",
"name": "My integration",
"image": "https://lyricwinter.com/…",
"email": "[email protected]"
}
},
"request_id": "req_01J9Z3K8QF4"
}Read generation preferences
GET/me/generation-preferences
account:readRead the account's saved Allow fallbacks setting. New accounts start with it enabled. The preference is shared across devices.
Response 200
Saved generation preference. Fields below are inside data.
allow_fallbacksbooleanrequired
Errors 401, 403, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/me/generation-preferences" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const response = await fetch(`https://lyricwinter.com/api/v1/me/generation-preferences`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/me/generation-preferences",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"allow_fallbacks": true
},
"request_id": "req_01J9Z3K8QF4"
}Save generation preferences
PATCH/me/generation-preferences
account:writeSave Allow fallbacks by sending allow_fallbacks as true or false. The response contains the saved value. Changing this preference does not alter work already submitted.
Request body application/json
allow_fallbacksbooleanrequired
Response 200
Saved generation preference. Fields below are inside data.
allow_fallbacksbooleanrequired
Errors 400, 401, 403, 500 use the standard error envelope.
curl -X PATCH "https://lyricwinter.com/api/v1/me/generation-preferences" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"allow_fallbacks": true
}'const response = await fetch(`https://lyricwinter.com/api/v1/me/generation-preferences`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"allow_fallbacks": true
}),
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"PATCH",
f"https://lyricwinter.com/api/v1/me/generation-preferences",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
json={
"allow_fallbacks": True
},
)
payload = response.json(){
"data": {
"allow_fallbacks": true
},
"request_id": "req_01J9Z3K8QF4"
}Get the current account balance
GET/me/balance
account:readReturns the caller's current account generation balance with account:read. data.balance.snowcoins is settled; data.balance.available_snowcoins is available after outstanding holds. For promotional credits and the combined Studio balance, use /studio/account-capabilities with studio:read. These values are current snapshots, not historical balances for billing activity. The server still reserves and charges credits atomically. Subscription state and usage history are separate resources.
Response 200
Cached balance and subscription-adjacent state for the authenticated caller. Fields below are inside data.
balanceobjectrequired13 child attributes
snowcoinsinteger | nullrequired≥ 0Current settled account Snowcoins.
available_snowcoinsinteger | nullrequired≥ 0Current spendable account Snowcoins after active holds.
billing_debtintegerrequired≥ 0subscription_tierstringrequiredOne of
zerowintermywinterultrawinterhyperwintersubscription_providerstring | nullrequiredOne of
stripeapp_storesubscription_statusstringrequiredOne of
freeactivegrace_periodbilling_retryexpiredrevokedhas_active_subscriptionbooleanrequiredparse_limit_charactersintegerrequired≥ 1unlimited_f5_ttsbooleanrequiredauto_reload_enabledbooleanrequiredauto_reload_thresholdnumber | nullrequiredsmall_word_packs_eligiblebooleanrequiredsmall_word_pack_eligibilityobjectrequired7 child attributes
canUseSmallWordPacksbooleanrequiredactiveSubscriptionbooleanrequiredpreviousSuccessfulPaymentbooleanrequiredengagedReturningUserbooleanrequiredcompletedAudioRunsLast30Daysintegerrequired≥ 0accountAgeDaysinteger | nullrequired≥ 0accountCreatedAtstring | nullrequireddate-time
Errors 401, 403, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/me/balance" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const response = await fetch(`https://lyricwinter.com/api/v1/me/balance`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/me/balance",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"balance": {
"snowcoins": 1,
"available_snowcoins": 1,
"billing_debt": 1,
"subscription_tier": "zerowinter",
"subscription_provider": "stripe",
"subscription_status": "free",
"has_active_subscription": true,
"parse_limit_characters": 1,
"unlimited_f5_tts": true,
"auto_reload_enabled": true,
"auto_reload_threshold": 1,
"small_word_packs_eligible": true,
"small_word_pack_eligibility": {
"canUseSmallWordPacks": true,
"activeSubscription": true,
"previousSuccessfulPayment": true,
"engagedReturningUser": true,
"completedAudioRunsLast30Days": 1,
"accountAgeDays": 1,
"accountCreatedAt": "2026-09-30T17:00:00.000Z"
}
}
},
"request_id": "req_01J9Z3K8QF4"
}Get available Studio funding and actions
GET/studio/account-capabilities
studio:readReturns the caller's account balance, promotional Studio credits, plan, and action capabilities with studio:read. data.studio_funding.total_available_snowcoins and total_available_words include both account and promotional funding after holds. as_of identifies the snapshot. Actions are advisory, not a live provider-health check or a guarantee that a later paid request will succeed. Reading this endpoint can claim an eligible account reward before returning the snapshot; repeated reads do not grant the same reward twice.
Response 200
Current Studio account capabilities from one consistent billing snapshot. Fields below are inside data.
schema_version"studio-account-capabilities-4"requiredas_ofstringrequireddate-timeplanobjectrequired3 child attributes
tierstringrequiredOne of
zerowintermywinterultrawinterhyperwinterdisplay_namestringrequiredcharacter_limitintegerrequired≥ 1
balanceobjectrequired6 child attributes
settled_snowcoinsintegerrequired≥ 0held_snowcoinsintegerrequired≥ 0available_snowcoinsintegerrequired≥ 0settled_wordsintegerrequired≥ 0held_wordsintegerrequired≥ 0available_wordsintegerrequired≥ 0
studio_fundingobjectrequired5 child attributes
promotionalobjectrequired5 child attributes
available_snowcoinsintegerrequired≥ 0held_snowcoinsintegerrequired≥ 0available_wordsintegerrequired≥ 0held_wordsintegerrequired≥ 0grantsarray of objectrequired7 item attributes
campaign_keystringrequireddisplay_namestringrequiredavailable_snowcoinsintegerrequired≥ 0held_snowcoinsintegerrequired≥ 0available_wordsintegerrequired≥ 0held_wordsintegerrequired≥ 0expires_atstring | nullrequireddate-time
total_available_snowcoinsintegerrequired≥ 0total_held_snowcoinsintegerrequired≥ 0total_available_wordsintegerrequired≥ 0total_held_wordsintegerrequired≥ 0
campaign_dialogsarray of objectrequiredmax 20 items12 item attributes
campaign_keystringrequiredpattern ^[a-z0-9][a-z0-9_]{2,63}$campaign_kindstringrequiredOne of
promotioncustomer_referralaffiliateannouncementproduct_updatepriorityintegerrequired-1000–1000content_revisionintegerrequired≥ 1interactionstringrequiredOne of
claimacknowledgetitlestringrequired1–120 charsbodystringrequired1–1000 charsprimary_action_labelstringrequired1–80 charssecondary_action_labelstring | nullrequired1–80 charslearn_more_urlstring | nullrequireduripattern ^https://available_untilstringrequireddate-timerewardsarray of objectrequiredmax 20 items7 item attributes
reward_keystringrequiredreward_type"studio_words"requiredamount_snowcoinsintegerrequired≥ 1amount_wordsintegerrequired≥ 1expiration_policystringrequiredOne of
nonefixedrollingfixed_expires_atstring | nullrequireddate-timeexpires_in_secondsinteger | nullrequired≥ 1
campaign_offersarray of objectrequiredmax 20 items12 item attributes
campaign_keystringrequiredpattern ^[a-z0-9][a-z0-9_]{2,63}$campaign_kindstringrequiredOne of
promotioncustomer_referralaffiliateannouncementproduct_updatepriorityintegerrequired-1000–1000content_revisionintegerrequired≥ 1interactionstringrequiredOne of
claimacknowledgetitlestringrequired1–120 charsbodystringrequired1–1000 charsprimary_action_labelstringrequired1–80 charssecondary_action_labelstring | nullrequired1–80 charslearn_more_urlstring | nullrequireduripattern ^https://available_untilstringrequireddate-timerewardsarray of objectrequiredmax 20 items7 item attributes
reward_keystringrequiredreward_type"studio_words"requiredamount_snowcoinsintegerrequired≥ 1amount_wordsintegerrequired≥ 1expiration_policystringrequiredOne of
nonefixedrollingfixed_expires_atstring | nullrequireddate-timeexpires_in_secondsinteger | nullrequired≥ 1
purchasesobjectrequired1 child attributes
small_word_packs_eligiblebooleanrequired
actionsobjectrequired6 child attributes
prepare_textobjectrequired2 child attributes
statusstringrequiredOne of
availablenot_connectedbilling_modestringrequiredOne of
includedmetered_snowcoinsnot_applicable
speech_generationobjectrequired2 child attributes
statusstringrequiredOne of
availablenot_connectedbilling_modestringrequiredOne of
includedmetered_snowcoinsnot_applicable
sfx_generationobjectrequired2 child attributes
statusstringrequiredOne of
availablenot_connectedbilling_modestringrequiredOne of
includedmetered_snowcoinsnot_applicable
voice_designobjectrequired2 child attributes
statusstringrequiredOne of
availablenot_connectedbilling_modestringrequiredOne of
includedmetered_snowcoinsnot_applicable
voice_cloningobjectrequired2 child attributes
statusstringrequiredOne of
availablenot_connectedbilling_modestringrequiredOne of
includedmetered_snowcoinsnot_applicable
final_renderobjectrequired2 child attributes
statusstringrequiredOne of
availablenot_connectedbilling_modestringrequiredOne of
includedmetered_snowcoinsnot_applicable
Errors 401, 403, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/studio/account-capabilities" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const response = await fetch(`https://lyricwinter.com/api/v1/studio/account-capabilities`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/studio/account-capabilities",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"schema_version": "studio-account-capabilities-4",
"as_of": "2026-09-30T17:00:00.000Z",
"plan": {
"tier": "zerowinter",
"display_name": "string",
"character_limit": 1
},
"balance": {
"settled_snowcoins": 1,
"held_snowcoins": 1,
"available_snowcoins": 1,
"settled_words": 1,
"held_words": 1,
"available_words": 1
},
"studio_funding": {
"promotional": {
"available_snowcoins": 1,
"held_snowcoins": 1,
"available_words": 1,
"held_words": 1,
"grants": [
{
"campaign_key": "string",
"display_name": "string",
"available_snowcoins": 1,
"held_snowcoins": 1,
"available_words": 1,
"held_words": 1,
"expires_at": "2026-09-30T17:00:00.000Z"
}
]
},
"total_available_snowcoins": 1,
"total_held_snowcoins": 1,
"total_available_words": 1,
"total_held_words": 1
},
"campaign_dialogs": [
{
"campaign_key": "string",
"campaign_kind": "promotion",
"priority": 1,
"content_revision": 1,
"interaction": "claim",
"title": "Chapter One",
"body": "string",
"primary_action_label": "string",
"secondary_action_label": "string",
"learn_more_url": "https://lyricwinter.com/…",
"available_until": "2026-09-30T17:00:00.000Z",
"rewards": [
{
"reward_key": "string",
"reward_type": "studio_words",
"amount_snowcoins": 1,
"amount_words": 1,
"expiration_policy": "none",
"fixed_expires_at": "2026-09-30T17:00:00.000Z",
"expires_in_seconds": 1
}
]
}
],
"campaign_offers": [
{
"campaign_key": "string",
"campaign_kind": "promotion",
"priority": 1,
"content_revision": 1,
"interaction": "claim",
"title": "Chapter One",
"body": "string",
"primary_action_label": "string",
"secondary_action_label": "string",
"learn_more_url": "https://lyricwinter.com/…",
"available_until": "2026-09-30T17:00:00.000Z",
"rewards": [
{
"reward_key": "string",
"reward_type": "studio_words",
"amount_snowcoins": 1,
"amount_words": 1,
"expiration_policy": "none",
"fixed_expires_at": "2026-09-30T17:00:00.000Z",
"expires_in_seconds": 1
}
]
}
],
"purchases": {
"small_word_packs_eligible": true
},
"actions": {
"prepare_text": {
"status": "available",
"billing_mode": "included"
},
"speech_generation": {
"status": "available",
"billing_mode": "included"
},
"sfx_generation": {
"status": "available",
"billing_mode": "included"
},
"voice_design": {
"status": "available",
"billing_mode": "included"
},
"voice_cloning": {
"status": "available",
"billing_mode": "included"
},
"final_render": {
"status": "available",
"billing_mode": "included"
}
}
},
"request_id": "req_01J9Z3K8QF4"
}List API keys
GET/api-keys
api_keys:readLists metadata for the account's API keys, including name, scopes, expiry, last use, and revocation time. Raw keys are never returned.
Response 200
Caller-owned API key metadata without raw key material or token hashes. Fields below are inside data.
api_keysarray of objectrequired9 item attributes
idstringrequireduuidnamestringrequired1–80 charstoken_prefixstringrequiredpattern ^lw_[A-Za-z0-9_-]{8,32}$Safe display prefix for identifying a key.
scopesarray of stringrequiredOne of
account:readaccount:writeapi_keys:readapi_keys:writeaudio_runs:readaudio_runs:writebilling:readbilling:writedemo_videos:readdemo_videos:writefeedback:writeprojects:readprojects:writereactions:readreactions:writestories:readstories:writestudio:readstudio:writevoice_pins:readvoice_pins:writevoice_actors:readvoice_shares:readvoice_shares:writevoices:readvoices:writeexpires_atstring | nullrequireddate-timelast_used_atstring | nullrequireddate-timerevoked_atstring | nullrequireddate-timecreated_atstringrequireddate-timeupdated_atstringrequireddate-time
Errors 401, 403, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/api-keys" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const response = await fetch(`https://lyricwinter.com/api/v1/api-keys`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/api-keys",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"api_keys": [
{
"id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"name": "My integration",
"token_prefix": "string",
"scopes": [
"account:read"
],
"expires_at": "2026-09-30T17:00:00.000Z",
"last_used_at": "2026-09-30T17:00:00.000Z",
"revoked_at": "2026-09-30T17:00:00.000Z",
"created_at": "2026-09-30T17:00:00.000Z",
"updated_at": "2026-09-30T17:00:00.000Z"
}
]
},
"request_id": "req_01J9Z3K8QF4"
}Create an API key
POST/api-keys
api_keys:writeCreates a scoped API key. The response contains raw_key exactly once; LyricWinter stores only a hash. When you call this endpoint with an API key, the new key can only have scopes that the calling key already holds.
Request body application/json
namestringrequired1–80 charsscopesarray of stringrequiredmin 1 itemsDuplicate scopes are accepted and deduplicated.
One of
account:readaccount:writeapi_keys:readapi_keys:writeaudio_runs:readaudio_runs:writebilling:readbilling:writedemo_videos:readdemo_videos:writefeedback:writeprojects:readprojects:writereactions:readreactions:writestories:readstories:writestudio:readstudio:writevoice_pins:readvoice_pins:writevoice_actors:readvoice_shares:readvoice_shares:writevoices:readvoices:writeexpires_atstring | nulldate-timeOptional expiration timestamp. Null or omitted creates a non-expiring key.
Response 201
API key created. The raw key is returned only in this response. Fields below are inside data.
api_keyobjectrequired9 child attributes
idstringrequireduuidnamestringrequired1–80 charstoken_prefixstringrequiredpattern ^lw_[A-Za-z0-9_-]{8,32}$Safe display prefix for identifying a key.
scopesarray of stringrequiredOne of
account:readaccount:writeapi_keys:readapi_keys:writeaudio_runs:readaudio_runs:writebilling:readbilling:writedemo_videos:readdemo_videos:writefeedback:writeprojects:readprojects:writereactions:readreactions:writestories:readstories:writestudio:readstudio:writevoice_pins:readvoice_pins:writevoice_actors:readvoice_shares:readvoice_shares:writevoices:readvoices:writeexpires_atstring | nullrequireddate-timelast_used_atstring | nullrequireddate-timerevoked_atstring | nullrequireddate-timecreated_atstringrequireddate-timeupdated_atstringrequireddate-time
raw_keystringrequiredpattern ^lw_[A-Za-z0-9_-]{8,32}_[A-Za-z0-9_-]+$Display-once raw API key. The server stores only a SHA-256 hash.
Errors 400, 401, 403, 409, 500 use the standard error envelope.
curl -X POST "https://lyricwinter.com/api/v1/api-keys" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My integration",
"scopes": [
"account:read"
]
}'const response = await fetch(`https://lyricwinter.com/api/v1/api-keys`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "My integration",
"scopes": [
"account:read"
]
}),
});
const { data, error, request_id } = await response.json();import os
import requests
response = requests.request(
"POST",
f"https://lyricwinter.com/api/v1/api-keys",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
json={
"name": "My integration",
"scopes": [
"account:read"
]
},
)
payload = response.json(){
"data": {
"api_key": {
"id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"name": "My integration",
"token_prefix": "string",
"scopes": [
"account:read"
],
"expires_at": "2026-09-30T17:00:00.000Z",
"last_used_at": "2026-09-30T17:00:00.000Z",
"revoked_at": "2026-09-30T17:00:00.000Z",
"created_at": "2026-09-30T17:00:00.000Z",
"updated_at": "2026-09-30T17:00:00.000Z"
},
"raw_key": "string"
},
"request_id": "req_01J9Z3K8QF4"
}Revoke an API key
DELETE/api-keys/{apiKeyId}
api_keys:writeRevokes one of the account's API keys immediately. Revoking a key that is already revoked succeeds without changes.
Path parameters
apiKeyIdstringrequireduuid
Response 200
Caller-owned API key was revoked, or was already revoked. Fields below are inside data.
oktruerequiredapi_keyobjectrequired9 child attributes
idstringrequireduuidnamestringrequired1–80 charstoken_prefixstringrequiredpattern ^lw_[A-Za-z0-9_-]{8,32}$Safe display prefix for identifying a key.
scopesarray of stringrequiredOne of
account:readaccount:writeapi_keys:readapi_keys:writeaudio_runs:readaudio_runs:writebilling:readbilling:writedemo_videos:readdemo_videos:writefeedback:writeprojects:readprojects:writereactions:readreactions:writestories:readstories:writestudio:readstudio:writevoice_pins:readvoice_pins:writevoice_actors:readvoice_shares:readvoice_shares:writevoices:readvoices:writeexpires_atstring | nullrequireddate-timelast_used_atstring | nullrequireddate-timerevoked_atstring | nullrequireddate-timecreated_atstringrequireddate-timeupdated_atstringrequireddate-time
Errors 400, 401, 403, 404, 500 use the standard error envelope.
curl -X DELETE "https://lyricwinter.com/api/v1/api-keys/$API_KEY_ID" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const apiKeyId = "<apiKeyId>";
const response = await fetch(`https://lyricwinter.com/api/v1/api-keys/${apiKeyId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
api_key_id = "<apiKeyId>"
response = requests.request(
"DELETE",
f"https://lyricwinter.com/api/v1/api-keys/{api_key_id}",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"ok": true,
"api_key": {
"id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"name": "My integration",
"token_prefix": "string",
"scopes": [
"account:read"
],
"expires_at": "2026-09-30T17:00:00.000Z",
"last_used_at": "2026-09-30T17:00:00.000Z",
"revoked_at": "2026-09-30T17:00:00.000Z",
"created_at": "2026-09-30T17:00:00.000Z",
"updated_at": "2026-09-30T17:00:00.000Z"
}
},
"request_id": "req_01J9Z3K8QF4"
}