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

POST/api/keyskeys:write

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> 0

    ID of the provider this key belongs to

  • service_idinteger | null> 0

    Optional ID of the service this key is associated with

  • folder_idinteger | null> 0

    Optional ID of the folder to organize this key

  • minutesinteger | null> 0

    Key validity duration in minutes. Cannot be used with expires_in_days

  • expires_in_daysinteger | null1–36500

    Key validity duration in days (1-36500). Cannot be used with minutes

  • hwidstring | null≤ 512 chars

    Hardware ID to bind this key to a specific device. Cannot be used with no_hwid=true

  • key_typestring | null

    Key type classification. Options: free, premium. Must match is_premium value

    One offreepremium
  • is_premiumboolean

    Whether this is a premium key. Must match key_type if provided

    Default false
  • one_time_useboolean

    Whether the key can only be used once

    Default false
  • expiry_on_first_useboolean

    Whether the key expiry timer starts on first use instead of creation

    Default false
  • no_hwidboolean

    Whether to disable hardware ID binding. Cannot be used with hwid or hwid_limit

    Default false
  • hwid_limitinteger | null≥ 1

    Maximum number of hardware IDs that can use this key. Cannot be used with no_hwid=true

  • key_namestring | null≤ 64 chars

    Optional custom name for the key

Response fieldsinside data
  • keyIduuid

    Created key unique identifier

  • keystring

    The actual key value

  • expiresInMinutesinteger | null

    Key expiration duration in minutes

  • oneTimeUseboolean

    Whether the key can only be used once

  • expiryOnFirstUseboolean

    Whether the key expiry timer starts on first use

  • validityMinutesinteger | null

    Key validity duration in minutes

  • hwidLimitinteger | null

    Maximum 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"
}'
201 Created
{
  "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

POST/api/keys/batchkeys:write

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> 0

    ID of the provider this key belongs to

  • service_idinteger | null> 0

    Optional ID of the service this key is associated with

  • folder_idinteger | null> 0

    Optional ID of the folder to organize this key

  • minutesinteger | null> 0

    Key validity duration in minutes. Cannot be used with expires_in_days

  • expires_in_daysinteger | null1–36500

    Key validity duration in days (1-36500). Cannot be used with minutes

  • hwidstring | null≤ 512 chars

    Hardware ID to bind this key to a specific device. Cannot be used with no_hwid=true

  • key_typestring | null

    Key type classification. Options: free, premium. Must match is_premium value

    One offreepremium
  • is_premiumboolean

    Whether this is a premium key. Must match key_type if provided

    Default false
  • one_time_useboolean

    Whether the key can only be used once

    Default false
  • expiry_on_first_useboolean

    Whether the key expiry timer starts on first use instead of creation

    Default false
  • no_hwidboolean

    Whether to disable hardware ID binding. Cannot be used with hwid or hwid_limit

    Default false
  • hwid_limitinteger | null≥ 1

    Maximum number of hardware IDs that can use this key. Cannot be used with no_hwid=true

  • countintegerrequired1–100

    Number of keys to generate in batch (1-100)

Response fieldsinside data
  • okboolean

    Whether the batch operation succeeded

  • createdinteger

    Number 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
}'
200 OK
{
  "success": true,
  "data": {
    "ok": true,
    "created": 10
  }
}

List keys

GET/api/keyskeys:read

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

  • paginatedstring

    Whether to return paginated results

    One oftruefalseDefault true
  • pagenumber≥ 1

    Page number for pagination (1-indexed)

    Default 1
  • limitnumber1–100

    Number of keys per page (1-100)

    Default 25
  • sortstring

    Sort order: status (disabled/expired first), status_active (active first), newest (alias id), oldest, expires_soon, expires_late

    One ofstatusstatus_activeidnewestoldestexpires_soonexpires_lateDefault "status"
  • keys_viewstring

    Filter keys by type. Options: premium, standard

    One ofpremiumstandard
  • searchstring≥ 2 chars

    Search term to filter keys (minimum 2 characters)

  • statusstring

    Filter keys by status. Options: active, used, expired, disabled

    One ofactiveusedexpireddisabled
  • provider_idinteger> 0

    Filter keys by provider ID

  • service_idintegerrequired> 0

    Service the resource belongs to

  • folder_idinteger> 0

    Filter keys by folder ID

  • discord_user_idstring

    Only keys linked to this Discord user

  • discordstring

    Only keys with (linked) or without (unlinked) a Discord account

    One oflinkedunlinked
  • robloxstring1–64 chars

    Roblox username substring or exact Roblox user id

  • hwidstring

    Only keys bound (or not yet bound) to a device

    One ofboundunbound
  • executorstring1–64 chars

    Only keys validated at least once from this executor

  • expiresstring

    Keys that never expire, or unexpired keys expiring within the window

    One ofnever24h7d30d
  • created_fromdatetime | null

    Created at or after this ISO timestamp

  • created_todatetime | null

    Created at or before this ISO timestamp

