Tether · Authentication Profile

Tether Authentication

Authentication

Tether secures its APIs with apiKey across 1 declared security scheme, as derived from its OpenAPI definitions.

CompanyStablecoinsCryptocurrencyBlockchainWalletsDigital AssetsPaymentsSelf-CustodyMulti-ChainAgentsMCPOpen Source
Methods: apiKey Schemes: 1 OAuth flows: API key in: header

Security Schemes

ApiKeyAuth apiKey
· in: header (X-API-KEY)

Source

Authentication Profile

Raw ↑
generated: '2026-08-05'
method: searched
source: openapi/tether-wdk-indexer-openapi-original.yml
docs: https://docs.wdk.tether.io/tools/indexer-api/api-reference
summary:
  types:
  - apiKey
  api_key_in:
  - header
  oauth2_flows: []
  x-note: >-
    Single-scheme provider. No OAuth 2.0, no OpenID Connect, no mutual TLS, no HTTP
    basic or bearer anywhere in Tether's public API surface — which is why no
    scopes/ artifact is emitted (there is no scope surface to describe).
schemes:
- name: ApiKeyAuth
  type: apiKey
  in: header
  parameter: X-API-KEY
  description: API key obtained via the registration form. Include in the X-API-KEY
    header for all authenticated requests.
  sources:
  - openapi/tether-wdk-indexer-openapi-original.yml
issuance:
  self_service: true
  registration_url: https://wdk-api.tether.io/register
  cost: free
  api_managed: true
  operations:
  - operationId: createApiKey
    method: POST
    path: /api/v1/keys
    note: Returns the plaintext key ONCE, plus its hashedKey, owner, ttl, label,
      createdAt and lastActive.
  - operationId: listApiKeys
    method: GET
    path: /api/v1/keys
    note: >-
      Also returns the key's own rate-limit budget as `max` and `timeWindow` — the
      only runtime path to that figure, since no RateLimit-* headers are sent.
  - operationId: deleteApiKey
    method: DELETE
    path: /api/v1/keys/{hashedKey}
    note: Keys are revoked by HASH, so a revocation script never handles plaintext.
  expiry:
    field: ttl
    unit: milliseconds
    no_expiry_value: 0
unauthenticated_operations:
- operationId: getHealth
  path: GET /api/v1/health
- operationId: listChains
  path: GET /api/v1/chains
failure_semantics:
  '401': Unauthorized — API key EXPIRED.
  '403': Forbidden — API key MISSING or INVALID.
  x-note: >-
    Inverted relative to the common convention, where a missing credential is 401.
    Rotation logic must trigger on 401, not 403.
sdk_and_agent_auth:
  x-note: >-
    The WDK SDK, CLI and MCP Toolkit do not authenticate to Tether at all — they are
    self-custodial and authenticate to CHAINS with a locally held BIP-39 seed. The
    only Tether credential in that stack is the optional Indexer API key passed to
    `useIndexer({ apiKey })`, plus an optional MoonPay key for the fiat modules.
  secret_handling_published:
  - Seed phrases stay local; `close()` wipes keys from memory.
  - Read and write tool sets are separable so an operator can grant read-only access.
  - Docs mandate a dedicated development wallet with limited funds.
  - '@tetherto/wdk-secret-manager generates, encrypts and manages seeds.'
  - '@tetherto/wdk-react-native-secure-storage backs mobile secret storage.'
  security_model_doc: https://docs.wdk.tether.io/cli/reference/security-model
x-evidence:
  fetched: '2026-08-05'
  urls:
  - url: https://wdk-api.tether.io/docs/json
    http_status: 200
  - url: https://docs.wdk.tether.io/tools/indexer-api/api-reference
    http_status: 200
  - url: https://docs.wdk.tether.io/tools/indexer-api/get-started
    http_status: 200