API reference
Keys
Create keys when someone pays, look them up, change their rules and clean up expired ones.
On this page
A key is what a player pastes into your script. Every key belongs to a provider — the key flow that sets its default lifetime, HWID limit and checkpoints — inside a service. Get IDs from List services and List providers, or copy them from the dashboard URL.
Create a key
Issues one key — typically right after a payment succeeds. Give data.key to the buyer and store data.keyId with the order, so you can update or delete the key later.
Omit both expires_in_days and minutes for a lifetime key. Settings you leave out fall back to the provider's defaults.
Bodyapplication/json
provider_idintegerrequired> 0ID of the provider this key belongs to
service_idinteger | null> 0Optional ID of the service this key is associated with
folder_idinteger | null> 0Optional ID of the folder to organize this key
minutesinteger | null> 0Key validity duration in minutes. Cannot be used with expires_in_days
expires_in_daysinteger | null1–36500Key validity duration in days (1-36500). Cannot be used with minutes
hwidstring | null≤ 512 charsHardware ID to bind this key to a specific device. Cannot be used with no_hwid=true
key_typestring | nullKey type classification. Options: free, premium. Must match is_premium value
One offreepremiumis_premiumbooleanWhether this is a premium key. Must match key_type if provided
Defaultfalseone_time_usebooleanWhether the key can only be used once
Defaultfalseexpiry_on_first_usebooleanWhether the key expiry timer starts on first use instead of creation
Defaultfalseno_hwidbooleanWhether to disable hardware ID binding. Cannot be used with hwid or hwid_limit
Defaultfalsehwid_limitinteger | null≥ 1Maximum number of hardware IDs that can use this key. Cannot be used with no_hwid=true
key_namestring | null≤ 64 charsOptional custom name for the key
Response fieldsinside data
keyIduuidCreated key unique identifier
keystringThe actual key value
expiresInMinutesinteger | nullKey expiration duration in minutes
oneTimeUsebooleanWhether the key can only be used once
expiryOnFirstUsebooleanWhether the key expiry timer starts on first use
validityMinutesinteger | nullKey validity duration in minutes
hwidLimitinteger | nullMaximum number of hardware IDs that can use this key
curl -X POST "https://api.santiauth.com/api/keys" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider_id": 1,
"expires_in_days": 30,
"is_premium": true,
"key_name": "Order #1042"
}'{
"success": true,
"data": {
"keyId": "880e8400-e29b-41d4-a716-446655440003",
"key": "MYAPP-ABC1-DEF2-GHI3",
"expiresInMinutes": 1440,
"oneTimeUse": false,
"expiryOnFirstUse": false,
"validityMinutes": 1440,
"hwidLimit": 1
}
}Create keys in batch
Up to 100 keys with the same settings in one call — for giveaways, resellers or pre-generated stock. Prefer it over a loop of single calls: it is one request against your rate limit.
Bodyapplication/json
provider_idintegerrequired> 0ID of the provider this key belongs to
service_idinteger | null> 0Optional ID of the service this key is associated with
folder_idinteger | null> 0Optional ID of the folder to organize this key
minutesinteger | null> 0Key validity duration in minutes. Cannot be used with expires_in_days
expires_in_daysinteger | null1–36500Key validity duration in days (1-36500). Cannot be used with minutes
hwidstring | null≤ 512 charsHardware ID to bind this key to a specific device. Cannot be used with no_hwid=true
key_typestring | nullKey type classification. Options: free, premium. Must match is_premium value
One offreepremiumis_premiumbooleanWhether this is a premium key. Must match key_type if provided
Defaultfalseone_time_usebooleanWhether the key can only be used once
Defaultfalseexpiry_on_first_usebooleanWhether the key expiry timer starts on first use instead of creation
Defaultfalseno_hwidbooleanWhether to disable hardware ID binding. Cannot be used with hwid or hwid_limit
Defaultfalsehwid_limitinteger | null≥ 1Maximum number of hardware IDs that can use this key. Cannot be used with no_hwid=true
countintegerrequired1–100Number of keys to generate in batch (1-100)
Response fieldsinside data
okbooleanWhether the batch operation succeeded
createdintegerNumber of keys successfully created
curl -X POST "https://api.santiauth.com/api/keys/batch" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider_id": 1,
"count": 25,
"expires_in_days": 7
}'{
"success": true,
"data": {
"ok": true,
"created": 10
}
}List keys
Keys of one service. Combine filters freely — for example status=active&discord_user_id=… finds a buyer's working keys. Results are paginated: follow data.pagination.totalPages.
Query parameters
paginatedstringWhether to return paginated results
One oftruefalseDefaulttruepagenumber≥ 1Page number for pagination (1-indexed)
Default1limitnumber1–100Number of keys per page (1-100)
Default25sortstringSort order: status (disabled/expired first), status_active (active first), newest (alias id), oldest, expires_soon, expires_late
One ofstatusstatus_activeidnewestoldestexpires_soonexpires_lateDefault"status"keys_viewstringFilter keys by type. Options: premium, standard
One ofpremiumstandardsearchstring≥ 2 charsSearch term to filter keys (minimum 2 characters)
statusstringFilter keys by status. Options: active, used, expired, disabled
One ofactiveusedexpireddisabledprovider_idinteger> 0Filter keys by provider ID
service_idintegerrequired> 0Service the resource belongs to
folder_idinteger> 0Filter keys by folder ID
discord_user_idstringOnly keys linked to this Discord user
discordstringOnly keys with (linked) or without (unlinked) a Discord account
One oflinkedunlinkedrobloxstring1–64 charsRoblox username substring or exact Roblox user id
hwidstringOnly keys bound (or not yet bound) to a device
One ofboundunboundexecutorstring1–64 charsOnly keys validated at least once from this executor
expiresstringKeys that never expire, or unexpired keys expiring within the window
One ofnever24h7d30dcreated_fromdatetime | nullCreated at or after this ISO timestamp
created_todatetime | nullCreated at or before this ISO timestamp
Response fieldsinside data
keysarray of objectsArray of key objects
ShowHide 23 child attributes
iduuidKey unique identifier
key_valuestringThe actual key value
key_namestring | nullOptional custom name for the key
statusstringCurrent key status
One ofactiveusedexpireddisabledexpires_atdatetime | nullKey expiration timestamp
used_atdatetime | nullTimestamp when key was first used
provider_namestring | nullName of the provider this key belongs to
service_idinteger | nullID of the service this key is associated with
service_namestring | nullName of the service this key is associated with
folder_namestring | nullName of the folder this key is organized in
is_premiumbooleanWhether this is a premium key
one_time_usebooleanWhether the key can only be used once
expiry_on_first_usebooleanWhether the key expiry timer starts on first use
no_hwidbooleanWhether hardware ID binding is disabled
hwid_limitinteger | nullMaximum number of hardware IDs that can use this key
roblox_usernamestring | nullRoblox username associated with this key
roblox_user_idstring | nullRoblox user id associated with this key
discord_user_idstring | nullDiscord user id the key is linked to
hwidstring | nullDevice the key is bound to, if any
folder_idinteger | nullFolder the key is organized in, if any
validity_minutesinteger | nullDuration (minutes) granted on activation for expiry_on_first_use keys that haven't started yet
is_disabledbooleanWhether the key was manually disabled
created_atdatetimeCreation timestamp
paginationobjectPagination metadata
ShowHide 4 child attributes
pageintegerCurrent page number
limitintegerKeys per page
totalintegerTotal number of keys
totalPagesintegerTotal number of pages
curl "https://api.santiauth.com/api/keys?service_id=1&status=active&limit=50" \
-H "x-api-key: $SANTIAUTH_API_KEY"{
"success": true,
"data": {
"keys": [
{
"id": "880e8400-e29b-41d4-a716-446655440003",
"key_value": "MYAPP-ABC1-DEF2-GHI3",
"key_name": "Trial Key for John",
"status": "active",
"expires_at": "2026-05-30T15:35:47.850Z",
"used_at": "2026-04-30T15:35:47.850Z",
"provider_name": "My Application",
"service_id": 1,
"service_name": "Premium Service",
"folder_name": "Trial Keys",
"is_premium": false,
"one_time_use": false,
"expiry_on_first_use": false,
"no_hwid": false,
"hwid_limit": 1,
"roblox_username": "RobloxPlayer123",
"roblox_user_id": "156",
"discord_user_id": "1550213780359610410",
"hwid": "a1b2c3d4",
"folder_id": 1,
"validity_minutes": 43200,
"is_disabled": false,
"created_at": "2026-04-30T15:35:47.850Z"
}
],
"pagination": {
"page": 1,
"limit": 25,
"total": 100,
"totalPages": 4
}
}
}Update a key
Send only the fields you want to change. The same call resets a player's device (reset_hwid), unlinks a Roblox account (reset_roblox), extends a key (expires_at or validity_minutes) and disables it (disabled).
Path parameters
iduuidrequiredUUID of the key to update
Bodyapplication/json
key_namestring | null≤ 64 charsCustom name for the key. Send null to clear, omit to leave unchanged.
is_premiumbooleanWhether the key counts as a premium-tier key
one_time_usebooleanMark the key as single-use after first successful validation. Mutually exclusive with expiry_on_first_use.
expiry_on_first_usebooleanStart the validity countdown from the first successful validation. Mutually exclusive with one_time_use.
no_hwidbooleanDisable HWID locking. When set, hwid_limit is cleared.
hwid_limitinteger | null≥ 1Maximum number of distinct HWIDs that can use this key. Ignored when no_hwid is true.
folder_idinteger | null> 0Move the key into a folder of the same service. Send null to remove it from its folder.
discord_user_idstring | nullLink the key to a Discord user. Send null to unlink.
expires_atdatetime | nullAbsolute expiry timestamp. Send null for a key that never expires. For expiry_on_first_use keys that haven't started, use validity_minutes instead.
validity_minutesinteger | null1–52560000Duration granted on activation for expiry_on_first_use keys that haven't started. Send null for lifetime.
disabledbooleanDisable (true) or re-enable (false) the key.
reset_hwidbooleanUnbind the key from its current device.
One oftruereset_robloxbooleanUnlink the Roblox account bound to the key.
One oftruereset_usagebooleanClear the used-at mark so a one-time key can be redeemed again.
One oftrue
Response fieldsinside data
iduuidKey unique identifier
key_valuestringThe actual key value
key_namestring | nullOptional custom name for the key
statusstringCurrent key status
One ofactiveusedexpireddisabledexpires_atdatetime | nullKey expiration timestamp
used_atdatetime | nullTimestamp when key was first used
provider_namestring | nullName of the provider this key belongs to
service_idinteger | nullID of the service this key is associated with
service_namestring | nullName of the service this key is associated with
folder_namestring | nullName of the folder this key is organized in
is_premiumbooleanWhether this is a premium key
one_time_usebooleanWhether the key can only be used once
expiry_on_first_usebooleanWhether the key expiry timer starts on first use
no_hwidbooleanWhether hardware ID binding is disabled
hwid_limitinteger | nullMaximum number of hardware IDs that can use this key
roblox_usernamestring | nullRoblox username associated with this key
roblox_user_idstring | nullRoblox user id associated with this key
discord_user_idstring | nullDiscord user id the key is linked to
hwidstring | nullDevice the key is bound to, if any
folder_idinteger | nullFolder the key is organized in, if any
validity_minutesinteger | nullDuration (minutes) granted on activation for expiry_on_first_use keys that haven't started yet
is_disabledbooleanWhether the key was manually disabled
created_atdatetimeCreation timestamp
curl -X PATCH "https://api.santiauth.com/api/keys/880e8400-e29b-41d4-a716-446655440003" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reset_hwid": true
}'{
"success": true,
"data": {
"id": "880e8400-e29b-41d4-a716-446655440003",
"key_value": "MYAPP-ABC1-DEF2-GHI3",
"key_name": "Trial Key for John",
"status": "active",
"expires_at": "2026-05-30T15:35:47.850Z",
"used_at": "2026-04-30T15:35:47.850Z",
"provider_name": "My Application",
"service_id": 1,
"service_name": "Premium Service",
"folder_name": "Trial Keys",
"is_premium": false,
"one_time_use": false,
"expiry_on_first_use": false,
"no_hwid": false,
"hwid_limit": 1,
"roblox_username": "RobloxPlayer123",
"roblox_user_id": "156",
"discord_user_id": "1550213780359610410",
"hwid": "a1b2c3d4",
"folder_id": 1,
"validity_minutes": 43200,
"is_disabled": false,
"created_at": "2026-04-30T15:35:47.850Z"
}
}Delete a key
Deletes one key; scripts using it fail their next key check. To pause a key instead, update it with "disabled": true.
Path parameters
iduuidrequiredUUID of the key to delete
Response fieldsinside data
okbooleanOperation success indicator
One oftrue
curl -X DELETE "https://api.santiauth.com/api/keys/880e8400-e29b-41d4-a716-446655440003" \
-H "x-api-key: $SANTIAUTH_API_KEY"{
"success": true,
"data": {
"ok": true
}
}Act on many keys
Revokes, restores, extends, resets the HWID of or deletes many keys in one call. Pass either ids (up to 1000) or filters — the same filters as List keys; {} selects every key of the service. extend needs minutes and skips lifetime keys. data.affected is the number of keys that changed.
Bodyapplication/json
service_idintegerrequired> 0Service the resource belongs to
actionstringrequiredrevoke disables the keys, restore re-enables them, extend adds
minutes(lifetime keys are skipped), delete removes them, reset_hwid unbinds their devicesOne ofrevokerestoreextenddeletereset_hwidminutesinteger1–5256000Minutes to add; required for extend
idsarray of uuids≤ 1000 itemsExplicit key ids (up to 1000). Mutually exclusive with filters.
filtersobjectApply to every key of the service matching these filters.
{}selects every key.ShowHide 13 child attributes
keys_viewstringOnly premium or only standard keys
One ofpremiumstandardsearchstring≥ 2 charsSearch term (minimum 2 characters)
statusstringOnly keys with this status
One ofactiveusedexpireddisabledprovider_idinteger> 0Only keys of this provider
folder_idinteger> 0Only keys in this folder
discord_user_idstringOnly keys linked to this Discord user
discordstringOnly keys with (linked) or without (unlinked) a Discord account
One oflinkedunlinkedrobloxstring1–64 charsRoblox username substring or exact Roblox user id
hwidstringOnly keys bound (or not yet bound) to a device
One ofboundunboundexecutorstring1–64 charsOnly keys validated at least once from this executor
expiresstringKeys that never expire, or unexpired keys expiring within the window
One ofnever24h7d30dcreated_fromdatetime | nullCreated at or after this ISO timestamp
created_todatetime | nullCreated at or before this ISO timestamp
Response fieldsinside data
actionstringOne ofrevokerestoreextenddeletereset_hwidaffectedintegerKeys that changed
curl -X POST "https://api.santiauth.com/api/keys/bulk" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"service_id": 1,
"action": "extend",
"minutes": 10080,
"filters": {
"status": "active"
}
}'{
"success": true,
"data": {
"action": "revoke",
"affected": 42
}
}Revoke keys of a refund
Call it from your store when an order is refunded or charged back: revokes the order's keys (up to 100 key values) so they stop working right away. With "ban": true it also bans the holders' Discord accounts and devices from the service. Keys of other services are ignored and listed in data.not_found. Safe to retry — revoked keys stay revoked. The call is recorded in the audit log as key.refund or key.chargeback.
Bodyapplication/json
service_idintegerrequired> 0Service the resource belongs to
keysarray of stringsrequired≤ 100 itemsKey values delivered for the refunded order (up to 100)
reasonstringrequiredWhy the keys are revoked
One ofrefundchargebackorder_idstring1–128 charsThe store's order id, recorded in the audit log
banbooleanAlso ban the key holders (Discord account and bound HWID) from the service
Response fieldsinside data
revokedintegerKeys revoked by this call
not_foundarray of stringsValues that are not keys of this service
bannedintegerHolders banned (Discord accounts + HWIDs)
curl -X POST "https://api.santiauth.com/api/keys/refund" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"service_id": 1,
"keys": [
"SANTI-ABCD-EFGH-IJKL"
],
"reason": "chargeback",
"order_id": "1042",
"ban": true
}'{
"success": true,
"data": {
"revoked": 1,
"not_found": [
"string"
],
"banned": 0
}
}List sharing alerts
Keys that looked shared — used from too many IPs, or tried from other devices, within an hour. Thresholds are set per service in Settings → Keys → Key lifecycle. Filter with status=open|resolved; data.open is the number of unresolved alerts.
Query parameters
service_idintegerrequired> 0Service the resource belongs to
statusstringOne ofopenresolvedlimitinteger1–100Default25offsetinteger | null≥ 0Default0
Response fieldsinside data
itemsarray of objectsShowHide 13 child attributes
idintegerkey_idstringkey_valuestringkey_namestring | nullhwidstring | nulldiscord_user_idstring | nullkindstringmany_ips — too many distinct IPs in an hour; hwid_mismatch — repeated tries from other HWIDs
One ofmany_ipshwid_mismatchobservedintegerthresholdintegerstatusstringOne ofopenresolvedresolutionstring | nullOne ofdismissedrevokedreset_hwidresolved_atdatetime | nullcreated_atdatetime
totalintegeropeninteger
curl "https://api.santiauth.com/api/keys/sharing-alerts?service_id=1&status=open&limit=25" \
-H "x-api-key: $SANTIAUTH_API_KEY"{
"success": true,
"data": {
"items": [
{
"id": 1,
"key_id": "string",
"key_value": "string",
"key_name": "string",
"hwid": "string",
"discord_user_id": "string",
"kind": "many_ips",
"observed": 1,
"threshold": 1,
"status": "open",
"resolution": "dismissed",
"resolved_at": "2026-09-30T12:00:00.000Z",
"created_at": "2026-09-30T12:00:00.000Z"
}
],
"total": 1,
"open": 1
}
}Resolve a sharing alert
Closes an open alert. dismissed only closes it, revoked also revokes the key, reset_hwid unbinds its device. data.resolved is false when the alert was already resolved.
Path parameters
alertIdintegerrequired> 0
Bodyapplication/json
resolutionstringrequireddismissed — only close; revoked — revoke the key; reset_hwid — unbind its HWID
One ofdismissedrevokedreset_hwid
Response fieldsinside data
resolvedboolean
curl -X POST "https://api.santiauth.com/api/keys/sharing-alerts/3f2b8c1e-4d5a-4e6f-9a7b-8c9d0e1f2a3b/resolve" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"resolution": "revoked"
}'{
"success": true,
"data": {
"resolved": false
}
}Delete expired keys
Removes every expired key of the service, or of one provider with provider_id. data.deleted is the number of keys removed.
Query parameters
service_idintegerrequired> 0Service the resource belongs to
provider_idinteger> 0Optional provider ID to limit deletion to specific provider's expired keys
Response fieldsinside data
okbooleanOperation success indicator
One oftruedeletedintegerNumber of expired keys deleted
curl -X DELETE "https://api.santiauth.com/api/keys/expired?service_id=1" \
-H "x-api-key: $SANTIAUTH_API_KEY"{
"success": true,
"data": {
"ok": true,
"deleted": 42
}
}Export keys
Streams a file instead of JSON — csv, json (newline-delimited) or txt (one key per line). Accepts the same filters as List keys.
Query parameters
service_idintegerrequired> 0Service the resource belongs to
folder_idinteger> 0Filter keys by folder ID
formatstringrequiredExport format. Options: csv, json, txt
One ofcsvjsontxtkeys_viewstringFilter keys by type. Options: premium, standard
One ofpremiumstandardsearchstring≥ 2 charsSearch term to filter keys (minimum 2 characters)
statusstringFilter keys by status. Options: active, used, expired, disabled
One ofactiveusedexpireddisabledprovider_idinteger> 0Filter keys by provider ID
sortstringSort order: status (disabled/expired first), status_active (active first), newest (alias id), oldest, expires_soon, expires_late
One ofstatusstatus_activeidnewestoldestexpires_soonexpires_lateDefault"status"discord_user_idstringOnly keys linked to this Discord user
discordstringOnly keys with (linked) or without (unlinked) a Discord account
One oflinkedunlinkedrobloxstring1–64 charsRoblox username substring or exact Roblox user id
hwidstringOnly keys bound (or not yet bound) to a device
One ofboundunboundexecutorstring1–64 charsOnly keys validated at least once from this executor
expiresstringKeys that never expire, or unexpired keys expiring within the window
One ofnever24h7d30dcreated_fromdatetime | nullCreated at or after this ISO timestamp
created_todatetime | nullCreated at or before this ISO timestamp
curl "https://api.santiauth.com/api/keys/export?service_id=1&format=csv&status=active" \
-H "x-api-key: $SANTIAUTH_API_KEY"Body: text/csvImport keys
Uploads existing keys from a CSV file, for example when migrating from another platform. Rows that fail validation are skipped and listed in data.errors.
Bodymultipart/form-data
filefilerequiredCSV file containing keys to import
provider_iduuidrequiredUUID of the provider to import keys into
template_iduuidOptional template UUID for default key settings
service_idstringOptional service to attach the keys to. Service editors can import into the service's providers.
Response fieldsinside data
importedintegerNumber of keys successfully imported
skippedintegerNumber of keys that were skipped
errorsarray of stringsArray of error messages for failed imports
curl -X POST "https://api.santiauth.com/api/keys/import" \
-H "x-api-key: $SANTIAUTH_API_KEY" \
-F "file=@keys.csv" \
-F "provider_id=1" \
-F "service_id=1"{
"success": true,
"data": {
"imported": 95,
"skipped": 5,
"errors": [
"string"
]
}
}Get filter options
Values for list filters that depend on your data, such as the executors your keys were used from.
Query parameters
service_idintegerrequired> 0Service the resource belongs to
Response fieldsinside data
executorsarray of stringsExecutors that validated this service's keys in the last 90 days, most used first
curl "https://api.santiauth.com/api/keys/filter-options?service_id=1" \
-H "x-api-key: $SANTIAUTH_API_KEY"{
"success": true,
"data": {
"executors": [
"Wave",
"Synapse Z"
]
}
}Buyer self-service
These public endpoints back the buyer key page at /key. They need no API key: the key value itself is the credential, so it always travels in the body. Each is rate-limited per IP.
Look up a key
/api/public/keys/lookupno API keyThe key's status, expiry, device binding, and whether a HWID reset or a transfer is possible right now.
Bodyapplication/json
keystringrequired4–256 charsThe key value
Response fieldsinside data
service_namestringstatusstringOne ofactiveusedexpireddisabledexpires_atstring | nullvalidity_minutesinteger | nullno_hwidbooleanhwid_boundbooleanhwid_resetobjectShowHide 4 child attributes
enabledbooleanThe service lets buyers reset the HWID themselves
resets_leftinteger | nullResets left; null = unlimited
next_reset_atstring | nullWhen the cooldown ends; null = no cooldown
availablebooleanA reset would succeed right now
transferobjectShowHide 4 child attributes
enabledbooleanThe service lets buyers transfer their key
next_transfer_atstring | nullWhen the cooldown ends; null = no cooldown
availablebooleanA transfer would succeed right now
rotatesbooleanA transfer issues a new key value; the old one stops working
curl -X POST "https://api.santiauth.com/api/public/keys/lookup" \
-H "Content-Type: application/json" \
-d '{
"key": "SANTI-ABCD-EFGH-IJKL"
}'{
"success": true,
"data": {
"service_name": "string",
"status": "active",
"expires_at": "string",
"validity_minutes": 1,
"no_hwid": false,
"hwid_bound": false,
"hwid_reset": {
"enabled": false,
"resets_left": 1,
"next_reset_at": "string",
"available": false
},
"transfer": {
"enabled": false,
"next_transfer_at": "string",
"available": false,
"rotates": false
}
}
}Transfer a key
/api/public/keys/transferno API keyHands the key to someone else: clears its device, Roblox and Discord bindings and, with discord_user_id, binds the new holder. Works only when the service turns on transfers, once per its cooldown (429 KEY_TRANSFER_COOLDOWN with next_transfer_at otherwise). A Discord account banned from the service can't receive keys (403 KEY_TRANSFER_BANNED). With New key on transfer on (Settings → Keys → Key lifecycle, the default), the key gets a new value: the response carries new_key, the new holder also gets it by Discord DM, the old value stops validating and loader sessions on it end at their next heartbeat. lookup reports this as transfer.rotates.
Bodyapplication/json
keystringrequired4–256 charsThe key value
discord_user_idstringThe new holder's Discord user id; omit to just release the key
Response fieldsinside data
next_transfer_atstring | nullnew_keystringoptionalThe key's new value when the service rotates keys on transfer
curl -X POST "https://api.santiauth.com/api/public/keys/transfer" \
-H "Content-Type: application/json" \
-d '{
"key": "SANTI-ABCD-EFGH-IJKL",
"discord_user_id": "1550213780359610410"
}'{
"success": true,
"data": {
"next_transfer_at": "string",
"new_key": "string"
}
}