Response fieldsinside data
  • keysarray of objects

    Array of key objects

    Show 23 child attributes
    • iduuid

      Key unique identifier

    • key_valuestring

      The actual key value

    • key_namestring | null

      Optional custom name for the key

    • statusstring

      Current key status

      One ofactiveusedexpireddisabled
    • expires_atdatetime | null

      Key expiration timestamp

    • used_atdatetime | null

      Timestamp when key was first used

    • provider_namestring | null

      Name of the provider this key belongs to

    • service_idinteger | null

      ID of the service this key is associated with

    • service_namestring | null

      Name of the service this key is associated with

    • folder_namestring | null

      Name of the folder this key is organized in

    • is_premiumboolean

      Whether this is a premium key

    • one_time_useboolean

      Whether the key can only be used once

    • expiry_on_first_useboolean

      Whether the key expiry timer starts on first use

    • no_hwidboolean

      Whether hardware ID binding is disabled

    • hwid_limitinteger | null

      Maximum number of hardware IDs that can use this key

    • roblox_usernamestring | null

      Roblox username associated with this key

    • roblox_user_idstring | null

      Roblox user id associated with this key

    • discord_user_idstring | null

      Discord user id the key is linked to

    • hwidstring | null

      Device the key is bound to, if any

    • folder_idinteger | null

      Folder the key is organized in, if any

    • validity_minutesinteger | null

      Duration (minutes) granted on activation for expiry_on_first_use keys that haven't started yet

    • is_disabledboolean

      Whether the key was manually disabled

    • created_atdatetime

      Creation timestamp

  • paginationobject

    Pagination metadata

    Show 4 child attributes
    • pageinteger

      Current page number

    • limitinteger

      Keys per page

    • totalinteger

      Total number of keys

    • totalPagesinteger

      Total number of pages

curl "https://api.santiauth.com/api/keys?service_id=1&status=active&limit=50" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "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

PATCH/api/keys/{id}keys:write

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

  • iduuidrequired

    UUID of the key to update

Bodyapplication/json

  • key_namestring | null≤ 64 chars

    Custom name for the key. Send null to clear, omit to leave unchanged.

  • is_premiumboolean

    Whether the key counts as a premium-tier key

  • one_time_useboolean

    Mark the key as single-use after first successful validation. Mutually exclusive with expiry_on_first_use.

  • expiry_on_first_useboolean

    Start the validity countdown from the first successful validation. Mutually exclusive with one_time_use.

  • no_hwidboolean

    Disable HWID locking. When set, hwid_limit is cleared.

  • hwid_limitinteger | null≥ 1

    Maximum number of distinct HWIDs that can use this key. Ignored when no_hwid is true.

  • folder_idinteger | null> 0

    Move the key into a folder of the same service. Send null to remove it from its folder.

  • discord_user_idstring | null

    Link the key to a Discord user. Send null to unlink.

  • expires_atdatetime | null

    Absolute 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–52560000

    Duration granted on activation for expiry_on_first_use keys that haven't started. Send null for lifetime.

  • disabledboolean

    Disable (true) or re-enable (false) the key.

  • reset_hwidboolean

    Unbind the key from its current device.

    One oftrue
  • reset_robloxboolean

    Unlink the Roblox account bound to the key.

    One oftrue
  • reset_usageboolean

    Clear the used-at mark so a one-time key can be redeemed again.

    One oftrue
Response fieldsinside data
  • iduuid

    Key unique identifier

  • key_valuestring

    The actual key value

  • key_namestring | null

    Optional custom name for the key

  • statusstring

    Current key status

    One ofactiveusedexpireddisabled
  • expires_atdatetime | null

    Key expiration timestamp

  • used_atdatetime | null

    Timestamp when key was first used

  • provider_namestring | null

    Name of the provider this key belongs to

  • service_idinteger | null

    ID of the service this key is associated with

  • service_namestring | null

    Name of the service this key is associated with

  • folder_namestring | null

    Name of the folder this key is organized in

  • is_premiumboolean

    Whether this is a premium key

  • one_time_useboolean

    Whether the key can only be used once

  • expiry_on_first_useboolean

    Whether the key expiry timer starts on first use

  • no_hwidboolean

    Whether hardware ID binding is disabled

  • hwid_limitinteger | null

    Maximum number of hardware IDs that can use this key

  • roblox_usernamestring | null

    Roblox username associated with this key

  • roblox_user_idstring | null

    Roblox user id associated with this key

  • discord_user_idstring | null

    Discord user id the key is linked to

  • hwidstring | null

    Device the key is bound to, if any

  • folder_idinteger | null

    Folder the key is organized in, if any

  • validity_minutesinteger | null

    Duration (minutes) granted on activation for expiry_on_first_use keys that haven't started yet

  • is_disabledboolean

    Whether the key was manually disabled

  • created_atdatetime

    Creation 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
}'
200 OK
{
  "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

DELETE/api/keys/{id}keys:write

Deletes one key; scripts using it fail their next key check. To pause a key instead, update it with "disabled": true.

Path parameters

  • iduuidrequired

    UUID of the key to delete

Response fieldsinside data
  • okboolean

    Operation 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"
200 OK
{
  "success": true,
  "data": {
    "ok": true
  }
}

Act on many keys

POST/api/keys/bulkkeys:write

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> 0

    Service the resource belongs to

  • actionstringrequired

    revoke disables the keys, restore re-enables them, extend adds minutes (lifetime keys are skipped), delete removes them, reset_hwid unbinds their devices

    One ofrevokerestoreextenddeletereset_hwid
  • minutesinteger1–5256000

    Minutes to add; required for extend

  • idsarray of uuids≤ 1000 items

    Explicit key ids (up to 1000). Mutually exclusive with filters.

  • filtersobject

    Apply to every key of the service matching these filters. {} selects every key.

    Show 13 child attributes
    • keys_viewstring

      Only premium or only standard keys

      One ofpremiumstandard
    • searchstring≥ 2 chars

      Search term (minimum 2 characters)

    • statusstring

      Only keys with this status

      One ofactiveusedexpireddisabled
    • provider_idinteger> 0

      Only keys of this provider

    • folder_idinteger> 0

      Only keys in this folder

    • discord_user_idstring

      Only keys linked to this Discord user

    • discordstring

      Only keys with (linked) or without (unlinked) a Discord account

      One oflinkedunlinked
    • robloxstring1–64 chars

      Roblox username substring or exact Roblox user id

    • hwidstring

      Only keys bound (or not yet bound) to a device

      One ofboundunbound
    • executorstring1–64 chars

      Only keys validated at least once from this executor

    • expiresstring

      Keys that never expire, or unexpired keys expiring within the window

      One ofnever24h7d30d
    • created_fromdatetime | null

      Created at or after this ISO timestamp

    • created_todatetime | null

      Created at or before this ISO timestamp

Response fieldsinside data
  • actionstring
    One ofrevokerestoreextenddeletereset_hwid
  • affectedinteger

    Keys 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"
  }
}'
200 OK
{
  "success": true,
  "data": {
    "action": "revoke",
    "affected": 42
  }
}

Revoke keys of a refund

POST/api/keys/refundkeys:write

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> 0

    Service the resource belongs to

  • keysarray of stringsrequired≤ 100 items

    Key values delivered for the refunded order (up to 100)

  • reasonstringrequired

    Why the keys are revoked

    One ofrefundchargeback
  • order_idstring1–128 chars

    The store's order id, recorded in the audit log

  • banboolean

    Also ban the key holders (Discord account and bound HWID) from the service

Response fieldsinside data
  • revokedinteger

    Keys revoked by this call

  • not_foundarray of strings

    Values that are not keys of this service

  • bannedinteger

    Holders 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
}'
200 OK
{
  "success": true,
  "data": {
    "revoked": 1,
    "not_found": [
      "string"
    ],
    "banned": 0
  }
}

List sharing alerts

GET/api/keys/sharing-alertskeys:read

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> 0

    Service the resource belongs to

  • statusstring
    One ofopenresolved
  • limitinteger1–100
    Default 25
  • offsetinteger | null≥ 0
    Default 0
Response fieldsinside data
  • itemsarray of objects
    Show 13 child attributes
    • idinteger
    • key_idstring
    • key_valuestring
    • key_namestring | null
    • hwidstring | null
    • discord_user_idstring | null
    • kindstring

      many_ips — too many distinct IPs in an hour; hwid_mismatch — repeated tries from other HWIDs

      One ofmany_ipshwid_mismatch
    • observedinteger
    • thresholdinteger
    • statusstring
      One ofopenresolved
    • resolutionstring | null
      One ofdismissedrevokedreset_hwid
    • resolved_atdatetime | null
    • created_atdatetime
  • totalinteger
  • openinteger
curl "https://api.santiauth.com/api/keys/sharing-alerts?service_id=1&status=open&limit=25" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "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

POST/api/keys/sharing-alerts/{alertId}/resolvekeys:write

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

  • resolutionstringrequired

    dismissed — 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"
}'
200 OK
{
  "success": true,
  "data": {
    "resolved": false
  }
}

Delete expired keys

DELETE/api/keys/expiredkeys:write

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> 0

    Service the resource belongs to

  • provider_idinteger> 0

    Optional provider ID to limit deletion to specific provider's expired keys

Response fieldsinside data
  • okboolean

    Operation success indicator

    One oftrue
  • deletedinteger

    Number of expired keys deleted

curl -X DELETE "https://api.santiauth.com/api/keys/expired?service_id=1" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "success": true,
  "data": {
    "ok": true,
    "deleted": 42
  }
}

Export keys

GET/api/keys/exportkeys:read

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> 0

    Service the resource belongs to

  • folder_idinteger> 0

    Filter keys by folder ID

  • formatstringrequired

    Export format. Options: csv, json, txt

    One ofcsvjsontxt
  • keys_viewstring

    Filter keys by type. Options: premium, standard

    One ofpremiumstandard
  • searchstring≥ 2 chars

    Search term to filter keys (minimum 2 characters)

  • statusstring

    Filter keys by status. Options: active, used, expired, disabled

    One ofactiveusedexpireddisabled
  • provider_idinteger> 0

    Filter keys by provider ID

  • sortstring

    Sort 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_idstring

    Only keys linked to this Discord user

  • discordstring

    Only keys with (linked) or without (unlinked) a Discord account

    One oflinkedunlinked
  • robloxstring1–64 chars

    Roblox username substring or exact Roblox user id

  • hwidstring

    Only keys bound (or not yet bound) to a device

    One ofboundunbound
  • executorstring1–64 chars

    Only keys validated at least once from this executor

  • expiresstring

    Keys that never expire, or unexpired keys expiring within the window

    One ofnever24h7d30d
  • created_fromdatetime | null

    Created at or after this ISO timestamp

  • created_todatetime | null

    Created 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"
200 OKtext/csv
Body: text/csv

Import keys

POST/api/keys/importkeys:write

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

  • filefilerequired

    CSV file containing keys to import

  • provider_iduuidrequired

    UUID of the provider to import keys into

  • template_iduuid

    Optional template UUID for default key settings

  • service_idstring

    Optional service to attach the keys to. Service editors can import into the service's providers.

Response fieldsinside data
  • importedinteger

    Number of keys successfully imported

  • skippedinteger

    Number of keys that were skipped

  • errorsarray of strings

    Array 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"
200 OK
{
  "success": true,
  "data": {
    "imported": 95,
    "skipped": 5,
    "errors": [
      "string"
    ]
  }
}

Get filter options

GET/api/keys/filter-optionskeys:read

Values for list filters that depend on your data, such as the executors your keys were used from.

Query parameters

  • service_idintegerrequired> 0

    Service the resource belongs to

Response fieldsinside data
  • executorsarray of strings

    Executors 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"
200 OK
{
  "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

POST/api/public/keys/lookupno API key

The key's status, expiry, device binding, and whether a HWID reset or a transfer is possible right now.

Bodyapplication/json

  • keystringrequired4–256 chars

    The key value

Response fieldsinside data
  • service_namestring
  • statusstring
    One ofactiveusedexpireddisabled
  • expires_atstring | null
  • validity_minutesinteger | null
  • no_hwidboolean
  • hwid_boundboolean
  • hwid_resetobject
    Show 4 child attributes
    • enabledboolean

      The service lets buyers reset the HWID themselves

    • resets_leftinteger | null

      Resets left; null = unlimited

    • next_reset_atstring | null

      When the cooldown ends; null = no cooldown

    • availableboolean

      A reset would succeed right now

  • transferobject
    Show 4 child attributes
    • enabledboolean

      The service lets buyers transfer their key

    • next_transfer_atstring | null

      When the cooldown ends; null = no cooldown

    • availableboolean

      A transfer would succeed right now

    • rotatesboolean

      A 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"
}'
200 OK
{
  "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

POST/api/public/keys/transferno API key

Hands 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 chars

    The key value

  • discord_user_idstring

    The new holder's Discord user id; omit to just release the key

Response fieldsinside data
  • next_transfer_atstring | null
  • new_keystringoptional

    The 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"
}'
200 OK
{
  "success": true,
  "data": {
    "next_transfer_at": "string",
    "new_key": "string"
  }
}