# Approve activity Source: https://docs.turnkey.com/api-reference/activities/approve-activity Approve an activity. Enum options: `ACTIVITY_TYPE_APPROVE_ACTIVITY` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

An artifact verifying a User's action.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The approveActivityIntent object An artifact verifying a User's action. The result of the activity A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/approve_activity \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_APPROVE_ACTIVITY", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "fingerprint": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().approveActivity({ fingerprint: " (An artifact verifying a User's action.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_APPROVE_ACTIVITY", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "approveActivityIntent": { "fingerprint": "" } }, "result": " (approved activity result, if completed)", "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Broadcast EVM transaction Source: https://docs.turnkey.com/api-reference/activities/broadcast-evm-transaction Submit a transaction intent describing an EVM transaction you would like to broadcast. Enum options: `ACTIVITY_TYPE_ETH_SEND_TRANSACTION` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. Enum options: `eip155:1`, `eip155:11155111`, `eip155:8453`, `eip155:84532`, `eip155:137`, `eip155:80002` Recipient address as a hex string with 0x prefix. Amount of native asset to send in wei. Hex-encoded call data for contract interactions. Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations. Maximum amount of gas to use for this transaction, for EIP-1559 transactions. Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The ethSendTransactionIntent object A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet). Enum options: `eip155:1`, `eip155:11155111`, `eip155:8453`, `eip155:84532`, `eip155:137`, `eip155:80002` Recipient address as a hex string with 0x prefix. Amount of native asset to send in wei. Hex-encoded call data for contract interactions. Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations. Maximum amount of gas to use for this transaction, for EIP-1559 transactions. Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture. The result of the activity The ethSendTransactionResult object The send\_transaction\_status ID associated with the transaction submission A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/eth_send_transaction \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "from": "", "sponsor": "", "caip2": "", "to": "", "value": "", "data": "", "nonce": "", "gasLimit": "", "maxFeePerGas": "", "maxPriorityFeePerGas": "", "gasStationNonce": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().ethSendTransaction({ from: " (A wallet or private key address to sign with. This does not support private key IDs.)", sponsor: true // Whether to sponsor this transaction via Gas Station., caip2: "" // CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)., to: " (Recipient address as a hex string with 0x prefix.)", value: " (Amount of native asset to send in wei.)", data: " (Hex-encoded call data for contract interactions.)", nonce: " (Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations.)", gasLimit: " (Maximum amount of gas to use for this transaction, for EIP-1559 transactions.)", maxFeePerGas: " (Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.)", maxPriorityFeePerGas: " (Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.)", gasStationNonce: " (The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "ethSendTransactionIntent": { "from": "", "sponsor": "", "caip2": "", "to": "", "value": "", "data": "", "nonce": "", "gasLimit": "", "maxFeePerGas": "", "maxPriorityFeePerGas": "", "gasStationNonce": "" } }, "result": { "ethSendTransactionResult": { "sendTransactionStatusId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Broadcast SVM transaction Source: https://docs.turnkey.com/api-reference/activities/broadcast-svm-transaction Submit a transaction intent describing an SVM transaction you would like to broadcast. Enum options: `ACTIVITY_TYPE_SOL_SEND_TRANSACTION` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Base64-encoded serialized unsigned Solana transaction A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. Enum options: `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`, `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG`, `solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY` user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The solSendTransactionIntent object Base64-encoded serialized unsigned Solana transaction A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Enum options: `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`, `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG`, `solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY` user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution The result of the activity The solSendTransactionResult object The send\_transaction\_status ID associated with the transaction submission A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/sol_send_transaction \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "unsignedTransaction": "", "signWith": "", "sponsor": "", "caip2": "", "recentBlockhash": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().solSendTransaction({ unsignedTransaction: " (Base64-encoded serialized unsigned Solana transaction)", signWith: " (A wallet or private key address to sign with. This does not support private key IDs.)", sponsor: true // Whether to sponsor this transaction via Gas Station., caip2: "" // CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet)., recentBlockhash: " (user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "solSendTransactionIntent": { "unsignedTransaction": "", "signWith": "", "sponsor": "", "caip2": "", "recentBlockhash": "" } }, "result": { "solSendTransactionResult": { "sendTransactionStatusId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create a Fiat On Ramp Credential Source: https://docs.turnkey.com/api-reference/activities/create-a-fiat-on-ramp-credential Create a fiat on ramp provider credential Enum options: `ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. If the on-ramp credential is a sandbox credential
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createFiatOnRampCredentialIntent object onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. If the on-ramp credential is a sandbox credential The result of the activity The createFiatOnRampCredentialResult object Unique identifier of the Fiat On-Ramp credential that was created A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_fiat_on_ramp_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "", "sandboxMode": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createFiatOnRampCredential({ onrampProvider: "" // onrampProvider field, projectId: " (Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier)", publishableApiKey: " (Publishable API key for the on-ramp provider)", encryptedSecretApiKey: " (Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key)", encryptedPrivateApiKey: " (Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key.)", sandboxMode: true // If the on-ramp credential is a sandbox credential }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createFiatOnRampCredentialIntent": { "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "", "sandboxMode": "" } }, "result": { "createFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create an OAuth 2.0 Credential Source: https://docs.turnkey.com/api-reference/activities/create-an-oauth-20-credential Enable authentication for end users with an OAuth 2.0 provider Enum options: `ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createOauth2CredentialIntent object provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key The result of the activity The createOauth2CredentialResult object Unique identifier of the OAuth 2.0 credential that was created A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_oauth2_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "provider": "", "clientId": "", "encryptedClientSecret": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createOauth2Credential({ provider: "" // provider field, clientId: " (The Client ID issued by the OAuth 2.0 provider)", encryptedClientSecret: " (The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createOauth2CredentialIntent": { "provider": "", "clientId": "", "encryptedClientSecret": "" } }, "result": { "createOauth2CredentialResult": { "oauth2CredentialId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create API keys Source: https://docs.turnkey.com/api-reference/activities/create-api-keys Add API keys to an existing user. Enum options: `ACTIVITY_TYPE_CREATE_API_KEYS_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of API Keys.

Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last.
Unique identifier for a given User.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createApiKeysIntentV2 object A list of API Keys. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. Unique identifier for a given User. The result of the activity The createApiKeysResult object A list of API Key IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_api_keys \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "userId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createApiKeys({ apiKeys: [{ // A list of API Keys., apiKeyName: " (Human-readable name for an API Key.)", publicKey: " (The public component of a cryptographic key pair used to sign messages and transactions.)", curveType: "" // curveType field, expirationSeconds: " (Optional window (in seconds) indicating how long the API Key should last.)", }], userId: " (Unique identifier for a given User.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createApiKeysIntentV2": { "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "userId": "" } }, "result": { "createApiKeysResult": { "apiKeyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create authenticators Source: https://docs.turnkey.com/api-reference/activities/create-authenticators Create authenticators to authenticate requests to Turnkey. Enum options: `ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of Authenticators.

Human-readable name for an Authenticator. Challenge presented for authentication purposes.

attestation field

The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID`
Unique identifier for a given User.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createAuthenticatorsIntentV2 object A list of Authenticators. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for a given User. The result of the activity The createAuthenticatorsResult object A list of Authenticator IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_authenticators \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "userId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createAuthenticators({ authenticators: [{ // A list of Authenticators., authenticatorName: " (Human-readable name for an Authenticator.)", challenge: " (Challenge presented for authentication purposes.)", attestation: { // attestation field, credentialId: " (The cbor encoded then base64 url encoded id of the credential.)", clientDataJson: " (A base64 url encoded payload containing metadata about the signing context and the challenge.)", attestationObject: " (A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses.)", transports: "" // The type of authenticator transports., }, }], userId: " (Unique identifier for a given User.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createAuthenticatorsIntentV2": { "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "userId": "" } }, "result": { "createAuthenticatorsResult": { "authenticatorIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create invitations Source: https://docs.turnkey.com/api-reference/activities/create-invitations Create invitations to join an existing organization. Enum options: `ACTIVITY_TYPE_CREATE_INVITATIONS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of Invitations.

The name of the intended Invitation recipient. The email address of the intended Invitation recipient.

A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body.

Array item type: string

item field

Enum options: `ACCESS_TYPE_WEB`, `ACCESS_TYPE_API`, `ACCESS_TYPE_ALL` Unique identifier for the Sender of an Invitation.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createInvitationsIntent object A list of Invitations. The name of the intended Invitation recipient. The email address of the intended Invitation recipient. A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body. item field accessType field Enum options: `ACCESS_TYPE_WEB`, `ACCESS_TYPE_API`, `ACCESS_TYPE_ALL` Unique identifier for the Sender of an Invitation. The result of the activity The createInvitationsResult object A list of Invitation IDs item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_invitations \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_INVITATIONS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "invitations": [ { "receiverUserName": "", "receiverUserEmail": "", "receiverUserTags": [ "" ], "accessType": "", "senderUserId": "" } ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createInvitations({ invitations: [{ // A list of Invitations., receiverUserName: " (The name of the intended Invitation recipient.)", receiverUserEmail: " (The email address of the intended Invitation recipient.)", receiverUserTags: [""] // A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body., accessType: "" // accessType field, senderUserId: " (Unique identifier for the Sender of an Invitation.)", }] }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_INVITATIONS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createInvitationsIntent": { "invitations": [ { "receiverUserName": "", "receiverUserEmail": "", "receiverUserTags": [ "" ], "accessType": "", "senderUserId": "" } ] } }, "result": { "createInvitationsResult": { "invitationIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create Oauth providers Source: https://docs.turnkey.com/api-reference/activities/create-oauth-providers Create Oauth providers for a specified user. Enum options: `ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the User to add an Oauth provider to

A list of Oauth providers.

Human-readable name to identify a Provider. Base64 encoded OIDC token
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createOauthProvidersIntent object The ID of the User to add an Oauth provider to A list of Oauth providers. Human-readable name to identify a Provider. Base64 encoded OIDC token The result of the activity The createOauthProvidersResult object A list of unique identifiers for Oauth Providers item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_oauth_providers \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createOauthProviders({ userId: " (The ID of the User to add an Oauth provider to)", oauthProviders: [{ // A list of Oauth providers., providerName: " (Human-readable name to identify a Provider.)", oidcToken: " (Base64 encoded OIDC token)", }] }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createOauthProvidersIntent": { "userId": "", "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } }, "result": { "createOauthProvidersResult": { "providerIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create policies Source: https://docs.turnkey.com/api-reference/activities/create-policies Create new policies. Enum options: `ACTIVITY_TYPE_CREATE_POLICIES` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

An array of policy intents to be created.

Human-readable name for a Policy. Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createPoliciesIntent object An array of policy intents to be created. Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy. The result of the activity The createPoliciesResult object A list of unique identifiers for the created policies. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_policies \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_POLICIES", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "policies": [ { "policyName": "", "effect": "", "condition": "", "consensus": "", "notes": "" } ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createPolicies({ policies: [{ // An array of policy intents to be created., policyName: " (Human-readable name for a Policy.)", effect: "" // effect field, condition: " (The condition expression that triggers the Effect)", consensus: " (The consensus expression that triggers the Effect)", notes: " (Notes for a Policy.)", }] }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_POLICIES", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createPoliciesIntent": { "policies": [ { "policyName": "", "effect": "", "condition": "", "consensus": "", "notes": "" } ] } }, "result": { "createPoliciesResult": { "policyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create policy Source: https://docs.turnkey.com/api-reference/activities/create-policy Create a new policy. Enum options: `ACTIVITY_TYPE_CREATE_POLICY_V3` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Human-readable name for a Policy. Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createPolicyIntentV3 object Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy. The result of the activity The createPolicyResult object Unique identifier for a given Policy. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_policy \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_POLICY_V3", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "policyName": "", "effect": "", "condition": "", "consensus": "", "notes": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createPolicy({ policyName: " (Human-readable name for a Policy.)", effect: "" // effect field, condition: " (The condition expression that triggers the Effect)", consensus: " (The consensus expression that triggers the Effect)", notes: " (Notes for a Policy.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_POLICY_V3", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createPolicyIntentV3": { "policyName": "", "effect": "", "condition": "", "consensus": "", "notes": "" } }, "result": { "createPolicyResult": { "policyId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create private key tag Source: https://docs.turnkey.com/api-reference/activities/create-private-key-tag Create a private key tag and add it to private keys. Enum options: `ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Human-readable name for a Private Key Tag.

A list of Private Key IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createPrivateKeyTagIntent object Human-readable name for a Private Key Tag. A list of Private Key IDs. item field The result of the activity The createPrivateKeyTagResult object Unique identifier for a given Private Key Tag. A list of Private Key IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_private_key_tag \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "privateKeyTagName": "", "privateKeyIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createPrivateKeyTag({ privateKeyTagName: " (Human-readable name for a Private Key Tag.)", privateKeyIds: [""] // A list of Private Key IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createPrivateKeyTagIntent": { "privateKeyTagName": "", "privateKeyIds": [ "" ] } }, "result": { "createPrivateKeyTagResult": { "privateKeyTagId": "", "privateKeyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create private keys Source: https://docs.turnkey.com/api-reference/activities/create-private-keys Create new private keys. Enum options: `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of Private Keys.

Human-readable name for a Private Key. Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256`

A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body.

Array item type: string

item field

Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createPrivateKeysIntentV2 object A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` The result of the activity The createPrivateKeysResultV2 object A list of Private Key IDs and addresses. privateKeyId field addresses field format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_private_keys \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "privateKeys": [ { "privateKeyName": "", "curve": "", "privateKeyTags": [ "" ], "addressFormats": [ "" ] } ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createPrivateKeys({ privateKeys: [{ // A list of Private Keys., privateKeyName: " (Human-readable name for a Private Key.)", curve: "" // curve field, privateKeyTags: [""] // A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body., addressFormats: "" // Cryptocurrency-specific formats for a derived address (e.g., Ethereum)., }] }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createPrivateKeysIntentV2": { "privateKeys": [ { "privateKeyName": "", "curve": "", "privateKeyTags": [ "" ], "addressFormats": [ "" ] } ] } }, "result": { "createPrivateKeysResultV2": { "privateKeys": [ { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] } ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create read only session Source: https://docs.turnkey.com/api-reference/activities/create-read-only-session Create a read only session for a user (valid for 1 hour). Enum options: `ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization. The parameters object containing the specific intent data for this activity. Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createReadOnlySessionIntent object The result of the activity The createReadOnlySessionResult object Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. String representing a read only session UTC timestamp in seconds representing the expiry time for the read only session. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_read_only_session \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": {} }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createReadOnlySession({}); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createReadOnlySessionIntent": {} }, "result": { "createReadOnlySessionResult": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "session": "", "sessionExpiry": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create read write session Source: https://docs.turnkey.com/api-reference/activities/create-read-write-session Create a read write session for a user. Enum options: `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted. Unique identifier for a given User. Optional human-readable name for an API Key. If none provided, default to Read Write Session - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated ReadWriteSession API keys
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createReadWriteSessionIntentV2 object Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted. Unique identifier for a given User. Optional human-readable name for an API Key. If none provided, default to Read Write Session - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated ReadWriteSession API keys The result of the activity The createReadWriteSessionResultV2 object Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. Unique identifier for the created API key. HPKE encrypted credential bundle A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_read_write_session \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "targetPublicKey": "", "userId": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createReadWriteSession({ targetPublicKey: " (Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted.)", userId: " (Unique identifier for a given User.)", apiKeyName: " (Optional human-readable name for an API Key. If none provided, default to Read Write Session - )", expirationSeconds: " (Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.)", invalidateExisting: true // Invalidate all other previously generated ReadWriteSession API keys }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createReadWriteSessionIntentV2": { "targetPublicKey": "", "userId": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" } }, "result": { "createReadWriteSessionResultV2": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "apiKeyId": "", "credentialBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create smart contract interface Source: https://docs.turnkey.com/api-reference/activities/create-smart-contract-interface Create an ABI/IDL in JSON. Enum options: `ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Corresponding contract address or program ID ABI/IDL as a JSON string. Limited to 400kb Enum options: `SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM`, `SMART_CONTRACT_INTERFACE_TYPE_SOLANA` Human-readable name for a Smart Contract Interface. Notes for a Smart Contract Interface.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createSmartContractInterfaceIntent object Corresponding contract address or program ID ABI/IDL as a JSON string. Limited to 400kb type field Enum options: `SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM`, `SMART_CONTRACT_INTERFACE_TYPE_SOLANA` Human-readable name for a Smart Contract Interface. Notes for a Smart Contract Interface. The result of the activity The createSmartContractInterfaceResult object The ID of the created Smart Contract Interface. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_smart_contract_interface \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "smartContractAddress": "", "smartContractInterface": "", "type": "", "label": "", "notes": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createSmartContractInterface({ smartContractAddress: " (Corresponding contract address or program ID)", smartContractInterface: " (ABI/IDL as a JSON string. Limited to 400kb)", type: "" // type field, label: " (Human-readable name for a Smart Contract Interface.)", notes: " (Notes for a Smart Contract Interface.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createSmartContractInterfaceIntent": { "smartContractAddress": "", "smartContractInterface": "", "type": "", "label": "", "notes": "" } }, "result": { "createSmartContractInterfaceResult": { "smartContractInterfaceId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create sub-organization Source: https://docs.turnkey.com/api-reference/activities/create-sub-organization Create a new sub-organization. Enum options: `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Name for this sub-organization

Root users to create within this sub-organization

Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890

A list of API Key parameters. This field, if not needed, should be an empty array in your request body.

Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last.

A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body.

Human-readable name for an Authenticator. Challenge presented for authentication purposes.

attestation field

The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID`

A list of Oauth providers. This field, if not needed, should be an empty array in your request body.

Human-readable name to identify a Provider. Base64 encoded OIDC token
The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users

wallet field

Human-readable name for a Wallet.

A list of wallet Accounts. This field, if not needed, should be an empty array in your request body.

Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP`
Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24.
Disable email recovery for the sub-organization Disable email auth for the sub-organization Disable OTP SMS auth for the sub-organization Disable OTP email auth for the sub-organization Signed JWT containing a unique id, expiry, verification type, contact

clientSignature field

The public component of a cryptographic key pair used to create the signature. Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createSubOrganizationIntentV7 object Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization Disable OTP SMS auth for the sub-organization Disable OTP email auth for the sub-organization Signed JWT containing a unique id, expiry, verification type, contact clientSignature field The public component of a cryptographic key pair used to create the signature. scheme field Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message. The result of the activity The createSubOrganizationResultV7 object subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_sub_organization \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "userPhoneNumber": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } ], "rootQuorumThreshold": "", "wallet": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "disableEmailRecovery": "", "disableEmailAuth": "", "disableSmsAuth": "", "disableOtpEmailAuth": "", "verificationToken": "", "clientSignature": { "publicKey": "", "scheme": "", "message": "", "signature": "" } } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createSubOrganization({ subOrganizationName: " (Name for this sub-organization)", rootUsers: [{ // Root users to create within this sub-organization, userName: " (Human-readable name for a User.)", userEmail: " (The user's email address.)", userPhoneNumber: " (The user's phone number in E.164 format e.g. +13214567890)", apiKeys: [{ // A list of API Key parameters. This field, if not needed, should be an empty array in your request body., apiKeyName: " (Human-readable name for an API Key.)", publicKey: " (The public component of a cryptographic key pair used to sign messages and transactions.)", curveType: "" // curveType field, expirationSeconds: " (Optional window (in seconds) indicating how long the API Key should last.)", }], authenticators: [{ // A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body., authenticatorName: " (Human-readable name for an Authenticator.)", challenge: " (Challenge presented for authentication purposes.)", attestation: { // attestation field, credentialId: " (The cbor encoded then base64 url encoded id of the credential.)", clientDataJson: " (A base64 url encoded payload containing metadata about the signing context and the challenge.)", attestationObject: " (A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses.)", transports: "" // The type of authenticator transports., }, }], oauthProviders: [{ // A list of Oauth providers. This field, if not needed, should be an empty array in your request body., providerName: " (Human-readable name to identify a Provider.)", oidcToken: " (Base64 encoded OIDC token)", }], }], rootQuorumThreshold: 0 // The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users, wallet: { // wallet field, walletName: " (Human-readable name for a Wallet.)", accounts: [{ // A list of wallet Accounts. This field, if not needed, should be an empty array in your request body., curve: "" // curve field, pathFormat: "" // pathFormat field, path: " (Path used to generate a wallet Account.)", addressFormat: "" // addressFormat field, }], mnemonicLength: 0 // Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24., }, disableEmailRecovery: true // Disable email recovery for the sub-organization, disableEmailAuth: true // Disable email auth for the sub-organization, disableSmsAuth: true // Disable OTP SMS auth for the sub-organization, disableOtpEmailAuth: true // Disable OTP email auth for the sub-organization, verificationToken: " (Signed JWT containing a unique id, expiry, verification type, contact)", clientSignature: { // clientSignature field, publicKey: " (The public component of a cryptographic key pair used to create the signature.)", scheme: "" // scheme field, message: " (The message that was signed.)", signature: " (The cryptographic signature over the message.)", } }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createSubOrganizationIntentV7": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "userPhoneNumber": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } ], "rootQuorumThreshold": "", "wallet": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "disableEmailRecovery": "", "disableEmailAuth": "", "disableSmsAuth": "", "disableOtpEmailAuth": "", "verificationToken": "", "clientSignature": { "publicKey": "", "scheme": "", "message": "", "signature": "" } } }, "result": { "createSubOrganizationResultV7": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create user tag Source: https://docs.turnkey.com/api-reference/activities/create-user-tag Create a user tag and add it to users. Enum options: `ACTIVITY_TYPE_CREATE_USER_TAG` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Human-readable name for a User Tag.

A list of User IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createUserTagIntent object Human-readable name for a User Tag. A list of User IDs. item field The result of the activity The createUserTagResult object Unique identifier for a given User Tag. A list of User IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_user_tag \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_USER_TAG", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userTagName": "", "userIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createUserTag({ userTagName: " (Human-readable name for a User Tag.)", userIds: [""] // A list of User IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_USER_TAG", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createUserTagIntent": { "userTagName": "", "userIds": [ "" ] } }, "result": { "createUserTagResult": { "userTagId": "", "userIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create users Source: https://docs.turnkey.com/api-reference/activities/create-users Create users in an existing organization. Enum options: `ACTIVITY_TYPE_CREATE_USERS_V3` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of Users.

Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890

A list of API Key parameters. This field, if not needed, should be an empty array in your request body.

Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last.

A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body.

Human-readable name for an Authenticator. Challenge presented for authentication purposes.

attestation field

The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID`

A list of Oauth providers. This field, if not needed, should be an empty array in your request body.

Human-readable name to identify a Provider. Base64 encoded OIDC token

A list of User Tag IDs. This field, if not needed, should be an empty array in your request body.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createUsersIntentV3 object A list of Users. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field The result of the activity The createUsersResult object A list of User IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_users \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_USERS_V3", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "users": [ { "userName": "", "userEmail": "", "userPhoneNumber": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ], "userTags": [ "" ] } ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createUsers({ users: [{ // A list of Users., userName: " (Human-readable name for a User.)", userEmail: " (The user's email address.)", userPhoneNumber: " (The user's phone number in E.164 format e.g. +13214567890)", apiKeys: [{ // A list of API Key parameters. This field, if not needed, should be an empty array in your request body., apiKeyName: " (Human-readable name for an API Key.)", publicKey: " (The public component of a cryptographic key pair used to sign messages and transactions.)", curveType: "" // curveType field, expirationSeconds: " (Optional window (in seconds) indicating how long the API Key should last.)", }], authenticators: [{ // A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body., authenticatorName: " (Human-readable name for an Authenticator.)", challenge: " (Challenge presented for authentication purposes.)", attestation: { // attestation field, credentialId: " (The cbor encoded then base64 url encoded id of the credential.)", clientDataJson: " (A base64 url encoded payload containing metadata about the signing context and the challenge.)", attestationObject: " (A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses.)", transports: "" // The type of authenticator transports., }, }], oauthProviders: [{ // A list of Oauth providers. This field, if not needed, should be an empty array in your request body., providerName: " (Human-readable name to identify a Provider.)", oidcToken: " (Base64 encoded OIDC token)", }], userTags: [""] // A list of User Tag IDs. This field, if not needed, should be an empty array in your request body., }] }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_USERS_V3", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createUsersIntentV3": { "users": [ { "userName": "", "userEmail": "", "userPhoneNumber": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ], "userTags": [ "" ] } ] } }, "result": { "createUsersResult": { "userIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create wallet Source: https://docs.turnkey.com/api-reference/activities/create-wallet Create a wallet and derive addresses. Enum options: `ACTIVITY_TYPE_CREATE_WALLET` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Human-readable name for a Wallet.

A list of wallet Accounts. This field, if not needed, should be an empty array in your request body.

Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP`
Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createWalletIntent object Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. The result of the activity The createWalletResult object Unique identifier for a Wallet. A list of account addresses. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_wallet \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_WALLET", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createWallet({ walletName: " (Human-readable name for a Wallet.)", accounts: [{ // A list of wallet Accounts. This field, if not needed, should be an empty array in your request body., curve: "" // curve field, pathFormat: "" // pathFormat field, path: " (Path used to generate a wallet Account.)", addressFormat: "" // addressFormat field, }], mnemonicLength: 0 // Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_WALLET", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createWalletIntent": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" } }, "result": { "createWalletResult": { "walletId": "", "addresses": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Create wallet accounts Source: https://docs.turnkey.com/api-reference/activities/create-wallet-accounts Derive additional addresses using an existing wallet. Enum options: `ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Wallet.

A list of wallet Accounts.

Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP`
Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The createWalletAccountsIntent object Unique identifier for a given Wallet. A list of wallet Accounts. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true. The result of the activity The createWalletAccountsResult object A list of derived addresses. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/create_wallet_accounts \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "walletId": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "persist": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().createWalletAccounts({ walletId: " (Unique identifier for a given Wallet.)", accounts: [{ // A list of wallet Accounts., curve: "" // curve field, pathFormat: "" // pathFormat field, path: " (Path used to generate a wallet Account.)", addressFormat: "" // addressFormat field, }], persist: true // Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createWalletAccountsIntent": { "walletId": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "persist": "" } }, "result": { "createWalletAccountsResult": { "addresses": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete a Fiat On Ramp Credential Source: https://docs.turnkey.com/api-reference/activities/delete-a-fiat-on-ramp-credential Delete a fiat on ramp provider credential Enum options: `ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the fiat on-ramp credential to delete
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteFiatOnRampCredentialIntent object The ID of the fiat on-ramp credential to delete The result of the activity The deleteFiatOnRampCredentialResult object Unique identifier of the Fiat On-Ramp credential that was deleted A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_fiat_on_ramp_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "fiatOnrampCredentialId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteFiatOnRampCredential({ fiatOnrampCredentialId: " (The ID of the fiat on-ramp credential to delete)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteFiatOnRampCredentialIntent": { "fiatOnrampCredentialId": "" } }, "result": { "deleteFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete an OAuth 2.0 Credential Source: https://docs.turnkey.com/api-reference/activities/delete-an-oauth-20-credential Disable authentication for end users with an OAuth 2.0 provider Enum options: `ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the OAuth 2.0 credential to delete
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteOauth2CredentialIntent object The ID of the OAuth 2.0 credential to delete The result of the activity The deleteOauth2CredentialResult object Unique identifier of the OAuth 2.0 credential that was deleted A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_oauth2_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "oauth2CredentialId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteOauth2Credential({ oauth2CredentialId: " (The ID of the OAuth 2.0 credential to delete)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteOauth2CredentialIntent": { "oauth2CredentialId": "" } }, "result": { "deleteOauth2CredentialResult": { "oauth2CredentialId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete API keys Source: https://docs.turnkey.com/api-reference/activities/delete-api-keys Remove api keys from a user. Enum options: `ACTIVITY_TYPE_DELETE_API_KEYS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User.

A list of API Key IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteApiKeysIntent object Unique identifier for a given User. A list of API Key IDs. item field The result of the activity The deleteApiKeysResult object A list of API Key IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_api_keys \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_API_KEYS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "apiKeyIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteApiKeys({ userId: " (Unique identifier for a given User.)", apiKeyIds: [""] // A list of API Key IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_API_KEYS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteApiKeysIntent": { "userId": "", "apiKeyIds": [ "" ] } }, "result": { "deleteApiKeysResult": { "apiKeyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete authenticators Source: https://docs.turnkey.com/api-reference/activities/delete-authenticators Remove authenticators from a user. Enum options: `ACTIVITY_TYPE_DELETE_AUTHENTICATORS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User.

A list of Authenticator IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteAuthenticatorsIntent object Unique identifier for a given User. A list of Authenticator IDs. item field The result of the activity The deleteAuthenticatorsResult object Unique identifier for a given Authenticator. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_authenticators \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "authenticatorIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteAuthenticators({ userId: " (Unique identifier for a given User.)", authenticatorIds: [""] // A list of Authenticator IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteAuthenticatorsIntent": { "userId": "", "authenticatorIds": [ "" ] } }, "result": { "deleteAuthenticatorsResult": { "authenticatorIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete invitation Source: https://docs.turnkey.com/api-reference/activities/delete-invitation Delete an existing invitation. Enum options: `ACTIVITY_TYPE_DELETE_INVITATION` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Invitation object.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteInvitationIntent object Unique identifier for a given Invitation object. The result of the activity The deleteInvitationResult object Unique identifier for a given Invitation. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_invitation \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_INVITATION", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "invitationId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteInvitation({ invitationId: " (Unique identifier for a given Invitation object.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_INVITATION", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteInvitationIntent": { "invitationId": "" } }, "result": { "deleteInvitationResult": { "invitationId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete Oauth providers Source: https://docs.turnkey.com/api-reference/activities/delete-oauth-providers Remove Oauth providers for a specified user. Enum options: `ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the User to remove an Oauth provider from

Unique identifier for a given Provider.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteOauthProvidersIntent object The ID of the User to remove an Oauth provider from Unique identifier for a given Provider. item field The result of the activity The deleteOauthProvidersResult object A list of unique identifiers for Oauth Providers item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_oauth_providers \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "providerIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteOauthProviders({ userId: " (The ID of the User to remove an Oauth provider from)", providerIds: [""] // Unique identifier for a given Provider. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteOauthProvidersIntent": { "userId": "", "providerIds": [ "" ] } }, "result": { "deleteOauthProvidersResult": { "providerIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete policies Source: https://docs.turnkey.com/api-reference/activities/delete-policies Delete existing policies. Enum options: `ACTIVITY_TYPE_DELETE_POLICIES` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

List of unique identifiers for policies within an organization

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deletePoliciesIntent object List of unique identifiers for policies within an organization item field The result of the activity The deletePoliciesResult object A list of unique identifiers for the deleted policies. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_policies \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_POLICIES", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "policyIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deletePolicies({ policyIds: [""] // List of unique identifiers for policies within an organization }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_POLICIES", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deletePoliciesIntent": { "policyIds": [ "" ] } }, "result": { "deletePoliciesResult": { "policyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete policy Source: https://docs.turnkey.com/api-reference/activities/delete-policy Delete an existing policy. Enum options: `ACTIVITY_TYPE_DELETE_POLICY` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Policy.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deletePolicyIntent object Unique identifier for a given Policy. The result of the activity The deletePolicyResult object Unique identifier for a given Policy. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_policy \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_POLICY", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "policyId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deletePolicy({ policyId: " (Unique identifier for a given Policy.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_POLICY", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deletePolicyIntent": { "policyId": "" } }, "result": { "deletePolicyResult": { "policyId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete private key tags Source: https://docs.turnkey.com/api-reference/activities/delete-private-key-tags Delete private key tags within an organization. Enum options: `ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of Private Key Tag IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deletePrivateKeyTagsIntent object A list of Private Key Tag IDs. item field The result of the activity The deletePrivateKeyTagsResult object A list of Private Key Tag IDs. item field A list of Private Key IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_private_key_tags \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "privateKeyTagIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deletePrivateKeyTags({ privateKeyTagIds: [""] // A list of Private Key Tag IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deletePrivateKeyTagsIntent": { "privateKeyTagIds": [ "" ] } }, "result": { "deletePrivateKeyTagsResult": { "privateKeyTagIds": [ "" ], "privateKeyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete private keys Source: https://docs.turnkey.com/api-reference/activities/delete-private-keys Delete private keys for an organization. Enum options: `ACTIVITY_TYPE_DELETE_PRIVATE_KEYS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

List of unique identifiers for private keys within an organization

Array item type: string

item field

Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deletePrivateKeysIntent object List of unique identifiers for private keys within an organization item field Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored. The result of the activity The deletePrivateKeysResult object A list of private key unique identifiers that were removed item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_private_keys \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "privateKeyIds": [ "" ], "deleteWithoutExport": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deletePrivateKeys({ privateKeyIds: [""] // List of unique identifiers for private keys within an organization, deleteWithoutExport: true // Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deletePrivateKeysIntent": { "privateKeyIds": [ "" ], "deleteWithoutExport": "" } }, "result": { "deletePrivateKeysResult": { "privateKeyIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete smart contract interface Source: https://docs.turnkey.com/api-reference/activities/delete-smart-contract-interface Delete a smart contract interface. Enum options: `ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of a Smart Contract Interface intended for deletion.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteSmartContractInterfaceIntent object The ID of a Smart Contract Interface intended for deletion. The result of the activity The deleteSmartContractInterfaceResult object The ID of the deleted Smart Contract Interface. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_smart_contract_interface \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "smartContractInterfaceId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteSmartContractInterface({ smartContractInterfaceId: " (The ID of a Smart Contract Interface intended for deletion.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteSmartContractInterfaceIntent": { "smartContractInterfaceId": "" } }, "result": { "deleteSmartContractInterfaceResult": { "smartContractInterfaceId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete sub-organization Source: https://docs.turnkey.com/api-reference/activities/delete-sub-organization Delete a sub-organization. Enum options: `ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteSubOrganizationIntent object Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false. The result of the activity The deleteSubOrganizationResult object Unique identifier of the sub organization that was removed A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_sub_organization \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "deleteWithoutExport": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteSubOrganization({ deleteWithoutExport: true // Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteSubOrganizationIntent": { "deleteWithoutExport": "" } }, "result": { "deleteSubOrganizationResult": { "subOrganizationUuid": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete user tags Source: https://docs.turnkey.com/api-reference/activities/delete-user-tags Delete user tags within an organization. Enum options: `ACTIVITY_TYPE_DELETE_USER_TAGS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of User Tag IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteUserTagsIntent object A list of User Tag IDs. item field The result of the activity The deleteUserTagsResult object A list of User Tag IDs. item field A list of User IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_user_tags \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_USER_TAGS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userTagIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteUserTags({ userTagIds: [""] // A list of User Tag IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_USER_TAGS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteUserTagsIntent": { "userTagIds": [ "" ] } }, "result": { "deleteUserTagsResult": { "userTagIds": [ "" ], "userIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete users Source: https://docs.turnkey.com/api-reference/activities/delete-users Delete users within an organization. Enum options: `ACTIVITY_TYPE_DELETE_USERS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A list of User IDs.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteUsersIntent object A list of User IDs. item field The result of the activity The deleteUsersResult object A list of User IDs. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_users \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_USERS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteUsers({ userIds: [""] // A list of User IDs. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_USERS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteUsersIntent": { "userIds": [ "" ] } }, "result": { "deleteUsersResult": { "userIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete wallet accounts Source: https://docs.turnkey.com/api-reference/activities/delete-wallet-accounts Delete wallet accounts for an organization. Enum options: `ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

List of unique identifiers for wallet accounts within an organization

Array item type: string

item field

Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteWalletAccountsIntent object List of unique identifiers for wallet accounts within an organization item field Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored. The result of the activity The deleteWalletAccountsResult object A list of wallet account unique identifiers that were removed item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_wallet_accounts \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "walletAccountIds": [ "" ], "deleteWithoutExport": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteWalletAccounts({ walletAccountIds: [""] // List of unique identifiers for wallet accounts within an organization, deleteWithoutExport: true // Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteWalletAccountsIntent": { "walletAccountIds": [ "" ], "deleteWithoutExport": "" } }, "result": { "deleteWalletAccountsResult": { "walletAccountIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Delete wallets Source: https://docs.turnkey.com/api-reference/activities/delete-wallets Delete wallets for an organization. Enum options: `ACTIVITY_TYPE_DELETE_WALLETS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

List of unique identifiers for wallets within an organization

Array item type: string

item field

Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The deleteWalletsIntent object List of unique identifiers for wallets within an organization item field Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored. The result of the activity The deleteWalletsResult object A list of wallet unique identifiers that were removed item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/delete_wallets \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_DELETE_WALLETS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "walletIds": [ "" ], "deleteWithoutExport": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().deleteWallets({ walletIds: [""] // List of unique identifiers for wallets within an organization, deleteWithoutExport: true // Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_DELETE_WALLETS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "deleteWalletsIntent": { "walletIds": [ "" ], "deleteWithoutExport": "" } }, "result": { "deleteWalletsResult": { "walletIds": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Export private key Source: https://docs.turnkey.com/api-reference/activities/export-private-key Export a private key. Enum options: `ACTIVITY_TYPE_EXPORT_PRIVATE_KEY` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Private Key. Client-side public key generated by the user, to which the export bundle will be encrypted.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The exportPrivateKeyIntent object Unique identifier for a given Private Key. Client-side public key generated by the user, to which the export bundle will be encrypted. The result of the activity The exportPrivateKeyResult object Unique identifier for a given Private Key. Export bundle containing a private key encrypted to the client's target public key. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/export_private_key \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "privateKeyId": "", "targetPublicKey": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().exportPrivateKey({ privateKeyId: " (Unique identifier for a given Private Key.)", targetPublicKey: " (Client-side public key generated by the user, to which the export bundle will be encrypted.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "exportPrivateKeyIntent": { "privateKeyId": "", "targetPublicKey": "" } }, "result": { "exportPrivateKeyResult": { "privateKeyId": "", "exportBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Export wallet Source: https://docs.turnkey.com/api-reference/activities/export-wallet Export a wallet. Enum options: `ACTIVITY_TYPE_EXPORT_WALLET` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Wallet. Client-side public key generated by the user, to which the export bundle will be encrypted. Enum options: `MNEMONIC_LANGUAGE_ENGLISH`, `MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE`, `MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE`, `MNEMONIC_LANGUAGE_CZECH`, `MNEMONIC_LANGUAGE_FRENCH`, `MNEMONIC_LANGUAGE_ITALIAN`, `MNEMONIC_LANGUAGE_JAPANESE`, `MNEMONIC_LANGUAGE_KOREAN`, `MNEMONIC_LANGUAGE_SPANISH`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The exportWalletIntent object Unique identifier for a given Wallet. Client-side public key generated by the user, to which the export bundle will be encrypted. language field Enum options: `MNEMONIC_LANGUAGE_ENGLISH`, `MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE`, `MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE`, `MNEMONIC_LANGUAGE_CZECH`, `MNEMONIC_LANGUAGE_FRENCH`, `MNEMONIC_LANGUAGE_ITALIAN`, `MNEMONIC_LANGUAGE_JAPANESE`, `MNEMONIC_LANGUAGE_KOREAN`, `MNEMONIC_LANGUAGE_SPANISH` The result of the activity The exportWalletResult object Unique identifier for a given Wallet. Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/export_wallet \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_EXPORT_WALLET", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "walletId": "", "targetPublicKey": "", "language": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().exportWallet({ walletId: " (Unique identifier for a given Wallet.)", targetPublicKey: " (Client-side public key generated by the user, to which the export bundle will be encrypted.)", language: "" // language field }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_EXPORT_WALLET", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "exportWalletIntent": { "walletId": "", "targetPublicKey": "", "language": "" } }, "result": { "exportWalletResult": { "walletId": "", "exportBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Export wallet account Source: https://docs.turnkey.com/api-reference/activities/export-wallet-account Export a wallet account. Enum options: `ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Address to identify Wallet Account. Client-side public key generated by the user, to which the export bundle will be encrypted.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The exportWalletAccountIntent object Address to identify Wallet Account. Client-side public key generated by the user, to which the export bundle will be encrypted. The result of the activity The exportWalletAccountResult object Address to identify Wallet Account. Export bundle containing a private key encrypted by the client's target public key. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/export_wallet_account \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "address": "", "targetPublicKey": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().exportWalletAccount({ address: " (Address to identify Wallet Account.)", targetPublicKey: " (Client-side public key generated by the user, to which the export bundle will be encrypted.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "exportWalletAccountIntent": { "address": "", "targetPublicKey": "" } }, "result": { "exportWalletAccountResult": { "address": "", "exportBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Import private key Source: https://docs.turnkey.com/api-reference/activities/import-private-key Import a private key. Enum options: `ACTIVITY_TYPE_IMPORT_PRIVATE_KEY` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the User importing a Private Key. Human-readable name for a Private Key. Bundle containing a raw private key encrypted to the enclave's target public key. Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The importPrivateKeyIntent object The ID of the User importing a Private Key. Human-readable name for a Private Key. Bundle containing a raw private key encrypted to the enclave's target public key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` The result of the activity The importPrivateKeyResult object Unique identifier for a Private Key. A list of addresses. format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/import_private_key \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "privateKeyName": "", "encryptedBundle": "", "curve": "", "addressFormats": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().importPrivateKey({ userId: " (The ID of the User importing a Private Key.)", privateKeyName: " (Human-readable name for a Private Key.)", encryptedBundle: " (Bundle containing a raw private key encrypted to the enclave's target public key.)", curve: "" // curve field, addressFormats: "" // Cryptocurrency-specific formats for a derived address (e.g., Ethereum). }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "importPrivateKeyIntent": { "userId": "", "privateKeyName": "", "encryptedBundle": "", "curve": "", "addressFormats": [ "" ] } }, "result": { "importPrivateKeyResult": { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Import wallet Source: https://docs.turnkey.com/api-reference/activities/import-wallet Import a wallet. Enum options: `ACTIVITY_TYPE_IMPORT_WALLET` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the User importing a Wallet. Human-readable name for a Wallet. Bundle containing a wallet mnemonic encrypted to the enclave's target public key.

A list of wallet Accounts.

Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The importWalletIntent object The ID of the User importing a Wallet. Human-readable name for a Wallet. Bundle containing a wallet mnemonic encrypted to the enclave's target public key. A list of wallet Accounts. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` The result of the activity The importWalletResult object Unique identifier for a Wallet. A list of account addresses. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/import_wallet \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_IMPORT_WALLET", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "walletName": "", "encryptedBundle": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().importWallet({ userId: " (The ID of the User importing a Wallet.)", walletName: " (Human-readable name for a Wallet.)", encryptedBundle: " (Bundle containing a wallet mnemonic encrypted to the enclave's target public key.)", accounts: [{ // A list of wallet Accounts., curve: "" // curve field, pathFormat: "" // pathFormat field, path: " (Path used to generate a wallet Account.)", addressFormat: "" // addressFormat field, }] }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_IMPORT_WALLET", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "importWalletIntent": { "userId": "", "walletName": "", "encryptedBundle": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ] } }, "result": { "importWalletResult": { "walletId": "", "addresses": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Init email recovery Source: https://docs.turnkey.com/api-reference/activities/init-email-recovery Initialize a new email recovery. Enum options: `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Email of the user starting recovery Client-side public key generated by the user, to which the recovery bundle will be encrypted. Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used.

emailCustomization field

The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.
Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The initUserEmailRecoveryIntentV2 object Email of the user starting recovery Client-side public key generated by the user, to which the recovery bundle will be encrypted. Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to The result of the activity The initUserEmailRecoveryResult object Unique identifier for the user being recovered. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/init_user_email_recovery \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "email": "", "targetPublicKey": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().initUserEmailRecovery({ email: " (Email of the user starting recovery)", targetPublicKey: " (Client-side public key generated by the user, to which the recovery bundle will be encrypted.)", expirationSeconds: " (Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used.)", emailCustomization: { // emailCustomization field, appName: " (The name of the application. This field is required and will be used in email notifications if an email template is not provided.)", logoUrl: " (A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.)", magicLinkTemplate: " (A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.)", templateVariables: " (JSON object containing key/value pairs to be used with custom templates.)", templateId: " (Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.)", }, sendFromEmailAddress: " (Optional custom email address from which to send the OTP email)", sendFromEmailSenderName: " (Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications')", replyToEmailAddress: " (Optional custom email address to use as reply-to)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "initUserEmailRecoveryIntentV2": { "email": "", "targetPublicKey": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" } }, "result": { "initUserEmailRecoveryResult": { "userId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Init fiat on ramp Source: https://docs.turnkey.com/api-reference/activities/init-fiat-on-ramp Initiate a fiat on ramp flow. Enum options: `ACTIVITY_TYPE_INIT_FIAT_ON_RAMP` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Destination wallet address for the buy transaction. Enum options: `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE` Enum options: `FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC` Enum options: `FIAT_ON_RAMP_CURRENCY_AUD`, `FIAT_ON_RAMP_CURRENCY_BGN`, `FIAT_ON_RAMP_CURRENCY_BRL`, `FIAT_ON_RAMP_CURRENCY_CAD`, `FIAT_ON_RAMP_CURRENCY_CHF`, `FIAT_ON_RAMP_CURRENCY_COP`, `FIAT_ON_RAMP_CURRENCY_CZK`, `FIAT_ON_RAMP_CURRENCY_DKK`, `FIAT_ON_RAMP_CURRENCY_DOP`, `FIAT_ON_RAMP_CURRENCY_EGP`, `FIAT_ON_RAMP_CURRENCY_EUR`, `FIAT_ON_RAMP_CURRENCY_GBP`, `FIAT_ON_RAMP_CURRENCY_HKD`, `FIAT_ON_RAMP_CURRENCY_IDR`, `FIAT_ON_RAMP_CURRENCY_ILS`, `FIAT_ON_RAMP_CURRENCY_JOD`, `FIAT_ON_RAMP_CURRENCY_KES`, `FIAT_ON_RAMP_CURRENCY_KWD`, `FIAT_ON_RAMP_CURRENCY_LKR`, `FIAT_ON_RAMP_CURRENCY_MXN`, `FIAT_ON_RAMP_CURRENCY_NGN`, `FIAT_ON_RAMP_CURRENCY_NOK`, `FIAT_ON_RAMP_CURRENCY_NZD`, `FIAT_ON_RAMP_CURRENCY_OMR`, `FIAT_ON_RAMP_CURRENCY_PEN`, `FIAT_ON_RAMP_CURRENCY_PLN`, `FIAT_ON_RAMP_CURRENCY_RON`, `FIAT_ON_RAMP_CURRENCY_SEK`, `FIAT_ON_RAMP_CURRENCY_THB`, `FIAT_ON_RAMP_CURRENCY_TRY`, `FIAT_ON_RAMP_CURRENCY_TWD`, `FIAT_ON_RAMP_CURRENCY_USD`, `FIAT_ON_RAMP_CURRENCY_VND`, `FIAT_ON_RAMP_CURRENCY_ZAR` Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount. Enum options: `FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD`, `FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL`, `FIAT_ON_RAMP_PAYMENT_METHOD_VENMO`, `FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE`, `FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT`, `FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET`, `FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT` ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB. ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country\_code=US. Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false. Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The initFiatOnRampIntent object onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Destination wallet address for the buy transaction. network field Enum options: `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE` cryptoCurrencyCode field Enum options: `FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC` fiatCurrencyCode field Enum options: `FIAT_ON_RAMP_CURRENCY_AUD`, `FIAT_ON_RAMP_CURRENCY_BGN`, `FIAT_ON_RAMP_CURRENCY_BRL`, `FIAT_ON_RAMP_CURRENCY_CAD`, `FIAT_ON_RAMP_CURRENCY_CHF`, `FIAT_ON_RAMP_CURRENCY_COP`, `FIAT_ON_RAMP_CURRENCY_CZK`, `FIAT_ON_RAMP_CURRENCY_DKK`, `FIAT_ON_RAMP_CURRENCY_DOP`, `FIAT_ON_RAMP_CURRENCY_EGP`, `FIAT_ON_RAMP_CURRENCY_EUR`, `FIAT_ON_RAMP_CURRENCY_GBP`, `FIAT_ON_RAMP_CURRENCY_HKD`, `FIAT_ON_RAMP_CURRENCY_IDR`, `FIAT_ON_RAMP_CURRENCY_ILS`, `FIAT_ON_RAMP_CURRENCY_JOD`, `FIAT_ON_RAMP_CURRENCY_KES`, `FIAT_ON_RAMP_CURRENCY_KWD`, `FIAT_ON_RAMP_CURRENCY_LKR`, `FIAT_ON_RAMP_CURRENCY_MXN`, `FIAT_ON_RAMP_CURRENCY_NGN`, `FIAT_ON_RAMP_CURRENCY_NOK`, `FIAT_ON_RAMP_CURRENCY_NZD`, `FIAT_ON_RAMP_CURRENCY_OMR`, `FIAT_ON_RAMP_CURRENCY_PEN`, `FIAT_ON_RAMP_CURRENCY_PLN`, `FIAT_ON_RAMP_CURRENCY_RON`, `FIAT_ON_RAMP_CURRENCY_SEK`, `FIAT_ON_RAMP_CURRENCY_THB`, `FIAT_ON_RAMP_CURRENCY_TRY`, `FIAT_ON_RAMP_CURRENCY_TWD`, `FIAT_ON_RAMP_CURRENCY_USD`, `FIAT_ON_RAMP_CURRENCY_VND`, `FIAT_ON_RAMP_CURRENCY_ZAR` Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount. paymentMethod field Enum options: `FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD`, `FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL`, `FIAT_ON_RAMP_PAYMENT_METHOD_VENMO`, `FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE`, `FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT`, `FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET`, `FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT` ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB. ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country\_code=US. Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false. Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled. The result of the activity The initFiatOnRampResult object Unique URL for a given fiat on-ramp flow. Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow. Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/init_fiat_on_ramp \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "onrampProvider": "", "walletAddress": "", "network": "", "cryptoCurrencyCode": "", "fiatCurrencyCode": "", "fiatCurrencyAmount": "", "paymentMethod": "", "countryCode": "", "countrySubdivisionCode": "", "sandboxMode": "", "urlForSignature": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().initFiatOnRamp({ onrampProvider: "" // onrampProvider field, walletAddress: " (Destination wallet address for the buy transaction.)", network: "" // network field, cryptoCurrencyCode: "" // cryptoCurrencyCode field, fiatCurrencyCode: "" // fiatCurrencyCode field, fiatCurrencyAmount: " (Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount.)", paymentMethod: "" // paymentMethod field, countryCode: " (ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB.)", countrySubdivisionCode: " (ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country_code=US.)", sandboxMode: true // Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false., urlForSignature: " (Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "initFiatOnRampIntent": { "onrampProvider": "", "walletAddress": "", "network": "", "cryptoCurrencyCode": "", "fiatCurrencyCode": "", "fiatCurrencyAmount": "", "paymentMethod": "", "countryCode": "", "countrySubdivisionCode": "", "sandboxMode": "", "urlForSignature": "" } }, "result": { "initFiatOnRampResult": { "onRampUrl": "", "onRampTransactionId": "", "onRampUrlSignature": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Init generic OTP Source: https://docs.turnkey.com/api-reference/activities/init-generic-otp Initiate a generic OTP activity. Enum options: `ACTIVITY_TYPE_INIT_OTP_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided.

emailCustomization field

A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.

smsCustomization field

Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}}
Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The initOtpIntentV2 object Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided. emailCustomization field A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to The result of the activity The initOtpResult object Unique identifier for an OTP authentication A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/init_otp \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_INIT_OTP_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "otpType": "", "contact": "", "otpLength": "", "appName": "", "emailCustomization": { "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().initOtp({ otpType: " (Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL)", contact: " (Email or phone number to send the OTP code to)", otpLength: 0 // Optional length of the OTP code. Default = 9, appName: " (The name of the application. This field is required and will be used in email notifications if an email template is not provided.)", emailCustomization: { // emailCustomization field, logoUrl: " (A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.)", magicLinkTemplate: " (A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.)", templateVariables: " (JSON object containing key/value pairs to be used with custom templates.)", templateId: " (Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.)", }, smsCustomization: { // smsCustomization field, template: " (Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}})", }, userIdentifier: " (Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.)", sendFromEmailAddress: " (Optional custom email address from which to send the OTP email)", alphanumeric: true // Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true, sendFromEmailSenderName: " (Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications')", expirationSeconds: " (Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes))", replyToEmailAddress: " (Optional custom email address to use as reply-to)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_INIT_OTP_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "initOtpIntentV2": { "otpType": "", "contact": "", "otpLength": "", "appName": "", "emailCustomization": { "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" } }, "result": { "initOtpResult": { "otpId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Init import private key Source: https://docs.turnkey.com/api-reference/activities/init-import-private-key Initialize a new private key import. Enum options: `ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the User importing a Private Key.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The initImportPrivateKeyIntent object The ID of the User importing a Private Key. The result of the activity The initImportPrivateKeyResult object Import bundle containing a public key and signature to use for importing client data. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/init_import_private_key \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().initImportPrivateKey({ userId: " (The ID of the User importing a Private Key.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "initImportPrivateKeyIntent": { "userId": "" } }, "result": { "initImportPrivateKeyResult": { "importBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Init import wallet Source: https://docs.turnkey.com/api-reference/activities/init-import-wallet Initialize a new wallet import. Enum options: `ACTIVITY_TYPE_INIT_IMPORT_WALLET` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the User importing a Wallet.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The initImportWalletIntent object The ID of the User importing a Wallet. The result of the activity The initImportWalletResult object Import bundle containing a public key and signature to use for importing client data. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/init_import_wallet \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().initImportWallet({ userId: " (The ID of the User importing a Wallet.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "initImportWalletIntent": { "userId": "" } }, "result": { "initImportWalletResult": { "importBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Init OTP auth Source: https://docs.turnkey.com/api-reference/activities/init-otp-auth Initiate an OTP auth activity. Enum options: `ACTIVITY_TYPE_INIT_OTP_AUTH_V3` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided.

emailCustomization field

A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.

smsCustomization field

Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}}
Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The initOtpAuthIntentV3 object Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided. emailCustomization field A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to The result of the activity The initOtpAuthResultV2 object Unique identifier for an OTP authentication A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/init_otp_auth \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "otpType": "", "contact": "", "otpLength": "", "appName": "", "emailCustomization": { "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().initOtpAuth({ otpType: " (Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL)", contact: " (Email or phone number to send the OTP code to)", otpLength: 0 // Optional length of the OTP code. Default = 9, appName: " (The name of the application. This field is required and will be used in email notifications if an email template is not provided.)", emailCustomization: { // emailCustomization field, logoUrl: " (A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.)", magicLinkTemplate: " (A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.)", templateVariables: " (JSON object containing key/value pairs to be used with custom templates.)", templateId: " (Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.)", }, smsCustomization: { // smsCustomization field, template: " (Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}})", }, userIdentifier: " (Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.)", sendFromEmailAddress: " (Optional custom email address from which to send the OTP email)", alphanumeric: true // Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true, sendFromEmailSenderName: " (Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications')", expirationSeconds: " (Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes))", replyToEmailAddress: " (Optional custom email address to use as reply-to)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "initOtpAuthIntentV3": { "otpType": "", "contact": "", "otpLength": "", "appName": "", "emailCustomization": { "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" } }, "result": { "initOtpAuthResultV2": { "otpId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Login with a stamp Source: https://docs.turnkey.com/api-reference/activities/login-with-a-stamp Create a session for a user through stamping client side (API key, wallet client, or passkey client). Enum options: `ACTIVITY_TYPE_STAMP_LOGIN` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The stampLoginIntent object Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys The result of the activity The stampLoginResult object Signed JWT containing an expiry, public key, session type, user id, and organization id A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/stamp_login \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_STAMP_LOGIN", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "publicKey": "", "expirationSeconds": "", "invalidateExisting": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().stampLogin({ publicKey: " (Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request)", expirationSeconds: " (Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.)", invalidateExisting: true // Invalidate all other previously generated Login API keys }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_STAMP_LOGIN", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "stampLoginIntent": { "publicKey": "", "expirationSeconds": "", "invalidateExisting": "" } }, "result": { "stampLoginResult": { "session": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Login with Oauth Source: https://docs.turnkey.com/api-reference/activities/login-with-oauth Create an Oauth session for a user. Enum options: `ACTIVITY_TYPE_OAUTH_LOGIN` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Base64 encoded OIDC token Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The oauthLoginIntent object Base64 encoded OIDC token Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys The result of the activity The oauthLoginResult object Signed JWT containing an expiry, public key, session type, user id, and organization id A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/oauth_login \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_OAUTH_LOGIN", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "oidcToken": "", "publicKey": "", "expirationSeconds": "", "invalidateExisting": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().oauthLogin({ oidcToken: " (Base64 encoded OIDC token)", publicKey: " (Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request)", expirationSeconds: " (Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.)", invalidateExisting: true // Invalidate all other previously generated Login API keys }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_OAUTH_LOGIN", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "oauthLoginIntent": { "oidcToken": "", "publicKey": "", "expirationSeconds": "", "invalidateExisting": "" } }, "result": { "oauthLoginResult": { "session": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Login with OTP Source: https://docs.turnkey.com/api-reference/activities/login-with-otp Create an OTP session for a user. Enum options: `ACTIVITY_TYPE_OTP_LOGIN` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Signed JWT containing a unique id, expiry, verification type, contact Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys

clientSignature field

The public component of a cryptographic key pair used to create the signature. Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The otpLoginIntent object Signed JWT containing a unique id, expiry, verification type, contact Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys clientSignature field The public component of a cryptographic key pair used to create the signature. scheme field Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message. The result of the activity The otpLoginResult object Signed JWT containing an expiry, public key, session type, user id, and organization id A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/otp_login \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_OTP_LOGIN", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "verificationToken": "", "publicKey": "", "expirationSeconds": "", "invalidateExisting": "", "clientSignature": { "publicKey": "", "scheme": "", "message": "", "signature": "" } } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().otpLogin({ verificationToken: " (Signed JWT containing a unique id, expiry, verification type, contact)", publicKey: " (Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token)", expirationSeconds: " (Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.)", invalidateExisting: true // Invalidate all other previously generated Login API keys, clientSignature: { // clientSignature field, publicKey: " (The public component of a cryptographic key pair used to create the signature.)", scheme: "" // scheme field, message: " (The message that was signed.)", signature: " (The cryptographic signature over the message.)", } }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_OTP_LOGIN", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "otpLoginIntent": { "verificationToken": "", "publicKey": "", "expirationSeconds": "", "invalidateExisting": "", "clientSignature": { "publicKey": "", "scheme": "", "message": "", "signature": "" } } }, "result": { "otpLoginResult": { "session": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Oauth Source: https://docs.turnkey.com/api-reference/activities/oauth Authenticate a user with an OIDC token (Oauth). Enum options: `ACTIVITY_TYPE_OAUTH` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Base64 encoded OIDC token Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Oauth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Oauth API keys
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The oauthIntent object Base64 encoded OIDC token Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Oauth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Oauth API keys The result of the activity The oauthResult object Unique identifier for the authenticating User. Unique identifier for the created API key. HPKE encrypted credential bundle A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/oauth \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_OAUTH", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "oidcToken": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().oauth({ oidcToken: " (Base64 encoded OIDC token)", targetPublicKey: " (Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted.)", apiKeyName: " (Optional human-readable name for an API Key. If none provided, default to Oauth - )", expirationSeconds: " (Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.)", invalidateExisting: true // Invalidate all other previously generated Oauth API keys }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_OAUTH", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "oauthIntent": { "oidcToken": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" } }, "result": { "oauthResult": { "userId": "", "apiKeyId": "", "credentialBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # OAuth 2.0 authentication Source: https://docs.turnkey.com/api-reference/activities/oauth-20-authentication Authenticate a user with an OAuth 2.0 provider and receive an OIDC token to use with the LoginWithOAuth or CreateSubOrganization activities Enum options: `ACTIVITY_TYPE_OAUTH2_AUTHENTICATE` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The OAuth 2.0 credential id whose client\_id and client\_secret will be used in the OAuth 2.0 flow The auth\_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider The code verifier used by OAuth 2.0 PKCE providers An optional nonce used by the client to prevent replay/substitution of an ID token An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The oauth2AuthenticateIntent object The OAuth 2.0 credential id whose client\_id and client\_secret will be used in the OAuth 2.0 flow The auth\_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider The code verifier used by OAuth 2.0 PKCE providers An optional nonce used by the client to prevent replay/substitution of an ID token An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token The result of the activity The oauth2AuthenticateResult object Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/oauth2_authenticate \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "oauth2CredentialId": "", "authCode": "", "redirectUri": "", "codeVerifier": "", "nonce": "", "bearerTokenTargetPublicKey": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().oauth2Authenticate({ oauth2CredentialId: " (The OAuth 2.0 credential id whose client_id and client_secret will be used in the OAuth 2.0 flow)", authCode: " (The auth_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow)", redirectUri: " (The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider)", codeVerifier: " (The code verifier used by OAuth 2.0 PKCE providers)", nonce: " (An optional nonce used by the client to prevent replay/substitution of an ID token)", bearerTokenTargetPublicKey: " (An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "oauth2AuthenticateIntent": { "oauth2CredentialId": "", "authCode": "", "redirectUri": "", "codeVerifier": "", "nonce": "", "bearerTokenTargetPublicKey": "" } }, "result": { "oauth2AuthenticateResult": { "oidcToken": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # OTP auth Source: https://docs.turnkey.com/api-reference/activities/otp-auth Authenticate a user with an OTP code sent via email or SMS. Enum options: `ACTIVITY_TYPE_OTP_AUTH` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to OTP Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated OTP Auth API keys
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The otpAuthIntent object ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to OTP Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated OTP Auth API keys The result of the activity The otpAuthResult object Unique identifier for the authenticating User. Unique identifier for the created API key. HPKE encrypted credential bundle A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/otp_auth \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_OTP_AUTH", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "otpId": "", "otpCode": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().otpAuth({ otpId: " (ID representing the result of an init OTP activity.)", otpCode: " (OTP sent out to a user's contact (email or SMS))", targetPublicKey: " (Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted.)", apiKeyName: " (Optional human-readable name for an API Key. If none provided, default to OTP Auth - )", expirationSeconds: " (Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.)", invalidateExisting: true // Invalidate all other previously generated OTP Auth API keys }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_OTP_AUTH", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "otpAuthIntent": { "otpId": "", "otpCode": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" } }, "result": { "otpAuthResult": { "userId": "", "apiKeyId": "", "credentialBundle": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Activities Source: https://docs.turnkey.com/api-reference/activities/overview Activities are requests to securely execute a workload in Turnkey. # What are activities? Activities (also called [submissions](/developer-reference/api-overview/submissions)) are requests to create, modify, or use resources within Turnkey. Submission endpoints are always prefixed with `/public/v1/submit`. * **Policy Enforcement:** Activities are subject to consensus or condition enforcement via the policy engine. * **Optimistic Execution:** Activities are executed optimistically synchronous—if possible, the request completes synchronously; otherwise, it falls back to asynchronous processing. * **Activity Status:** * `COMPLETED`: The activity was successful and the `result` field is populated. * `FAILED`: The activity failed and the `failure` field contains the reason. * `CONSENSUS_NEEDED`: More signatures are required to process the request. * `PENDING`: The request is processing asynchronously. * **Approval expiration:** Activities do not expire. However, approvals expire 24 hours after the first vote if consensus is not reached, and must be re-submitted while the activity remains in ACTIVITY\_STATUS\_CONSENSUS\_NEEDED. * **Status Updates:** You can get updates by re-submitting the request (idempotent) or polling `get_activity` with the activity ID. * **Idempotency:** The API is idempotent—identical requests (same POST body) return the same activity. To generate a new activity, change the `timestampMs` value in your request. # Perform email auth Source: https://docs.turnkey.com/api-reference/activities/perform-email-auth Authenticate a user via email. Enum options: `ACTIVITY_TYPE_EMAIL_AUTH_V3` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.

emailCustomization field

The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.
Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The emailAuthIntentV3 object Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to The result of the activity The emailAuthResult object Unique identifier for the authenticating User. Unique identifier for the created API key. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/email_auth \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_EMAIL_AUTH_V3", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "email": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "invalidateExisting": "", "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().emailAuth({ email: " (Email of the authenticating user.)", targetPublicKey: " (Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted.)", apiKeyName: " (Optional human-readable name for an API Key. If none provided, default to Email Auth - )", expirationSeconds: " (Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.)", emailCustomization: { // emailCustomization field, appName: " (The name of the application. This field is required and will be used in email notifications if an email template is not provided.)", logoUrl: " (A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.)", magicLinkTemplate: " (A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.)", templateVariables: " (JSON object containing key/value pairs to be used with custom templates.)", templateId: " (Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.)", }, invalidateExisting: true // Invalidate all other previously generated Email Auth API keys, sendFromEmailAddress: " (Optional custom email address from which to send the email)", sendFromEmailSenderName: " (Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications')", replyToEmailAddress: " (Optional custom email address to use as reply-to)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_EMAIL_AUTH_V3", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "emailAuthIntentV3": { "email": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "invalidateExisting": "", "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" } }, "result": { "emailAuthResult": { "userId": "", "apiKeyId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Recover a user Source: https://docs.turnkey.com/api-reference/activities/recover-a-user Complete the process of recovering a user by adding an authenticator. Enum options: `ACTIVITY_TYPE_RECOVER_USER` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

authenticator field

Human-readable name for an Authenticator. Challenge presented for authentication purposes.

attestation field

The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID`
Unique identifier for the user performing recovery.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The recoverUserIntent object authenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for the user performing recovery. The result of the activity The recoverUserResult object ID of the authenticator created. item field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/recover_user \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_RECOVER_USER", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "authenticator": { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } }, "userId": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().recoverUser({ authenticator: { // authenticator field, authenticatorName: " (Human-readable name for an Authenticator.)", challenge: " (Challenge presented for authentication purposes.)", attestation: { // attestation field, credentialId: " (The cbor encoded then base64 url encoded id of the credential.)", clientDataJson: " (A base64 url encoded payload containing metadata about the signing context and the challenge.)", attestationObject: " (A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses.)", transports: "" // The type of authenticator transports., }, }, userId: " (Unique identifier for the user performing recovery.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_RECOVER_USER", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "recoverUserIntent": { "authenticator": { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } }, "userId": "" } }, "result": { "recoverUserResult": { "authenticatorId": [ "" ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Reject activity Source: https://docs.turnkey.com/api-reference/activities/reject-activity Reject an activity. Enum options: `ACTIVITY_TYPE_REJECT_ACTIVITY` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

An artifact verifying a User's action.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. ACTIVITY\_STATUS\_REJECTED The activity type The intent of the activity The rejectActivityIntent object An artifact verifying a User's action. The result of the activity A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/reject_activity \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_REJECT_ACTIVITY", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "fingerprint": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().rejectActivity({ fingerprint: " (An artifact verifying a User's action.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_REJECT_ACTIVITY", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "rejectActivityIntent": { "fingerprint": "" } }, "result": {}, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Remove organization feature Source: https://docs.turnkey.com/api-reference/activities/remove-organization-feature Remove an organization feature. This activity must be approved by the current root quorum. Enum options: `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The removeOrganizationFeatureIntent object name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` The result of the activity The removeOrganizationFeatureResult object Resulting list of organization features. name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/remove_organization_feature \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "name": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().removeOrganizationFeature({ name: "" // name field }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "removeOrganizationFeatureIntent": { "name": "" } }, "result": { "removeOrganizationFeatureResult": { "features": [ { "name": "", "value": "" } ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Set organization feature Source: https://docs.turnkey.com/api-reference/activities/set-organization-feature Set an organization feature. This activity must be approved by the current root quorum. Enum options: `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` Optional value for the feature. Will override existing values if feature is already set.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The setOrganizationFeatureIntent object name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` Optional value for the feature. Will override existing values if feature is already set. The result of the activity The setOrganizationFeatureResult object Resulting list of organization features. name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/set_organization_feature \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "name": "", "value": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().setOrganizationFeature({ name: "" // name field, value: " (Optional value for the feature. Will override existing values if feature is already set.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "setOrganizationFeatureIntent": { "name": "", "value": "" } }, "result": { "setOrganizationFeatureResult": { "features": [ { "name": "", "value": "" } ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Sign raw payload Source: https://docs.turnkey.com/api-reference/activities/sign-raw-payload Sign a raw payload. Enum options: `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned payload to be signed. Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The signRawPayloadIntentV2 object A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned payload to be signed. encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` The result of the activity The signRawPayloadResult object Component of an ECSDA signature. Component of an ECSDA signature. Component of an ECSDA signature. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/sign_raw_payload \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "signWith": "", "payload": "", "encoding": "", "hashFunction": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().signRawPayload({ signWith: " (A Wallet account address, Private Key address, or Private Key identifier.)", payload: " (Raw unsigned payload to be signed.)", encoding: "" // encoding field, hashFunction: "" // hashFunction field }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "signRawPayloadIntentV2": { "signWith": "", "payload": "", "encoding": "", "hashFunction": "" } }, "result": { "signRawPayloadResult": { "r": "", "s": "", "v": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Sign raw payloads Source: https://docs.turnkey.com/api-reference/activities/sign-raw-payloads Sign multiple raw payloads with the same signing parameters. Enum options: `ACTIVITY_TYPE_SIGN_RAW_PAYLOADS` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A Wallet account address, Private Key address, or Private Key identifier.

An array of raw unsigned payloads to be signed.

Array item type: string

item field

Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The signRawPayloadsIntent object A Wallet account address, Private Key address, or Private Key identifier. An array of raw unsigned payloads to be signed. item field encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` The result of the activity The signRawPayloadsResult object signatures field Component of an ECSDA signature. Component of an ECSDA signature. Component of an ECSDA signature. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/sign_raw_payloads \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "signWith": "", "payloads": [ "" ], "encoding": "", "hashFunction": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().signRawPayloads({ signWith: " (A Wallet account address, Private Key address, or Private Key identifier.)", payloads: [""] // An array of raw unsigned payloads to be signed., encoding: "" // encoding field, hashFunction: "" // hashFunction field }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "signRawPayloadsIntent": { "signWith": "", "payloads": [ "" ], "encoding": "", "hashFunction": "" } }, "result": { "signRawPayloadsResult": { "signatures": [ { "r": "", "s": "", "v": "" } ] } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Sign transaction Source: https://docs.turnkey.com/api-reference/activities/sign-transaction Sign a transaction. Enum options: `ACTIVITY_TYPE_SIGN_TRANSACTION_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned transaction to be signed Enum options: `TRANSACTION_TYPE_ETHEREUM`, `TRANSACTION_TYPE_SOLANA`, `TRANSACTION_TYPE_TRON`, `TRANSACTION_TYPE_BITCOIN`, `TRANSACTION_TYPE_TEMPO`
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The signTransactionIntentV2 object A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned transaction to be signed type field Enum options: `TRANSACTION_TYPE_ETHEREUM`, `TRANSACTION_TYPE_SOLANA`, `TRANSACTION_TYPE_TRON`, `TRANSACTION_TYPE_BITCOIN`, `TRANSACTION_TYPE_TEMPO` The result of the activity The signTransactionResult object signedTransaction field A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/sign_transaction \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "signWith": "", "unsignedTransaction": "", "type": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().signTransaction({ signWith: " (A Wallet account address, Private Key address, or Private Key identifier.)", unsignedTransaction: " (Raw unsigned transaction to be signed)", type: "" // type field }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "signTransactionIntentV2": { "signWith": "", "unsignedTransaction": "", "type": "" } }, "result": { "signTransactionResult": { "signedTransaction": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update a Fiat On Ramp Credential Source: https://docs.turnkey.com/api-reference/activities/update-a-fiat-on-ramp-credential Update a fiat on ramp provider credential Enum options: `ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the fiat on-ramp credential to update Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier. Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateFiatOnRampCredentialIntent object The ID of the fiat on-ramp credential to update onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier. Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. The result of the activity The updateFiatOnRampCredentialResult object Unique identifier of the Fiat On-Ramp credential that was updated A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_fiat_on_ramp_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "fiatOnrampCredentialId": "", "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateFiatOnRampCredential({ fiatOnrampCredentialId: " (The ID of the fiat on-ramp credential to update)", onrampProvider: "" // onrampProvider field, projectId: " (Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier.)", publishableApiKey: " (Publishable API key for the on-ramp provider)", encryptedSecretApiKey: " (Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key)", encryptedPrivateApiKey: " (Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateFiatOnRampCredentialIntent": { "fiatOnrampCredentialId": "", "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "" } }, "result": { "updateFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update an OAuth 2.0 Credential Source: https://docs.turnkey.com/api-reference/activities/update-an-oauth-20-credential Update an OAuth 2.0 provider credential Enum options: `ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The ID of the OAuth 2.0 credential to update Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateOauth2CredentialIntent object The ID of the OAuth 2.0 credential to update provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key The result of the activity The updateOauth2CredentialResult object Unique identifier of the OAuth 2.0 credential that was updated A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_oauth2_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "oauth2CredentialId": "", "provider": "", "clientId": "", "encryptedClientSecret": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateOauth2Credential({ oauth2CredentialId: " (The ID of the OAuth 2.0 credential to update)", provider: "" // provider field, clientId: " (The Client ID issued by the OAuth 2.0 provider)", encryptedClientSecret: " (The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateOauth2CredentialIntent": { "oauth2CredentialId": "", "provider": "", "clientId": "", "encryptedClientSecret": "" } }, "result": { "updateOauth2CredentialResult": { "oauth2CredentialId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update policy Source: https://docs.turnkey.com/api-reference/activities/update-policy Update an existing policy. Enum options: `ACTIVITY_TYPE_UPDATE_POLICY_V2` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Policy. Human-readable name for a Policy. Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect (optional). The consensus expression that triggers the Effect (optional). Accompanying notes for a Policy (optional).
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updatePolicyIntentV2 object Unique identifier for a given Policy. Human-readable name for a Policy. policyEffect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect (optional). The consensus expression that triggers the Effect (optional). Accompanying notes for a Policy (optional). The result of the activity The updatePolicyResultV2 object Unique identifier for a given Policy. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_policy \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_POLICY_V2", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "policyId": "", "policyName": "", "policyEffect": "", "policyCondition": "", "policyConsensus": "", "policyNotes": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updatePolicy({ policyId: " (Unique identifier for a given Policy.)", policyName: " (Human-readable name for a Policy.)", policyEffect: "" // policyEffect field, policyCondition: " (The condition expression that triggers the Effect (optional).)", policyConsensus: " (The consensus expression that triggers the Effect (optional).)", policyNotes: " (Accompanying notes for a Policy (optional).)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_POLICY_V2", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updatePolicyIntentV2": { "policyId": "", "policyName": "", "policyEffect": "", "policyCondition": "", "policyConsensus": "", "policyNotes": "" } }, "result": { "updatePolicyResultV2": { "policyId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update private key tag Source: https://docs.turnkey.com/api-reference/activities/update-private-key-tag Update human-readable name or associated private keys. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail. Enum options: `ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Private Key Tag. The new, human-readable name for the tag with the given ID.

A list of Private Keys IDs to add this tag to.

Array item type: string

item field

A list of Private Key IDs to remove this tag from.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updatePrivateKeyTagIntent object Unique identifier for a given Private Key Tag. The new, human-readable name for the tag with the given ID. A list of Private Keys IDs to add this tag to. item field A list of Private Key IDs to remove this tag from. item field The result of the activity The updatePrivateKeyTagResult object Unique identifier for a given Private Key Tag. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_private_key_tag \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "privateKeyTagId": "", "newPrivateKeyTagName": "", "addPrivateKeyIds": [ "" ], "removePrivateKeyIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updatePrivateKeyTag({ privateKeyTagId: " (Unique identifier for a given Private Key Tag.)", newPrivateKeyTagName: " (The new, human-readable name for the tag with the given ID.)", addPrivateKeyIds: [""] // A list of Private Keys IDs to add this tag to., removePrivateKeyIds: [""] // A list of Private Key IDs to remove this tag from. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updatePrivateKeyTagIntent": { "privateKeyTagId": "", "newPrivateKeyTagName": "", "addPrivateKeyIds": [ "" ], "removePrivateKeyIds": [ "" ] } }, "result": { "updatePrivateKeyTagResult": { "privateKeyTagId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update root quorum Source: https://docs.turnkey.com/api-reference/activities/update-root-quorum Set the threshold and members of the root quorum. This activity must be approved by the current root quorum. Enum options: `ACTIVITY_TYPE_UPDATE_ROOT_QUORUM` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

The threshold of unique approvals to reach quorum.

The unique identifiers of users who comprise the quorum set.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateRootQuorumIntent object The threshold of unique approvals to reach quorum. The unique identifiers of users who comprise the quorum set. item field The result of the activity The updateRootQuorumResult object A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_root_quorum \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "threshold": "", "userIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateRootQuorum({ threshold: 0 // The threshold of unique approvals to reach quorum., userIds: [""] // The unique identifiers of users who comprise the quorum set. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateRootQuorumIntent": { "threshold": "", "userIds": [ "" ] } }, "result": { "updateRootQuorumResult": {} }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update user Source: https://docs.turnkey.com/api-reference/activities/update-user Update a user in an existing organization. Enum options: `ACTIVITY_TYPE_UPDATE_USER` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User. Human-readable name for a User. The user's email address.

An updated list of User Tags to apply to this User. This field, if not needed, should be an empty array in your request body.

Array item type: string

item field

The user's phone number in E.164 format e.g. +13214567890
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateUserIntent object Unique identifier for a given User. Human-readable name for a User. The user's email address. An updated list of User Tags to apply to this User. This field, if not needed, should be an empty array in your request body. item field The user's phone number in E.164 format e.g. +13214567890 The result of the activity The updateUserResult object A User ID. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_user \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_USER", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "userName": "", "userEmail": "", "userTagIds": [ "" ], "userPhoneNumber": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateUser({ userId: " (Unique identifier for a given User.)", userName: " (Human-readable name for a User.)", userEmail: " (The user's email address.)", userTagIds: [""] // An updated list of User Tags to apply to this User. This field, if not needed, should be an empty array in your request body., userPhoneNumber: " (The user's phone number in E.164 format e.g. +13214567890)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_USER", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateUserIntent": { "userId": "", "userName": "", "userEmail": "", "userTagIds": [ "" ], "userPhoneNumber": "" } }, "result": { "updateUserResult": { "userId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update user tag Source: https://docs.turnkey.com/api-reference/activities/update-user-tag Update human-readable name or associated users. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail. Enum options: `ACTIVITY_TYPE_UPDATE_USER_TAG` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User Tag. The new, human-readable name for the tag with the given ID.

A list of User IDs to add this tag to.

Array item type: string

item field

A list of User IDs to remove this tag from.

Array item type: string

item field

Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateUserTagIntent object Unique identifier for a given User Tag. The new, human-readable name for the tag with the given ID. A list of User IDs to add this tag to. item field A list of User IDs to remove this tag from. item field The result of the activity The updateUserTagResult object Unique identifier for a given User Tag. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_user_tag \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_USER_TAG", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userTagId": "", "newUserTagName": "", "addUserIds": [ "" ], "removeUserIds": [ "" ] } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateUserTag({ userTagId: " (Unique identifier for a given User Tag.)", newUserTagName: " (The new, human-readable name for the tag with the given ID.)", addUserIds: [""] // A list of User IDs to add this tag to., removeUserIds: [""] // A list of User IDs to remove this tag from. }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_USER_TAG", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateUserTagIntent": { "userTagId": "", "newUserTagName": "", "addUserIds": [ "" ], "removeUserIds": [ "" ] } }, "result": { "updateUserTagResult": { "userTagId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update user's email Source: https://docs.turnkey.com/api-reference/activities/update-users-email Update a user's email in an existing organization. Enum options: `ACTIVITY_TYPE_UPDATE_USER_EMAIL` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User. The user's email address. Setting this to an empty string will remove the user's email. Signed JWT containing a unique id, expiry, verification type, contact
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateUserEmailIntent object Unique identifier for a given User. The user's email address. Setting this to an empty string will remove the user's email. Signed JWT containing a unique id, expiry, verification type, contact The result of the activity The updateUserEmailResult object Unique identifier of the User whose email was updated. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_user_email \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_USER_EMAIL", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "userEmail": "", "verificationToken": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateUserEmail({ userId: " (Unique identifier for a given User.)", userEmail: " (The user's email address. Setting this to an empty string will remove the user's email.)", verificationToken: " (Signed JWT containing a unique id, expiry, verification type, contact)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_USER_EMAIL", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateUserEmailIntent": { "userId": "", "userEmail": "", "verificationToken": "" } }, "result": { "updateUserEmailResult": { "userId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update user's name Source: https://docs.turnkey.com/api-reference/activities/update-users-name Update a user's name in an existing organization. Enum options: `ACTIVITY_TYPE_UPDATE_USER_NAME` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User. Human-readable name for a User.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateUserNameIntent object Unique identifier for a given User. Human-readable name for a User. The result of the activity The updateUserNameResult object Unique identifier of the User whose name was updated. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_user_name \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_USER_NAME", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "userName": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateUserName({ userId: " (Unique identifier for a given User.)", userName: " (Human-readable name for a User.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_USER_NAME", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateUserNameIntent": { "userId": "", "userName": "" } }, "result": { "updateUserNameResult": { "userId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update user's phone number Source: https://docs.turnkey.com/api-reference/activities/update-users-phone-number Update a user's phone number in an existing organization. Enum options: `ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given User. The user's phone number in E.164 format e.g. +13214567890. Setting this to an empty string will remove the user's phone number. Signed JWT containing a unique id, expiry, verification type, contact
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateUserPhoneNumberIntent object Unique identifier for a given User. The user's phone number in E.164 format e.g. +13214567890. Setting this to an empty string will remove the user's phone number. Signed JWT containing a unique id, expiry, verification type, contact The result of the activity The updateUserPhoneNumberResult object Unique identifier of the User whose phone number was updated. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_user_phone_number \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "userId": "", "userPhoneNumber": "", "verificationToken": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateUserPhoneNumber({ userId: " (Unique identifier for a given User.)", userPhoneNumber: " (The user's phone number in E.164 format e.g. +13214567890. Setting this to an empty string will remove the user's phone number.)", verificationToken: " (Signed JWT containing a unique id, expiry, verification type, contact)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateUserPhoneNumberIntent": { "userId": "", "userPhoneNumber": "", "verificationToken": "" } }, "result": { "updateUserPhoneNumberResult": { "userId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Update wallet Source: https://docs.turnkey.com/api-reference/activities/update-wallet Update a wallet for an organization. Enum options: `ACTIVITY_TYPE_UPDATE_WALLET` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

Unique identifier for a given Wallet. Human-readable name for a Wallet.
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The updateWalletIntent object Unique identifier for a given Wallet. Human-readable name for a Wallet. The result of the activity The updateWalletResult object A Wallet ID. A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/update_wallet \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_UPDATE_WALLET", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "walletId": "", "walletName": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().updateWallet({ walletId: " (Unique identifier for a given Wallet.)", walletName: " (Human-readable name for a Wallet.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_UPDATE_WALLET", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "updateWalletIntent": { "walletId": "", "walletName": "" } }, "result": { "updateWalletResult": { "walletId": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # Verify generic OTP Source: https://docs.turnkey.com/api-reference/activities/verify-generic-otp Verify a generic OTP. Enum options: `ACTIVITY_TYPE_VERIFY_OTP` Timestamp (in milliseconds) of the request, used to verify liveness of user requests. Unique identifier for a given Organization.

The parameters object containing the specific intent data for this activity.

ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Expiration window (in seconds) indicating how long the verification token is valid for. If not provided, a default of 1 hour will be used. Maximum value is 86400 seconds (24 hours) Client-side public key generated by the user, which will be added to the JWT response and verified in subsequent requests via a client proof signature
Enable to have your activity generate and return App Proofs, enabling verifiability. A successful response returns the following fields: The activity object containing type, intent, and result Unique identifier for a given Activity object. Unique identifier for a given Organization. The activity status The activity type The intent of the activity The verifyOtpIntent object ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Expiration window (in seconds) indicating how long the verification token is valid for. If not provided, a default of 1 hour will be used. Maximum value is 86400 seconds (24 hours) Client-side public key generated by the user, which will be added to the JWT response and verified in subsequent requests via a client proof signature The result of the activity The verifyOtpResult object Signed JWT containing a unique id, expiry, verification type, contact. Verification status of a user is updated when the token is consumed (in OTP\_LOGIN requests) A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. An artifact verifying a User's action. Whether the activity can be approved. Whether the activity can be rejected. The creation timestamp. The last update timestamp. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/submit/verify_otp \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "type": "ACTIVITY_TYPE_VERIFY_OTP", "timestampMs": " (e.g. 1746736509954)", "organizationId": " (Your Organization ID)", "parameters": { "otpId": "", "otpCode": "", "expirationSeconds": "", "publicKey": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().verifyOtp({ otpId: " (ID representing the result of an init OTP activity.)", otpCode: " (OTP sent out to a user's contact (email or SMS))", expirationSeconds: " (Expiration window (in seconds) indicating how long the verification token is valid for. If not provided, a default of 1 hour will be used. Maximum value is 86400 seconds (24 hours))", publicKey: " (Client-side public key generated by the user, which will be added to the JWT response and verified in subsequent requests via a client proof signature)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "status": "ACTIVITY_STATUS_COMPLETED", "type": "ACTIVITY_TYPE_VERIFY_OTP", "organizationId": "", "timestampMs": " (e.g. 1746736509954)", "result": { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "verifyOtpIntent": { "otpId": "", "otpCode": "", "expirationSeconds": "", "publicKey": "" } }, "result": { "verifyOtpResult": { "verificationToken": "" } }, "votes": "", "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": "", "updatedAt": "" } } } } ``` # API reference Source: https://docs.turnkey.com/api-reference/overview Review our [API Introduction](/developer-reference/api-overview/intro) to get started. # Get a specific boot proof Source: https://docs.turnkey.com/api-reference/queries/get-a-specific-boot-proof Get the boot proof for a given ephemeral key. Unique identifier for a given Organization. Hex encoded ephemeral public key. A successful response returns the following fields: bootProof field The hex encoded Ephemeral Public Key. The DER encoded COSE Sign1 struct Attestation doc. The borsch serialized base64 encoded Manifest. The borsch serialized base64 encoded Manifest Envelope. The label under which the enclave app was deployed. Name of the enclave app Owner of the app i.e. 'tkhq' createdAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_boot_proof \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "ephemeralKey": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getBootProof({ organizationId: " (Unique identifier for a given Organization.)", ephemeralKey: " (Hex encoded ephemeral public key.)" }); ``` ```json 200 theme={"system"} { "bootProof": { "ephemeralPublicKeyHex": "", "awsAttestationDocB64": "", "qosManifestB64": "", "qosManifestEnvelopeB64": "", "deploymentLabel": "", "enclaveApp": "", "owner": "", "createdAt": { "seconds": "", "nanos": "" } } } ``` # Get activity Source: https://docs.turnkey.com/api-reference/queries/get-activity Get details about an activity. Unique identifier for a given organization. Unique identifier for a given activity object. A successful response returns the following fields: activity field Unique identifier for a given Activity object. Unique identifier for a given Organization. status field Enum options: `ACTIVITY_STATUS_CREATED`, `ACTIVITY_STATUS_PENDING`, `ACTIVITY_STATUS_COMPLETED`, `ACTIVITY_STATUS_FAILED`, `ACTIVITY_STATUS_CONSENSUS_NEEDED`, `ACTIVITY_STATUS_REJECTED` type field Enum options: `ACTIVITY_TYPE_CREATE_API_KEYS`, `ACTIVITY_TYPE_CREATE_USERS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD`, `ACTIVITY_TYPE_CREATE_INVITATIONS`, `ACTIVITY_TYPE_ACCEPT_INVITATION`, `ACTIVITY_TYPE_CREATE_POLICY`, `ACTIVITY_TYPE_DISABLE_PRIVATE_KEY`, `ACTIVITY_TYPE_DELETE_USERS`, `ACTIVITY_TYPE_DELETE_API_KEYS`, `ACTIVITY_TYPE_DELETE_INVITATION`, `ACTIVITY_TYPE_DELETE_ORGANIZATION`, `ACTIVITY_TYPE_DELETE_POLICY`, `ACTIVITY_TYPE_CREATE_USER_TAG`, `ACTIVITY_TYPE_DELETE_USER_TAGS`, `ACTIVITY_TYPE_CREATE_ORGANIZATION`, `ACTIVITY_TYPE_SIGN_TRANSACTION`, `ACTIVITY_TYPE_APPROVE_ACTIVITY`, `ACTIVITY_TYPE_REJECT_ACTIVITY`, `ACTIVITY_TYPE_DELETE_AUTHENTICATORS`, `ACTIVITY_TYPE_CREATE_AUTHENTICATORS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG`, `ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS`, `ACTIVITY_TYPE_SET_PAYMENT_METHOD`, `ACTIVITY_TYPE_ACTIVATE_BILLING_TIER`, `ACTIVITY_TYPE_DELETE_PAYMENT_METHOD`, `ACTIVITY_TYPE_CREATE_POLICY_V2`, `ACTIVITY_TYPE_CREATE_POLICY_V3`, `ACTIVITY_TYPE_CREATE_API_ONLY_USERS`, `ACTIVITY_TYPE_UPDATE_ROOT_QUORUM`, `ACTIVITY_TYPE_UPDATE_USER_TAG`, `ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG`, `ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2`, `ACTIVITY_TYPE_CREATE_ORGANIZATION_V2`, `ACTIVITY_TYPE_CREATE_USERS_V2`, `ACTIVITY_TYPE_ACCEPT_INVITATION_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V2`, `ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2`, `ACTIVITY_TYPE_UPDATE_USER`, `ACTIVITY_TYPE_UPDATE_POLICY`, `ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V3`, `ACTIVITY_TYPE_CREATE_WALLET`, `ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS`, `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY`, `ACTIVITY_TYPE_RECOVER_USER`, `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2`, `ACTIVITY_TYPE_SIGN_TRANSACTION_V2`, `ACTIVITY_TYPE_EXPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_EXPORT_WALLET`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4`, `ACTIVITY_TYPE_EMAIL_AUTH`, `ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT`, `ACTIVITY_TYPE_INIT_IMPORT_WALLET`, `ACTIVITY_TYPE_IMPORT_WALLET`, `ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_IMPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_CREATE_POLICIES`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOADS`, `ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION`, `ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS`, `ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V5`, `ACTIVITY_TYPE_OAUTH`, `ACTIVITY_TYPE_CREATE_API_KEYS_V2`, `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION`, `ACTIVITY_TYPE_EMAIL_AUTH_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V6`, `ACTIVITY_TYPE_DELETE_PRIVATE_KEYS`, `ACTIVITY_TYPE_DELETE_WALLETS`, `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2`, `ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION`, `ACTIVITY_TYPE_INIT_OTP_AUTH`, `ACTIVITY_TYPE_OTP_AUTH`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7`, `ACTIVITY_TYPE_UPDATE_WALLET`, `ACTIVITY_TYPE_UPDATE_POLICY_V2`, `ACTIVITY_TYPE_CREATE_USERS_V3`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V2`, `ACTIVITY_TYPE_INIT_OTP`, `ACTIVITY_TYPE_VERIFY_OTP`, `ACTIVITY_TYPE_OTP_LOGIN`, `ACTIVITY_TYPE_STAMP_LOGIN`, `ACTIVITY_TYPE_OAUTH_LOGIN`, `ACTIVITY_TYPE_UPDATE_USER_NAME`, `ACTIVITY_TYPE_UPDATE_USER_EMAIL`, `ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER`, `ACTIVITY_TYPE_INIT_FIAT_ON_RAMP`, `ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE`, `ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE`, `ACTIVITY_TYPE_ENABLE_AUTH_PROXY`, `ACTIVITY_TYPE_DISABLE_AUTH_PROXY`, `ACTIVITY_TYPE_UPDATE_AUTH_PROXY_CONFIG`, `ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_OAUTH2_AUTHENTICATE`, `ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS`, `ACTIVITY_TYPE_DELETE_POLICIES`, `ACTIVITY_TYPE_ETH_SEND_RAW_TRANSACTION`, `ACTIVITY_TYPE_ETH_SEND_TRANSACTION`, `ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_EMAIL_AUTH_V3`, `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V3`, `ACTIVITY_TYPE_INIT_OTP_V2`, `ACTIVITY_TYPE_UPSERT_GAS_USAGE_CONFIG`, `ACTIVITY_TYPE_CREATE_TVC_APP`, `ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT`, `ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS`, `ACTIVITY_TYPE_SOL_SEND_TRANSACTION` intent field createOrganizationIntent field Human-readable name for an Organization. The root user's email address. rootAuthenticator field Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. Unique identifier for the root user object. createAuthenticatorsIntent field A list of Authenticators. Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. Unique identifier for a given User. createUsersIntent field A list of Users. Human-readable name for a User. The user's email address. accessType field Enum options: `ACCESS_TYPE_WEB`, `ACCESS_TYPE_API`, `ACCESS_TYPE_ALL` A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field createPrivateKeysIntent field A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` signRawPayloadIntent field Unique identifier for a given Private Key. Raw unsigned payload to be signed. encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` createInvitationsIntent field A list of Invitations. The name of the intended Invitation recipient. The email address of the intended Invitation recipient. A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body. item field accessType field Enum options: `ACCESS_TYPE_WEB`, `ACCESS_TYPE_API`, `ACCESS_TYPE_ALL` Unique identifier for the Sender of an Invitation. acceptInvitationIntent field Unique identifier for a given Invitation object. Unique identifier for a given User. authenticator field Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. createPolicyIntent field Human-readable name for a Policy. A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details. subject field operator field Enum options: `OPERATOR_EQUAL`, `OPERATOR_MORE_THAN`, `OPERATOR_MORE_THAN_OR_EQUAL`, `OPERATOR_LESS_THAN`, `OPERATOR_LESS_THAN_OR_EQUAL`, `OPERATOR_CONTAINS`, `OPERATOR_NOT_EQUAL`, `OPERATOR_IN`, `OPERATOR_NOT_IN`, `OPERATOR_CONTAINS_ONE`, `OPERATOR_CONTAINS_ALL` target field effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` notes field disablePrivateKeyIntent field Unique identifier for a given Private Key. deleteUsersIntent field A list of User IDs. item field deleteAuthenticatorsIntent field Unique identifier for a given User. A list of Authenticator IDs. item field deleteInvitationIntent field Unique identifier for a given Invitation object. deleteOrganizationIntent field Unique identifier for a given Organization. deletePolicyIntent field Unique identifier for a given Policy. createUserTagIntent field Human-readable name for a User Tag. A list of User IDs. item field deleteUserTagsIntent field A list of User Tag IDs. item field signTransactionIntent field Unique identifier for a given Private Key. Raw unsigned transaction to be signed by a particular Private Key. type field Enum options: `TRANSACTION_TYPE_ETHEREUM`, `TRANSACTION_TYPE_SOLANA`, `TRANSACTION_TYPE_TRON`, `TRANSACTION_TYPE_BITCOIN`, `TRANSACTION_TYPE_TEMPO` createApiKeysIntent field A list of API Keys. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. Unique identifier for a given User. deleteApiKeysIntent field Unique identifier for a given User. A list of API Key IDs. item field approveActivityIntent field An artifact verifying a User's action. rejectActivityIntent field An artifact verifying a User's action. createPrivateKeyTagIntent field Human-readable name for a Private Key Tag. A list of Private Key IDs. item field deletePrivateKeyTagsIntent field A list of Private Key Tag IDs. item field createPolicyIntentV2 field Human-readable name for a Policy. A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details. subject field operator field Enum options: `OPERATOR_EQUAL`, `OPERATOR_MORE_THAN`, `OPERATOR_MORE_THAN_OR_EQUAL`, `OPERATOR_LESS_THAN`, `OPERATOR_LESS_THAN_OR_EQUAL`, `OPERATOR_CONTAINS`, `OPERATOR_NOT_EQUAL`, `OPERATOR_IN`, `OPERATOR_NOT_IN`, `OPERATOR_CONTAINS_ONE`, `OPERATOR_CONTAINS_ALL` targets field item field effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` notes field setPaymentMethodIntent field The account number of the customer's credit card. The verification digits of the customer's credit card. The month that the credit card expires. The year that the credit card expires. The email that will receive invoices for the credit card. The name associated with the credit card. activateBillingTierIntent field The product that the customer wants to subscribe to. deletePaymentMethodIntent field The payment method that the customer wants to remove. createPolicyIntentV3 field Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy. createApiOnlyUsersIntent field A list of API-only Users to create. The name of the new API-only User. The email address for this API-only User (optional). A list of tags assigned to the new API-only User. This field, if not needed, should be an empty array in your request body. item field A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. updateRootQuorumIntent field The threshold of unique approvals to reach quorum. The unique identifiers of users who comprise the quorum set. item field updateUserTagIntent field Unique identifier for a given User Tag. The new, human-readable name for the tag with the given ID. A list of User IDs to add this tag to. item field A list of User IDs to remove this tag from. item field updatePrivateKeyTagIntent field Unique identifier for a given Private Key Tag. The new, human-readable name for the tag with the given ID. A list of Private Keys IDs to add this tag to. item field A list of Private Key IDs to remove this tag from. item field createAuthenticatorsIntentV2 field A list of Authenticators. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for a given User. acceptInvitationIntentV2 field Unique identifier for a given Invitation object. Unique identifier for a given User. authenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` createOrganizationIntentV2 field Human-readable name for an Organization. The root user's email address. rootAuthenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for the root user object. createUsersIntentV2 field A list of Users. Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field createSubOrganizationIntent field Name for this sub-organization rootAuthenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` createSubOrganizationIntentV2 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users updateAllowedOriginsIntent field Additional origins requests are allowed from besides Turnkey origins item field createPrivateKeysIntentV2 field A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` updateUserIntent field Unique identifier for a given User. Human-readable name for a User. The user's email address. An updated list of User Tags to apply to this User. This field, if not needed, should be an empty array in your request body. item field The user's phone number in E.164 format e.g. +13214567890 updatePolicyIntent field Unique identifier for a given Policy. Human-readable name for a Policy. policyEffect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect (optional). The consensus expression that triggers the Effect (optional). Accompanying notes for a Policy (optional). setPaymentMethodIntentV2 field The id of the payment method that was created clientside. The email that will receive invoices for the credit card. The name associated with the credit card. createSubOrganizationIntentV3 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` createWalletIntent field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. createWalletAccountsIntent field Unique identifier for a given Wallet. A list of wallet Accounts. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true. initUserEmailRecoveryIntent field Email of the user starting recovery Client-side public key generated by the user, to which the recovery bundle will be encrypted. Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to recoverUserIntent field authenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for the user performing recovery. setOrganizationFeatureIntent field name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` Optional value for the feature. Will override existing values if feature is already set. removeOrganizationFeatureIntent field name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` signRawPayloadIntentV2 field A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned payload to be signed. encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` signTransactionIntentV2 field A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned transaction to be signed type field Enum options: `TRANSACTION_TYPE_ETHEREUM`, `TRANSACTION_TYPE_SOLANA`, `TRANSACTION_TYPE_TRON`, `TRANSACTION_TYPE_BITCOIN`, `TRANSACTION_TYPE_TEMPO` exportPrivateKeyIntent field Unique identifier for a given Private Key. Client-side public key generated by the user, to which the export bundle will be encrypted. exportWalletIntent field Unique identifier for a given Wallet. Client-side public key generated by the user, to which the export bundle will be encrypted. language field Enum options: `MNEMONIC_LANGUAGE_ENGLISH`, `MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE`, `MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE`, `MNEMONIC_LANGUAGE_CZECH`, `MNEMONIC_LANGUAGE_FRENCH`, `MNEMONIC_LANGUAGE_ITALIAN`, `MNEMONIC_LANGUAGE_JAPANESE`, `MNEMONIC_LANGUAGE_KOREAN`, `MNEMONIC_LANGUAGE_SPANISH` createSubOrganizationIntentV4 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization emailAuthIntent field Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to exportWalletAccountIntent field Address to identify Wallet Account. Client-side public key generated by the user, to which the export bundle will be encrypted. initImportWalletIntent field The ID of the User importing a Wallet. importWalletIntent field The ID of the User importing a Wallet. Human-readable name for a Wallet. Bundle containing a wallet mnemonic encrypted to the enclave's target public key. A list of wallet Accounts. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` initImportPrivateKeyIntent field The ID of the User importing a Private Key. importPrivateKeyIntent field The ID of the User importing a Private Key. Human-readable name for a Private Key. Bundle containing a raw private key encrypted to the enclave's target public key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` createPoliciesIntent field An array of policy intents to be created. Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy. signRawPayloadsIntent field A Wallet account address, Private Key address, or Private Key identifier. An array of raw unsigned payloads to be signed. item field encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` createReadOnlySessionIntent field createOauthProvidersIntent field The ID of the User to add an Oauth provider to A list of Oauth providers. Human-readable name to identify a Provider. Base64 encoded OIDC token deleteOauthProvidersIntent field The ID of the User to remove an Oauth provider from Unique identifier for a given Provider. item field createSubOrganizationIntentV5 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization oauthIntent field Base64 encoded OIDC token Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Oauth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Oauth API keys createApiKeysIntentV2 field A list of API Keys. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. Unique identifier for a given User. createReadWriteSessionIntent field Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted. Email of the user to create a read write session for Optional human-readable name for an API Key. If none provided, default to Read Write Session - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailAuthIntentV2 field Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to createSubOrganizationIntentV6 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization deletePrivateKeysIntent field List of unique identifiers for private keys within an organization item field Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored. deleteWalletsIntent field List of unique identifiers for wallets within an organization item field Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored. createReadWriteSessionIntentV2 field Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted. Unique identifier for a given User. Optional human-readable name for an API Key. If none provided, default to Read Write Session - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated ReadWriteSession API keys deleteSubOrganizationIntent field Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false. initOtpAuthIntent field Enum to specifiy whether to send OTP via SMS or email Email or phone number to send the OTP code to emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to otpAuthIntent field ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to OTP Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated OTP Auth API keys createSubOrganizationIntentV7 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization Disable OTP SMS auth for the sub-organization Disable OTP email auth for the sub-organization Signed JWT containing a unique id, expiry, verification type, contact clientSignature field The public component of a cryptographic key pair used to create the signature. scheme field Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message. updateWalletIntent field Unique identifier for a given Wallet. Human-readable name for a Wallet. updatePolicyIntentV2 field Unique identifier for a given Policy. Human-readable name for a Policy. policyEffect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect (optional). The consensus expression that triggers the Effect (optional). Accompanying notes for a Policy (optional). createUsersIntentV3 field A list of Users. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field initOtpAuthIntentV2 field Enum to specifiy whether to send OTP via SMS or email Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to initOtpIntent field Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to verifyOtpIntent field ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Expiration window (in seconds) indicating how long the verification token is valid for. If not provided, a default of 1 hour will be used. Maximum value is 86400 seconds (24 hours) Client-side public key generated by the user, which will be added to the JWT response and verified in subsequent requests via a client proof signature otpLoginIntent field Signed JWT containing a unique id, expiry, verification type, contact Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys clientSignature field The public component of a cryptographic key pair used to create the signature. scheme field Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message. stampLoginIntent field Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys oauthLoginIntent field Base64 encoded OIDC token Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys updateUserNameIntent field Unique identifier for a given User. Human-readable name for a User. updateUserEmailIntent field Unique identifier for a given User. The user's email address. Setting this to an empty string will remove the user's email. Signed JWT containing a unique id, expiry, verification type, contact updateUserPhoneNumberIntent field Unique identifier for a given User. The user's phone number in E.164 format e.g. +13214567890. Setting this to an empty string will remove the user's phone number. Signed JWT containing a unique id, expiry, verification type, contact initFiatOnRampIntent field onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Destination wallet address for the buy transaction. network field Enum options: `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE` cryptoCurrencyCode field Enum options: `FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC` fiatCurrencyCode field Enum options: `FIAT_ON_RAMP_CURRENCY_AUD`, `FIAT_ON_RAMP_CURRENCY_BGN`, `FIAT_ON_RAMP_CURRENCY_BRL`, `FIAT_ON_RAMP_CURRENCY_CAD`, `FIAT_ON_RAMP_CURRENCY_CHF`, `FIAT_ON_RAMP_CURRENCY_COP`, `FIAT_ON_RAMP_CURRENCY_CZK`, `FIAT_ON_RAMP_CURRENCY_DKK`, `FIAT_ON_RAMP_CURRENCY_DOP`, `FIAT_ON_RAMP_CURRENCY_EGP`, `FIAT_ON_RAMP_CURRENCY_EUR`, `FIAT_ON_RAMP_CURRENCY_GBP`, `FIAT_ON_RAMP_CURRENCY_HKD`, `FIAT_ON_RAMP_CURRENCY_IDR`, `FIAT_ON_RAMP_CURRENCY_ILS`, `FIAT_ON_RAMP_CURRENCY_JOD`, `FIAT_ON_RAMP_CURRENCY_KES`, `FIAT_ON_RAMP_CURRENCY_KWD`, `FIAT_ON_RAMP_CURRENCY_LKR`, `FIAT_ON_RAMP_CURRENCY_MXN`, `FIAT_ON_RAMP_CURRENCY_NGN`, `FIAT_ON_RAMP_CURRENCY_NOK`, `FIAT_ON_RAMP_CURRENCY_NZD`, `FIAT_ON_RAMP_CURRENCY_OMR`, `FIAT_ON_RAMP_CURRENCY_PEN`, `FIAT_ON_RAMP_CURRENCY_PLN`, `FIAT_ON_RAMP_CURRENCY_RON`, `FIAT_ON_RAMP_CURRENCY_SEK`, `FIAT_ON_RAMP_CURRENCY_THB`, `FIAT_ON_RAMP_CURRENCY_TRY`, `FIAT_ON_RAMP_CURRENCY_TWD`, `FIAT_ON_RAMP_CURRENCY_USD`, `FIAT_ON_RAMP_CURRENCY_VND`, `FIAT_ON_RAMP_CURRENCY_ZAR` Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount. paymentMethod field Enum options: `FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD`, `FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL`, `FIAT_ON_RAMP_PAYMENT_METHOD_VENMO`, `FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE`, `FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT`, `FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET`, `FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT` ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB. ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country\_code=US. Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false. Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled. createSmartContractInterfaceIntent field Corresponding contract address or program ID ABI/IDL as a JSON string. Limited to 400kb type field Enum options: `SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM`, `SMART_CONTRACT_INTERFACE_TYPE_SOLANA` Human-readable name for a Smart Contract Interface. Notes for a Smart Contract Interface. deleteSmartContractInterfaceIntent field The ID of a Smart Contract Interface intended for deletion. enableAuthProxyIntent field disableAuthProxyIntent field updateAuthProxyConfigIntent field Updated list of allowed origins for CORS. item field Updated list of allowed proxy authentication methods. item field Custom 'from' address for auth-related emails. Custom reply-to address for auth-related emails. Template ID for email-auth messages. Template ID for OTP SMS messages. emailCustomizationParams field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomizationParams field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} walletKitSettings field List of enabled social login providers (e.g., 'apple', 'google', 'facebook') item field Mapping of social login providers to their Oauth client IDs. Oauth redirect URL to be used for social login flows. OTP code lifetime in seconds. Verification-token lifetime in seconds. Session lifetime in seconds. Enable alphanumeric OTP codes. Desired OTP code length (6–9). Custom 'from' email sender for auth-related emails. Verification token required for get account with PII (email/phone number). Default false. createOauth2CredentialIntent field provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key updateOauth2CredentialIntent field The ID of the OAuth 2.0 credential to update provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key deleteOauth2CredentialIntent field The ID of the OAuth 2.0 credential to delete oauth2AuthenticateIntent field The OAuth 2.0 credential id whose client\_id and client\_secret will be used in the OAuth 2.0 flow The auth\_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider The code verifier used by OAuth 2.0 PKCE providers An optional nonce used by the client to prevent replay/substitution of an ID token An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token deleteWalletAccountsIntent field List of unique identifiers for wallet accounts within an organization item field Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored. deletePoliciesIntent field List of unique identifiers for policies within an organization item field ethSendRawTransactionIntent field The raw, signed transaction to be sent. CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet). Enum options: `eip155:1`, `eip155:11155111`, `eip155:8453`, `eip155:84532` ethSendTransactionIntent field A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet). Enum options: `eip155:1`, `eip155:11155111`, `eip155:8453`, `eip155:84532`, `eip155:137`, `eip155:80002` Recipient address as a hex string with 0x prefix. Amount of native asset to send in wei. Hex-encoded call data for contract interactions. Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations. Maximum amount of gas to use for this transaction, for EIP-1559 transactions. Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture. createFiatOnRampCredentialIntent field onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. If the on-ramp credential is a sandbox credential updateFiatOnRampCredentialIntent field The ID of the fiat on-ramp credential to update onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier. Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. deleteFiatOnRampCredentialIntent field The ID of the fiat on-ramp credential to delete emailAuthIntentV3 field Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to initUserEmailRecoveryIntentV2 field Email of the user starting recovery Client-side public key generated by the user, to which the recovery bundle will be encrypted. Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to initOtpIntentV2 field Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided. emailCustomization field A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to initOtpAuthIntentV3 field Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided. emailCustomization field A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to upsertGasUsageConfigIntent field Gas sponsorship USD limit for the billing organization window. Gas sponsorship USD limit for sub-organizations under the billing organization. Rolling sponsorship window duration, expressed in minutes. Whether gas sponsorship is enabled for the organization. createTvcAppIntent field The name of the new TVC application Quorum public key to use for this application Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required manifestSetParams field Short description for this new operator set Operators to create as part of this new operator set The name for this new operator Public key for this operator Existing operators to use as part of this new operator set item field The threshold of operators needed to reach consensus in this new Operator Set Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required shareSetParams field Short description for this new operator set Operators to create as part of this new operator set The name for this new operator Public key for this operator Existing operators to use as part of this new operator set item field The threshold of operators needed to reach consensus in this new Operator Set Enables external connectivity for this TVC app. Default if not provided: false. createTvcDeploymentIntent field The unique identifier of the to-be-deployed TVC application The QuorumOS version to use to deploy this application URL of the container containing the pivot binary Location of the binary in the pivot container Arguments to pass to the pivot binary at startup. Encoded as a list of strings, for example \["--foo", "bar"] item field Digest of the pivot binary in the pivot container. This value will be inserted in the QOS manifest to ensure application integrity. URL of the container containing the host binary Location of the binary inside the host container Arguments to pass to the host binary at startup. Encoded as a list of strings, for example \["--foo", "bar"] item field Optional nonce to ensure uniqueness of the deployment manifest. If not provided, it defaults to the current Unix timestamp in seconds. Optional encrypted pull secret to authorize Turnkey to pull the pivot container image. If your image is public, leave this empty. Optional encrypted pull secret to authorize Turnkey to pull the host container image. If your image is public, leave this empty. createTvcManifestApprovalsIntent field Unique identifier of the TVC deployment to approve List of manifest approvals Unique identifier of the operator providing this approval Signature from the operator approving the manifest solSendTransactionIntent field Base64-encoded serialized unsigned Solana transaction A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Enum options: `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`, `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG`, `solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY` user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution result field createOrganizationResult field Unique identifier for a given Organization. createAuthenticatorsResult field A list of Authenticator IDs. item field createUsersResult field A list of User IDs. item field createPrivateKeysResult field A list of Private Key IDs. item field createInvitationsResult field A list of Invitation IDs item field acceptInvitationResult field Unique identifier for a given Invitation. Unique identifier for a given User. signRawPayloadResult field Component of an ECSDA signature. Component of an ECSDA signature. Component of an ECSDA signature. createPolicyResult field Unique identifier for a given Policy. disablePrivateKeyResult field Unique identifier for a given Private Key. deleteUsersResult field A list of User IDs. item field deleteAuthenticatorsResult field Unique identifier for a given Authenticator. item field deleteInvitationResult field Unique identifier for a given Invitation. deleteOrganizationResult field Unique identifier for a given Organization. deletePolicyResult field Unique identifier for a given Policy. createUserTagResult field Unique identifier for a given User Tag. A list of User IDs. item field deleteUserTagsResult field A list of User Tag IDs. item field A list of User IDs. item field signTransactionResult field signedTransaction field deleteApiKeysResult field A list of API Key IDs. item field createApiKeysResult field A list of API Key IDs. item field createPrivateKeyTagResult field Unique identifier for a given Private Key Tag. A list of Private Key IDs. item field deletePrivateKeyTagsResult field A list of Private Key Tag IDs. item field A list of Private Key IDs. item field setPaymentMethodResult field The last four digits of the credit card added. The name associated with the payment method. The email address associated with the payment method. activateBillingTierResult field The id of the product being subscribed to. deletePaymentMethodResult field The payment method that was removed. createApiOnlyUsersResult field A list of API-only User IDs. item field updateRootQuorumResult field updateUserTagResult field Unique identifier for a given User Tag. updatePrivateKeyTagResult field Unique identifier for a given Private Key Tag. createSubOrganizationResult field subOrganizationId field rootUserIds field item field updateAllowedOriginsResult field createPrivateKeysResultV2 field A list of Private Key IDs and addresses. privateKeyId field addresses field format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field updateUserResult field A User ID. updatePolicyResult field Unique identifier for a given Policy. createSubOrganizationResultV3 field subOrganizationId field A list of Private Key IDs and addresses. privateKeyId field addresses field format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field rootUserIds field item field createWalletResult field Unique identifier for a Wallet. A list of account addresses. item field createWalletAccountsResult field A list of derived addresses. item field initUserEmailRecoveryResult field Unique identifier for the user being recovered. recoverUserResult field ID of the authenticator created. item field setOrganizationFeatureResult field Resulting list of organization features. name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field removeOrganizationFeatureResult field Resulting list of organization features. name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field exportPrivateKeyResult field Unique identifier for a given Private Key. Export bundle containing a private key encrypted to the client's target public key. exportWalletResult field Unique identifier for a given Wallet. Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key. createSubOrganizationResultV4 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field emailAuthResult field Unique identifier for the authenticating User. Unique identifier for the created API key. exportWalletAccountResult field Address to identify Wallet Account. Export bundle containing a private key encrypted by the client's target public key. initImportWalletResult field Import bundle containing a public key and signature to use for importing client data. importWalletResult field Unique identifier for a Wallet. A list of account addresses. item field initImportPrivateKeyResult field Import bundle containing a public key and signature to use for importing client data. importPrivateKeyResult field Unique identifier for a Private Key. A list of addresses. format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field createPoliciesResult field A list of unique identifiers for the created policies. item field signRawPayloadsResult field signatures field Component of an ECSDA signature. Component of an ECSDA signature. Component of an ECSDA signature. createReadOnlySessionResult field Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. String representing a read only session UTC timestamp in seconds representing the expiry time for the read only session. createOauthProvidersResult field A list of unique identifiers for Oauth Providers item field deleteOauthProvidersResult field A list of unique identifiers for Oauth Providers item field createSubOrganizationResultV5 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field oauthResult field Unique identifier for the authenticating User. Unique identifier for the created API key. HPKE encrypted credential bundle createReadWriteSessionResult field Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. Unique identifier for the created API key. HPKE encrypted credential bundle createSubOrganizationResultV6 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field deletePrivateKeysResult field A list of private key unique identifiers that were removed item field deleteWalletsResult field A list of wallet unique identifiers that were removed item field createReadWriteSessionResultV2 field Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. Unique identifier for the created API key. HPKE encrypted credential bundle deleteSubOrganizationResult field Unique identifier of the sub organization that was removed initOtpAuthResult field Unique identifier for an OTP authentication otpAuthResult field Unique identifier for the authenticating User. Unique identifier for the created API key. HPKE encrypted credential bundle createSubOrganizationResultV7 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field updateWalletResult field A Wallet ID. updatePolicyResultV2 field Unique identifier for a given Policy. initOtpAuthResultV2 field Unique identifier for an OTP authentication initOtpResult field Unique identifier for an OTP authentication verifyOtpResult field Signed JWT containing a unique id, expiry, verification type, contact. Verification status of a user is updated when the token is consumed (in OTP\_LOGIN requests) otpLoginResult field Signed JWT containing an expiry, public key, session type, user id, and organization id stampLoginResult field Signed JWT containing an expiry, public key, session type, user id, and organization id oauthLoginResult field Signed JWT containing an expiry, public key, session type, user id, and organization id updateUserNameResult field Unique identifier of the User whose name was updated. updateUserEmailResult field Unique identifier of the User whose email was updated. updateUserPhoneNumberResult field Unique identifier of the User whose phone number was updated. initFiatOnRampResult field Unique URL for a given fiat on-ramp flow. Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow. Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project. createSmartContractInterfaceResult field The ID of the created Smart Contract Interface. deleteSmartContractInterfaceResult field The ID of the deleted Smart Contract Interface. enableAuthProxyResult field A User ID with permission to initiate authentication. disableAuthProxyResult field updateAuthProxyConfigResult field Unique identifier for a given User. (representing the turnkey signer user id) createOauth2CredentialResult field Unique identifier of the OAuth 2.0 credential that was created updateOauth2CredentialResult field Unique identifier of the OAuth 2.0 credential that was updated deleteOauth2CredentialResult field Unique identifier of the OAuth 2.0 credential that was deleted oauth2AuthenticateResult field Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity deleteWalletAccountsResult field A list of wallet account unique identifiers that were removed item field deletePoliciesResult field A list of unique identifiers for the deleted policies. item field ethSendRawTransactionResult field The transaction hash of the sent transaction createFiatOnRampCredentialResult field Unique identifier of the Fiat On-Ramp credential that was created updateFiatOnRampCredentialResult field Unique identifier of the Fiat On-Ramp credential that was updated deleteFiatOnRampCredentialResult field Unique identifier of the Fiat On-Ramp credential that was deleted ethSendTransactionResult field The send\_transaction\_status ID associated with the transaction submission upsertGasUsageConfigResult field Unique identifier for the gas usage configuration that was created or updated. createTvcAppResult field The unique identifier for the TVC application The unique identifier for the TVC manifest set The unique identifier(s) of the manifest set operators item field The required number of approvals for the manifest set createTvcDeploymentResult field The unique identifier for the TVC deployment The unique identifier for the TVC manifest createTvcManifestApprovalsResult field The unique identifier(s) for the manifest approvals item field solSendTransactionResult field The send\_transaction\_status ID associated with the transaction submission A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. Unique identifier for a given Vote object. Unique identifier for a given User. user field Unique identifier for a given User. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of Authenticator parameters. Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE). item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` attestationType field Identifier indicating the type of the Security Key. Unique identifier for a WebAuthn credential. The type of Authenticator device. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given Authenticator. Human-readable name for an Authenticator. createdAt field seconds field nanos field updatedAt field seconds field nanos field A list of API Key parameters. This field, if not needed, should be an empty array in your request body. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given API Key. Human-readable name for an API Key. createdAt field seconds field nanos field updatedAt field seconds field nanos field Optional window (in seconds) indicating how long the API Key should last. A list of User Tag IDs. item field A list of Oauth Providers. Unique identifier for an OAuth Provider Human-readable name to identify a Provider. The issuer of the token, typically a URL indicating the authentication server, e.g [https://accounts.google.com](https://accounts.google.com) Expected audience ('aud' attribute of the signed token) which represents the app ID Expected subject ('sub' attribute of the signed token) which represents the user ID createdAt field seconds field nanos field updatedAt field seconds field nanos field createdAt field seconds field nanos field updatedAt field seconds field nanos field Unique identifier for a given Activity object. selection field Enum options: `VOTE_SELECTION_APPROVED`, `VOTE_SELECTION_REJECTED` The raw message being signed within a Vote. The public component of a cryptographic key pair used to sign messages and transactions. The signature applied to a particular vote. Method used to produce a signature. createdAt field seconds field nanos field A list of App Proofs generated by enclaves during activity execution, providing verifiable attestations of performed operations. scheme field Enum options: `SIGNATURE_SCHEME_EPHEMERAL_KEY_P256` Ephemeral public key. JSON serialized AppProofPayload. Signature over hashed proof\_payload. An artifact verifying a User's action. canApprove field canReject field createdAt field seconds field nanos field updatedAt field seconds field nanos field failure field code field message field details field @type field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_activity \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "activityId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getActivity({ organizationId: " (Unique identifier for a given organization.)", activityId: " (Unique identifier for a given activity object.)" }); ``` ```json 200 theme={"system"} { "activity": { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createOrganizationIntent": { "organizationName": "", "rootEmail": "", "rootAuthenticator": { "authenticatorName": "", "userId": "", "attestation": { "id": "", "type": "", "rawId": "", "authenticatorAttachment": "", "response": { "clientDataJson": "", "attestationObject": "", "transports": [ "" ], "authenticatorAttachment": "" }, "clientExtensionResults": { "appid": "", "appidExclude": "", "credProps": { "rk": "" } } }, "challenge": "" }, "rootUserId": "" } }, "result": { "createOrganizationResult": { "organizationId": "" }, "createAuthenticatorsResult": { "authenticatorIds": [ "" ] }, "createUsersResult": { "userIds": [ "" ] }, "createPrivateKeysResult": { "privateKeyIds": [ "" ] }, "createInvitationsResult": { "invitationIds": [ "" ] }, "acceptInvitationResult": { "invitationId": "", "userId": "" }, "signRawPayloadResult": { "r": "", "s": "", "v": "" }, "createPolicyResult": { "policyId": "" }, "disablePrivateKeyResult": { "privateKeyId": "" }, "deleteUsersResult": { "userIds": [ "" ] }, "deleteAuthenticatorsResult": { "authenticatorIds": [ "" ] }, "deleteInvitationResult": { "invitationId": "" }, "deleteOrganizationResult": { "organizationId": "" }, "deletePolicyResult": { "policyId": "" }, "createUserTagResult": { "userTagId": "", "userIds": [ "" ] }, "deleteUserTagsResult": { "userTagIds": [ "" ], "userIds": [ "" ] }, "signTransactionResult": { "signedTransaction": "" }, "deleteApiKeysResult": { "apiKeyIds": [ "" ] }, "createApiKeysResult": { "apiKeyIds": [ "" ] }, "createPrivateKeyTagResult": { "privateKeyTagId": "", "privateKeyIds": [ "" ] }, "deletePrivateKeyTagsResult": { "privateKeyTagIds": [ "" ], "privateKeyIds": [ "" ] }, "setPaymentMethodResult": { "lastFour": "", "cardHolderName": "", "cardHolderEmail": "" }, "activateBillingTierResult": { "productId": "" }, "deletePaymentMethodResult": { "paymentMethodId": "" }, "createApiOnlyUsersResult": { "userIds": [ "" ] }, "updateRootQuorumResult": "", "updateUserTagResult": { "userTagId": "" }, "updatePrivateKeyTagResult": { "privateKeyTagId": "" }, "createSubOrganizationResult": { "subOrganizationId": "", "rootUserIds": [ "" ] }, "updateAllowedOriginsResult": "", "createPrivateKeysResultV2": { "privateKeys": [ { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] } ] }, "updateUserResult": { "userId": "" }, "updatePolicyResult": { "policyId": "" }, "createSubOrganizationResultV3": { "subOrganizationId": "", "privateKeys": [ { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] } ], "rootUserIds": [ "" ] }, "createWalletResult": { "walletId": "", "addresses": [ "" ] }, "createWalletAccountsResult": { "addresses": [ "" ] }, "initUserEmailRecoveryResult": { "userId": "" }, "recoverUserResult": { "authenticatorId": [ "" ] }, "setOrganizationFeatureResult": { "features": [ { "name": "", "value": "" } ] }, "removeOrganizationFeatureResult": { "features": [ { "name": "", "value": "" } ] }, "exportPrivateKeyResult": { "privateKeyId": "", "exportBundle": "" }, "exportWalletResult": { "walletId": "", "exportBundle": "" }, "createSubOrganizationResultV4": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "emailAuthResult": { "userId": "", "apiKeyId": "" }, "exportWalletAccountResult": { "address": "", "exportBundle": "" }, "initImportWalletResult": { "importBundle": "" }, "importWalletResult": { "walletId": "", "addresses": [ "" ] }, "initImportPrivateKeyResult": { "importBundle": "" }, "importPrivateKeyResult": { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] }, "createPoliciesResult": { "policyIds": [ "" ] }, "signRawPayloadsResult": { "signatures": [ { "r": "", "s": "", "v": "" } ] }, "createReadOnlySessionResult": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "session": "", "sessionExpiry": "" }, "createOauthProvidersResult": { "providerIds": [ "" ] }, "deleteOauthProvidersResult": { "providerIds": [ "" ] }, "createSubOrganizationResultV5": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "oauthResult": { "userId": "", "apiKeyId": "", "credentialBundle": "" }, "createReadWriteSessionResult": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "apiKeyId": "", "credentialBundle": "" }, "createSubOrganizationResultV6": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "deletePrivateKeysResult": { "privateKeyIds": [ "" ] }, "deleteWalletsResult": { "walletIds": [ "" ] }, "createReadWriteSessionResultV2": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "apiKeyId": "", "credentialBundle": "" }, "deleteSubOrganizationResult": { "subOrganizationUuid": "" }, "initOtpAuthResult": { "otpId": "" }, "otpAuthResult": { "userId": "", "apiKeyId": "", "credentialBundle": "" }, "createSubOrganizationResultV7": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "updateWalletResult": { "walletId": "" }, "updatePolicyResultV2": { "policyId": "" }, "initOtpAuthResultV2": { "otpId": "" }, "initOtpResult": { "otpId": "" }, "verifyOtpResult": { "verificationToken": "" }, "otpLoginResult": { "session": "" }, "stampLoginResult": { "session": "" }, "oauthLoginResult": { "session": "" }, "updateUserNameResult": { "userId": "" }, "updateUserEmailResult": { "userId": "" }, "updateUserPhoneNumberResult": { "userId": "" }, "initFiatOnRampResult": { "onRampUrl": "", "onRampTransactionId": "", "onRampUrlSignature": "" }, "createSmartContractInterfaceResult": { "smartContractInterfaceId": "" }, "deleteSmartContractInterfaceResult": { "smartContractInterfaceId": "" }, "enableAuthProxyResult": { "userId": "" }, "disableAuthProxyResult": "", "updateAuthProxyConfigResult": { "configId": "" }, "createOauth2CredentialResult": { "oauth2CredentialId": "" }, "updateOauth2CredentialResult": { "oauth2CredentialId": "" }, "deleteOauth2CredentialResult": { "oauth2CredentialId": "" }, "oauth2AuthenticateResult": { "oidcToken": "" }, "deleteWalletAccountsResult": { "walletAccountIds": [ "" ] }, "deletePoliciesResult": { "policyIds": [ "" ] }, "ethSendRawTransactionResult": { "transactionHash": "" }, "createFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" }, "updateFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" }, "deleteFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" }, "ethSendTransactionResult": { "sendTransactionStatusId": "" }, "upsertGasUsageConfigResult": { "gasUsageConfigId": "" }, "createTvcAppResult": { "appId": "", "manifestSetId": "", "manifestSetOperatorIds": [ "" ], "manifestSetThreshold": "" }, "createTvcDeploymentResult": { "deploymentId": "", "manifestId": "" }, "createTvcManifestApprovalsResult": { "approvalIds": [ "" ] }, "solSendTransactionResult": { "sendTransactionStatusId": "" } }, "votes": [ { "id": "", "userId": "", "user": { "userId": "", "userName": "", "userEmail": "", "userPhoneNumber": "", "authenticators": [ { "transports": [ "" ], "attestationType": "", "aaguid": "", "credentialId": "", "model": "", "credential": { "publicKey": "", "type": "" }, "authenticatorId": "", "authenticatorName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "apiKeys": [ { "credential": { "publicKey": "", "type": "" }, "apiKeyId": "", "apiKeyName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "expirationSeconds": "" } ], "userTags": [ "" ], "oauthProviders": [ { "providerId": "", "providerName": "", "issuer": "", "audience": "", "subject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } }, "activityId": "", "selection": "", "message": "", "publicKey": "", "signature": "", "scheme": "", "createdAt": { "seconds": "", "nanos": "" } } ], "appProofs": [ { "scheme": "", "publicKey": "", "proofPayload": "", "signature": "" } ], "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "failure": { "code": "", "message": "", "details": [ { "@type": "" } ] } } } ``` # Get API key Source: https://docs.turnkey.com/api-reference/queries/get-api-key Get details about an API key. Unique identifier for a given organization. Unique identifier for a given API key. A successful response returns the following fields: apiKey field credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given API Key. Human-readable name for an API Key. createdAt field seconds field nanos field updatedAt field seconds field nanos field Optional window (in seconds) indicating how long the API Key should last. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_api_key \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "apiKeyId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getApiKey({ organizationId: " (Unique identifier for a given organization.)", apiKeyId: " (Unique identifier for a given API key.)" }); ``` ```json 200 theme={"system"} { "apiKey": { "credential": { "publicKey": "", "type": "" }, "apiKeyId": "", "apiKeyName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "expirationSeconds": "" } } ``` # Get API keys Source: https://docs.turnkey.com/api-reference/queries/get-api-keys Get details about API keys for a user. Unique identifier for a given organization. Unique identifier for a given user. A successful response returns the following fields: A list of API keys. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given API Key. Human-readable name for an API Key. createdAt field seconds field nanos field updatedAt field seconds field nanos field Optional window (in seconds) indicating how long the API Key should last. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_api_keys \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "userId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getApiKeys({ organizationId: " (Unique identifier for a given organization.)", userId: " (Unique identifier for a given user.)" }); ``` ```json 200 theme={"system"} { "apiKeys": [ { "credential": { "publicKey": "", "type": "" }, "apiKeyId": "", "apiKeyName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "expirationSeconds": "" } ] } ``` # Get authenticator Source: https://docs.turnkey.com/api-reference/queries/get-authenticator Get details about an authenticator. Unique identifier for a given organization. Unique identifier for a given authenticator. A successful response returns the following fields: authenticator field Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE). item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` attestationType field Identifier indicating the type of the Security Key. Unique identifier for a WebAuthn credential. The type of Authenticator device. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given Authenticator. Human-readable name for an Authenticator. createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_authenticator \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "authenticatorId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getAuthenticator({ organizationId: " (Unique identifier for a given organization.)", authenticatorId: " (Unique identifier for a given authenticator.)" }); ``` ```json 200 theme={"system"} { "authenticator": { "transports": [ "" ], "attestationType": "", "aaguid": "", "credentialId": "", "model": "", "credential": { "publicKey": "", "type": "" }, "authenticatorId": "", "authenticatorName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } } ``` # Get authenticators Source: https://docs.turnkey.com/api-reference/queries/get-authenticators Get details about authenticators for a user. Unique identifier for a given organization. Unique identifier for a given user. A successful response returns the following fields: A list of authenticators. Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE). item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` attestationType field Identifier indicating the type of the Security Key. Unique identifier for a WebAuthn credential. The type of Authenticator device. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given Authenticator. Human-readable name for an Authenticator. createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_authenticators \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "userId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getAuthenticators({ organizationId: " (Unique identifier for a given organization.)", userId: " (Unique identifier for a given user.)" }); ``` ```json 200 theme={"system"} { "authenticators": [ { "transports": [ "" ], "attestationType": "", "aaguid": "", "credentialId": "", "model": "", "credential": { "publicKey": "", "type": "" }, "authenticatorId": "", "authenticatorName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # Get balances of supported assets for wallet account address Source: https://docs.turnkey.com/api-reference/queries/get-balances-of-supported-assets-for-wallet-account-address Get non-zero balances of supported assets for a single wallet account address on the specified network. Unique identifier for a given organization. Address corresponding to a wallet account. The network identifier in CAIP-2 format (e.g., 'eip155:1' for Ethereum mainnet). A successful response returns the following fields: List of asset balances The caip-19 asset identifier The asset symbol The balance in atomic units The number of decimals this asset uses display field USD value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. Normalized crypto value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_wallet_address_balances \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "address": "", "caip2": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getWalletAddressBalances({ organizationId: " (Unique identifier for a given organization.)", address: " (Address corresponding to a wallet account.)", caip2: " (The network identifier in CAIP-2 format (e.g., 'eip155:1' for Ethereum mainnet).)" }); ``` ```json 200 theme={"system"} { "balances": [ { "caip19": "", "symbol": "", "balance": "", "decimals": "", "display": { "usd": "", "crypto": "" } } ] } ``` # Get configs Source: https://docs.turnkey.com/api-reference/queries/get-configs Get quorum settings and features for an organization. Unique identifier for a given organization. A successful response returns the following fields: configs field features field name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field quorum field Count of unique approvals required to meet quorum. Unique identifiers of quorum set members. item field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_organization_configs \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getOrganizationConfigs({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "configs": { "features": [ { "name": "", "value": "" } ], "quorum": { "threshold": "", "userIds": [ "" ] } } } ``` # Get gas usage Source: https://docs.turnkey.com/api-reference/queries/get-gas-usage Get gas usage and gas limits for either the parent organization or a sub-organization. Unique identifier for a given Organization. A successful response returns the following fields: The window duration (in minutes) for the organization or sub-organization. The window limit (in USD) for the organization or sub-organization. The total gas usage (in USD) of all sponsored transactions processed over the last `window_duration_minutes` ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_gas_usage \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getGasUsage({ organizationId: " (Unique identifier for a given Organization.)" }); ``` ```json 200 theme={"system"} { "windowDurationMinutes": "", "windowLimitUsd": "", "usageUsd": "" } ``` # Get nonces Source: https://docs.turnkey.com/api-reference/queries/get-nonces Get nonce values for an address on a given network. Can fetch the standard on-chain nonce and/or the gas station nonce used for sponsored transactions. Unique identifier for a given Organization. The Ethereum address to query nonces for. The network identifier in CAIP-2 format (e.g., 'eip155:1' for Ethereum mainnet). Whether to fetch the standard on-chain nonce. Whether to fetch the gas station nonce used for sponsored transactions. A successful response returns the following fields: The standard on-chain nonce for the address, if requested. The gas station nonce for sponsored transactions, if requested. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_nonces \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "address": "", "caip2": "", "nonce": "", "gasStationNonce": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getNonces({ organizationId: " (Unique identifier for a given Organization.)", address: " (The Ethereum address to query nonces for.)", caip2: " (The network identifier in CAIP-2 format (e.g., 'eip155:1' for Ethereum mainnet).)", nonce: true // Whether to fetch the standard on-chain nonce., gasStationNonce: true // Whether to fetch the gas station nonce used for sponsored transactions. }); ``` ```json 200 theme={"system"} { "nonce": "", "gasStationNonce": "" } ``` # Get OAuth 2.0 credential Source: https://docs.turnkey.com/api-reference/queries/get-oauth-20-credential Get details about an OAuth 2.0 credential. Unique identifier for a given Organization. Unique identifier for a given OAuth 2.0 Credential. A successful response returns the following fields: oauth2Credential field Unique identifier for a given OAuth 2.0 Credential. Unique identifier for an Organization. provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The client id for a given OAuth 2.0 Credential. The encrypted client secret for a given OAuth 2.0 Credential encrypted to the TLS Fetcher quorum key. createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_oauth2_credential \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "oauth2CredentialId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getOauth2Credential({ organizationId: " (Unique identifier for a given Organization.)", oauth2CredentialId: " (Unique identifier for a given OAuth 2.0 Credential.)" }); ``` ```json 200 theme={"system"} { "oauth2Credential": { "oauth2CredentialId": "", "organizationId": "", "provider": "", "clientId": "", "encryptedClientSecret": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } } ``` # Get Oauth providers Source: https://docs.turnkey.com/api-reference/queries/get-oauth-providers Get details about Oauth providers for a user. Unique identifier for a given organization. Unique identifier for a given user. A successful response returns the following fields: A list of Oauth providers. Unique identifier for an OAuth Provider Human-readable name to identify a Provider. The issuer of the token, typically a URL indicating the authentication server, e.g [https://accounts.google.com](https://accounts.google.com) Expected audience ('aud' attribute of the signed token) which represents the app ID Expected subject ('sub' attribute of the signed token) which represents the user ID createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_oauth_providers \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "userId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getOauthProviders({ organizationId: " (Unique identifier for a given organization.)", userId: " (Unique identifier for a given user.)" }); ``` ```json 200 theme={"system"} { "oauthProviders": [ { "providerId": "", "providerName": "", "issuer": "", "audience": "", "subject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # Get On Ramp transaction status Source: https://docs.turnkey.com/api-reference/queries/get-on-ramp-transaction-status Get the status of an on ramp transaction. Unique identifier for a given organization. The unique identifier for the fiat on ramp transaction. Optional flag to specify if the transaction status should be refreshed from the fiat on ramp provider. Default = false. A successful response returns the following fields: The status of the fiat on ramp transaction. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_onramp_transaction_status \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "transactionId": "", "refresh": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getOnRampTransactionStatus({ organizationId: " (Unique identifier for a given organization.)", transactionId: " (The unique identifier for the fiat on ramp transaction.)", refresh: true // Optional flag to specify if the transaction status should be refreshed from the fiat on ramp provider. Default = false. }); ``` ```json 200 theme={"system"} { "transactionStatus": "" } ``` # Get policy Source: https://docs.turnkey.com/api-reference/queries/get-policy Get details about a policy. Unique identifier for a given organization. Unique identifier for a given policy. A successful response returns the following fields: policy field Unique identifier for a given Policy. Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` createdAt field seconds field nanos field updatedAt field seconds field nanos field Human-readable notes added by a User to describe a particular policy. A consensus expression that evalutes to true or false. A condition expression that evalutes to true or false. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_policy \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "policyId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getPolicy({ organizationId: " (Unique identifier for a given organization.)", policyId: " (Unique identifier for a given policy.)" }); ``` ```json 200 theme={"system"} { "policy": { "policyId": "", "policyName": "", "effect": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "notes": "", "consensus": "", "condition": "" } } ``` # Get policy evaluations Source: https://docs.turnkey.com/api-reference/queries/get-policy-evaluations Get the policy evaluations for an activity. Unique identifier for a given organization. Unique identifier for a given activity. A successful response returns the following fields: policyEvaluations field Unique identifier for a given policy evaluation. Unique identifier for a given Activity. Unique identifier for the Organization the Activity belongs to. Unique identifier for the Vote associated with this policy evaluation. Detailed evaluation result for each Policy that was run. policyId field outcome field Enum options: `OUTCOME_ALLOW`, `OUTCOME_DENY_EXPLICIT`, `OUTCOME_DENY_IMPLICIT`, `OUTCOME_REQUIRES_CONSENSUS`, `OUTCOME_REJECTED`, `OUTCOME_ERROR` createdAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_policy_evaluations \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "activityId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getPolicyEvaluations({ organizationId: " (Unique identifier for a given organization.)", activityId: " (Unique identifier for a given activity.)" }); ``` ```json 200 theme={"system"} { "policyEvaluations": [ { "id": "", "activityId": "", "organizationId": "", "voteId": "", "policyEvaluations": [ { "policyId": "", "outcome": "" } ], "createdAt": { "seconds": "", "nanos": "" } } ] } ``` # Get private key Source: https://docs.turnkey.com/api-reference/queries/get-private-key Get details about a private key. Unique identifier for a given organization. Unique identifier for a given private key. A successful response returns the following fields: privateKey field Unique identifier for a given Private Key. The public component of a cryptographic key pair used to sign messages and transactions. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Derived cryptocurrency addresses for a given Private Key. format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field A list of Private Key Tag IDs. item field createdAt field seconds field nanos field updatedAt field seconds field nanos field True when a given Private Key is exported, false otherwise. True when a given Private Key is imported, false otherwise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_private_key \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "privateKeyId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getPrivateKey({ organizationId: " (Unique identifier for a given organization.)", privateKeyId: " (Unique identifier for a given private key.)" }); ``` ```json 200 theme={"system"} { "privateKey": { "privateKeyId": "", "publicKey": "", "privateKeyName": "", "curve": "", "addresses": [ { "format": "", "address": "" } ], "privateKeyTags": [ "" ], "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "exported": "", "imported": "" } } ``` # Get send transaction status Source: https://docs.turnkey.com/api-reference/queries/get-send-transaction-status Get the status of a send transaction request. Unique identifier for a given organization. The unique identifier of a send transaction request. A successful response returns the following fields: The current status of the send transaction. eth field The Ethereum transaction hash, if available. The error encountered when broadcasting or confirming the transaction, if any. error field Human-readable error message describing what went wrong. Chain of revert errors from nested contract calls, ordered from outermost to innermost. The contract address where the revert occurred. Type of error: 'unknown', 'native', or 'custom'. Human-readable message describing this revert. unknown field The 4-byte error selector, if available. The raw error data, hex-encoded. native field The type of native error: 'error\_string', 'panic', or 'execution\_reverted'. The error message for Error(string) reverts. The panic code for Panic(uint256) reverts. custom field The name of the custom error. The decoded parameters as a JSON object. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_send_transaction_status \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "sendTransactionStatusId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getSendTransactionStatus({ organizationId: " (Unique identifier for a given organization.)", sendTransactionStatusId: " (The unique identifier of a send transaction request.)" }); ``` ```json 200 theme={"system"} { "txStatus": "", "eth": { "txHash": "" }, "txError": "", "error": { "message": "", "revertChain": [ { "address": "", "errorType": "", "displayMessage": "", "unknown": { "selector": "", "data": "" }, "native": { "nativeType": "", "message": "", "panicCode": "" }, "custom": { "errorName": "", "paramsJson": "" } } ] } } ``` # Get smart contract interface Source: https://docs.turnkey.com/api-reference/queries/get-smart-contract-interface Get details about a smart contract interface. Unique identifier for a given organization. Unique identifier for a given smart contract interface. A successful response returns the following fields: smartContractInterface field The Organization the Smart Contract Interface belongs to. Unique identifier for a given Smart Contract Interface (ABI or IDL). The address corresponding to the Smart Contract or Program. The JSON corresponding to the Smart Contract Interface (ABI or IDL). The type corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA). The label corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA). The notes corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA). createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_smart_contract_interface \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "smartContractInterfaceId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getSmartContractInterface({ organizationId: " (Unique identifier for a given organization.)", smartContractInterfaceId: " (Unique identifier for a given smart contract interface.)" }); ``` ```json 200 theme={"system"} { "smartContractInterface": { "organizationId": "", "smartContractInterfaceId": "", "smartContractAddress": "", "smartContractInterface": "", "type": "", "label": "", "notes": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } } ``` # Get sub-organizations Source: https://docs.turnkey.com/api-reference/queries/get-sub-organizations Get all suborg IDs associated given a parent org ID and an optional filter. Unique identifier for the parent organization. This is used to find sub-organizations within it. Specifies the type of filter to apply, i.e 'CREDENTIAL\_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE\_NUMBER', 'OIDC\_TOKEN', 'WALLET\_ACCOUNT\_ADDRESS' or 'PUBLIC\_KEY' The value of the filter to apply for the specified type. For example, a specific email or name string.

paginationOptions field

A limit of the number of object to be returned, between 1 and 100. Defaults to 10. A pagination cursor. This is an object ID that enables you to fetch all objects before this ID. A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.
A successful response returns the following fields: List of unique identifiers for the matching sub-organizations. item field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_suborgs \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "filterType": "", "filterValue": "", "paginationOptions": { "limit": "", "before": "", "after": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getSubOrgIds({ organizationId: " (Unique identifier for the parent organization. This is used to find sub-organizations within it.)", filterType: " (Specifies the type of filter to apply, i.e 'CREDENTIAL_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'WALLET_ACCOUNT_ADDRESS' or 'PUBLIC_KEY')", filterValue: " (The value of the filter to apply for the specified type. For example, a specific email or name string.)", paginationOptions: { // paginationOptions field, limit: " (A limit of the number of object to be returned, between 1 and 100. Defaults to 10.)", before: " (A pagination cursor. This is an object ID that enables you to fetch all objects before this ID.)", after: " (A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.)", } }); ``` ```json 200 theme={"system"} { "organizationIds": [ "" ] } ``` # Get the latest boot proof for an app Source: https://docs.turnkey.com/api-reference/queries/get-the-latest-boot-proof-for-an-app Get the latest boot proof for a given enclave app name. Unique identifier for a given Organization. Name of enclave app. A successful response returns the following fields: bootProof field The hex encoded Ephemeral Public Key. The DER encoded COSE Sign1 struct Attestation doc. The borsch serialized base64 encoded Manifest. The borsch serialized base64 encoded Manifest Envelope. The label under which the enclave app was deployed. Name of the enclave app Owner of the app i.e. 'tkhq' createdAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_latest_boot_proof \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "appName": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getLatestBootProof({ organizationId: " (Unique identifier for a given Organization.)", appName: " (Name of enclave app.)" }); ``` ```json 200 theme={"system"} { "bootProof": { "ephemeralPublicKeyHex": "", "awsAttestationDocB64": "", "qosManifestB64": "", "qosManifestEnvelopeB64": "", "deploymentLabel": "", "enclaveApp": "", "owner": "", "createdAt": { "seconds": "", "nanos": "" } } } ``` # Get user Source: https://docs.turnkey.com/api-reference/queries/get-user Get details about a user. Unique identifier for a given organization. Unique identifier for a given user. A successful response returns the following fields: user field Unique identifier for a given User. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of Authenticator parameters. Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE). item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` attestationType field Identifier indicating the type of the Security Key. Unique identifier for a WebAuthn credential. The type of Authenticator device. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given Authenticator. Human-readable name for an Authenticator. createdAt field seconds field nanos field updatedAt field seconds field nanos field A list of API Key parameters. This field, if not needed, should be an empty array in your request body. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given API Key. Human-readable name for an API Key. createdAt field seconds field nanos field updatedAt field seconds field nanos field Optional window (in seconds) indicating how long the API Key should last. A list of User Tag IDs. item field A list of Oauth Providers. Unique identifier for an OAuth Provider Human-readable name to identify a Provider. The issuer of the token, typically a URL indicating the authentication server, e.g [https://accounts.google.com](https://accounts.google.com) Expected audience ('aud' attribute of the signed token) which represents the app ID Expected subject ('sub' attribute of the signed token) which represents the user ID createdAt field seconds field nanos field updatedAt field seconds field nanos field createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_user \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "userId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getUser({ organizationId: " (Unique identifier for a given organization.)", userId: " (Unique identifier for a given user.)" }); ``` ```json 200 theme={"system"} { "user": { "userId": "", "userName": "", "userEmail": "", "userPhoneNumber": "", "authenticators": [ { "transports": [ "" ], "attestationType": "", "aaguid": "", "credentialId": "", "model": "", "credential": { "publicKey": "", "type": "" }, "authenticatorId": "", "authenticatorName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "apiKeys": [ { "credential": { "publicKey": "", "type": "" }, "apiKeyId": "", "apiKeyName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "expirationSeconds": "" } ], "userTags": [ "" ], "oauthProviders": [ { "providerId": "", "providerName": "", "issuer": "", "audience": "", "subject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } } ``` # Get verified sub-organizations Source: https://docs.turnkey.com/api-reference/queries/get-verified-sub-organizations Get all email or phone verified suborg IDs associated given a parent org ID. Unique identifier for the parent organization. This is used to find sub-organizations within it. Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE\_NUMBER'. The value of the filter to apply for the specified type. For example, a specific email or phone number string.

paginationOptions field

A limit of the number of object to be returned, between 1 and 100. Defaults to 10. A pagination cursor. This is an object ID that enables you to fetch all objects before this ID. A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.
A successful response returns the following fields: List of unique identifiers for the matching sub-organizations. item field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_verified_suborgs \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "filterType": "", "filterValue": "", "paginationOptions": { "limit": "", "before": "", "after": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getVerifiedSubOrgIds({ organizationId: " (Unique identifier for the parent organization. This is used to find sub-organizations within it.)", filterType: " (Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER'.)", filterValue: " (The value of the filter to apply for the specified type. For example, a specific email or phone number string.)", paginationOptions: { // paginationOptions field, limit: " (A limit of the number of object to be returned, between 1 and 100. Defaults to 10.)", before: " (A pagination cursor. This is an object ID that enables you to fetch all objects before this ID.)", after: " (A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.)", } }); ``` ```json 200 theme={"system"} { "organizationIds": [ "" ] } ``` # Get wallet Source: https://docs.turnkey.com/api-reference/queries/get-wallet Get details about a wallet. Unique identifier for a given organization. Unique identifier for a given wallet. A successful response returns the following fields: wallet field Unique identifier for a given Wallet. Human-readable name for a Wallet. createdAt field seconds field nanos field updatedAt field seconds field nanos field True when a given Wallet is exported, false otherwise. True when a given Wallet is imported, false otherwise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_wallet \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "walletId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getWallet({ organizationId: " (Unique identifier for a given organization.)", walletId: " (Unique identifier for a given wallet.)" }); ``` ```json 200 theme={"system"} { "wallet": { "walletId": "", "walletName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "exported": "", "imported": "" } } ``` # Get wallet account Source: https://docs.turnkey.com/api-reference/queries/get-wallet-account Get a single wallet account. Unique identifier for a given organization. Unique identifier for a given wallet. Address corresponding to a wallet account. Path corresponding to a wallet account. A successful response returns the following fields: account field Unique identifier for a given Wallet Account. The Organization the Account belongs to. The Wallet the Account was derived from. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate the Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Address generated using the Wallet seed and Account parameters. createdAt field seconds field nanos field updatedAt field seconds field nanos field The public component of this wallet account's underlying cryptographic key pair. walletDetails field Unique identifier for a given Wallet. Human-readable name for a Wallet. createdAt field seconds field nanos field updatedAt field seconds field nanos field True when a given Wallet is exported, false otherwise. True when a given Wallet is imported, false otherwise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/get_wallet_account \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "walletId": "", "address": "", "path": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getWalletAccount({ organizationId: " (Unique identifier for a given organization.)", walletId: " (Unique identifier for a given wallet.)", address: " (Address corresponding to a wallet account.)", path: " (Path corresponding to a wallet account.)" }); ``` ```json 200 theme={"system"} { "account": { "walletAccountId": "", "organizationId": "", "walletId": "", "curve": "", "pathFormat": "", "path": "", "addressFormat": "", "address": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "publicKey": "", "walletDetails": { "walletId": "", "walletName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "exported": "", "imported": "" } } } ``` # List activities Source: https://docs.turnkey.com/api-reference/queries/list-activities List all activities within an organization. Unique identifier for a given organization. Enum options: `ACTIVITY_STATUS_CREATED`, `ACTIVITY_STATUS_PENDING`, `ACTIVITY_STATUS_COMPLETED`, `ACTIVITY_STATUS_FAILED`, `ACTIVITY_STATUS_CONSENSUS_NEEDED`, `ACTIVITY_STATUS_REJECTED`

paginationOptions field

A limit of the number of object to be returned, between 1 and 100. Defaults to 10. A pagination cursor. This is an object ID that enables you to fetch all objects before this ID. A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.
Enum options: `ACTIVITY_TYPE_CREATE_API_KEYS`, `ACTIVITY_TYPE_CREATE_USERS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD`, `ACTIVITY_TYPE_CREATE_INVITATIONS`, `ACTIVITY_TYPE_ACCEPT_INVITATION`, `ACTIVITY_TYPE_CREATE_POLICY`, `ACTIVITY_TYPE_DISABLE_PRIVATE_KEY`, `ACTIVITY_TYPE_DELETE_USERS`, `ACTIVITY_TYPE_DELETE_API_KEYS`, `ACTIVITY_TYPE_DELETE_INVITATION`, `ACTIVITY_TYPE_DELETE_ORGANIZATION`, `ACTIVITY_TYPE_DELETE_POLICY`, `ACTIVITY_TYPE_CREATE_USER_TAG`, `ACTIVITY_TYPE_DELETE_USER_TAGS`, `ACTIVITY_TYPE_CREATE_ORGANIZATION`, `ACTIVITY_TYPE_SIGN_TRANSACTION`, `ACTIVITY_TYPE_APPROVE_ACTIVITY`, `ACTIVITY_TYPE_REJECT_ACTIVITY`, `ACTIVITY_TYPE_DELETE_AUTHENTICATORS`, `ACTIVITY_TYPE_CREATE_AUTHENTICATORS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG`, `ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS`, `ACTIVITY_TYPE_SET_PAYMENT_METHOD`, `ACTIVITY_TYPE_ACTIVATE_BILLING_TIER`, `ACTIVITY_TYPE_DELETE_PAYMENT_METHOD`, `ACTIVITY_TYPE_CREATE_POLICY_V2`, `ACTIVITY_TYPE_CREATE_POLICY_V3`, `ACTIVITY_TYPE_CREATE_API_ONLY_USERS`, `ACTIVITY_TYPE_UPDATE_ROOT_QUORUM`, `ACTIVITY_TYPE_UPDATE_USER_TAG`, `ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG`, `ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2`, `ACTIVITY_TYPE_CREATE_ORGANIZATION_V2`, `ACTIVITY_TYPE_CREATE_USERS_V2`, `ACTIVITY_TYPE_ACCEPT_INVITATION_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V2`, `ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2`, `ACTIVITY_TYPE_UPDATE_USER`, `ACTIVITY_TYPE_UPDATE_POLICY`, `ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V3`, `ACTIVITY_TYPE_CREATE_WALLET`, `ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS`, `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY`, `ACTIVITY_TYPE_RECOVER_USER`, `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2`, `ACTIVITY_TYPE_SIGN_TRANSACTION_V2`, `ACTIVITY_TYPE_EXPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_EXPORT_WALLET`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4`, `ACTIVITY_TYPE_EMAIL_AUTH`, `ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT`, `ACTIVITY_TYPE_INIT_IMPORT_WALLET`, `ACTIVITY_TYPE_IMPORT_WALLET`, `ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_IMPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_CREATE_POLICIES`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOADS`, `ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION`, `ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS`, `ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V5`, `ACTIVITY_TYPE_OAUTH`, `ACTIVITY_TYPE_CREATE_API_KEYS_V2`, `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION`, `ACTIVITY_TYPE_EMAIL_AUTH_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V6`, `ACTIVITY_TYPE_DELETE_PRIVATE_KEYS`, `ACTIVITY_TYPE_DELETE_WALLETS`, `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2`, `ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION`, `ACTIVITY_TYPE_INIT_OTP_AUTH`, `ACTIVITY_TYPE_OTP_AUTH`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7`, `ACTIVITY_TYPE_UPDATE_WALLET`, `ACTIVITY_TYPE_UPDATE_POLICY_V2`, `ACTIVITY_TYPE_CREATE_USERS_V3`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V2`, `ACTIVITY_TYPE_INIT_OTP`, `ACTIVITY_TYPE_VERIFY_OTP`, `ACTIVITY_TYPE_OTP_LOGIN`, `ACTIVITY_TYPE_STAMP_LOGIN`, `ACTIVITY_TYPE_OAUTH_LOGIN`, `ACTIVITY_TYPE_UPDATE_USER_NAME`, `ACTIVITY_TYPE_UPDATE_USER_EMAIL`, `ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER`, `ACTIVITY_TYPE_INIT_FIAT_ON_RAMP`, `ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE`, `ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE`, `ACTIVITY_TYPE_ENABLE_AUTH_PROXY`, `ACTIVITY_TYPE_DISABLE_AUTH_PROXY`, `ACTIVITY_TYPE_UPDATE_AUTH_PROXY_CONFIG`, `ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_OAUTH2_AUTHENTICATE`, `ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS`, `ACTIVITY_TYPE_DELETE_POLICIES`, `ACTIVITY_TYPE_ETH_SEND_RAW_TRANSACTION`, `ACTIVITY_TYPE_ETH_SEND_TRANSACTION`, `ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_EMAIL_AUTH_V3`, `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V3`, `ACTIVITY_TYPE_INIT_OTP_V2`, `ACTIVITY_TYPE_UPSERT_GAS_USAGE_CONFIG`, `ACTIVITY_TYPE_CREATE_TVC_APP`, `ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT`, `ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS`, `ACTIVITY_TYPE_SOL_SEND_TRANSACTION` A successful response returns the following fields: A list of activities. Unique identifier for a given Activity object. Unique identifier for a given Organization. status field Enum options: `ACTIVITY_STATUS_CREATED`, `ACTIVITY_STATUS_PENDING`, `ACTIVITY_STATUS_COMPLETED`, `ACTIVITY_STATUS_FAILED`, `ACTIVITY_STATUS_CONSENSUS_NEEDED`, `ACTIVITY_STATUS_REJECTED` type field Enum options: `ACTIVITY_TYPE_CREATE_API_KEYS`, `ACTIVITY_TYPE_CREATE_USERS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD`, `ACTIVITY_TYPE_CREATE_INVITATIONS`, `ACTIVITY_TYPE_ACCEPT_INVITATION`, `ACTIVITY_TYPE_CREATE_POLICY`, `ACTIVITY_TYPE_DISABLE_PRIVATE_KEY`, `ACTIVITY_TYPE_DELETE_USERS`, `ACTIVITY_TYPE_DELETE_API_KEYS`, `ACTIVITY_TYPE_DELETE_INVITATION`, `ACTIVITY_TYPE_DELETE_ORGANIZATION`, `ACTIVITY_TYPE_DELETE_POLICY`, `ACTIVITY_TYPE_CREATE_USER_TAG`, `ACTIVITY_TYPE_DELETE_USER_TAGS`, `ACTIVITY_TYPE_CREATE_ORGANIZATION`, `ACTIVITY_TYPE_SIGN_TRANSACTION`, `ACTIVITY_TYPE_APPROVE_ACTIVITY`, `ACTIVITY_TYPE_REJECT_ACTIVITY`, `ACTIVITY_TYPE_DELETE_AUTHENTICATORS`, `ACTIVITY_TYPE_CREATE_AUTHENTICATORS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG`, `ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS`, `ACTIVITY_TYPE_SET_PAYMENT_METHOD`, `ACTIVITY_TYPE_ACTIVATE_BILLING_TIER`, `ACTIVITY_TYPE_DELETE_PAYMENT_METHOD`, `ACTIVITY_TYPE_CREATE_POLICY_V2`, `ACTIVITY_TYPE_CREATE_POLICY_V3`, `ACTIVITY_TYPE_CREATE_API_ONLY_USERS`, `ACTIVITY_TYPE_UPDATE_ROOT_QUORUM`, `ACTIVITY_TYPE_UPDATE_USER_TAG`, `ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG`, `ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2`, `ACTIVITY_TYPE_CREATE_ORGANIZATION_V2`, `ACTIVITY_TYPE_CREATE_USERS_V2`, `ACTIVITY_TYPE_ACCEPT_INVITATION_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V2`, `ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS`, `ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2`, `ACTIVITY_TYPE_UPDATE_USER`, `ACTIVITY_TYPE_UPDATE_POLICY`, `ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V3`, `ACTIVITY_TYPE_CREATE_WALLET`, `ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS`, `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY`, `ACTIVITY_TYPE_RECOVER_USER`, `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2`, `ACTIVITY_TYPE_SIGN_TRANSACTION_V2`, `ACTIVITY_TYPE_EXPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_EXPORT_WALLET`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4`, `ACTIVITY_TYPE_EMAIL_AUTH`, `ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT`, `ACTIVITY_TYPE_INIT_IMPORT_WALLET`, `ACTIVITY_TYPE_IMPORT_WALLET`, `ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_IMPORT_PRIVATE_KEY`, `ACTIVITY_TYPE_CREATE_POLICIES`, `ACTIVITY_TYPE_SIGN_RAW_PAYLOADS`, `ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION`, `ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS`, `ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V5`, `ACTIVITY_TYPE_OAUTH`, `ACTIVITY_TYPE_CREATE_API_KEYS_V2`, `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION`, `ACTIVITY_TYPE_EMAIL_AUTH_V2`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V6`, `ACTIVITY_TYPE_DELETE_PRIVATE_KEYS`, `ACTIVITY_TYPE_DELETE_WALLETS`, `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2`, `ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION`, `ACTIVITY_TYPE_INIT_OTP_AUTH`, `ACTIVITY_TYPE_OTP_AUTH`, `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7`, `ACTIVITY_TYPE_UPDATE_WALLET`, `ACTIVITY_TYPE_UPDATE_POLICY_V2`, `ACTIVITY_TYPE_CREATE_USERS_V3`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V2`, `ACTIVITY_TYPE_INIT_OTP`, `ACTIVITY_TYPE_VERIFY_OTP`, `ACTIVITY_TYPE_OTP_LOGIN`, `ACTIVITY_TYPE_STAMP_LOGIN`, `ACTIVITY_TYPE_OAUTH_LOGIN`, `ACTIVITY_TYPE_UPDATE_USER_NAME`, `ACTIVITY_TYPE_UPDATE_USER_EMAIL`, `ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER`, `ACTIVITY_TYPE_INIT_FIAT_ON_RAMP`, `ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE`, `ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE`, `ACTIVITY_TYPE_ENABLE_AUTH_PROXY`, `ACTIVITY_TYPE_DISABLE_AUTH_PROXY`, `ACTIVITY_TYPE_UPDATE_AUTH_PROXY_CONFIG`, `ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL`, `ACTIVITY_TYPE_OAUTH2_AUTHENTICATE`, `ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS`, `ACTIVITY_TYPE_DELETE_POLICIES`, `ACTIVITY_TYPE_ETH_SEND_RAW_TRANSACTION`, `ACTIVITY_TYPE_ETH_SEND_TRANSACTION`, `ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL`, `ACTIVITY_TYPE_EMAIL_AUTH_V3`, `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V3`, `ACTIVITY_TYPE_INIT_OTP_V2`, `ACTIVITY_TYPE_UPSERT_GAS_USAGE_CONFIG`, `ACTIVITY_TYPE_CREATE_TVC_APP`, `ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT`, `ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS`, `ACTIVITY_TYPE_SOL_SEND_TRANSACTION` intent field createOrganizationIntent field Human-readable name for an Organization. The root user's email address. rootAuthenticator field Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. Unique identifier for the root user object. createAuthenticatorsIntent field A list of Authenticators. Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. Unique identifier for a given User. createUsersIntent field A list of Users. Human-readable name for a User. The user's email address. accessType field Enum options: `ACCESS_TYPE_WEB`, `ACCESS_TYPE_API`, `ACCESS_TYPE_ALL` A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field createPrivateKeysIntent field A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` signRawPayloadIntent field Unique identifier for a given Private Key. Raw unsigned payload to be signed. encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` createInvitationsIntent field A list of Invitations. The name of the intended Invitation recipient. The email address of the intended Invitation recipient. A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body. item field accessType field Enum options: `ACCESS_TYPE_WEB`, `ACCESS_TYPE_API`, `ACCESS_TYPE_ALL` Unique identifier for the Sender of an Invitation. acceptInvitationIntent field Unique identifier for a given Invitation object. Unique identifier for a given User. authenticator field Human-readable name for an Authenticator. Unique identifier for a given User. attestation field id field type field Enum options: `public-key` rawId field authenticatorAttachment field Enum options: `cross-platform`, `platform` response field clientDataJson field attestationObject field transports field item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` authenticatorAttachment field Enum options: `cross-platform`, `platform` clientExtensionResults field appid field appidExclude field credProps field rk field Challenge presented for authentication purposes. createPolicyIntent field Human-readable name for a Policy. A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details. subject field operator field Enum options: `OPERATOR_EQUAL`, `OPERATOR_MORE_THAN`, `OPERATOR_MORE_THAN_OR_EQUAL`, `OPERATOR_LESS_THAN`, `OPERATOR_LESS_THAN_OR_EQUAL`, `OPERATOR_CONTAINS`, `OPERATOR_NOT_EQUAL`, `OPERATOR_IN`, `OPERATOR_NOT_IN`, `OPERATOR_CONTAINS_ONE`, `OPERATOR_CONTAINS_ALL` target field effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` notes field disablePrivateKeyIntent field Unique identifier for a given Private Key. deleteUsersIntent field A list of User IDs. item field deleteAuthenticatorsIntent field Unique identifier for a given User. A list of Authenticator IDs. item field deleteInvitationIntent field Unique identifier for a given Invitation object. deleteOrganizationIntent field Unique identifier for a given Organization. deletePolicyIntent field Unique identifier for a given Policy. createUserTagIntent field Human-readable name for a User Tag. A list of User IDs. item field deleteUserTagsIntent field A list of User Tag IDs. item field signTransactionIntent field Unique identifier for a given Private Key. Raw unsigned transaction to be signed by a particular Private Key. type field Enum options: `TRANSACTION_TYPE_ETHEREUM`, `TRANSACTION_TYPE_SOLANA`, `TRANSACTION_TYPE_TRON`, `TRANSACTION_TYPE_BITCOIN`, `TRANSACTION_TYPE_TEMPO` createApiKeysIntent field A list of API Keys. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. Unique identifier for a given User. deleteApiKeysIntent field Unique identifier for a given User. A list of API Key IDs. item field approveActivityIntent field An artifact verifying a User's action. rejectActivityIntent field An artifact verifying a User's action. createPrivateKeyTagIntent field Human-readable name for a Private Key Tag. A list of Private Key IDs. item field deletePrivateKeyTagsIntent field A list of Private Key Tag IDs. item field createPolicyIntentV2 field Human-readable name for a Policy. A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details. subject field operator field Enum options: `OPERATOR_EQUAL`, `OPERATOR_MORE_THAN`, `OPERATOR_MORE_THAN_OR_EQUAL`, `OPERATOR_LESS_THAN`, `OPERATOR_LESS_THAN_OR_EQUAL`, `OPERATOR_CONTAINS`, `OPERATOR_NOT_EQUAL`, `OPERATOR_IN`, `OPERATOR_NOT_IN`, `OPERATOR_CONTAINS_ONE`, `OPERATOR_CONTAINS_ALL` targets field item field effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` notes field setPaymentMethodIntent field The account number of the customer's credit card. The verification digits of the customer's credit card. The month that the credit card expires. The year that the credit card expires. The email that will receive invoices for the credit card. The name associated with the credit card. activateBillingTierIntent field The product that the customer wants to subscribe to. deletePaymentMethodIntent field The payment method that the customer wants to remove. createPolicyIntentV3 field Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy. createApiOnlyUsersIntent field A list of API-only Users to create. The name of the new API-only User. The email address for this API-only User (optional). A list of tags assigned to the new API-only User. This field, if not needed, should be an empty array in your request body. item field A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. updateRootQuorumIntent field The threshold of unique approvals to reach quorum. The unique identifiers of users who comprise the quorum set. item field updateUserTagIntent field Unique identifier for a given User Tag. The new, human-readable name for the tag with the given ID. A list of User IDs to add this tag to. item field A list of User IDs to remove this tag from. item field updatePrivateKeyTagIntent field Unique identifier for a given Private Key Tag. The new, human-readable name for the tag with the given ID. A list of Private Keys IDs to add this tag to. item field A list of Private Key IDs to remove this tag from. item field createAuthenticatorsIntentV2 field A list of Authenticators. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for a given User. acceptInvitationIntentV2 field Unique identifier for a given Invitation object. Unique identifier for a given User. authenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` createOrganizationIntentV2 field Human-readable name for an Organization. The root user's email address. rootAuthenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for the root user object. createUsersIntentV2 field A list of Users. Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field createSubOrganizationIntent field Name for this sub-organization rootAuthenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` createSubOrganizationIntentV2 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users updateAllowedOriginsIntent field Additional origins requests are allowed from besides Turnkey origins item field createPrivateKeysIntentV2 field A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` updateUserIntent field Unique identifier for a given User. Human-readable name for a User. The user's email address. An updated list of User Tags to apply to this User. This field, if not needed, should be an empty array in your request body. item field The user's phone number in E.164 format e.g. +13214567890 updatePolicyIntent field Unique identifier for a given Policy. Human-readable name for a Policy. policyEffect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect (optional). The consensus expression that triggers the Effect (optional). Accompanying notes for a Policy (optional). setPaymentMethodIntentV2 field The id of the payment method that was created clientside. The email that will receive invoices for the credit card. The name associated with the credit card. createSubOrganizationIntentV3 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users A list of Private Keys. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body. item field Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` createWalletIntent field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. createWalletAccountsIntent field Unique identifier for a given Wallet. A list of wallet Accounts. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true. initUserEmailRecoveryIntent field Email of the user starting recovery Client-side public key generated by the user, to which the recovery bundle will be encrypted. Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to recoverUserIntent field authenticator field Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` Unique identifier for the user performing recovery. setOrganizationFeatureIntent field name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` Optional value for the feature. Will override existing values if feature is already set. removeOrganizationFeatureIntent field name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` signRawPayloadIntentV2 field A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned payload to be signed. encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` signTransactionIntentV2 field A Wallet account address, Private Key address, or Private Key identifier. Raw unsigned transaction to be signed type field Enum options: `TRANSACTION_TYPE_ETHEREUM`, `TRANSACTION_TYPE_SOLANA`, `TRANSACTION_TYPE_TRON`, `TRANSACTION_TYPE_BITCOIN`, `TRANSACTION_TYPE_TEMPO` exportPrivateKeyIntent field Unique identifier for a given Private Key. Client-side public key generated by the user, to which the export bundle will be encrypted. exportWalletIntent field Unique identifier for a given Wallet. Client-side public key generated by the user, to which the export bundle will be encrypted. language field Enum options: `MNEMONIC_LANGUAGE_ENGLISH`, `MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE`, `MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE`, `MNEMONIC_LANGUAGE_CZECH`, `MNEMONIC_LANGUAGE_FRENCH`, `MNEMONIC_LANGUAGE_ITALIAN`, `MNEMONIC_LANGUAGE_JAPANESE`, `MNEMONIC_LANGUAGE_KOREAN`, `MNEMONIC_LANGUAGE_SPANISH` createSubOrganizationIntentV4 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization emailAuthIntent field Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to exportWalletAccountIntent field Address to identify Wallet Account. Client-side public key generated by the user, to which the export bundle will be encrypted. initImportWalletIntent field The ID of the User importing a Wallet. importWalletIntent field The ID of the User importing a Wallet. Human-readable name for a Wallet. Bundle containing a wallet mnemonic encrypted to the enclave's target public key. A list of wallet Accounts. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` initImportPrivateKeyIntent field The ID of the User importing a Private Key. importPrivateKeyIntent field The ID of the User importing a Private Key. Human-readable name for a Private Key. Bundle containing a raw private key encrypted to the enclave's target public key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Cryptocurrency-specific formats for a derived address (e.g., Ethereum). item field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` createPoliciesIntent field An array of policy intents to be created. Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect The consensus expression that triggers the Effect Notes for a Policy. signRawPayloadsIntent field A Wallet account address, Private Key address, or Private Key identifier. An array of raw unsigned payloads to be signed. item field encoding field Enum options: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8`, `PAYLOAD_ENCODING_EIP712`, `PAYLOAD_ENCODING_EIP7702_AUTHORIZATION` hashFunction field Enum options: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` createReadOnlySessionIntent field createOauthProvidersIntent field The ID of the User to add an Oauth provider to A list of Oauth providers. Human-readable name to identify a Provider. Base64 encoded OIDC token deleteOauthProvidersIntent field The ID of the User to remove an Oauth provider from Unique identifier for a given Provider. item field createSubOrganizationIntentV5 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization oauthIntent field Base64 encoded OIDC token Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Oauth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Oauth API keys createApiKeysIntentV2 field A list of API Keys. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. Unique identifier for a given User. createReadWriteSessionIntent field Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted. Email of the user to create a read write session for Optional human-readable name for an API Key. If none provided, default to Read Write Session - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailAuthIntentV2 field Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to createSubOrganizationIntentV6 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization deletePrivateKeysIntent field List of unique identifiers for private keys within an organization item field Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored. deleteWalletsIntent field List of unique identifiers for wallets within an organization item field Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored. createReadWriteSessionIntentV2 field Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted. Unique identifier for a given User. Optional human-readable name for an API Key. If none provided, default to Read Write Session - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated ReadWriteSession API keys deleteSubOrganizationIntent field Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false. initOtpAuthIntent field Enum to specifiy whether to send OTP via SMS or email Email or phone number to send the OTP code to emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to otpAuthIntent field ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to OTP Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated OTP Auth API keys createSubOrganizationIntentV7 field Name for this sub-organization Root users to create within this sub-organization Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users wallet field Human-readable name for a Wallet. A list of wallet Accounts. This field, if not needed, should be an empty array in your request body. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate a wallet Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24. Disable email recovery for the sub-organization Disable email auth for the sub-organization Disable OTP SMS auth for the sub-organization Disable OTP email auth for the sub-organization Signed JWT containing a unique id, expiry, verification type, contact clientSignature field The public component of a cryptographic key pair used to create the signature. scheme field Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message. updateWalletIntent field Unique identifier for a given Wallet. Human-readable name for a Wallet. updatePolicyIntentV2 field Unique identifier for a given Policy. Human-readable name for a Policy. policyEffect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` The condition expression that triggers the Effect (optional). The consensus expression that triggers the Effect (optional). Accompanying notes for a Policy (optional). createUsersIntentV3 field A list of Users. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of API Key parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an API Key. The public component of a cryptographic key pair used to sign messages and transactions. curveType field Enum options: `API_KEY_CURVE_P256`, `API_KEY_CURVE_SECP256K1`, `API_KEY_CURVE_ED25519` Optional window (in seconds) indicating how long the API Key should last. A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. Human-readable name for an Authenticator. Challenge presented for authentication purposes. attestation field The cbor encoded then base64 url encoded id of the credential. A base64 url encoded payload containing metadata about the signing context and the challenge. A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses. The type of authenticator transports. item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` A list of Oauth providers. This field, if not needed, should be an empty array in your request body. Human-readable name to identify a Provider. Base64 encoded OIDC token A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. item field initOtpAuthIntentV2 field Enum to specifiy whether to send OTP via SMS or email Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to initOtpIntent field Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 emailCustomization field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to verifyOtpIntent field ID representing the result of an init OTP activity. OTP sent out to a user's contact (email or SMS) Expiration window (in seconds) indicating how long the verification token is valid for. If not provided, a default of 1 hour will be used. Maximum value is 86400 seconds (24 hours) Client-side public key generated by the user, which will be added to the JWT response and verified in subsequent requests via a client proof signature otpLoginIntent field Signed JWT containing a unique id, expiry, verification type, contact Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys clientSignature field The public component of a cryptographic key pair used to create the signature. scheme field Enum options: `CLIENT_SIGNATURE_SCHEME_API_P256` The message that was signed. The cryptographic signature over the message. stampLoginIntent field Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys oauthLoginIntent field Base64 encoded OIDC token Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used. Invalidate all other previously generated Login API keys updateUserNameIntent field Unique identifier for a given User. Human-readable name for a User. updateUserEmailIntent field Unique identifier for a given User. The user's email address. Setting this to an empty string will remove the user's email. Signed JWT containing a unique id, expiry, verification type, contact updateUserPhoneNumberIntent field Unique identifier for a given User. The user's phone number in E.164 format e.g. +13214567890. Setting this to an empty string will remove the user's phone number. Signed JWT containing a unique id, expiry, verification type, contact initFiatOnRampIntent field onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Destination wallet address for the buy transaction. network field Enum options: `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA`, `FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE` cryptoCurrencyCode field Enum options: `FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL`, `FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC` fiatCurrencyCode field Enum options: `FIAT_ON_RAMP_CURRENCY_AUD`, `FIAT_ON_RAMP_CURRENCY_BGN`, `FIAT_ON_RAMP_CURRENCY_BRL`, `FIAT_ON_RAMP_CURRENCY_CAD`, `FIAT_ON_RAMP_CURRENCY_CHF`, `FIAT_ON_RAMP_CURRENCY_COP`, `FIAT_ON_RAMP_CURRENCY_CZK`, `FIAT_ON_RAMP_CURRENCY_DKK`, `FIAT_ON_RAMP_CURRENCY_DOP`, `FIAT_ON_RAMP_CURRENCY_EGP`, `FIAT_ON_RAMP_CURRENCY_EUR`, `FIAT_ON_RAMP_CURRENCY_GBP`, `FIAT_ON_RAMP_CURRENCY_HKD`, `FIAT_ON_RAMP_CURRENCY_IDR`, `FIAT_ON_RAMP_CURRENCY_ILS`, `FIAT_ON_RAMP_CURRENCY_JOD`, `FIAT_ON_RAMP_CURRENCY_KES`, `FIAT_ON_RAMP_CURRENCY_KWD`, `FIAT_ON_RAMP_CURRENCY_LKR`, `FIAT_ON_RAMP_CURRENCY_MXN`, `FIAT_ON_RAMP_CURRENCY_NGN`, `FIAT_ON_RAMP_CURRENCY_NOK`, `FIAT_ON_RAMP_CURRENCY_NZD`, `FIAT_ON_RAMP_CURRENCY_OMR`, `FIAT_ON_RAMP_CURRENCY_PEN`, `FIAT_ON_RAMP_CURRENCY_PLN`, `FIAT_ON_RAMP_CURRENCY_RON`, `FIAT_ON_RAMP_CURRENCY_SEK`, `FIAT_ON_RAMP_CURRENCY_THB`, `FIAT_ON_RAMP_CURRENCY_TRY`, `FIAT_ON_RAMP_CURRENCY_TWD`, `FIAT_ON_RAMP_CURRENCY_USD`, `FIAT_ON_RAMP_CURRENCY_VND`, `FIAT_ON_RAMP_CURRENCY_ZAR` Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount. paymentMethod field Enum options: `FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD`, `FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY`, `FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER`, `FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT`, `FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL`, `FIAT_ON_RAMP_PAYMENT_METHOD_VENMO`, `FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE`, `FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT`, `FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET`, `FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT` ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB. ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country\_code=US. Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false. Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled. createSmartContractInterfaceIntent field Corresponding contract address or program ID ABI/IDL as a JSON string. Limited to 400kb type field Enum options: `SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM`, `SMART_CONTRACT_INTERFACE_TYPE_SOLANA` Human-readable name for a Smart Contract Interface. Notes for a Smart Contract Interface. deleteSmartContractInterfaceIntent field The ID of a Smart Contract Interface intended for deletion. enableAuthProxyIntent field disableAuthProxyIntent field updateAuthProxyConfigIntent field Updated list of allowed origins for CORS. item field Updated list of allowed proxy authentication methods. item field Custom 'from' address for auth-related emails. Custom reply-to address for auth-related emails. Template ID for email-auth messages. Template ID for OTP SMS messages. emailCustomizationParams field The name of the application. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomizationParams field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} walletKitSettings field List of enabled social login providers (e.g., 'apple', 'google', 'facebook') item field Mapping of social login providers to their Oauth client IDs. Oauth redirect URL to be used for social login flows. OTP code lifetime in seconds. Verification-token lifetime in seconds. Session lifetime in seconds. Enable alphanumeric OTP codes. Desired OTP code length (6–9). Custom 'from' email sender for auth-related emails. Verification token required for get account with PII (email/phone number). Default false. createOauth2CredentialIntent field provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key updateOauth2CredentialIntent field The ID of the OAuth 2.0 credential to update provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The Client ID issued by the OAuth 2.0 provider The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key deleteOauth2CredentialIntent field The ID of the OAuth 2.0 credential to delete oauth2AuthenticateIntent field The OAuth 2.0 credential id whose client\_id and client\_secret will be used in the OAuth 2.0 flow The auth\_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider The code verifier used by OAuth 2.0 PKCE providers An optional nonce used by the client to prevent replay/substitution of an ID token An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token deleteWalletAccountsIntent field List of unique identifiers for wallet accounts within an organization item field Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored. deletePoliciesIntent field List of unique identifiers for policies within an organization item field ethSendRawTransactionIntent field The raw, signed transaction to be sent. CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet). Enum options: `eip155:1`, `eip155:11155111`, `eip155:8453`, `eip155:84532` ethSendTransactionIntent field A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet). Enum options: `eip155:1`, `eip155:11155111`, `eip155:8453`, `eip155:84532`, `eip155:137`, `eip155:80002` Recipient address as a hex string with 0x prefix. Amount of native asset to send in wei. Hex-encoded call data for contract interactions. Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations. Maximum amount of gas to use for this transaction, for EIP-1559 transactions. Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions. The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture. createFiatOnRampCredentialIntent field onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. If the on-ramp credential is a sandbox credential updateFiatOnRampCredentialIntent field The ID of the fiat on-ramp credential to update onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier. Publishable API key for the on-ramp provider Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. deleteFiatOnRampCredentialIntent field The ID of the fiat on-ramp credential to delete emailAuthIntentV3 field Email of the authenticating user. Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted. Optional human-readable name for an API Key. If none provided, default to Email Auth - \ Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Invalidate all other previously generated Email Auth API keys Optional custom email address from which to send the email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to initUserEmailRecoveryIntentV2 field Email of the user starting recovery Client-side public key generated by the user, to which the recovery bundle will be encrypted. Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used. emailCustomization field The name of the application. This field is required and will be used in email notifications if an email template is not provided. A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. Optional custom email address from which to send the OTP email Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Optional custom email address to use as reply-to initOtpIntentV2 field Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided. emailCustomization field A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to initOtpAuthIntentV3 field Whether to send OTP via SMS or email. Possible values: OTP\_TYPE\_SMS, OTP\_TYPE\_EMAIL Email or phone number to send the OTP code to Optional length of the OTP code. Default = 9 The name of the application. This field is required and will be used in email notifications if an email template is not provided. emailCustomization field A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px. A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`. JSON object containing key/value pairs to be used with custom templates. Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template. smsCustomization field Template containing references to .OtpCode i.e Your OTP is \{\{.OtpCode}} Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address. Optional custom email address from which to send the OTP email Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications' Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes) Optional custom email address to use as reply-to upsertGasUsageConfigIntent field Gas sponsorship USD limit for the billing organization window. Gas sponsorship USD limit for sub-organizations under the billing organization. Rolling sponsorship window duration, expressed in minutes. Whether gas sponsorship is enabled for the organization. createTvcAppIntent field The name of the new TVC application Quorum public key to use for this application Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required manifestSetParams field Short description for this new operator set Operators to create as part of this new operator set The name for this new operator Public key for this operator Existing operators to use as part of this new operator set item field The threshold of operators needed to reach consensus in this new Operator Set Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required shareSetParams field Short description for this new operator set Operators to create as part of this new operator set The name for this new operator Public key for this operator Existing operators to use as part of this new operator set item field The threshold of operators needed to reach consensus in this new Operator Set Enables external connectivity for this TVC app. Default if not provided: false. createTvcDeploymentIntent field The unique identifier of the to-be-deployed TVC application The QuorumOS version to use to deploy this application URL of the container containing the pivot binary Location of the binary in the pivot container Arguments to pass to the pivot binary at startup. Encoded as a list of strings, for example \["--foo", "bar"] item field Digest of the pivot binary in the pivot container. This value will be inserted in the QOS manifest to ensure application integrity. URL of the container containing the host binary Location of the binary inside the host container Arguments to pass to the host binary at startup. Encoded as a list of strings, for example \["--foo", "bar"] item field Optional nonce to ensure uniqueness of the deployment manifest. If not provided, it defaults to the current Unix timestamp in seconds. Optional encrypted pull secret to authorize Turnkey to pull the pivot container image. If your image is public, leave this empty. Optional encrypted pull secret to authorize Turnkey to pull the host container image. If your image is public, leave this empty. createTvcManifestApprovalsIntent field Unique identifier of the TVC deployment to approve List of manifest approvals Unique identifier of the operator providing this approval Signature from the operator approving the manifest solSendTransactionIntent field Base64-encoded serialized unsigned Solana transaction A wallet or private key address to sign with. This does not support private key IDs. Whether to sponsor this transaction via Gas Station. CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Enum options: `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`, `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG`, `solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY` user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution result field createOrganizationResult field Unique identifier for a given Organization. createAuthenticatorsResult field A list of Authenticator IDs. item field createUsersResult field A list of User IDs. item field createPrivateKeysResult field A list of Private Key IDs. item field createInvitationsResult field A list of Invitation IDs item field acceptInvitationResult field Unique identifier for a given Invitation. Unique identifier for a given User. signRawPayloadResult field Component of an ECSDA signature. Component of an ECSDA signature. Component of an ECSDA signature. createPolicyResult field Unique identifier for a given Policy. disablePrivateKeyResult field Unique identifier for a given Private Key. deleteUsersResult field A list of User IDs. item field deleteAuthenticatorsResult field Unique identifier for a given Authenticator. item field deleteInvitationResult field Unique identifier for a given Invitation. deleteOrganizationResult field Unique identifier for a given Organization. deletePolicyResult field Unique identifier for a given Policy. createUserTagResult field Unique identifier for a given User Tag. A list of User IDs. item field deleteUserTagsResult field A list of User Tag IDs. item field A list of User IDs. item field signTransactionResult field signedTransaction field deleteApiKeysResult field A list of API Key IDs. item field createApiKeysResult field A list of API Key IDs. item field createPrivateKeyTagResult field Unique identifier for a given Private Key Tag. A list of Private Key IDs. item field deletePrivateKeyTagsResult field A list of Private Key Tag IDs. item field A list of Private Key IDs. item field setPaymentMethodResult field The last four digits of the credit card added. The name associated with the payment method. The email address associated with the payment method. activateBillingTierResult field The id of the product being subscribed to. deletePaymentMethodResult field The payment method that was removed. createApiOnlyUsersResult field A list of API-only User IDs. item field updateRootQuorumResult field updateUserTagResult field Unique identifier for a given User Tag. updatePrivateKeyTagResult field Unique identifier for a given Private Key Tag. createSubOrganizationResult field subOrganizationId field rootUserIds field item field updateAllowedOriginsResult field createPrivateKeysResultV2 field A list of Private Key IDs and addresses. privateKeyId field addresses field format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field updateUserResult field A User ID. updatePolicyResult field Unique identifier for a given Policy. createSubOrganizationResultV3 field subOrganizationId field A list of Private Key IDs and addresses. privateKeyId field addresses field format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field rootUserIds field item field createWalletResult field Unique identifier for a Wallet. A list of account addresses. item field createWalletAccountsResult field A list of derived addresses. item field initUserEmailRecoveryResult field Unique identifier for the user being recovered. recoverUserResult field ID of the authenticator created. item field setOrganizationFeatureResult field Resulting list of organization features. name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field removeOrganizationFeatureResult field Resulting list of organization features. name field Enum options: `FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY`, `FEATURE_NAME_WEBAUTHN_ORIGINS`, `FEATURE_NAME_EMAIL_AUTH`, `FEATURE_NAME_EMAIL_RECOVERY`, `FEATURE_NAME_WEBHOOK`, `FEATURE_NAME_SMS_AUTH`, `FEATURE_NAME_OTP_EMAIL_AUTH`, `FEATURE_NAME_AUTH_PROXY` value field exportPrivateKeyResult field Unique identifier for a given Private Key. Export bundle containing a private key encrypted to the client's target public key. exportWalletResult field Unique identifier for a given Wallet. Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key. createSubOrganizationResultV4 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field emailAuthResult field Unique identifier for the authenticating User. Unique identifier for the created API key. exportWalletAccountResult field Address to identify Wallet Account. Export bundle containing a private key encrypted by the client's target public key. initImportWalletResult field Import bundle containing a public key and signature to use for importing client data. importWalletResult field Unique identifier for a Wallet. A list of account addresses. item field initImportPrivateKeyResult field Import bundle containing a public key and signature to use for importing client data. importPrivateKeyResult field Unique identifier for a Private Key. A list of addresses. format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field createPoliciesResult field A list of unique identifiers for the created policies. item field signRawPayloadsResult field signatures field Component of an ECSDA signature. Component of an ECSDA signature. Component of an ECSDA signature. createReadOnlySessionResult field Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. String representing a read only session UTC timestamp in seconds representing the expiry time for the read only session. createOauthProvidersResult field A list of unique identifiers for Oauth Providers item field deleteOauthProvidersResult field A list of unique identifiers for Oauth Providers item field createSubOrganizationResultV5 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field oauthResult field Unique identifier for the authenticating User. Unique identifier for the created API key. HPKE encrypted credential bundle createReadWriteSessionResult field Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. Unique identifier for the created API key. HPKE encrypted credential bundle createSubOrganizationResultV6 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field deletePrivateKeysResult field A list of private key unique identifiers that were removed item field deleteWalletsResult field A list of wallet unique identifiers that were removed item field createReadWriteSessionResultV2 field Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons. Human-readable name for an Organization. Unique identifier for a given User. Human-readable name for a User. Unique identifier for the created API key. HPKE encrypted credential bundle deleteSubOrganizationResult field Unique identifier of the sub organization that was removed initOtpAuthResult field Unique identifier for an OTP authentication otpAuthResult field Unique identifier for the authenticating User. Unique identifier for the created API key. HPKE encrypted credential bundle createSubOrganizationResultV7 field subOrganizationId field wallet field walletId field A list of account addresses. item field rootUserIds field item field updateWalletResult field A Wallet ID. updatePolicyResultV2 field Unique identifier for a given Policy. initOtpAuthResultV2 field Unique identifier for an OTP authentication initOtpResult field Unique identifier for an OTP authentication verifyOtpResult field Signed JWT containing a unique id, expiry, verification type, contact. Verification status of a user is updated when the token is consumed (in OTP\_LOGIN requests) otpLoginResult field Signed JWT containing an expiry, public key, session type, user id, and organization id stampLoginResult field Signed JWT containing an expiry, public key, session type, user id, and organization id oauthLoginResult field Signed JWT containing an expiry, public key, session type, user id, and organization id updateUserNameResult field Unique identifier of the User whose name was updated. updateUserEmailResult field Unique identifier of the User whose email was updated. updateUserPhoneNumberResult field Unique identifier of the User whose phone number was updated. initFiatOnRampResult field Unique URL for a given fiat on-ramp flow. Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow. Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project. createSmartContractInterfaceResult field The ID of the created Smart Contract Interface. deleteSmartContractInterfaceResult field The ID of the deleted Smart Contract Interface. enableAuthProxyResult field A User ID with permission to initiate authentication. disableAuthProxyResult field updateAuthProxyConfigResult field Unique identifier for a given User. (representing the turnkey signer user id) createOauth2CredentialResult field Unique identifier of the OAuth 2.0 credential that was created updateOauth2CredentialResult field Unique identifier of the OAuth 2.0 credential that was updated deleteOauth2CredentialResult field Unique identifier of the OAuth 2.0 credential that was deleted oauth2AuthenticateResult field Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity deleteWalletAccountsResult field A list of wallet account unique identifiers that were removed item field deletePoliciesResult field A list of unique identifiers for the deleted policies. item field ethSendRawTransactionResult field The transaction hash of the sent transaction createFiatOnRampCredentialResult field Unique identifier of the Fiat On-Ramp credential that was created updateFiatOnRampCredentialResult field Unique identifier of the Fiat On-Ramp credential that was updated deleteFiatOnRampCredentialResult field Unique identifier of the Fiat On-Ramp credential that was deleted ethSendTransactionResult field The send\_transaction\_status ID associated with the transaction submission upsertGasUsageConfigResult field Unique identifier for the gas usage configuration that was created or updated. createTvcAppResult field The unique identifier for the TVC application The unique identifier for the TVC manifest set The unique identifier(s) of the manifest set operators item field The required number of approvals for the manifest set createTvcDeploymentResult field The unique identifier for the TVC deployment The unique identifier for the TVC manifest createTvcManifestApprovalsResult field The unique identifier(s) for the manifest approvals item field solSendTransactionResult field The send\_transaction\_status ID associated with the transaction submission A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata. Unique identifier for a given Vote object. Unique identifier for a given User. user field Unique identifier for a given User. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of Authenticator parameters. Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE). item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` attestationType field Identifier indicating the type of the Security Key. Unique identifier for a WebAuthn credential. The type of Authenticator device. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given Authenticator. Human-readable name for an Authenticator. createdAt field seconds field nanos field updatedAt field seconds field nanos field A list of API Key parameters. This field, if not needed, should be an empty array in your request body. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given API Key. Human-readable name for an API Key. createdAt field seconds field nanos field updatedAt field seconds field nanos field Optional window (in seconds) indicating how long the API Key should last. A list of User Tag IDs. item field A list of Oauth Providers. Unique identifier for an OAuth Provider Human-readable name to identify a Provider. The issuer of the token, typically a URL indicating the authentication server, e.g [https://accounts.google.com](https://accounts.google.com) Expected audience ('aud' attribute of the signed token) which represents the app ID Expected subject ('sub' attribute of the signed token) which represents the user ID createdAt field seconds field nanos field updatedAt field seconds field nanos field createdAt field seconds field nanos field updatedAt field seconds field nanos field Unique identifier for a given Activity object. selection field Enum options: `VOTE_SELECTION_APPROVED`, `VOTE_SELECTION_REJECTED` The raw message being signed within a Vote. The public component of a cryptographic key pair used to sign messages and transactions. The signature applied to a particular vote. Method used to produce a signature. createdAt field seconds field nanos field A list of App Proofs generated by enclaves during activity execution, providing verifiable attestations of performed operations. scheme field Enum options: `SIGNATURE_SCHEME_EPHEMERAL_KEY_P256` Ephemeral public key. JSON serialized AppProofPayload. Signature over hashed proof\_payload. An artifact verifying a User's action. canApprove field canReject field createdAt field seconds field nanos field updatedAt field seconds field nanos field failure field code field message field details field @type field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_activities \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "filterByStatus": [ "" ], "paginationOptions": { "limit": "", "before": "", "after": "" }, "filterByType": [ "" ] }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getActivities({ organizationId: " (Unique identifier for a given organization.)", filterByStatus: "" // Array of activity statuses filtering which activities will be listed in the response., paginationOptions: { // paginationOptions field, limit: " (A limit of the number of object to be returned, between 1 and 100. Defaults to 10.)", before: " (A pagination cursor. This is an object ID that enables you to fetch all objects before this ID.)", after: " (A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.)", }, filterByType: "" // Array of activity types filtering which activities will be listed in the response. }); ``` ```json 200 theme={"system"} { "activities": [ { "id": "", "organizationId": "", "status": "", "type": "", "intent": { "createOrganizationIntent": { "organizationName": "", "rootEmail": "", "rootAuthenticator": { "authenticatorName": "", "userId": "", "attestation": { "id": "", "type": "", "rawId": "", "authenticatorAttachment": "", "response": { "clientDataJson": "", "attestationObject": "", "transports": [ "" ], "authenticatorAttachment": "" }, "clientExtensionResults": { "appid": "", "appidExclude": "", "credProps": { "rk": "" } } }, "challenge": "" }, "rootUserId": "" }, "createAuthenticatorsIntent": { "authenticators": [ { "authenticatorName": "", "userId": "", "attestation": { "id": "", "type": "", "rawId": "", "authenticatorAttachment": "", "response": { "clientDataJson": "", "attestationObject": "", "transports": [ "" ], "authenticatorAttachment": "" }, "clientExtensionResults": { "appid": "", "appidExclude": "", "credProps": { "rk": "" } } }, "challenge": "" } ], "userId": "" }, "createUsersIntent": { "users": [ { "userName": "", "userEmail": "", "accessType": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "userId": "", "attestation": { "id": "", "type": "", "rawId": "", "authenticatorAttachment": "", "response": { "clientDataJson": "", "attestationObject": "", "transports": [ "" ], "authenticatorAttachment": "" }, "clientExtensionResults": { "appid": "", "appidExclude": "", "credProps": { "rk": "" } } }, "challenge": "" } ], "userTags": [ "" ] } ] }, "createPrivateKeysIntent": { "privateKeys": [ { "privateKeyName": "", "curve": "", "privateKeyTags": [ "" ], "addressFormats": [ "" ] } ] }, "signRawPayloadIntent": { "privateKeyId": "", "payload": "", "encoding": "", "hashFunction": "" }, "createInvitationsIntent": { "invitations": [ { "receiverUserName": "", "receiverUserEmail": "", "receiverUserTags": [ "" ], "accessType": "", "senderUserId": "" } ] }, "acceptInvitationIntent": { "invitationId": "", "userId": "", "authenticator": { "authenticatorName": "", "userId": "", "attestation": { "id": "", "type": "", "rawId": "", "authenticatorAttachment": "", "response": { "clientDataJson": "", "attestationObject": "", "transports": [ "" ], "authenticatorAttachment": "" }, "clientExtensionResults": { "appid": "", "appidExclude": "", "credProps": { "rk": "" } } }, "challenge": "" } }, "createPolicyIntent": { "policyName": "", "selectors": [ { "subject": "", "operator": "", "target": "" } ], "effect": "", "notes": "" }, "disablePrivateKeyIntent": { "privateKeyId": "" }, "deleteUsersIntent": { "userIds": [ "" ] }, "deleteAuthenticatorsIntent": { "userId": "", "authenticatorIds": [ "" ] }, "deleteInvitationIntent": { "invitationId": "" }, "deleteOrganizationIntent": { "organizationId": "" }, "deletePolicyIntent": { "policyId": "" }, "createUserTagIntent": { "userTagName": "", "userIds": [ "" ] }, "deleteUserTagsIntent": { "userTagIds": [ "" ] }, "signTransactionIntent": { "privateKeyId": "", "unsignedTransaction": "", "type": "" }, "createApiKeysIntent": { "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "userId": "" }, "deleteApiKeysIntent": { "userId": "", "apiKeyIds": [ "" ] }, "approveActivityIntent": { "fingerprint": "" }, "rejectActivityIntent": { "fingerprint": "" }, "createPrivateKeyTagIntent": { "privateKeyTagName": "", "privateKeyIds": [ "" ] }, "deletePrivateKeyTagsIntent": { "privateKeyTagIds": [ "" ] }, "createPolicyIntentV2": { "policyName": "", "selectors": [ { "subject": "", "operator": "", "targets": [ "" ] } ], "effect": "", "notes": "" }, "setPaymentMethodIntent": { "number": "", "cvv": "", "expiryMonth": "", "expiryYear": "", "cardHolderEmail": "", "cardHolderName": "" }, "activateBillingTierIntent": { "productId": "" }, "deletePaymentMethodIntent": { "paymentMethodId": "" }, "createPolicyIntentV3": { "policyName": "", "effect": "", "condition": "", "consensus": "", "notes": "" }, "createApiOnlyUsersIntent": { "apiOnlyUsers": [ { "userName": "", "userEmail": "", "userTags": [ "" ], "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ] } ] }, "updateRootQuorumIntent": { "threshold": "", "userIds": [ "" ] }, "updateUserTagIntent": { "userTagId": "", "newUserTagName": "", "addUserIds": [ "" ], "removeUserIds": [ "" ] }, "updatePrivateKeyTagIntent": { "privateKeyTagId": "", "newPrivateKeyTagName": "", "addPrivateKeyIds": [ "" ], "removePrivateKeyIds": [ "" ] }, "createAuthenticatorsIntentV2": { "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "userId": "" }, "acceptInvitationIntentV2": { "invitationId": "", "userId": "", "authenticator": { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } }, "createOrganizationIntentV2": { "organizationName": "", "rootEmail": "", "rootAuthenticator": { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } }, "rootUserId": "" }, "createUsersIntentV2": { "users": [ { "userName": "", "userEmail": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "userTags": [ "" ] } ] }, "createSubOrganizationIntent": { "name": "", "rootAuthenticator": { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } }, "createSubOrganizationIntentV2": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ] } ], "rootQuorumThreshold": "" }, "updateAllowedOriginsIntent": { "allowedOrigins": [ "" ] }, "createPrivateKeysIntentV2": { "privateKeys": [ { "privateKeyName": "", "curve": "", "privateKeyTags": [ "" ], "addressFormats": [ "" ] } ] }, "updateUserIntent": { "userId": "", "userName": "", "userEmail": "", "userTagIds": [ "" ], "userPhoneNumber": "" }, "updatePolicyIntent": { "policyId": "", "policyName": "", "policyEffect": "", "policyCondition": "", "policyConsensus": "", "policyNotes": "" }, "setPaymentMethodIntentV2": { "paymentMethodId": "", "cardHolderEmail": "", "cardHolderName": "" }, "createSubOrganizationIntentV3": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ] } ], "rootQuorumThreshold": "", "privateKeys": [ { "privateKeyName": "", "curve": "", "privateKeyTags": [ "" ], "addressFormats": [ "" ] } ] }, "createWalletIntent": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "createWalletAccountsIntent": { "walletId": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "persist": "" }, "initUserEmailRecoveryIntent": { "email": "", "targetPublicKey": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "recoverUserIntent": { "authenticator": { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } }, "userId": "" }, "setOrganizationFeatureIntent": { "name": "", "value": "" }, "removeOrganizationFeatureIntent": { "name": "" }, "signRawPayloadIntentV2": { "signWith": "", "payload": "", "encoding": "", "hashFunction": "" }, "signTransactionIntentV2": { "signWith": "", "unsignedTransaction": "", "type": "" }, "exportPrivateKeyIntent": { "privateKeyId": "", "targetPublicKey": "" }, "exportWalletIntent": { "walletId": "", "targetPublicKey": "", "language": "" }, "createSubOrganizationIntentV4": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ] } ], "rootQuorumThreshold": "", "wallet": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "disableEmailRecovery": "", "disableEmailAuth": "" }, "emailAuthIntent": { "email": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "invalidateExisting": "", "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "exportWalletAccountIntent": { "address": "", "targetPublicKey": "" }, "initImportWalletIntent": { "userId": "" }, "importWalletIntent": { "userId": "", "walletName": "", "encryptedBundle": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ] }, "initImportPrivateKeyIntent": { "userId": "" }, "importPrivateKeyIntent": { "userId": "", "privateKeyName": "", "encryptedBundle": "", "curve": "", "addressFormats": [ "" ] }, "createPoliciesIntent": { "policies": [ { "policyName": "", "effect": "", "condition": "", "consensus": "", "notes": "" } ] }, "signRawPayloadsIntent": { "signWith": "", "payloads": [ "" ], "encoding": "", "hashFunction": "" }, "createReadOnlySessionIntent": "", "createOauthProvidersIntent": { "userId": "", "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] }, "deleteOauthProvidersIntent": { "userId": "", "providerIds": [ "" ] }, "createSubOrganizationIntentV5": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } ], "rootQuorumThreshold": "", "wallet": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "disableEmailRecovery": "", "disableEmailAuth": "" }, "oauthIntent": { "oidcToken": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" }, "createApiKeysIntentV2": { "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "userId": "" }, "createReadWriteSessionIntent": { "targetPublicKey": "", "email": "", "apiKeyName": "", "expirationSeconds": "" }, "emailAuthIntentV2": { "email": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "invalidateExisting": "", "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "createSubOrganizationIntentV6": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } ], "rootQuorumThreshold": "", "wallet": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "disableEmailRecovery": "", "disableEmailAuth": "" }, "deletePrivateKeysIntent": { "privateKeyIds": [ "" ], "deleteWithoutExport": "" }, "deleteWalletsIntent": { "walletIds": [ "" ], "deleteWithoutExport": "" }, "createReadWriteSessionIntentV2": { "targetPublicKey": "", "userId": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" }, "deleteSubOrganizationIntent": { "deleteWithoutExport": "" }, "initOtpAuthIntent": { "otpType": "", "contact": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "otpAuthIntent": { "otpId": "", "otpCode": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "invalidateExisting": "" }, "createSubOrganizationIntentV7": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "", "userPhoneNumber": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ] } ], "rootQuorumThreshold": "", "wallet": { "walletName": "", "accounts": [ { "curve": "", "pathFormat": "", "path": "", "addressFormat": "" } ], "mnemonicLength": "" }, "disableEmailRecovery": "", "disableEmailAuth": "", "disableSmsAuth": "", "disableOtpEmailAuth": "", "verificationToken": "", "clientSignature": { "publicKey": "", "scheme": "", "message": "", "signature": "" } }, "updateWalletIntent": { "walletId": "", "walletName": "" }, "updatePolicyIntentV2": { "policyId": "", "policyName": "", "policyEffect": "", "policyCondition": "", "policyConsensus": "", "policyNotes": "" }, "createUsersIntentV3": { "users": [ { "userName": "", "userEmail": "", "userPhoneNumber": "", "apiKeys": [ { "apiKeyName": "", "publicKey": "", "curveType": "", "expirationSeconds": "" } ], "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": [ "" ] } } ], "oauthProviders": [ { "providerName": "", "oidcToken": "" } ], "userTags": [ "" ] } ] }, "initOtpAuthIntentV2": { "otpType": "", "contact": "", "otpLength": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "initOtpIntent": { "otpType": "", "contact": "", "otpLength": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" }, "verifyOtpIntent": { "otpId": "", "otpCode": "", "expirationSeconds": "", "publicKey": "" }, "otpLoginIntent": { "verificationToken": "", "publicKey": "", "expirationSeconds": "", "invalidateExisting": "", "clientSignature": { "publicKey": "", "scheme": "", "message": "", "signature": "" } }, "stampLoginIntent": { "publicKey": "", "expirationSeconds": "", "invalidateExisting": "" }, "oauthLoginIntent": { "oidcToken": "", "publicKey": "", "expirationSeconds": "", "invalidateExisting": "" }, "updateUserNameIntent": { "userId": "", "userName": "" }, "updateUserEmailIntent": { "userId": "", "userEmail": "", "verificationToken": "" }, "updateUserPhoneNumberIntent": { "userId": "", "userPhoneNumber": "", "verificationToken": "" }, "initFiatOnRampIntent": { "onrampProvider": "", "walletAddress": "", "network": "", "cryptoCurrencyCode": "", "fiatCurrencyCode": "", "fiatCurrencyAmount": "", "paymentMethod": "", "countryCode": "", "countrySubdivisionCode": "", "sandboxMode": "", "urlForSignature": "" }, "createSmartContractInterfaceIntent": { "smartContractAddress": "", "smartContractInterface": "", "type": "", "label": "", "notes": "" }, "deleteSmartContractInterfaceIntent": { "smartContractInterfaceId": "" }, "enableAuthProxyIntent": "", "disableAuthProxyIntent": "", "updateAuthProxyConfigIntent": { "allowedOrigins": [ "" ], "allowedAuthMethods": [ "" ], "sendFromEmailAddress": "", "replyToEmailAddress": "", "emailAuthTemplateId": "", "otpTemplateId": "", "emailCustomizationParams": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomizationParams": { "template": "" }, "walletKitSettings": { "enabledSocialProviders": [ "" ], "oauthClientIds": "", "oauthRedirectUrl": "" }, "otpExpirationSeconds": "", "verificationTokenExpirationSeconds": "", "sessionExpirationSeconds": "", "otpAlphanumeric": "", "otpLength": "", "sendFromEmailSenderName": "", "verificationTokenRequiredForGetAccountPii": "" }, "createOauth2CredentialIntent": { "provider": "", "clientId": "", "encryptedClientSecret": "" }, "updateOauth2CredentialIntent": { "oauth2CredentialId": "", "provider": "", "clientId": "", "encryptedClientSecret": "" }, "deleteOauth2CredentialIntent": { "oauth2CredentialId": "" }, "oauth2AuthenticateIntent": { "oauth2CredentialId": "", "authCode": "", "redirectUri": "", "codeVerifier": "", "nonce": "", "bearerTokenTargetPublicKey": "" }, "deleteWalletAccountsIntent": { "walletAccountIds": [ "" ], "deleteWithoutExport": "" }, "deletePoliciesIntent": { "policyIds": [ "" ] }, "ethSendRawTransactionIntent": { "signedTransaction": "", "caip2": "" }, "ethSendTransactionIntent": { "from": "", "sponsor": "", "caip2": "", "to": "", "value": "", "data": "", "nonce": "", "gasLimit": "", "maxFeePerGas": "", "maxPriorityFeePerGas": "", "gasStationNonce": "" }, "createFiatOnRampCredentialIntent": { "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "", "sandboxMode": "" }, "updateFiatOnRampCredentialIntent": { "fiatOnrampCredentialId": "", "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "" }, "deleteFiatOnRampCredentialIntent": { "fiatOnrampCredentialId": "" }, "emailAuthIntentV3": { "email": "", "targetPublicKey": "", "apiKeyName": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "invalidateExisting": "", "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "initUserEmailRecoveryIntentV2": { "email": "", "targetPublicKey": "", "expirationSeconds": "", "emailCustomization": { "appName": "", "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "sendFromEmailAddress": "", "sendFromEmailSenderName": "", "replyToEmailAddress": "" }, "initOtpIntentV2": { "otpType": "", "contact": "", "otpLength": "", "appName": "", "emailCustomization": { "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" }, "initOtpAuthIntentV3": { "otpType": "", "contact": "", "otpLength": "", "appName": "", "emailCustomization": { "logoUrl": "", "magicLinkTemplate": "", "templateVariables": "", "templateId": "" }, "smsCustomization": { "template": "" }, "userIdentifier": "", "sendFromEmailAddress": "", "alphanumeric": "", "sendFromEmailSenderName": "", "expirationSeconds": "", "replyToEmailAddress": "" }, "upsertGasUsageConfigIntent": { "orgWindowLimitUsd": "", "subOrgWindowLimitUsd": "", "windowDurationMinutes": "", "enabled": "" }, "createTvcAppIntent": { "name": "", "quorumPublicKey": "", "manifestSetId": "", "manifestSetParams": { "name": "", "newOperators": [ { "name": "", "publicKey": "" } ], "existingOperatorIds": [ "" ], "threshold": "" }, "shareSetId": "", "shareSetParams": { "name": "", "newOperators": [ { "name": "", "publicKey": "" } ], "existingOperatorIds": [ "" ], "threshold": "" }, "externalConnectivity": "" }, "createTvcDeploymentIntent": { "appId": "", "qosVersion": "", "pivotContainerImageUrl": "", "pivotPath": "", "pivotArgs": [ "" ], "expectedPivotDigest": "", "hostContainerImageUrl": "", "hostPath": "", "hostArgs": [ "" ], "nonce": "", "pivotContainerEncryptedPullSecret": "", "hostContainerEncryptedPullSecret": "" }, "createTvcManifestApprovalsIntent": { "manifestId": "", "approvals": [ { "operatorId": "", "signature": "" } ] }, "solSendTransactionIntent": { "unsignedTransaction": "", "signWith": "", "sponsor": "", "caip2": "", "recentBlockhash": "" } }, "result": { "createOrganizationResult": { "organizationId": "" }, "createAuthenticatorsResult": { "authenticatorIds": [ "" ] }, "createUsersResult": { "userIds": [ "" ] }, "createPrivateKeysResult": { "privateKeyIds": [ "" ] }, "createInvitationsResult": { "invitationIds": [ "" ] }, "acceptInvitationResult": { "invitationId": "", "userId": "" }, "signRawPayloadResult": { "r": "", "s": "", "v": "" }, "createPolicyResult": { "policyId": "" }, "disablePrivateKeyResult": { "privateKeyId": "" }, "deleteUsersResult": { "userIds": [ "" ] }, "deleteAuthenticatorsResult": { "authenticatorIds": [ "" ] }, "deleteInvitationResult": { "invitationId": "" }, "deleteOrganizationResult": { "organizationId": "" }, "deletePolicyResult": { "policyId": "" }, "createUserTagResult": { "userTagId": "", "userIds": [ "" ] }, "deleteUserTagsResult": { "userTagIds": [ "" ], "userIds": [ "" ] }, "signTransactionResult": { "signedTransaction": "" }, "deleteApiKeysResult": { "apiKeyIds": [ "" ] }, "createApiKeysResult": { "apiKeyIds": [ "" ] }, "createPrivateKeyTagResult": { "privateKeyTagId": "", "privateKeyIds": [ "" ] }, "deletePrivateKeyTagsResult": { "privateKeyTagIds": [ "" ], "privateKeyIds": [ "" ] }, "setPaymentMethodResult": { "lastFour": "", "cardHolderName": "", "cardHolderEmail": "" }, "activateBillingTierResult": { "productId": "" }, "deletePaymentMethodResult": { "paymentMethodId": "" }, "createApiOnlyUsersResult": { "userIds": [ "" ] }, "updateRootQuorumResult": "", "updateUserTagResult": { "userTagId": "" }, "updatePrivateKeyTagResult": { "privateKeyTagId": "" }, "createSubOrganizationResult": { "subOrganizationId": "", "rootUserIds": [ "" ] }, "updateAllowedOriginsResult": "", "createPrivateKeysResultV2": { "privateKeys": [ { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] } ] }, "updateUserResult": { "userId": "" }, "updatePolicyResult": { "policyId": "" }, "createSubOrganizationResultV3": { "subOrganizationId": "", "privateKeys": [ { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] } ], "rootUserIds": [ "" ] }, "createWalletResult": { "walletId": "", "addresses": [ "" ] }, "createWalletAccountsResult": { "addresses": [ "" ] }, "initUserEmailRecoveryResult": { "userId": "" }, "recoverUserResult": { "authenticatorId": [ "" ] }, "setOrganizationFeatureResult": { "features": [ { "name": "", "value": "" } ] }, "removeOrganizationFeatureResult": { "features": [ { "name": "", "value": "" } ] }, "exportPrivateKeyResult": { "privateKeyId": "", "exportBundle": "" }, "exportWalletResult": { "walletId": "", "exportBundle": "" }, "createSubOrganizationResultV4": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "emailAuthResult": { "userId": "", "apiKeyId": "" }, "exportWalletAccountResult": { "address": "", "exportBundle": "" }, "initImportWalletResult": { "importBundle": "" }, "importWalletResult": { "walletId": "", "addresses": [ "" ] }, "initImportPrivateKeyResult": { "importBundle": "" }, "importPrivateKeyResult": { "privateKeyId": "", "addresses": [ { "format": "", "address": "" } ] }, "createPoliciesResult": { "policyIds": [ "" ] }, "signRawPayloadsResult": { "signatures": [ { "r": "", "s": "", "v": "" } ] }, "createReadOnlySessionResult": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "session": "", "sessionExpiry": "" }, "createOauthProvidersResult": { "providerIds": [ "" ] }, "deleteOauthProvidersResult": { "providerIds": [ "" ] }, "createSubOrganizationResultV5": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "oauthResult": { "userId": "", "apiKeyId": "", "credentialBundle": "" }, "createReadWriteSessionResult": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "apiKeyId": "", "credentialBundle": "" }, "createSubOrganizationResultV6": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "deletePrivateKeysResult": { "privateKeyIds": [ "" ] }, "deleteWalletsResult": { "walletIds": [ "" ] }, "createReadWriteSessionResultV2": { "organizationId": "", "organizationName": "", "userId": "", "username": "", "apiKeyId": "", "credentialBundle": "" }, "deleteSubOrganizationResult": { "subOrganizationUuid": "" }, "initOtpAuthResult": { "otpId": "" }, "otpAuthResult": { "userId": "", "apiKeyId": "", "credentialBundle": "" }, "createSubOrganizationResultV7": { "subOrganizationId": "", "wallet": { "walletId": "", "addresses": [ "" ] }, "rootUserIds": [ "" ] }, "updateWalletResult": { "walletId": "" }, "updatePolicyResultV2": { "policyId": "" }, "initOtpAuthResultV2": { "otpId": "" }, "initOtpResult": { "otpId": "" }, "verifyOtpResult": { "verificationToken": "" }, "otpLoginResult": { "session": "" }, "stampLoginResult": { "session": "" }, "oauthLoginResult": { "session": "" }, "updateUserNameResult": { "userId": "" }, "updateUserEmailResult": { "userId": "" }, "updateUserPhoneNumberResult": { "userId": "" }, "initFiatOnRampResult": { "onRampUrl": "", "onRampTransactionId": "", "onRampUrlSignature": "" }, "createSmartContractInterfaceResult": { "smartContractInterfaceId": "" }, "deleteSmartContractInterfaceResult": { "smartContractInterfaceId": "" }, "enableAuthProxyResult": { "userId": "" }, "disableAuthProxyResult": "", "updateAuthProxyConfigResult": { "configId": "" }, "createOauth2CredentialResult": { "oauth2CredentialId": "" }, "updateOauth2CredentialResult": { "oauth2CredentialId": "" }, "deleteOauth2CredentialResult": { "oauth2CredentialId": "" }, "oauth2AuthenticateResult": { "oidcToken": "" }, "deleteWalletAccountsResult": { "walletAccountIds": [ "" ] }, "deletePoliciesResult": { "policyIds": [ "" ] }, "ethSendRawTransactionResult": { "transactionHash": "" }, "createFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" }, "updateFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" }, "deleteFiatOnRampCredentialResult": { "fiatOnRampCredentialId": "" }, "ethSendTransactionResult": { "sendTransactionStatusId": "" }, "upsertGasUsageConfigResult": { "gasUsageConfigId": "" }, "createTvcAppResult": { "appId": "", "manifestSetId": "", "manifestSetOperatorIds": [ "" ], "manifestSetThreshold": "" }, "createTvcDeploymentResult": { "deploymentId": "", "manifestId": "" }, "createTvcManifestApprovalsResult": { "approvalIds": [ "" ] }, "solSendTransactionResult": { "sendTransactionStatusId": "" } }, "votes": [ { "id": "", "userId": "", "user": { "userId": "", "userName": "", "userEmail": "", "userPhoneNumber": "", "authenticators": [ { "transports": [ "" ], "attestationType": "", "aaguid": "", "credentialId": "", "model": "", "credential": { "publicKey": "", "type": "" }, "authenticatorId": "", "authenticatorName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "apiKeys": [ { "credential": { "publicKey": "", "type": "" }, "apiKeyId": "", "apiKeyName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "expirationSeconds": "" } ], "userTags": [ "" ], "oauthProviders": [ { "providerId": "", "providerName": "", "issuer": "", "audience": "", "subject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } }, "activityId": "", "selection": "", "message": "", "publicKey": "", "signature": "", "scheme": "", "createdAt": { "seconds": "", "nanos": "" } } ], "appProofs": [ { "scheme": "", "publicKey": "", "proofPayload": "", "signature": "" } ], "fingerprint": "", "canApprove": "", "canReject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "failure": { "code": "", "message": "", "details": [ { "@type": "" } ] } } ] } ``` # List App Proofs for an activity Source: https://docs.turnkey.com/api-reference/queries/list-app-proofs-for-an-activity List the App Proofs for the given activity. Unique identifier for a given Organization. Unique identifier for a given activity. A successful response returns the following fields: appProofs field scheme field Enum options: `SIGNATURE_SCHEME_EPHEMERAL_KEY_P256` Ephemeral public key. JSON serialized AppProofPayload. Signature over hashed proof\_payload. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_app_proofs \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "activityId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getAppProofs({ organizationId: " (Unique identifier for a given Organization.)", activityId: " (Unique identifier for a given activity.)" }); ``` ```json 200 theme={"system"} { "appProofs": [ { "scheme": "", "publicKey": "", "proofPayload": "", "signature": "" } ] } ``` # List Fiat On Ramp Credentials Source: https://docs.turnkey.com/api-reference/queries/list-fiat-on-ramp-credentials List all fiat on ramp provider credentials within an organization. Unique identifier for a given Organization. A successful response returns the following fields: fiatOnRampCredentials field Unique identifier for a given Fiat On-Ramp Credential. Unique identifier for an Organization. onrampProvider field Enum options: `FIAT_ON_RAMP_PROVIDER_COINBASE`, `FIAT_ON_RAMP_PROVIDER_MOONPAY` Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier. Publishable API key for the on-ramp provider. Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key. Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key. If the on-ramp credential is a sandbox credential. createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_fiat_on_ramp_credentials \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().listFiatOnRampCredentials({ organizationId: " (Unique identifier for a given Organization.)" }); ``` ```json 200 theme={"system"} { "fiatOnRampCredentials": [ { "fiatOnrampCredentialId": "", "organizationId": "", "onrampProvider": "", "projectId": "", "publishableApiKey": "", "encryptedSecretApiKey": "", "encryptedPrivateApiKey": "", "sandboxMode": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # List OAuth 2.0 Credentials Source: https://docs.turnkey.com/api-reference/queries/list-oauth-20-credentials List all OAuth 2.0 credentials within an organization. Unique identifier for a given Organization. A successful response returns the following fields: oauth2Credentials field Unique identifier for a given OAuth 2.0 Credential. Unique identifier for an Organization. provider field Enum options: `OAUTH2_PROVIDER_X`, `OAUTH2_PROVIDER_DISCORD` The client id for a given OAuth 2.0 Credential. The encrypted client secret for a given OAuth 2.0 Credential encrypted to the TLS Fetcher quorum key. createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_oauth2_credentials \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().listOauth2Credentials({ organizationId: " (Unique identifier for a given Organization.)" }); ``` ```json 200 theme={"system"} { "oauth2Credentials": [ { "oauth2CredentialId": "", "organizationId": "", "provider": "", "clientId": "", "encryptedClientSecret": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # List policies Source: https://docs.turnkey.com/api-reference/queries/list-policies List all policies within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of policies. Unique identifier for a given Policy. Human-readable name for a Policy. effect field Enum options: `EFFECT_ALLOW`, `EFFECT_DENY` createdAt field seconds field nanos field updatedAt field seconds field nanos field Human-readable notes added by a User to describe a particular policy. A consensus expression that evalutes to true or false. A condition expression that evalutes to true or false. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_policies \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getPolicies({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "policies": [ { "policyId": "", "policyName": "", "effect": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "notes": "", "consensus": "", "condition": "" } ] } ``` # List private key tags Source: https://docs.turnkey.com/api-reference/queries/list-private-key-tags List all private key tags within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of private key tags. Unique identifier for a given Tag. Human-readable name for a Tag. tagType field Enum options: `TAG_TYPE_USER`, `TAG_TYPE_PRIVATE_KEY` createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_private_key_tags \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().listPrivateKeyTags({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "privateKeyTags": [ { "tagId": "", "tagName": "", "tagType": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # List private keys Source: https://docs.turnkey.com/api-reference/queries/list-private-keys List all private keys within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of private keys. Unique identifier for a given Private Key. The public component of a cryptographic key pair used to sign messages and transactions. Human-readable name for a Private Key. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` Derived cryptocurrency addresses for a given Private Key. format field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` address field A list of Private Key Tag IDs. item field createdAt field seconds field nanos field updatedAt field seconds field nanos field True when a given Private Key is exported, false otherwise. True when a given Private Key is imported, false otherwise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_private_keys \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getPrivateKeys({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "privateKeys": [ { "privateKeyId": "", "publicKey": "", "privateKeyName": "", "curve": "", "addresses": [ { "format": "", "address": "" } ], "privateKeyTags": [ "" ], "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "exported": "", "imported": "" } ] } ``` # List smart contract interfaces Source: https://docs.turnkey.com/api-reference/queries/list-smart-contract-interfaces List all smart contract interfaces within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of smart contract interfaces. The Organization the Smart Contract Interface belongs to. Unique identifier for a given Smart Contract Interface (ABI or IDL). The address corresponding to the Smart Contract or Program. The JSON corresponding to the Smart Contract Interface (ABI or IDL). The type corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA). The label corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA). The notes corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA). createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_smart_contract_interfaces \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getSmartContractInterfaces({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "smartContractInterfaces": [ { "organizationId": "", "smartContractInterfaceId": "", "smartContractAddress": "", "smartContractInterface": "", "type": "", "label": "", "notes": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # List supported assets Source: https://docs.turnkey.com/api-reference/queries/list-supported-assets List supported assets for the specified network Unique identifier for a given organization. The network identifier in CAIP-2 format (e.g., 'eip155:1' for Ethereum mainnet). A successful response returns the following fields: assets field caip19 field symbol field decimals field logoUrl field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_supported_assets \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "caip2": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().listSupportedAssets({ organizationId: " (Unique identifier for a given organization.)", caip2: " (The network identifier in CAIP-2 format (e.g., 'eip155:1' for Ethereum mainnet).)" }); ``` ```json 200 theme={"system"} { "assets": [ { "caip19": "", "symbol": "", "decimals": "", "logoUrl": "" } ] } ``` # List user tags Source: https://docs.turnkey.com/api-reference/queries/list-user-tags List all user tags within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of user tags. Unique identifier for a given Tag. Human-readable name for a Tag. tagType field Enum options: `TAG_TYPE_USER`, `TAG_TYPE_PRIVATE_KEY` createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_user_tags \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().listUserTags({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "userTags": [ { "tagId": "", "tagName": "", "tagType": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # List users Source: https://docs.turnkey.com/api-reference/queries/list-users List all users within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of users. Unique identifier for a given User. Human-readable name for a User. The user's email address. The user's phone number in E.164 format e.g. +13214567890 A list of Authenticator parameters. Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE). item field Enum options: `AUTHENTICATOR_TRANSPORT_BLE`, `AUTHENTICATOR_TRANSPORT_INTERNAL`, `AUTHENTICATOR_TRANSPORT_NFC`, `AUTHENTICATOR_TRANSPORT_USB`, `AUTHENTICATOR_TRANSPORT_HYBRID` attestationType field Identifier indicating the type of the Security Key. Unique identifier for a WebAuthn credential. The type of Authenticator device. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given Authenticator. Human-readable name for an Authenticator. createdAt field seconds field nanos field updatedAt field seconds field nanos field A list of API Key parameters. This field, if not needed, should be an empty array in your request body. credential field The public component of a cryptographic key pair used to sign messages and transactions. type field Enum options: `CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR`, `CREDENTIAL_TYPE_API_KEY_P256`, `CREDENTIAL_TYPE_RECOVER_USER_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_SECP256K1`, `CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256`, `CREDENTIAL_TYPE_API_KEY_ED25519`, `CREDENTIAL_TYPE_OTP_AUTH_KEY_P256`, `CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256`, `CREDENTIAL_TYPE_OAUTH_KEY_P256`, `CREDENTIAL_TYPE_LOGIN` Unique identifier for a given API Key. Human-readable name for an API Key. createdAt field seconds field nanos field updatedAt field seconds field nanos field Optional window (in seconds) indicating how long the API Key should last. A list of User Tag IDs. item field A list of Oauth Providers. Unique identifier for an OAuth Provider Human-readable name to identify a Provider. The issuer of the token, typically a URL indicating the authentication server, e.g [https://accounts.google.com](https://accounts.google.com) Expected audience ('aud' attribute of the signed token) which represents the app ID Expected subject ('sub' attribute of the signed token) which represents the user ID createdAt field seconds field nanos field updatedAt field seconds field nanos field createdAt field seconds field nanos field updatedAt field seconds field nanos field ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_users \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getUsers({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "users": [ { "userId": "", "userName": "", "userEmail": "", "userPhoneNumber": "", "authenticators": [ { "transports": [ "" ], "attestationType": "", "aaguid": "", "credentialId": "", "model": "", "credential": { "publicKey": "", "type": "" }, "authenticatorId": "", "authenticatorName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "apiKeys": [ { "credential": { "publicKey": "", "type": "" }, "apiKeyId": "", "apiKeyName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "expirationSeconds": "" } ], "userTags": [ "" ], "oauthProviders": [ { "providerId": "", "providerName": "", "issuer": "", "audience": "", "subject": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ], "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" } } ] } ``` # List wallets Source: https://docs.turnkey.com/api-reference/queries/list-wallets List all wallets within an organization. Unique identifier for a given organization. A successful response returns the following fields: A list of wallets. Unique identifier for a given Wallet. Human-readable name for a Wallet. createdAt field seconds field nanos field updatedAt field seconds field nanos field True when a given Wallet is exported, false otherwise. True when a given Wallet is imported, false otherwise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_wallets \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getWallets({ organizationId: " (Unique identifier for a given organization.)" }); ``` ```json 200 theme={"system"} { "wallets": [ { "walletId": "", "walletName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "exported": "", "imported": "" } ] } ``` # List wallets accounts Source: https://docs.turnkey.com/api-reference/queries/list-wallets-accounts List all accounts within a wallet. Unique identifier for a given organization. Unique identifier for a given wallet. If not provided, all accounts for the organization will be returned. Optional flag to specify if the wallet details should be included in the response. Default = false.

paginationOptions field

A limit of the number of object to be returned, between 1 and 100. Defaults to 10. A pagination cursor. This is an object ID that enables you to fetch all objects before this ID. A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.
A successful response returns the following fields: A list of accounts generated from a wallet that share a common seed. Unique identifier for a given Wallet Account. The Organization the Account belongs to. The Wallet the Account was derived from. curve field Enum options: `CURVE_SECP256K1`, `CURVE_ED25519`, `CURVE_P256` pathFormat field Enum options: `PATH_FORMAT_BIP32` Path used to generate the Account. addressFormat field Enum options: `ADDRESS_FORMAT_UNCOMPRESSED`, `ADDRESS_FORMAT_COMPRESSED`, `ADDRESS_FORMAT_ETHEREUM`, `ADDRESS_FORMAT_SOLANA`, `ADDRESS_FORMAT_COSMOS`, `ADDRESS_FORMAT_TRON`, `ADDRESS_FORMAT_SUI`, `ADDRESS_FORMAT_APTOS`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH`, `ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH`, `ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR`, `ADDRESS_FORMAT_SEI`, `ADDRESS_FORMAT_XLM`, `ADDRESS_FORMAT_DOGE_MAINNET`, `ADDRESS_FORMAT_DOGE_TESTNET`, `ADDRESS_FORMAT_TON_V3R2`, `ADDRESS_FORMAT_TON_V4R2`, `ADDRESS_FORMAT_TON_V5R1`, `ADDRESS_FORMAT_XRP` Address generated using the Wallet seed and Account parameters. createdAt field seconds field nanos field updatedAt field seconds field nanos field The public component of this wallet account's underlying cryptographic key pair. walletDetails field Unique identifier for a given Wallet. Human-readable name for a Wallet. createdAt field seconds field nanos field updatedAt field seconds field nanos field True when a given Wallet is exported, false otherwise. True when a given Wallet is imported, false otherwise. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/list_wallet_accounts \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "", "walletId": "", "includeWalletDetails": "", "paginationOptions": { "limit": "", "before": "", "after": "" } }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getWalletAccounts({ organizationId: " (Unique identifier for a given organization.)", walletId: " (Unique identifier for a given wallet. If not provided, all accounts for the organization will be returned.)", includeWalletDetails: true // Optional flag to specify if the wallet details should be included in the response. Default = false., paginationOptions: { // paginationOptions field, limit: " (A limit of the number of object to be returned, between 1 and 100. Defaults to 10.)", before: " (A pagination cursor. This is an object ID that enables you to fetch all objects before this ID.)", after: " (A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.)", } }); ``` ```json 200 theme={"system"} { "accounts": [ { "walletAccountId": "", "organizationId": "", "walletId": "", "curve": "", "pathFormat": "", "path": "", "addressFormat": "", "address": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "publicKey": "", "walletDetails": { "walletId": "", "walletName": "", "createdAt": { "seconds": "", "nanos": "" }, "updatedAt": { "seconds": "", "nanos": "" }, "exported": "", "imported": "" } } ] } ``` # Queries Source: https://docs.turnkey.com/api-reference/queries/overview Queries are read requests to Turnkey's API. They allow you to retrieve data about your organization and its resources. # What are queries? Queries are read-only operations that let you fetch information from Turnkey's API without modifying any resources. Query endpoints are always prefixed with `/public/v1/query`. * **No Policy Enforcement:** Queries are not subject to the policy engine, so any authenticated user in your organization can perform them. * **Organization-wide Access:** All users within an organization can read any data within the organization. Parent organizations can also query data for all of their sub-organizations. * **Use Cases:** Common use cases include listing users, retrieving organization details, and fetching activity logs. # Who am I? Source: https://docs.turnkey.com/api-reference/queries/who-am-i Get basic information about your current API or WebAuthN user and their organization. Affords sub-organization look ups via parent organization for WebAuthN or API key users. Unique identifier for a given organization. If the request is being made by a WebAuthN user and their sub-organization ID is unknown, this can be the parent organization ID; using the sub-organization ID when possible is preferred due to performance reasons. A successful response returns the following fields: Unique identifier for a given organization. Human-readable name for an organization. Unique identifier for a given user. Human-readable name for a user. ```bash title="cURL" theme={"system"} curl --request POST \ --url https://api.turnkey.com/public/v1/query/whoami \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header "X-Stamp: (see Authorizations)" \ --data '{ "organizationId": "" }' ``` ```javascript title="JavaScript" theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const response = await turnkeyClient.apiClient().getWhoami({ organizationId: " (Unique identifier for a given organization. If the request is being made by a WebAuthN user and their sub-organization ID is unknown, this can be the parent organization ID; using the sub-organization ID when possible is preferred due to performance reasons.)" }); ``` ```json 200 theme={"system"} { "organizationId": "", "organizationName": "", "userId": "", "username": "" } ``` # Backend Authentication Source: https://docs.turnkey.com/authentication/backend-setup Guide for integrating Turnkey authentication into your backend, covering session JWT creation, validation, and enforcing user access controls. ## Introduction This guide shows you how to use Turnkey as the foundation for your own backend authentication system. You’ll learn how to issue, send, and validate session JWTs, and enforce access controls in your backend. ## Why Use Backend Authentication? There are several benefits to enforcing authenticated requests to your backend: 1. **User data**: Store and retrieve user data associated with Turnkey sub-organizations 2. **Metrics and monitoring**: Add custom validations, rate limiting, and logging 3. **Co-signing capabilities**: Enable 2/2 signing patterns where your application is a co-signer ## JWT Authentication Flow JSON Web Tokens (JWTs) provide a secure, stateless way to authenticate requests between your frontend and backend. Here's how to implement a JWT-based flow with Turnkey: ### Architecture Overview ```mermaid theme={"system"} sequenceDiagram participant User participant Frontend participant Backend participant Turnkey %% Login/Signup Flow User->>Frontend: Login/Signup Action Frontend->>Backend: Send auth info Backend->>Backend: Create and sign Turnkey request Backend->>Turnkey: Send signed request Turnkey->>Backend: Return session JWT Backend->>Frontend: Return session JWT Frontend->>Frontend: Store session JWT %% Subsequent Request Flow User->>Frontend: Action requiring Backend Authentication Frontend->>Backend: Send request with JWT Backend->>Backend: Validate JWT Backend->>Backend: Check user permissions Backend->>Frontend: Return response Frontend->>User: Update UI ``` ### High-Level Flow The overall pattern is similar, but may differ slightly depending on the auth method. Generally: * The user authenticates (via passkey, OTP, etc.) * A session is created with Turnkey, returning a session JWT * That session JWT is used to make authenticated requests to your backend ## Getting the Session JWT Turnkey supports multiple authentication methods, each of which results in a session JWT that proves the user's identity. This section covers the two most common flows: passkey authentication and OTP (One-Time Passcode) authentication. It explains how each method ultimately produces a session JWT that your frontend can use to make authenticated requests to your backend. ### Passkey Authentication Turnkey supports passkey authentication, which allows users to log in using their device’s biometric system or a hardware security key. In this guide, we’ll separate login and signup flows, since most apps handle them independently and the implementation details differ slightly. #### Signup Flow ```mermaid theme={"system"} sequenceDiagram participant User participant Frontend participant Backend participant Turnkey User->>Frontend: Begin signup (create passkey) Frontend->>Frontend: Create passkey and ephemeral API key Frontend->>Backend: Send passkey + ephemeral API public key Backend->>Turnkey: Create sub-org with passkey + API public key Turnkey->>Backend: Return subOrgId Backend->>Frontend: Return subOrgId Frontend->>Frontend: Create TurnkeyClient with ephemeral API key Frontend->>Turnkey: Call stampLogin() using ephemeral API key Turnkey->>Frontend: Return session JWT User->>Frontend: Action requiring Backend Authentication Frontend->>Backend: Send request along with session JWT Backend->>Backend: Validate JWT Backend->>Backend: Check user permissions Backend->>Frontend: Return response Frontend->>User: Update UI ``` The user begins the signup flow by tapping a button like “Sign up with Passkey” on the frontend. The frontend creates a passkey using WebAuthn, prompting the user for biometric or hardware authentication. At the same time, it silently generates a temporary API key in the background, which is used to stamp requests during the signup process. **Note:** We use a temporary API key during signup to avoid prompting the user twice for a passkey tap. Without it, we’d need to use the passkey to stamp the `stampLogin()` request later in the flow, which would trigger a second prompt right after creating the passkey. Using the API key instead allows us to create the session in the background with just a single tap. The frontend sends the passkey and API public key to the backend. The backend then uses the Turnkey API to create a new sub-organization and register both credentials as authenticators. The frontend initializes a `TurnkeyClient` using the temporary API key and calls `stampLogin()`. Turnkey returns a session JWT representing the authenticated user session. Your frontend can now make requests to your backend and attach the session JWT. The backend will validate the token on each request and verify that the user has permission to perform the requested action. #### Login Flow ```mermaid theme={"system"} sequenceDiagram participant User participant Frontend participant Backend participant Turnkey User->>Frontend: Begin login Frontend->>Frontend: Call stampLogin() with passkeyStamper Frontend->>Frontend: Trigger WebAuthn prompt Frontend->>User: Request biometric/hardware authentication User->>Frontend: Tap to approve login Frontend->>Turnkey: Send signed request to Turnkey Turnkey->>Frontend: Return session JWT User->>Frontend: Action requiring Backend Authentication Frontend->>Backend: Send request along with session JWT Backend->>Backend: Validate JWT Backend->>Backend: Check user permissions Backend->>Frontend: Return response Frontend->>User: Update UI ``` The user begins the login flow by tapping a button like “Log in with Passkey” on the frontend. The frontend initializes a `TurnkeyClient` with a `passkeyStamper` and calls `stampLogin()`. This triggers a WebAuthn prompt, prompting the user to approve the login request using their passkey. Once the user approves the request, the signed login is sent to Turnkey. Turnkey then returns a session JWT representing the authenticated user session. Your frontend can now make requests to your backend and attach the session JWT. The backend will validate the token on each request and verify that the user has permission to perform the requested action. ### OTP Authentication Turnkey also supports SMS and email-based One-Time Passcode (OTP) authentication, allowing users to log in by entering a code sent to their email or phone number. We’ll cover OTP login and signup together, since the flows are similar and most apps handle them in a unified way. ```mermaid theme={"system"} sequenceDiagram participant User participant Frontend participant Backend participant Turnkey User->>Frontend: Begin login (enter email/phone) Frontend->>Backend: Request OTP Backend->>Turnkey: Call initOtp() Turnkey->>Backend: Return otpId Backend->>Frontend: Return otpId Frontend->>User: Prompt for OTP code User->>Frontend: Enter OTP code Frontend->>Backend: Verify OTP Backend->>Turnkey: Call verifyOtp() Turnkey->>Backend: Return verification token Backend->>Frontend: Return verification token Frontend->>Frontend: Create API key Frontend->>Backend: Send API public key + verification token Backend->>Turnkey: Call getSubOrgIds() with contact info Turnkey->>Backend: Return existing subOrgId (if any) alt SubOrgId not found Backend->>Turnkey: Create new sub-org with contact Turnkey->>Backend: Return new subOrgId end Backend->>Turnkey: Call otpLogin() with subOrgId, public key, and token Turnkey->>Backend: Return session JWT Backend->>Frontend: Return session JWT User->>Frontend: Action requiring Backend Authentication Frontend->>Backend: Send request along with session JWT Backend->>Backend: Validate JWT Backend->>Backend: Check user permissions Backend->>Frontend: Return response Frontend->>User: Update UI ``` The user begins the login flow by entering their email or phone number on the frontend. The frontend sends the contact info to your backend, which requests an OTP from Turnkey. Once the user receives and enters the code, your backend verifies it with Turnkey and receives a verification token. The frontend generates an API key, then sends the API public key and verification token to the backend. The backend checks with Turnkey whether a sub-organization already exists for the contact. If not, it creates a new one. The backend calls `otpLogin()` with the subOrgId, public key, and verification token. Turnkey returns a session JWT representing the authenticated user session, which the backend then returns to the frontend. Your frontend can now make requests to your backend and attach the session JWT. The backend will validate the token on each request and verify that the user has permission to perform the requested action. ## Sending the JWT from the Frontend After a user completes Turnkey authentication and a session is created (via passkey, OTP, or another supported method), your backend returns a session JWT to the frontend. This token proves the user’s identity and is the frontend’s responsibility to store and include in all future authenticated requests to your backend. The session JWT should be attached to each request using the `Authorization` header. This allows your backend to identify the authenticated user and enforce any necessary access control based on the `user_id` or `organization_id`. **Note:** These requests are sent to your own backend endpoints and may contain any application-specific payload, such as a form submission, a database mutation, or a business action. They are not necessarily related to Turnkey. Here’s an example of how the frontend might send the JWT: ```typescript theme={"system"} const response = await fetch("/api/your-backend-endpoint", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${sessionJwt}`, }, body: JSON.stringify({ /* your request payload */ }), }); ``` This adds the following header to your HTTP request: ```http theme={"system"} Authorization: Bearer ``` ## Validating the JWT in Your Backend After a user completes Turnkey authentication and a session is created (via passkey, OTP, or another supported method), your backend returns a session JWT to the frontend. This token proves the user's identity and is the frontend’s responsibility to store and include in all future authenticated requests. ### What Does the Session JWT Contain? Before diving into how to verify the session JWT, it’s helpful to understand what’s actually inside it. The JWT includes information that identifies the authenticated user and the organization they belong to, as well as metadata like expiration time and session type. Here’s an example of a decoded session JWT: ```typescript theme={"system"} { "exp": , "public_key": "", "session_type": "SESSION_TYPE_READ_WRITE", "user_id": "", "organization_id": "" } ``` ### Validating the JWT To validate the session JWT: Use the helper function `verifySessionJwtSignature` from [`@turnkey/crypto`](https://github.com/tkhq/sdk/blob/e10342cd111fbb9b1d168ff386b5dc263e3a5ce3/packages/crypto/src/turnkey.ts#L409-L466) to confirm that the JWT was signed by Turnkey and hasn’t been modified. ```typescript theme={"system"} import { verifySessionJwtSignature } from "@turnkey/crypto"; const isValid = await verifySessionJwtSignature(sessionJwt); if (!isValid) { throw new Error("Invalid JWT: failed signature verification"); } ``` Before verifying expiration or enforcing access controls, you’ll need to decode the JWT payload to access fields like `user_id`, `organization_id`, and `exp`. Here’s an example helper you can define to decode and extract the session fields from the payload: ```typescript theme={"system"} export function decodeSessionJwt(token: string): { sessionType: string; userId: string; organizationId: string; expiry: number; publicKey: string; } { const [, payload] = token.split("."); if (!payload) { throw new Error("Invalid JWT: Missing payload"); } const decoded = JSON.parse(atob(payload)); const { exp, public_key: publicKey, session_type: sessionType, user_id: userId, organization_id: organizationId, } = decoded; if (!exp || !publicKey || !sessionType || !userId || !organizationId) { throw new Error("JWT payload missing required fields"); } return { sessionType, userId, organizationId, expiry: exp, publicKey, }; } ``` Ensure that the token has not expired by validating the exp (expiration) claim. ```typescript theme={"system"} if (decodedJwt.exp * 1000 < Date.now()) { throw new Error("Token has expired"); } ``` Once the token is verified and decoded, use the `userId` and `organizationId` to enforce access control in your application. This step is application-specific and depends on how your backend maps users to organizations. For example, you might: * Look up the user in your database by `userId` * Confirm that the request targets the correct `organizationId` * Reject the request if the user is not linked to that organization This ensures that even with a valid JWT, a user can only access resources associated with their own Turnkey sub-organization. ## Advanced Topics Learn about advanced patterns like multi-signature setups requiring approvals from both the user and the backend. # Credentials Source: https://docs.turnkey.com/authentication/credentials An overview of credentials and how they're used with various authentication methods ## Introduction After authenticating using frequently-used methods like [SMS OTP](/authentication/sms), [Email Authentication](/authentication/email), or [OAuth](/authentication/social-logins) (e.g., Google), users will make requests to Turnkey with a resulting API key. Each API key includes a `Credential` field specifying its type and public key. This Credential type can be used to identify how the API key was issued and which specific authentication method was used. [Passkeys](/authentication/passkeys/introduction), known as Authenticators within the context of Turnkey, also have the same `Credential` field and are equally distinguished by the credential type. ## Obtaining an API key's credential type and public key To obtain an API key's credential type and public key you can use the [GetAPIKey](/api-reference/queries/get-api-key) query. The API Key fields will be returned from this call and the credential `type` and `public_key` fields will be in the response. This will return an object that looks like: ```sh theme={"system"} { "apiKey": { "apiKeyId": "", "apiKeyName": "", "createdAt": { "nanos": "0", "seconds": "1752105687" }, "credential": { "publicKey": "", "type": "CREDENTIAL_TYPE_API_KEY_P256" }, "updatedAt": { "nanos": "0", "seconds": "1752105687" } } } ``` ## Credential Types The table below describes all of the different credential types and what authentication methods correspond to that credential type | Type | Authentication Method(s) | | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | **CREDENTIAL\_TYPE\_WEBAUTHN\_AUTHENTICATOR** | [Passkey/Authenticator Authentication](/authentication/passkeys/introduction) | | **CREDENTIAL\_TYPE\_API\_KEY\_P256** | [CreateAPIKeys](/api-reference/activities/create-api-keys) - curveType API\_KEY\_CURVE\_P256 | | **CREDENTIAL\_TYPE\_RECOVER\_USER\_KEY\_P256** | [Email Recovery](/authentication/email#recovery-flow) | | **CREDENTIAL\_TYPE\_API\_KEY\_SECP256K1** | Used for Ethereum and SECP256K1 chainS [Wallet Authentication](/embedded-wallets/code-examples/wallet-auth) | | **CREDENTIAL\_TYPE\_EMAIL\_AUTH\_KEY\_P256** | [Credential Bundle based Email Authentication](/authentication/email#credential-bundle-method) | | **CREDENTIAL\_TYPE\_API\_KEY\_ED25519** | Solana and ED25519 chains [Wallet Authentication](/embedded-wallets/code-examples/wallet-auth) | | **CREDENTIAL\_TYPE\_OTP\_AUTH\_KEY\_P256** | OTP based [Email](/authentication/email#otp-based-method) or [SMS](/authentication/sms) Authentication | | **CREDENTIAL\_TYPE\_READ\_WRITE\_SESSION\_KEY\_P256** | [CreateReadWriteSession](/api-reference/activities/create-read-write-session) | | **CREDENTIAL\_TYPE\_OAUTH\_KEY\_P256** | [Social Logins](/authentication/social-logins) | | **CREDENTIAL\_TYPE\_LOGIN** | [IndexedDB Authentication](/sdks/javascript-browser#indexeddbclient); OTP, Passkey, or OAuth | # Email auth & recovery Source: https://docs.turnkey.com/authentication/email Email Authentication enables users to authenticate and recover their Turnkey accounts using email-based verification. There are two methods of email authentication: #### One-Time Password * Uses a 6-9 digit or bech32 alphanumeric one-time password sent via email * Simple, and familiar user experience **One-Time Password Sandbox Environment** To test OTP codes in our sandbox environment you can use the following: * `alphanumeric` must be set to `false` * `otpLength` must be set to `6` * Email: [user@example.com](mailto:user@example.com) * OTP Code: `000000` #### Credential Bundle * Sends an encrypted API key credential directly via email * Alternative method for specific use cases * More secure, but requires copying the full credential to the client Both methods provide users with an expiring API key for authentication or account recovery. ## Core mechanism Email Authentication is built with expiring API keys as the foundation. The two delivery mechanisms are: ### OTP-based method The authentication process happens in two steps: A 6-9 digit or alphanumeric OTP code is sent to the user's verified email address Upon verification of the correct code, an API key credential is generated and encrypted for the client ### Credential bundle method This method is only supported by **legacy iframe-based flows** and is not available in the current Turnkey SDKs. The API key credential is encrypted and delivered directly through email to the user. Once the credential is live on the client side (within the context of an iframe), it is readily available to stamp (authenticate) requests. See the [enclave to end-user secure channel](/security/enclave-secure-channels) for more info on how we achieve secure delivery. This flow remains available for existing legacy integrations but is not recommended for new implementations. As an alternative, we recommend using the email OTP flow, which is fully supported by the current SDKs. An example that sends a magic link using [magicLinkTemplate](https://docs.turnkey.com/authentication/email#email-auth-and-recovery:~:text=height%20of%20124px-,magicLinkTemplate,-%3A%20a%20template%20for) can be found [here](https://github.com/tkhq/sdk/tree/main/examples/magic-link-auth). ### Email Recovery In Turnkey, email recovery **does not refer to a separate, recovery-only email address** (as commonly used in consumer products, where a recovery email can reset access but cannot itself be used to sign in). Instead, it means **adding email as an authentication method for a user**. Once added, that user can authenticate using email by default, alongside any other configured authenticators (such as passkeys, social logins or external wallets). The legacy iframe-based flow using `INIT_USER_EMAIL_RECOVERY` and `RECOVER_USER` still exists for backward compatibility with older integrations. These flows ultimately attach new authentication material (for example, a passkey) to the user. They are being deprecated and **should not be used for new integrations**. ## Prerequisites Make sure you have set up your primary Turnkey organization with at least one API user that can programmatically initiate email auth and create suborganizations. Check out our [Quickstart guide](/getting-started/quickstart) if you need help getting started. To allow an API user to initiate email auth, you'll need the following policy in your main organization: ```json theme={"system"} { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "(activity.resource == 'AUTH' && activity.action == 'CREATE') || (activity.resource == 'ORGANIZATION' && activity.action == 'CREATE')" } ``` For OTP Auth signup and login flows you will need a user with the following policy ```json theme={"system"} { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "(activity.resource == 'AUTH' && activity.action == 'CREATE') || (activity.resource == 'OTP' && activity.action == 'CREATE') || (activity.resource == 'OTP' && activity.action == 'VERIFY') || (activity.resource == 'ORGANIZATION' && activity.action == 'CREATE')" } ``` Avoid using an API key that is also present in the sub-organization that you're targeting within the email activities. Turnkey identifies the user from the request signature and in case of an identical API key it will always prioritize the sub-organization user matching. As a result, it will try to evaluate the sub-organization policies instead of the parent ones. ## User experience ### OTP-based authentication flow The flow begins with a new activity of type `ACTIVITY_TYPE_INIT_OTP` using the parent organization id with these parameters: * `otpType`: specify `"OTP_TYPE_EMAIL"` * `contact`: user's email address * `emailCustomization`: optional parameters for customizing emails * `userIdentifier`: optional parameter for rate limiting SMS OTP requests per user. We recommend generating this server-side based on the user's IP address or public key. See the [OTP Rate Limits](#otp-rate-limits) section below for more details. * `alphanumeric`: optional parameter for making this code bech32 alphanumeric or not. default: true * `otpLength`: optional parameter for selecting the length of the OTP. default: 9 * `expirationSeconds`: optional validity window (defaults to 5 minutes) * `sendFromEmailAddress` : optional custom email address from which to send the OTP email * `sendFromEmailSenderName` : optional custom sender name for use with sendFromEmailAddress; if left empty, will default to ‘Notifications’ * `replyToEmailAddress` : optional custom email address to use as reply-to After receiving the OTP, users complete OTP verification with `ACTIVITY_TYPE_VERIFY_OTP` using the parent organization id which returns a verificationToken JWT: * `otpId`: ID from the init activity * `otpCode`: the 6-9 digit or alphanumeric code received via email * `expirationSeconds`: optional validity window (defaults to 1 hour) After receiving the verification token, users complete OTP authentication flow with with `ACTIVITY_TYPE_OTP_LOGIN` using the sub orgazanition ID associated with the contact from the first step: * `publicKey`: public key to add to organization data associated with the signing key in IndexedDB or SecureStorage. * `verificationToken`: JWT returned from successfull `VERIFY_OTP` activity * `expirationSeconds`: optional validity window (defaults to 15 minutes) * `invalidateExisting`: optional boolean to invalidate previous login sessions auth otp email ### OTP rate limits In order to safeguard users, Turnkey enforces rate limits for OTP auth activities. If a `userIdentifier` parameter is provided, the following limits are enforced: * 3 requests per 3 minutes per unique `userIdentifier` * 3 retries max per code, after which point that code will be locked * 3 active codes per user, each with a 5 minute TTL ### Credential bundle authentication flow This alternative method uses `ACTIVITY_TYPE_EMAIL_AUTH` with these parameters: * `email`: user's email address (must match their registered email) * `targetPublicKey`: public key for credential encryption * `apiKeyName`: optional name (defaults to `Email Auth - `) * `expirationSeconds`: optional validity window (defaults to 15 minutes) * `emailCustomization`: optional parameters for customizing emails * `invalidateExisting`: optional boolean to invalidate previous Email Auth API keys auth email ## Email customization We offer customization for the following: * `appName`: the name of the application. This will be used in the email's subject, e.g. `Sign in to ${appName}` * `logoUrl`: a link to a PNG with a max width of 340px and max height of 124px * `magicLinkTemplate`: a template for the URL to be used in the magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s` ```js theme={"system"} // Sign and submits the EMAIL_AUTH activity const response = await client.emailAuth({ type: "ACTIVITY_TYPE_EMAIL_AUTH", timestampMs: String(Date.now()), organizationId: , parameters: { email: , targetPublicKey: , apiKeyName: , expirationSeconds: , emailCustomization: { appName: , logoUrl: , magicLinkTemplate: } }, }); ``` ### Breaking Change: `appName` Required **Effective December 16, 2025** Beginning December 16, 2025, all email-based OTP and recovery activities will require the `appName` parameter. Existing SDK versions will continue working, but upgrading without setting an `appName` will break email-based flows. **Affected:** Anyone using Auth Proxy without `appName` set **Action:** Set `appName` under [email configuration](https://app.turnkey.com/dashboard/walletKit) **Affected:** Users calling `init_otp_auth`, `init_otp`, `email_recovery`, or `email_auth` without `appName` **Action:**
• For `email_recovery` or `email_auth`: include `appName` in your request
• For `init_otp` or `init_otp_auth`: update your API call to match the new input structure when upgrading to the latest server-SDK
Both methods use the same parameter structure. Here's an example with `emailAuth`: ```js theme={"system"} await client.emailAuth({ parameters: { email: "user@example.com", targetPublicKey: "", emailCustomization: { appName: "Your App Name" // this is now required } } }); ``` Both methods use the same parameter structure. Here's an example with `initOtp`: ```js theme={"system"} await client.initOtp({ parameters: { otpType: "OTP_TYPE_EMAIL", contact: "user@example.com", appName: "Your App Name", // this is now required emailCustomization: { // other optional customization } } }); ``` If you manage email flows with policies, update to the new activity types: **EMAIL\_AUTH**
Old: `ACTIVITY_TYPE_EMAIL_AUTH`, `ACTIVITY_TYPE_EMAIL_AUTH_V2`
New: `ACTIVITY_TYPE_EMAIL_AUTH_V3` **INIT\_OTP\_AUTH**
Old: `ACTIVITY_TYPE_INIT_OTP_AUTH`, `ACTIVITY_TYPE_INIT_OTP_AUTH_V2`
New: `ACTIVITY_TYPE_INIT_OTP_AUTH_V3` **INIT\_OTP**
Old: `ACTIVITY_TYPE_INIT_OTP`
New: `ACTIVITY_TYPE_INIT_OTP_V2` **INIT\_USER\_EMAIL\_RECOVERY**
Old: `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY`
New: `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2`
### Email templates We also support custom HTML email templates for [Enterprise](https://www.turnkey.com/pricing) clients on the **Scale** tier. This allows you to inject arbitrary data from a JSON string containing key-value pairs. In this case, the `emailCustomization` variable may look like: ```js theme={"system"} ... emailCustomization: { templateId: , templateVariables: "{\"username\": \"alice and bob\"}" } ... ``` In this specific example, the value `alice and bob` can be interpolated into the email template using the key `username`, referenced in the template with `{{ index .TemplateVariables "username" }}`. The use of such template variables is purely optional. Here’s an example of a custom HTML email template that includes the OTP code, referenced within the markup as `{{ .OtpCode }}`. For best compatibility across email providers, make sure to use PNG images within your templates. dynamic email auth
example **Bespoke HTML templates** and **custom email sender domains** are available to [**Enterprise clients**](https://www.turnkey.com/pricing) on the **Scale tier** or higher. If you are interested in implementing bespoke, fully-customized email templates, please reach out to [hello@turnkey.com](mailto:hello@turnkey.com). ### Custom email sender domain [Enterprise](https://www.turnkey.com/pricing) clients can also customize the email sender domain. To get set up, please reach out to your Turnkey rep to get started but here is what you'll be able to configure: ```js theme={"system"} // Optional custom email address from which to send the OTP email "sendFromEmailAddress": "notifs@mail.domain.com" // Optional custom sender name "sendFromEmailSenderName": "MyApp Notifications" // Optional reply-to email address "replyToEmailAddress": "reply@mail.domain.com" ``` Please keep in mind that: * Email has to be from a pre-whitelisted domain * If there is no `sendFromEmailAddress` or it's invalid, the other two fields are ignored * If `sendFromEmailSenderName` is absent, it defaults to "Notifications" (again, ONLY if `sendFromEmailAddress` is present and valid) * If `replyToEmailAddress` is absent, then there is no reply-to added. If it is present, it must ALSO be from a valid, whitelisted domain, but it doesn't have to be the same email address as the `sendFromEmailAddress` one (though once again, this first one MUST be present, or the other two feature are ignored) * **Sender name screening:** Some email clients (e.g. Gmail) screen sender names more aggressively than others (e.g. Apple Mail), which can lead to inconsistent display across clients. To ensure a consistent experience, keep your `sendFromEmailSenderName` "safe looking" — avoid underscores, special symbols, or unusual formatting that may cause it to be filtered or hidden. If you are interested in implementing bespoke, fully-customized email templates and sender domain, please reach out to [hello@turnkey.com](mailto:hello@turnkey.com). ### Authorization Authorization is managed through our [policy engine](/concepts/policies/overview): ### Authentication Both OTP-based and credential bundle authentication activities: * Can be performed by [root quorum](/concepts/users/root-quorum#root-quorum) or users with proper policy authorization * Require the respective feature to be enabled in the organization and sub-organization * Can target any user in the organization or sub-organizations Specifically: * For OTP-based auth: `ACTIVITY_TYPE_INIT_OTP`, `ACTIVITY_TYPE_VERIFY_OTP` and `ACTIVITY_TYPE_OTP_LOGIN` * For credential bundle auth: `ACTIVITY_TYPE_EMAIL_AUTH` email auth authorization ### Example implementations * [OTP Auth Example](https://github.com/tkhq/sdk/tree/main/examples/otp-auth) * [Email Auth Example](https://github.com/tkhq/sdk/tree/main/examples/email-auth) * [Demo Embedded Wallet](https://wallet.tx.xyz) ([code](https://github.com/tkhq/demo-embedded-wallet)) ## Implementation in organizations For organizations accessed via dashboard: 1. Ensure the required features are enabled: * `FEATURE_NAME_OTP_EMAIL_AUTH` for OTP-based authentication * `FEATURE_NAME_EMAIL_AUTH` for credential bundle authentication 2. Users initiating the request must have appropriate permissions ## Opting out Organizations can disable email-based features if their security model requires it: Use `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE` to disable: * `FEATURE_NAME_OTP_EMAIL_AUTH` for OTP-based authentication * `FEATURE_NAME_EMAIL_AUTH` for credential bundle authentication When creating sub-organizations, use: * `disableOtpEmailAuth` parameter for OTP-based authentication * `disableEmailAuth` parameter for credential bundle authentication ## Implementation notes * Users are limited to: * 10 long-lived API keys * 10 expiring API keys (oldest are discarded when limit is reached) ### For top-level organizations * Both authentication methods are disabled by default * Must be enabled via `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` ### For sub-organizations * Both authentication methods are enabled by default * Can be disabled during creation using `CreateSubOrganizationIntentV7` activity parameters Example of enabling OTP-based Email Auth: ```bash theme={"system"} turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", "organizationId": "", "parameters": { "name": "FEATURE_NAME_OTP_EMAIL_AUTH" } }' --organization ``` Example of enabling credential bundle Email Auth: ```bash theme={"system"} turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", "organizationId": "", "parameters": { "name": "FEATURE_NAME_EMAIL_AUTH" } }' --organization ``` # Overview Source: https://docs.turnkey.com/authentication/overview Learn about supported authentication methods for Turnkey, how to add them, and usage details. Turnkey's wallet system supports granular controls on who can access wallets and what actions different users can perform. To enforce these controls, Turnkey's API must verify the identity of the party requesting a wallet action, ensuring that only authorized actions are executed by the system. This process is known as **authentication**. Turnkey supports both **API authentication** and **user authentication** for authenticating access to wallets. ## API authentication With **API authentication**, Turnkey authenticates a request from your server directly using an **API secret**. This ensures that Turnkey only executes requests sent by your servers alone, and no other party. In addition to the API secret, you can also configure **authorization policies** that control specific wallets, private keys, and other resources. Any requests to use or update these resources require approval according to the corresponding policy. This allows you to enforce granular controls on all Turnkey resources. For backend implementation details, see our [Backend Setup](/authentication/backend-setup) guide. **API Reference**: [Create API Keys](/api-reference/api-keys/create-api-keys), [Get API Keys](/api-reference/api-keys/get-api-key) ## User authentication Turnkey is a powerful toolkit for progressive authentication of users. With fine-grained control over onboarding flows and wallet connections, you can improve conversion and craft better UX. Using any of Turnkey's client-side SDKs, your app can authenticate users across web2 and web3 accounts, including: * **WebAuthN/Passkeys**: Biometric or passkey-based login based on the WebAuthn standard. [Learn more](/authentication/passkeys/introduction) * **Email or SMS**: Passwordless login via a one-time passcode sent to a user's email address or phone number. [Learn more](/authentication/email) | [SMS Authentication](/authentication/sms) * **OAuth and social logins**: Social login with Google, Apple, Twitter, Discord, GitHub, LinkedIn, and more. [Learn more](/authentication/social-logins) * **Wallets**: External wallet login via Sign-In With Ethereum and Sign-In With Solana. [Learn more](/embedded-wallets/code-examples/wallet-auth) Your app can configure each of these authentication methods to be an upfront login method, or as an account that users link later. All of Turnkey's authentication methods create a common user object, where you can easily find a user's unique ID and all of the accounts they've linked to their profile. A user is a user, regardless of whether they've connected with a wallet, email or other account. Once a user successfully authenticates with Turnkey, Turnkey creates a session for that user that your app can use to represent an authenticated session or to make authenticated requests to your backend. For information about managing authenticated sessions, see our [Sessions](/authentication/sessions) documentation. ## Related Resources Biometric and hardware-based passwordless authentication using WebAuthn standard. Passwordless login via one-time codes sent to users' email addresses. User verification through one-time passwords sent via text message. OAuth authentication with popular social providers like Google, Apple, and Twitter. Manage authenticated user sessions and access tokens in your application. # Discoverable vs. Non-Discoverable Source: https://docs.turnkey.com/authentication/passkeys/discoverable-vs-non-discoverable Also known as "resident" vs. "non-resident" credentials. From [the spec](https://www.w3.org/TR/webauthn-2/) > Historically, client-side discoverable credentials have been known as resident credentials or resident keys. Due to the phrases ResidentKey and residentKey being widely used in both the WebAuthn API and also in the Authenticator Model (e.g., in dictionary member names, algorithm variable names, and operation parameters) the usage of resident within their names has not been changed for backwards compatibility purposes. Also, the term resident key is defined here as equivalent to a client-side discoverable credential. What does this mean exactly? * "resident" credentials and "discoverable" credentials are the same * "non-resident" credentials and "non-discoverable" credentials are the same. The spec authors made this rename for clarity. With terminology out of the way, what is a "discoverable" credential compared to a "non-discoverable" credential? And why does it matter? ## Discoverable credentials A discoverable credential is a self-contained key pair, stored on the end-user's device. Discoverable credentials are preferred because keys are self-contained, can easily be synced and can be used across devices independently. Crucially for UX, the end-user is able to list their passkeys and choose which device/passkey they'd like to use: device selection on Chrome passkey selection on Chrome With discoverable credentials you don't have to keep track of credential IDs. Your authentication flow can simply be: "prompt the user with passkey authentication", and let the browser or device native UX handle the rest! The downside is you lose some control over these prompts, because they will vary depending on your users' OS and browser. For a live example using discoverable credentials, see [wallet.tx.xyz](https://wallet.tx.xyz/). ## Non-Discoverable credentials A non-discoverable credential isn’t stored on the end-user's device fully: Turnkey must store the generated credential ID; otherwise the user won’t be able to sign. This is because the actual signing key is a combination of an “on-device” secret and the credential ID (see details [here](https://crypto.stackexchange.com/questions/105942/how-do-non-resident-keys-work-in-webauthn)). Why would you choose non-discoverable credentials? * Most hardware security keys have limited slots to store discoverable credentials, or will refuse to create new discoverable credentials on the hardware altogether. YubiKey 5 [advertises 25 slots](https://support.yubico.com/hc/en-us/articles/4404456942738-FAQ#h_01FFHQFVBW0995G2MKZGCKQVEJ), SoloKeys [support 50](https://github.com/solokeys/solo1/issues/156#issuecomment-477645573), NitroKeys 3 [support 10](https://github.com/Nitrokey/nitrokey-3-firmware/blob/0e23c75318e2016ac1cfb8345de9279e3ad2eaf9/components/apps/src/lib.rs#L390). Non-discoverable credentials aren't subject to these limits because they work off of a single hardware secret. * Security keys can only allow clearing of individual slots if they support [CTAP 2.1](https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html). This is described in [this blog post](https://fy.blackhats.net.au/blog/2023-02-02-how-hype-will-turn-your-security-key-into-junk/). When security keys do not support CTAP 2.1, slots can only be freed up by resetting the hardware entirely, erasing all secrets at once. * Non-discoverable credentials take less space. This is important in some environments, but unlikely to be relevant if your users are storing passkeys in their Google or Apple accounts (plenty of space available there!) * Credential IDs have to be communicated during authentication (via the `allowCredentials` field). This allows browsers to offer better, more tailored prompts in some cases. For example: if the list contains a single authenticator with `"transports": ["AUTHENTICATOR_TRANSPORT_INTERNAL"]`, Chrome does “the right thing” by skipping the device selection popup: users go straight to the fingerprint popup, with no need to select “this device”! The downside to this is, of course, that you need to store credential IDs, and you need to make sure you can retrieve credentials for each user. This can be done with a table of credentials keyed by user email, for example. Or if you have your own authentication already, a list of credentials can be returned when the user logs in. For a live example using non-discoverable credentials, head to [app.turnkey.com](https://app.turnkey.com). That's right, Turnkey uses non-discoverable credentials because we need to offer broad support for security keys. We have some work ongoing to support both discoverable and non-discoverable credentials going forward. # Integrating Passkeys Source: https://docs.turnkey.com/authentication/passkeys/integration ## Passkey flow A typical passkey flow is composed of 4 main steps, depicted below: Passkey flow on Turnkey 1. Your app frontend triggers a passkey prompt. 2. Your end-user uses their device to produce a signature with their passkey, and a signed request is produced. 3. The signed request is forwarded to your backend. This step is optional, see ["To Proxy or not to proxy"](#proxying-signed-requests) below for more information. 4. The signed request is verified within a Turnkey secure enclave. This flow happens once for **registration** and for each subsequent **authentication** or signature request. The main difference is the browser APIs used to trigger the passkey prompt in step (1): * **Passkey registration** uses `navigator.credentials.create`(as described in [this guide](https://web.dev/passkey-registration/)). `navigator.credentials.create` triggers the creation of a **new** passkey. * **Passkey authentication** uses `navigator.credentials.get`. See [this guide](https://web.dev/passkey-form-autofill/) for more information. `navigator.credentials.get` triggers a signature prompt for an **existing** passkey. ## Our SDK can help Our SDK has integrated passkey functionality, and we've built examples to help you get started. * [`@turnkey/http`](https://www.npmjs.com/package/@turnkey/http) has a helper to trigger passkey registration (`getWebAuthnAttestation`). You can see it in action in our [`with-federated-passkeys`](https://github.com/tkhq/sdk/tree/main/examples/with-federated-passkeys) example: [direct code link](https://github.com/tkhq/sdk/blob/a2bfbf3cbd6040902bbe4c247900ac560be42925/examples/with-federated-passkeys/src/pages/index.tsx#L88) * [`@turnkey/webauthn-stamper`](https://www.npmjs.com/package/@turnkey/webauthn-stamper) is a passkey-compatible stamper which integrates seamlessly with `TurnkeyClient`: ```ts theme={"system"} import { WebauthnStamper } from "@turnkey/webauthn-stamper"; import { TurnkeyClient, createActivityPoller } from "@turnkey/http"; const stamper = new WebauthnStamper({ rpId: "your.app.xyz", }); // New HTTP client able to sign with passkeys const httpClient = new TurnkeyClient( { baseUrl: "https://api.turnkey.com" }, stamper ); // This will produce a signed request that can be POSTed from anywhere. // The `signedRequest` has a URL, a POST body, and a "stamp" (HTTP header name and value) const signedRequest = await httpClient.stampCreatePrivateKeys(...) // Alternatively, you can POST directly from your frontend. // Our HTTP client will use the webauthn stamper and the configured baseUrl automatically! const activityPoller = createActivityPoller({ client: client, requestFn: client.createPrivateKeys, }); // Contains the activity result; no backend proxy needed! const completedActivity = await activityPoller({ type: "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", // (omitting the rest of this for brevity) }) ``` * [`@turnkey/viem`](https://www.npmjs.com/package/@turnkey/viem) is a package wrapping all of the above so that you work directly with Viem without worrying about passkeys. See [this demo](https://github.com/tkhq/sdk/tree/main/examples/with-viem-and-passkeys). Regardless of whether you use our helpers and abstractions, take a look at [our registration and authentication options guide](/authentication/passkeys/options). This will help you choose the right options for your passkey flow. If you have questions, feedback, or find yourself in need of an abstraction or integration that doesn't exist yet, please get in touch with us! You can * Create an [issue on our SDK repo](https://github.com/tkhq/sdk/issues) * Join our slack community [here](https://join.slack.com/t/clubturnkey/shared_invite/zt-3aemp2g38-zIh4V~3vNpbX5PsSmkKxcQ) * Contact us at [hello@turnkey.com](mailto:hello@turnkey.com) We're here to make this as easy as possible for you and your team! ## Passkey wallets with sub-organizations If you're wondering how to create independent, non-custodial wallets for your end-users, head to [Sub-Organizations](/concepts/sub-organizations). In short: you'll be able to pass the registered passkeys as part of a "create sub-organization" activity, making your end-users the sole owners of any resource created within the sub-organization (including private keys). Your organization will only have read permissions. # Introduction to Passkeys Source: https://docs.turnkey.com/authentication/passkeys/introduction Passkeys are born out of a new standard being pushed by major industry players: Apple and Google. Google has a great high-level introduction to passkeys at [https://developers.google.com/identity/passkeys](https://developers.google.com/identity/passkeys), and Apple has its own version here: [https://developer.apple.com/passkeys](https://developer.apple.com/passkeys) ## TLDR: what are passkeys? From a technical point of view, passkeys are cryptographic key pairs created on end-user devices. Apple and Google have done a great job making these key pairs usable: * Key generation happens in secure end-user hardware. * Using passkeys is easy thanks to native browser UIs and cross-device syncing. * Passkey recovery for users is supported natively by Apple via iCloud Keychain and Google via the Google Password Manager. Passkeys come with big security upgrades compared to traditional passwords: * Access to passkeys is gated with OS-level biometrics: faceID, touchID, lock screen patterns, and so on. * Passkeys are bound to the web domain that creates them. This is important to thwart phishing attacks, where an attacker hosts a similar-looking website to steal user credentials. This is doable with passwords; impossible with passkeys. * Because passkeys rely on public key cryptography, passkeys have two components: a public key and a private key. Private keys are never disclosed to websites or apps, making them a lot harder to steal. Only public keys are sent. To authenticate, passkeys sign messages (with their private keys) and provide signatures as proofs, similar to crypto wallets. ## Isn't this similar to Webauthn? If you know about Webauthn, congratulations: a lot of this will feel familiar. Passkeys rely on the [same web standard](https://www.w3.org/TR/webauthn-2/) and the same browser APIs: `navigator.credentials.create` and `navigator.credentials.get`. The difference? Passkeys are resident credentials and they can be synced between devices. As a result, they are **not** device-bound and can be used from any device. ## How do cross-device syncing and recovery work? Synchronization and recovery are both supported natively by Apple and Google: * With Apple, Passkeys created on one device are synced through [iCloud Keychain](https://support.apple.com/en-us/HT204085) as long as the user is logged in with their Apple ID. Apple covers both syncing and recovery in ["About the security of passkeys"](https://support.apple.com/en-us/102195). For some additional detail, see [this Q\&A with the passkey team](https://developer.apple.com/news/?id=21mnmxow). Apple's account recovery process is documented in [this support page](https://support.apple.com/en-us/HT204921). * With Google, [Google Password Manager](https://passwords.google/) syncs passkeys across devices seamlessly. Google has plans to support syncing more broadly across different operating systems, see [this support summary](https://developers.google.com/identity/passkeys/supported-environments#chrome-passkey-support-summary). Recovery is covered in [this FAQ ("What happens if a user loses their device?")](https://developers.google.com/identity/passkeys/faq#what_happens_if_a_user_loses_their_device): it relies on Google's overall [account recovery process](https://support.google.com/accounts/answer/7682439?hl=en) because passkeys are attached to Google accounts. ## OS and browser support Modern browsers have great support for passkeys. See [caniuse](https://caniuse.com/passkeys) for detailed information. Support also varies by operating system: [this matrix](https://passkeys.dev/device-support/#matrix) has detailed information about OS-level support. ## Betting on Webauthn and Passkeys We believe **it's time to move away from passwords** so we've built Turnkey without them. When you authenticate to Turnkey you'll be prompted to create a new passkey: Authenticator selection on Turnkey Passkey prompt on Turnkey Authentication to Turnkey requires a passkey signature. No password needed! Next up, learn about how you can integrate passkeys into your app, [here](/authentication/passkeys/integration). # Native Passkeys Source: https://docs.turnkey.com/authentication/passkeys/native If you're unfamiliar with passkeys broadly, head to for an overview. TL;DR: passkeys are cryptographic key pairs generated and stored on secure hardware. Typically this is your Mac's or iPhone's , your Android's , or an external security key plugged in via USB. * Registration ("sign up") creates a new key pair: this is your passkey * Authentication ("sign in") uses an existing passkey to sign a message, proving ownership of the associated private key stored on your device. ## Passkeys on the Web Creating and using passkeys on the web is straightforward: browsers offer APIs to do it! * `navigator.credentials.create` creates a passkey * `navigator.credentials.get` prompts the user to select a passkey to sign a message And this doesn't require a backend. Here's a demo proving it: [https://passkeyapp.tkhqlabs.xyz/](https://passkeyapp.tkhqlabs.xyz/) An important security feature of passkeys: they're **domain-bound** to prevent phishing. In other words: passkeys created on `passkeyapp.tkhqlabs.xyz` won't be usable on `turnkey.com` for example. Browsers prevent this. ## Native Platform APIs ### Android In the Android ecosystem the `CredentialManager` supports creating and using passkeys with `CreatePublicKeyCredentialRequest` and `GetCredentialRequest`. See [the associated documentation](https://developer.android.com/training/sign-in/passkeys#sign-in) for more information. ### iOS iOS APIs to create and use passkeys are available as well: * `ASAuthorizationPlatformPublicKeyCredentialProvider(…).createCredentialRegistrationRequest` for passkey creation * `ASAuthorizationPlatformPublicKeyCredentialProvider(…).createCredentialAssertionRequest` for passkey usage See [these docs](https://developer.apple.com/documentation/authenticationservices/asauthorizationplatformpublickeycredentialprovider) for more info. And [this app](https://github.com/r-n-o/shiny) for a mini demo. ### Beware: no native Turnkey SDK (yet) While the native APIs to interact with passkeys exists on both iOS and Android, Turnkey doesn't yet offer an SDK for Swift or Kotlin, which means you'd have to write code to sign activities and send HTTP requests to our API. Get in touch with us if this is something you're attempting to do, we'd love to support you and release this as a proper SDK maintained by Turnkey. ## Building with React Native (recommended) Turnkey has a fully-featured [TypeScript SDK](https://github.com/tkhq/sdk/). It provides a type-safe client to call the Turnkey API and abstracts activity request signing. [React Native](https://reactnative.dev/) lets you write your app in Typescript and compile it into native code for both iOS and Android automatically. To sign Turnkey requests with native passkeys in a React Native application we've released [`@turnkey/react-native-passkey-stamper`](https://www.npmjs.com/package/@turnkey/react-native-passkey-stamper), a package compatible with our TypeScript client to sign Turnkey requests with native passkeys. Under the hood this package wraps [`react-native-passkey`](https://github.com/f-23/react-native-passkey), which calls the right native APIs on [iOS](https://github.com/f-23/react-native-passkey/blob/17184a1b1f6f3ac61e07aa784c9b64efb28b570e/ios/Passkey.swift#L29) and [Android](https://github.com/f-23/react-native-passkey/blob/17184a1b1f6f3ac61e07aa784c9b64efb28b570e/android/src/main/java/com/reactnativepasskey/PasskeyModule.kt#L30C44-L30C76), and exports a unified interface that we leverage. Bottom-line: if you've used our [webauthn stamper](https://www.npmjs.com/package/@turnkey/webauthn-stamper) or [API key stamper](https://www.npmjs.com/package/@turnkey/api-key-stamper), using our React Native passkey stamper will feel familiar. Take a look at the ["Installation"](https://www.npmjs.com/package/@turnkey/react-native-passkey-stamper#installation) and ["Usage"](https://www.npmjs.com/package/@turnkey/react-native-passkey-stamper#usage) sections to get started with passkeys in your React Native application. If you're looking for a concrete example, head to [this repository](https://github.com/r-n-o/passkeyapp): it contains a sample application integrated with Turnkey, written with Expo, and tested on both Android and iOS. ## Linking apps and web domains Passkeys on native apps aren't app-bound, they're **domain** bound just like web passkeys. This may come as a surprise: you'll have to configure a web domain to use passkeys natively! Configuration is done separately per ecosystem, but the idea is the same: * iOS expects a JSON file at the domain root (`/.well-known /apple-app-site-association`) : [example](https://github.com/r-n-o/passkeyapp/blob/main/http/.well-known/apple-app-site-association) * Android expects a JSON file at the domain root (`/.well-known/assetlinks.json`): [example](https://github.com/r-n-o/passkeyapp/blob/main/http/.well-known/assetlinks.json) This unlocks interesting flows where users use their web-created passkeys in a "companion" native app, or vice-versa. For example: a native app linked to the wallet.tx.xyz domain would allow users to log into their account from a native mobile app *using their web-created passkey* as long as they're synced properly. Note that these associations are "many-to-many": a website can link multiple associated apps, and a single native application can choose to create passkeys for multiple domains, via a dropdown for example. However (as far as we know) a single passkey is always bound to a single web domain: it can't be bound to multiple web domains. # Passkey Options Source: https://docs.turnkey.com/authentication/passkeys/options Whether you use the raw browser APIs or one of our helpers you'll have flexibility to set your own registration and authentication options. This page provides an overview and some recommendations related to these options. ## Registration options Mozilla has good (but lengthy) documentation on each option: [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/CredentialsContainer/create). Below we detail the most relevant options you'll want to think about. ### `challenge` This is the challenge signed by the end-user for registration. During registration this challenge isn't meaningful so we recommend picking a random challenge. It will not be visible to users. ### `timeout` Number of seconds before "giving up". The browser will simply show a timeout popup: Timeout popup This UI isn't very helpful, so we recommend making the timeout long (5 minutes). The less your users see this, the better. ### `rp` The `rp` options is an object with 2 fields: `id` and `name`. `rp.id` (aka RPID) should be your app top-level domain. For example, if your app is hosted on `https://your.app.xyz` the RPID should be `app.xyz` unless you have good reasons to do otherwise (see below). `rp.id`, or RPID, is a way to identify the website a passkey is associated with. Once set at registration time, it **determines the set of origins on which the passkey may be be used**. The [WebAuthn spec](https://www.w3.org/TR/webauthn-2/#relying-party-identifier) states that the RPID must be a “registrable domain suffix of, or equal to” the current domain. If the page creating a passkey is hosted at `https://your.app.xyz`, the RPID can thus be "your.app.xyz" or "app.xyz". A passkey with RPID "your.app.xyz" **cannot** be used on `https://www.app.xyz` or `https://foo.app.xyz`. However a passkey created with RPID "app.xyz" **will** be usable on all `https://*.app.xyz` sub-domains: `https://your.app.xyz`, `https://www.app.xyz`, `https://foo.app.xyz`, and so on. Hence our general recommendation above to set `app.xyz` (top-level domain) as the RPID to maximize flexibility. A reason why you might want to set the RPID to "your.app.xyz" instead of "app.xyz" like recommended above is extra security: if you are worried about user passkeys being usable across all your sub-domains, it makes sense to scope passkeys to the sub-domain they're meant to be used on, and only that sub-domain. If you scope passkeys to a specific sub-domain, be aware that migrating your app to a different sub-domain later will require a migration process where users have to re-enroll themselves by creating new passkeys on the new sub-domain. Passkeys cannot be transferred from one RPID to another. `rp.id` will show up in the initial registration popup: RPID in registration prompt `rp.name` doesn't show up in the popup so can be set to anything. We recommend setting it to the correctly capitalized name of your app, in case browsers start showing it in their native UIs in the future. ### `attestation` This option indicates whether an attestation is needed, to prove the authenticator authenticity. In general, Turnkey doesn't need attestations. Most passkeys do not produce meaningful attestations for privacy reasons. In the context of passkey integrations, you can omit this option: it will default to "none". ### `pubKeyCredParams` and `alg` The `pubKeyCredParams` is a list of supported algorithms. If you're relying on Turnkey to validate passkey signatures, this list should be: `[{alg: -7, type: "public-key"}, {alg: -257, type: "public-key"}]`. The integers `-7` and `-257` are algorithm identifiers for ES256 (aka P256) and RS256 (aka RSA), respectively. The full list of possible values is part of the [COSE standard, maintained by IANA](https://www.iana.org/assignments/cose/cose.xhtml#algorithms). Currently Turnkey only supports ES256 and RS256. ### `user` The `user` field has three sub-fields: * `id`: also known as "user handle", isn't visible to the end-user. We **strongly recommend setting this to a random value** (e.g. `const id = new Uint8Array(32); crypto.getRandomValues(id)`) to make sure a new passkey is created. Be aware: **if you accidentally set this value to an existing user handle, the corresponding passkey will be overridden!** [This section of spec](https://www.w3.org/TR/webauthn-2/#dictionary-user-credential-params) is clear on the matter: "the user handle ought not be a constant value across different accounts, even for non-discoverable credentials". * `name`: this will show up in the passkey list modal (see screenshot below). We recommend setting this to something the user will recognize: their email, the name of your app, or potentially leave this up to the user: User name and display name in passkey list * `displayName`: as far as we can tell this doesn't show up in current browser UIs. It might show up in future iterations so it's best to populate this with the same value as `name`. ### `authenticatorSelection` This option has lots of consequences for UX, and it has many sub-options, outlined below. #### `authenticatorAttachment` This option, if set, restricts the type of authenticators that can be registered. See the table below for the values this option can take and their effect on registration prompts (captured via Chrome on a MacBook Pro). | Empty (default) | `platform` | `cross-platform` | | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | | If you want broad compatibility, leave this option empty, and the browser UI will allow for both internal and external passkeys. | If set to `platform`, only internal authenticators (face ID, touch ID, and so on) can be registered. | If set to `cross-platform`, only passkeys from other devices or attached via USB are allowed. | | authenticatorAttachment unspecified | authenticatorAttachment set to platform | authenticatorAttachment set to cross-platform | #### `requireResidentKey` and `residentKey` These options allow you to specify whether you want your users to create discoverable or non-discoverable credentials. See [Discoverable vs. non-discoverable](/authentication/passkeys/discoverable-vs-non-discoverable) for more information. Default values: `residentKey` is `discouraged` and `requireResidentKey` is `false`. Important note: the default for `requireResidentKey` (`discouraged`) results in different outcomes based on OS: Android devices create non-discoverable credentials whereas iOS devices create discoverable credentials. If you want to create discoverable credentials whenever possible, set `requireResidentKey` to `false` and `residentKey` to `preferred`, which work across Android and iOS devices. #### `userVerification` "User verification" refers to mechanisms on the authenticators themselves such as PIN codes or biometric/fingerprint readers. This flag can be set to: * `discouraged`: yubikey PINs won't be required even if the device technically supports it. We've found that for TouchID/FaceID, authentication will still be required however. * `preferred`: yubikey PINs and other authentication mechanisms will be required if supported, but devices without them will be accepted. * `required`: authenticators without user verification support won't be accepted. To maximize compatibility we recommend setting `userVerification` to "discouraged" or "preferred" because some authenticators do not support user verification. Due to poor yubikey PIN UX in browsers, setting `userVerification` to "discouraged" is best unless you operate with a strict security threat model where user verification makes a big difference. "preferred" is the default value if you don't specify this option. ## Authentication options Mozilla's documentation on authentication options can be found here: [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/CredentialsContainer/get). Luckily there are fewer authentication options than registration. ### `challenge` This is the challenge to sign with the passkey. If you're integrating with Turnkey, the challenge should be the POST body of the request to be signed. Our SDK and helpers set this automatically for you already. ### `rpId` Must match the `rp.id` option during passkey registration. Passkeys are domain bound, so it's not possible to use a passkey registered with `rp.id` set to "foo.com" and use it on "bar.com". This is a core anti-phishing counter-measure. ### `allowCredentials` List of objects restricting which credentials can be used during authentication. This is crucial to specify if you're using [non-discoverable credentials](/authentication/passkeys/discoverable-vs-non-discoverable#non-discoverable-credentials) or if you want to tailor browser prompts to the right type of transport. Each object in this list has an ID (the credential ID) and a list of transports (e.g. "hybrid", "internal", "usb", etc). The `transports` list is **optional** but results in better, more targeted prompts. For example, here are screenshot of targeted prompts captured on Chrome, on a MacBook laptop: | `transports: ["internal"]` | `transports: ["usb"]` | `transports: ["hybrid"]` | | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | authentication prompt with transports: internal | authentication prompt with transports: usb | authentication prompt with transport: hybrid | The credential ID needs to be passed as a buffer but is returned from registration as a base64-encoded value: make sure to decode it (in JavaScript: `Buffer.from(storedCredentialId, "base64")`) to avoid issues. If the wrong credential ID is specified, `transports: ["internal"]` is set, browsers error right away because they can enumerate internal credentials. Chrome, for example, displays the following error: Chrome error when no matching passkey has been found for the provided Credential ID However, if the wrong credential ID is specified without `transports` set (or with other-than-internal `transports` set), browsers won't error right away because they can't enumerate external credentials. They will display an error once the user has pressed their security key or gone through the cross-device passkey flow: Chrome error when the credential ID used by the user is not in the allowCredentials list ### `attestation` See [`attestation`](#attestation) above. ### `timeout` See [`timeout`](#timeout) above. ### `UserVerification` See [`UserVerification`](#userverification) above. # Proxying signed requests Source: https://docs.turnkey.com/authentication/proxying-signed-requests Turnkey has an open CORS policy for its public API. This means your frontend can choose to POST sign requests straight to `https://api.turnkey.com`. Your frontend can also choose to forward the requests via a backend server (which POSTs the signed request to Turnkey). How should you decide what to do? Here are some considerations: * A backend proxy can be useful if you need to inspect and persist activity results. For example: if your users are creating wallets, you might want to persist the addresses. If your users are signing transactions, you might want to broadcast on their behalf. * Another reason why a backend server could be beneficial is monitoring, feature toggles, and validation: with a proxy you're able to control which requests are proxied and which aren't. You can also perform additional validation before signed requests are forwarded to Turnkey. * POSTing signed requests directly from your app frontend to Turnkey saves you the burden of running a proxy server, and takes you out of the loop so that your end-users interact directly with Turnkey. This is a "hands-off" approach that can work well if you want to give your end-users maximum flexibility and ownership over their sub-organization. # Sessions Source: https://docs.turnkey.com/authentication/sessions Turnkey sessions allow a user to take multiple, contiguous actions in a defined period of time. ## What is a session? Such actions can be divided into two buckets: * Read operations: Retrieving data (e.g., viewing wallet balances) * Write operations: Modifying data or performing sensitive actions (e.g., signing transactions) ## How can I create a session? ### Read-only sessions In terms of end-user experience, a read-only session might make sense in low-touch applications where users are primarily reading data (think viewing wallets and their balances). As for implementation, there are a few ways a developer can achieve read-only access on behalf of a user. Note: an end-user (sub-organization) falls hierarchically under the developer (parent-organization). #### Parent organization access By default, a parent organization has read access to all of its sub-organizations’ data. This means you can set up a federated model where the client makes requests to a backend (containing the parent organization’s API key credentials), the backend populates the requested data, and returns it back to the client. From an implementation perspective, each read request (i.e. `get` or `list`) requires an `organizationId` parameter. Populate that field with the sub-organization’s ID in order to get its data. #### Client side access Separately, if you would like the client to have all read requests encapsulated (instead of reading data via a proxy like in the previous approach), the client can initiate a read-only session via a [CreateReadOnlySession activity](/api-reference/activities/create-read-only-session). This activity returns a session string that, if passed into an HTTP request via `X-Session` header, gives permission to perform reads. Note that because this is an activity performed by an end user, it still requires authentication (for example, via passkey). Turnkey’s current SDKs, including `@turnkey/react-wallet-kit` and `@turnkey/core`, do not support read-only sessions. These SDKs are designed around cryptographically stamped, read-write sessions and do not expose the divergent request paths required for token-based read-only authentication. If you need read-only session support, you must either interact with the Turnkey API directly and attach the session token to requests manually, or use older / legacy SDK [implementations](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/sdk-client.ts#L231-L255) that still support token-based read-only sessions. For most applications, read-write sessions are recommended. By default, a parent organization already has read access to all of its sub-organizations’ data, allowing clients to fetch read-only data via a backend using the parent organization’s API credentials, without requiring a separate read-only client session. ### Read-write sessions In contrast to read-only sessions, a read-write session makes sense when a user would like to make several authenticated write requests in a window of time. There are a few ways to achieve this: #### Creating a read-write session There are several mechanisms to obtain read-write sessions: OTP, OAuth, Passkey sessions, and Session refreshing Read-write sessions Our SDK contains several abstractions that manage authentication. You can checkout all of our examples leveraging these examples [here](https://github.com/tkhq/sdk/tree/main/examples) **Note:** The session JWT is only metadata signed by Turnkey that references the client side stored API keypair, and is useful for verifying the session server-side or associating metadata, but it cannot be used to authenticate requests to Turnkey’s API. Only the session keypair can be used to create valid `x-stamp` signatures for API requests to Turnkey. In other words, solely the session JWT cannot be used to stamp requests outside of the client context. ### Mechanisms There are two primary mechanisms we offer that provide client side key generation and signing to support read-write sessions. #### IndexedDB (web only): For web apps that want stronger session persistence without relying on iframes or exposing credentials to your app’s JavaScript runtime, Turnkey supports using the [SubtleCrypto](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto) API to generate unextractable asymmetric key pairs and store them securely in the browser’s IndexedDB. This approach enables long-lived, client-held sessions that survive page reloads, tab closures, and even browser restarts – **without ever exposing the private key** to your JavaScript code. Turnkey’s SDK provides helpers to: * Create a new session by generating a P-256 key pair via `crypto.subtle.generateKey()` * Sign requests * Store and retrieve the key using IndexedDB under a given session ID * Abstractions built on top of the `IndexedDBStamper` that simplify authentication flows This is currently the **most persistent** session model for modern browsers that support WebCrypto. It is especially valuable in Progressive Web App (PWA) contexts or when iframe and Local Storage approaches are insufficient. To see the IndexedDB-backed session mechanism in action, check out our Turnkey react-wallet-kit [playground](https://github.com/tkhq/sdk/tree/main/examples/with-sdk-js) or dedicated authentication examples like [oauth](https://github.com/tkhq/sdk/tree/main/examples/oauth), [email OTP](https://github.com/tkhq/sdk/tree/main/examples/otp-auth), and [external wallet authentication](https://github.com/tkhq/sdk/tree/main/examples/wallet-auth). Our [Web demo application](https://github.com/tkhq/sdk/tree/main/examples/react-wallet-kit) hosted at [wallets.turnkey.com](https://wallets.turnkey.com) showcases complete end-to-end authentication flows and client-side session persistence backed by IndexedDB. #### SecureStorage (mobile only) Secure Storage operates essentially the same as IndexedDB with respect to authentication flows for Turnkey except it is mobile native and keys are generated using @turnkey/crypto rather than WebCrypto. #### LocalStorage: Another option is to create an API key and store it directly within Local Storage. However, this is a riskier setup than IndexedDb/SecureStorage as anyone who is able to access this client-side API key has full access to a User. ### Sessions FAQ Once a user has a valid session, it is trivial to use that session to create a new session. The `refreshSession` abstraction will create a brand new session and automatically store the resulting new session in local storage. In order to delete a session, simply remove all user-related artifacts from Local Storage. ```ts theme={"system"} /** * Clears out all data pertaining to a user session. * * @returns {Promise} */ logout = async (): Promise => { await removeStorageValue(StorageKeys.Client); await removeStorageValue(StorageKeys.Session); return true; }; ``` The expiration of session keys can be specified to any amount of time using the `expirationSeconds` parameter. The default length is 900 seconds (15 minutes). A user can have up to 10 expiring API keys at any given time. If you create an expiring API key that exceeds that limit, Turnkey automatically deletes one of your existing keys using the following priority: * Expired API keys are deleted first * If no expired keys exist, the oldest unexpired key is deleted If you are looking to invalidate existing sessions, you can use the `invalidateExisting` parameter for all `_LOGIN` activities. This will clear all existing session keys. Absolutely! Through leveraging IndexedDb you can handle sessions in the same way for Web and PWAs. However, for React Native/Mobile applications you will need to leverage Secure Storage. # SMS authentication Source: https://docs.turnkey.com/authentication/sms SMS authentication enables users to authenticate their Turnkey account using their phone number via a 6-9 digit or bech32 alphanumeric one-time password (OTP). When authenticated, users receive an expiring API key stored in memory within an iframe, which functions like a session key to access their wallet. ## Access and pricing SMS authentication is available to all Enterprise customers. To enable this feature, please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)). SMS pricing is usage-based and varies depending on the country of the destination phone number and the carrier. Prices are shown in U.S. cents per outbound SMS message segment. Taxes/surcharges separate. Select your country below to view pricing. ## Prerequisites Make sure you have set up your primary Turnkey organization with at least one API user that can programmatically initiate OTP and create sub-organizations. Check out our [Quickstart guide](/getting-started/quickstart) if you need help getting started. To allow an API user to initiate email auth, you'll need the following policy in your main organization: ```json theme={"system"} { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "(activity.resource == 'AUTH' && activity.action == 'CREATE') || (activity.resource == 'OTP' && activity.action == 'CREATE') || (activity.resource == 'OTP' && activity.action == 'VERIFY') || (activity.resource == 'ORGANIZATION' && activity.action == 'CREATE')" } ``` ## How it works SMS authentication uses three activities: 1. `INIT_OTP` - sends a 6-9 digit or bech32 alphanumeric OTP code to the specified phone number 2. `VERIFY_OTP` - verifies the code and returns a verificationToken JWT 3. `OTP_LOGIN` - verified the verificationToken and returns a session JWT ## Implementation ### Initiating SMS authentication The flow begins with a new activity of type `ACTIVITY_TYPE_INIT_OTP` using the parent organization id with these parameters: * `otpType`: specify `"OTP_TYPE_SMS"` * `contact`: user's phone number * `emailCustomization`: optional parameters for customizing emails * `userIdentifier`: optional parameter for rate limiting SMS OTP requests per user. We recommend generating this server-side based on the user's IP address or public key. See the [OTP Rate Limits](#otp-rate-limits) section below for more details. * `alphanumeric`: optional parameter for making this code bech32 alphanumeric or not. default: true * `otpLength`: optional parameter for selecting the length of the OTP. default: 9 * `expirationSeconds`: optional validity window (defaults to 5 minutes) #### One-Time Password Sandbox Environment To test OTP codes in our sandbox environment you can use the following: * `alphanumeric` must be set to `false` * `otpLength` must be set to `6` * Phone Number: +1 999-999-9999 * OTP Code: `000000` In the sandbox environment, SMS delivery is simulated. Use the fixed OTP code `000000` (with the returned otpId) when calling `ACTIVITY_TYPE_VERIFY_OTP` with the parent organization ID to obtain a verificationToken JWT: * `otpId`: ID from the init activity * `otpCode`: the 6-9 digit or alphanumeric code received via SMS * `expirationSeconds`: optional validity window (defaults to 1 hour) After receiving the verification token, users complete OTP authentication flow with with `ACTIVITY_TYPE_OTP_LOGIN` using the sub orgazanition ID associated with the contact from the first step: * `publicKey`: public key to add to organization data associated with the signing key in IndexedDB or SecureStorage. * `verificationToken`: JWT returned from successfull `VERIFY_OTP` activity * `expirationSeconds`: optional validity window (defaults to 15 minutes) * `invalidateExisting`: optional boolean to invalidate previous login sessions ## Authorization SMS authentication requires proper permissions through policies or parent organization status. ## Enabling/disabling SMS auth ### For top-level organizations SMS authentication is disabled by default. Enable it using `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`: ```bash theme={"system"} turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", "organizationId": "", "parameters": { "name": "FEATURE_NAME_SMS_AUTH" } }' --organization ``` ### For sub-organizations * SMS auth is enabled by default * Disable during creation using `disableSmsAuth: true` in the `CreateSubOrganizationIntentV7` activity * Disable after creation using `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE` with feature name `FEATURE_NAME_SMS_AUTH` ## Implementation notes * Users are limited to 10 long-lived API keys and 10 expiring API keys * When the expiring API key limit is reached, the oldest key is automatically discarded ## OTP rate limits In order to safeguard users, Turnkey enforces rate limits for OTP auth activities. If a `userIdentifier` parameter is provided, the following limits are enforced: * 3 requests per 3 minutes per unique `userIdentifier` * 3 retries max per code, after which point that code will be locked * 3 active codes per user, each with a 5 minute TTL # Social logins Source: https://docs.turnkey.com/authentication/social-logins Social logins provide a familiar and convenient way for users to access applications using their existing accounts from popular platforms like Google, Apple, Facebook, X/Twitter, etc. Under the hood, this functionality is powered by OAuth - a robust auth protocol which enables secure user verification through OpenID Connect ([OIDC](https://openid.net/specs/openid-connect-core-1_0.html)) tokens. This feature is available exclusively for sub-organization users. Similar to [email auth](/authentication/email), social login authentication is ideal for users who prefer not to manage API keys or [passkeys](/authentication/passkeys/introduction) directly. This makes it particularly well-suited for onboarding users who are comfortable with traditional web2-style accounts but may be unfamiliar with cryptographic keys and credentials. An example implementing social login authentication for an organization can be found in our SDK repo [here](https://github.com/tkhq/sdk/tree/main/examples/oauth). ## Types of Social Login Providers Turnkey supports two different types of Social Login Providers: 1. **OIDC Providers** (Google, Apple, Auth0, Cognito…) These providers issue your app an **OIDC ID Token** identifying an end-user, which can subsequently be passed to Turnkey as a means of authentication. 2. **OAuth 2.0-Only Providers** (X/Twitter, Discord…) These providers do *not* issue **OIDC ID Tokens** themselves, and instead provide only bare-bones OAuth 2.0. To work around this limitation, Turnkey runs the **OAuth 2.0 Authorization Code + PKCE** flow, calls the provider’s `who-am-I` endpoint using your app's credentials, and then uses the returned user data to **issue a short-lived OIDC ID token**. In effect, Turnkey acts as an "*OIDC Wrapper*" for these OAuth 2.0 Services. While the backend flows associated with these two types of Providers differ upstream of **OIDC ID Token** generation, they converge at that point and have no downstream differences. In both cases, the goal is to get an **OIDC ID Token** identifying the end user. ### Social Login Provider Types - Comparison The table below can be helpful in understanding the similarities and differences between the two types of Social Login Providers that Turnkey supports: | **Provider Type** | **OIDC Provider** | **OAuth 2.0-Only Providers** | | ----------------- | ---------------------------------------------- | ----------------------------------------------------------------- | | Providers | Google, Apple, Facebook, Auth0, Cognito | X/Twitter, Discord | | Token Transport | Returned to your App by Provider | Returned by Turnkey after the **OAuth 2.0 Auth Code + PKCE** flow | | Issuer (`iss`) | Provider (iss = Provider URL) | Turnkey (iss = Turnkey URL) | | Audience (`aud`) | Provider’s `client_id` for your app | Provider’s `client_id` for your app | | Subject (`sub`) | Provider’s subject (stable user ID) | Derived from ID `who-am-I` response (e.g., `x:123456789`) | | Nonce (`nonce`) | Sent to Provider; echoed in ID token | Sent to Turnkey; echoed in ID token. | | Refresh/access | If the Provider returns them, you may use them | Not provided. | ## Roles and responsibilities * **Turnkey**: Runs verifiable infrastructure to create credentials, verify OIDC tokens and, in the case of **OAuth 2.0-Only Providers**, issue them as well. * **Parent**: That's you! **For the rest of this guide we'll assume you, the reader, are a Turnkey customer**. We assume that you have: * An existing Turnkey organization (we'll refer to this organization as "the parent organization") * A web application frontend (we'll refer to this as just "app" or "web app") * A backend able to sign and POST Turnkey activities ("backend" or "parent backend") * **End-User**: The end-user is a user of your web app. They have an account with Google. * **OIDC Provider**: A provider able to authenticate your End-Users and provide OIDC tokens as proof. We'll use [Google](https://developers.google.com/identity/openid-connect/openid-connect) as an example. * **OAuth 2.0-Only Provider**: A provider of OAuth 2.0-based Authorization, for which Turnkey is able to act as an "*OIDC Wrapper*". ## Authentication Sequence Diagrams The sequence diagrams below display the differing flows for the two types of Social Login Providers. ### OIDC Provider ```mermaid theme={"system"} sequenceDiagram participant User participant Frontend participant OAuth Provider participant Backend participant Turnkey Frontend->>Frontend: Create API keypair User->>Frontend: Clicks "Log in with " Frontend->>OAuth Provider: Start OAuth flow with nonce=sha256(API publicKey) OAuth Provider->>User: Prompt to grant permission User->>OAuth Provider: Grants permission OAuth Provider->>Frontend: Return oidcToken Frontend->>Backend: Send oidcToken + API publicKey Backend->>Turnkey: Gets subOrgIds with that associated oidcToken Turnkey->>Backend: Return subOrgId (or null) alt SubOrgId not found Backend->>Turnkey: Create sub-org using oidcToken Turnkey->>Backend: Return new subOrgId end Backend->>Turnkey: Call oauth_login with oidcToken, API publicKey Turnkey->>Backend: Return session JWT Backend->>Frontend: Return session JWT ``` The frontend generates an API keypair before starting the OAuth login flow. This keypair will later become the session keypair once the user is authenticated via Turnkey. The user begins the login process by clicking "Log in with \" on the frontend. When starting the OAuth request to the provider, the frontend sets the `nonce` to `sha256(publicKey)` based on the API public key. This binds the resulting OIDC token to the keypair. The OAuth provider prompts the user to grant permission to share their identity. Once approved, the OAuth provider returns an `oidcToken` to the frontend. The frontend sends the `oidcToken` and API public key to your backend. The backend gets subOrgIds that are associated with that `oidcToken`. If no sub-organization exists, it creates one using the identity in the token. The backend calls `oauth_login` with the `oidcToken`, and API public key. Turnkey validates that the token’s `nonce` matches `sha256(publicKey)` and returns a session JWT. The backend sends this JWT to the frontend. Your frontend now treats the API keypair as the session keypair. It can use the private key to sign requests to Turnkey using the `x-stamp` header. ### OAuth 2.0-Only Provider ```mermaid theme={"system"} sequenceDiagram participant User participant Frontend participant OAuth Provider participant Backend participant Turnkey User->>Frontend: Clicks "Log in with " Frontend->>OAuth Provider: Start OAuth flow OAuth Provider->>User: Prompt to grant permission User->>OAuth Provider: Grants permission OAuth Provider->>Frontend: User redirected to redirect_uri and delivered auth_code Frontend->>Backend: User calls with redirect_uri and auth_code Backend->>Turnkey: Send auth_code + redirect_uri via `OAuth2Authenticate` call Turnkey->>Backend: Return OIDC Token Backend->>Turnkey: Gets subOrgIds with that associated oidcToken Turnkey->>Backend: Return subOrgId (or null) alt SubOrgId not found Backend->>Turnkey: Create sub-org using oidcToken Turnkey->>Backend: Return new subOrgId end Backend->>Turnkey: Call oauth_login with oidcToken, API publicKey Turnkey->>Backend: Return session JWT Backend->>Frontend: Return session JWT ``` The frontend generates an API keypair before starting the OAuth login flow. This keypair will later become the session keypair once the user is authenticated via Turnkey. The user begins the login process by clicking "Log in with \" on the frontend. The frontend initiates the OAuth Authentication flow with the provider. The OAuth provider prompts the user to grant permission to share their identity. Once approved, the OAuth provider returns an `oidcToken` to the frontend. The provider delivers a short-lived auth\_code via the redirect\_uri. The backend exchanges the auth\_code + redirect\_uri for an OIDC ID Token using the `OAuth2Authenticate` activity. The backend gets subOrgIds that are associated with that `oidcToken`. If no sub-organization exists, it creates one using the identity in the token. The backend calls `oauth_login` with the `oidcToken`, and API public key. The backend sends this JWT to the frontend. NOTE: For this flow, the `nonce` is *not* required to match `sha256(publicKey)`. Your frontend now treats the API keypair as the session keypair. It can use the private key to sign requests to Turnkey using the `x-stamp` header. ## What does Turnkey use from the OIDC tokens to prove identity? Turnkey parses and validates the following fields from the OIDC token to confirm the user's identity: * `issuer` (iss) – The OAuth provider that issued the token (e.g., `https://accounts.google.com`) * `audience` (aud) – The OAuth app’s client ID * `subject` (sub) – The unique identifier for the user in the OAuth provider's system **Note:**\ Some OAuth providers (like Google) encourage you to register separate client IDs for each platform (e.g., web, iOS, Android). However, as discussed above, in the Turnkey flow the `aud` claim from the OIDC token is used as part of how sub-organizations are identified. If a user logs in on one platform using the web client ID, and then later logs in on another platform using a different iOS client ID, the two tokens will have different `aud` values. Because of this, Turnkey will not consider them the same identity. To ensure users are recognized consistently across platforms, you must use the same OAuth client ID everywhere. In most cases, this means using your web client ID for web, iOS, and Android flows. ## OIDC token verification All OIDC tokens are verified inside of Turnkey's [secure enclaves](/security/secure-enclaves). We've designed a new secure enclave to fetch TLS content securely and bring [non-repudiation](https://en.wikipedia.org/wiki/Non-repudiation#In_digital_security) on top of TLS content: our TLS fetcher returns a URL and the fetched content, signed by the TLS fetcher's quorum key. By trusting the TLS fetcher quorum key, other Turnkey enclaves can bring TLS-fetched data into their computation safely. Verifying OIDC token is the first computation which requires this! To verify an OIDC token, other Turnkey enclaves receive the OIDC token as well as: * the signed content of the issuer's OpenId configuration. OpenId configuration **must** be hosted under `/.well-known/openid-configuration` for each domain. For Google for example, the issuer configuration is at [`accounts.google.com/.well-known/openid-configuration`](https://accounts.google.com/.well-known/openid-configuration). This JSON document contains, among other thing, a `jwksUri` key. The value for this key is a URL hosting the list of currently-valid OIDC token signers. * the signed content of the issuer's `jwksUri` (e.g., for Google, the `jwksUri` is [`googleapis.com/oauth2/v3/cert`](https://www.googleapis.com/oauth2/v3/certs)). This is a list of public keys against which the secure enclave can verify tokens. Note: **these public keys rotate periodically** (every \~6hrs), hence it's not possible to hardcode these public keys in our secure enclave code directly. We have to fetch them dynamically! With all of that, an enclave can independently verify an OIDC token without making outbound requests. Once the token is parsed and considered authentic, our enclaves match the `iss`, `aud` and `sub` attributes against the registered OAuth providers on the Turnkey sub-organization. We also check `exp` to make sure the OIDC token is not expired, and the `nonce` attribute (see next section). ## Nonce restrictions in OIDC tokens Our [`OAUTH_LOGIN`](https://docs.turnkey.com/api-reference/activities/login-with-oauth) activity requires 2 parameters minimum: * `oidcToken`: the base64 OIDC token * `publicKey`: the client-side public key generated by the user In order to prevent OIDC tokens from being used against multiple public keys, our enclaves parse the OIDC token and, as part of the validation logic, enforce that the `nonce` claim is set to `sha256(publicKey)`. For example, if the public key is `0394e549c71fa99dd5cf752fba623090be314949b74e4cdf7ca72031dd638e281a`, our enclaves expect the OIDC token nonce to be `1663bba492a323085b13895634a3618792c4ec6896f3c34ef3c26396df22ef82`. This restriction only applies during **authentication** (`OAUTH` activity). Registration via `CREATE_OAUTH_PROVIDER` and `CREATE_SUB_ORGANIZATION` activities is not affected since these activities do not accept a `publicKey` and do not return encrypted credentials as a result. If your OAuth provider does not allow you to customize `nonce` claims, Turnkey also accepts and validates `tknonce` claims. This is an alternative claim that will be considered. Only one of (`nonce`, `tknonce`) needs to be set to `sha256(publicKey)`; not both. ## OAuth vs. OIDC [OAuth2.0](https://datatracker.ietf.org/doc/html/rfc6749) is a separate protocol from [OIDC](https://openid.net/specs/openid-connect-core-1_0.html), with distinct goals: * "OAuth2.0" is an authorization framework * "OIDC" is an authentication framework We chose to name this feature "OAuth" because of the term familiarity: most Turnkey customers will have to setup an "OAuth" app with Google, and the user experience is often referred to as "OAuth" flows regardless of the protocol underneath. ## OIDC Providers Below, some details and pointers about specific providers we've worked with before. If yours isn't listed below it does not mean it can't be supported: any OIDC provider should work with Turnkey's OAuth. ### Google This provider is extensively tested and supported. We've integrated it in our demo wallet (hosted at [https://wallet.tx.xyz](https://wallet.tx.xyz)), along with Apple and Facebook: OAuth demo wallet The code is open-source, feel free to [check it out](https://github.com/tkhq/demo-embedded-wallet) for reference. The exact line where the OAuth component is loaded is here: [ui/src/screens/LandingScreen.tsx](https://github.com/tkhq/demo-embedded-wallet/blob/d4ec308e9ce0bf0da7b64da2b39e1a80c077eb82/ui/src/screens/LandingScreen.tsx#L384). The main documentation for Google OIDC is available [here](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/auth.tsx#L157). ### Apple Apple integration is also extensively tested and supported, and is integrated into our demo wallet (hosted at [https://wallet.tx.xyz](https://wallet.tx.xyz)). The code provides an [example component](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/apple-auth.tsx) as well as an [example redirect handler](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/app/\(landing\)/oauth-callback/apple/page.tsx). Documentation for Apple OIDC can be found [here](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple). ### Facebook Facebook OIDC requires a [manual flow with PFKE](https://developers.facebook.com/docs/facebook-login/guides/advanced/oidc-token/) (Proof for Key Exchange). This flow requires a few extra steps compared with Apple or Google. Specifically: * You will need to generate a **code verifier** that can either be recalled (e.g. from a database) or reassembled in a later request. * You will need to provide a **code challenge** as a parameter of the OAuth redirect that is either the code verifier itself or the hash of the code verifier. * Instead of receiving the OIDC token after the OAuth flow, you will receive an **auth code** that must be exchanged for an OIDC token in a subsequent request. The code verifier and your app's ID are also required in this exchange. In our example demo wallet, we opt to avoid using a database in the authentication process and instead generate our verification code serverside using the hash of a nonce and a secret salt value. The nonce is then passed to and returned from the Facebook API as a **state** parameter (see [the API spec](https://developers.facebook.com/docs/facebook-login/guides/advanced/oidc-token/) for details). Finally, the server reconstructs the verification code by re-hashing the nonce and the the salt. The full flow is displayed below: Facebook OAuth flow Code for the [redirect component](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/facebook-auth.tsx), [OAuth callback](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/app/\(landing\)/oauth-callback/facebook/page.tsx), and [code exchange](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/actions/turnkey.ts#L54) are all available in the example wallet repo. If you prefer to use a database such as Redis instead of reassembling the verification code, you can store the verification code and retrieve it in the exchange stage using a lookup key either passed as **state** or stored in local browser storage. ### Auth0 This provider was tested successfully and offers a wide range of authentication factors and integration. For example, Auth0 can wrap Twitter's auth or any other ["Social Connection"](https://marketplace.auth0.com/features/social-connections). In the testing process we discovered that Auth0 admins can manage users freely. Be careful about who can and can't access your Auth0 account: Auth0's management APIs allow for account merging. Specifically, anyone with a `users:update` scope token can call [this endpoint](https://auth0.com/docs/api/management/v2/users/post-identities) to arbitrarily link an identity. For example, if a Google-authenticated user (OIDC token `sub` claim: `google-oauth2|118121659617646047510`) gets merged into a Twitter-authenticated user (OIDC token `sub` claim: `twitter|47169608`), the OIDC token obtained by logging in through Google post-merge will be `twitter|47169608`. This can be surprising and lead to account takeover if an Auth0 admin is malicious. This is documented in Auth0's own docs, [here](https://auth0.com/docs/manage-users/user-accounts/user-account-linking#precautions). ### AWS Cognito The main thing to call out is the inability to pass custom `nonce` claims easily. To pass the hash of the end-user's public key, use a custom `tknonce` claim instead. ### Social linking Social linking is the concept of automatically linking an email address to a Turnkey user by authenticating with a social provider. This allows an end-user to authenticate with the social provider, or a matching email address. Currently, we only allow automatic linking for Google social logins. The cases are as follows: 1. The end-user authenticates with Google. Their email address is automatically linked to their authentication methods and considered “verified,” allowing them to log in with email OTP or email auth in the future. 2. The end-user authenticates with a Google email address (e.g., @gmail.com) via email OTP or email auth. If they later authenticate with Google, the Google OIDC provider will automatically be added as a valid login method, provided the email matches. 3. The end-user has existing non-Google authentication methods (e.g. phone number, passkeys, etc.) and later adds Google OIDC as a login method (via [CREATE\_OAUTH\_PROVIDERS](/api-reference/activities/create-oauth-providers#api-key)). The email address in the Google account will be automatically marked as "verified" and linked to the existing user. For more information on how to implement social linking, see the [social linking code example](/embedded-wallets/code-examples/social-linking). ## Setup for OAuth 2.0-Only Providers ### Setting Up X/Twitter Navigate to the [X developer portal](https://developer.twitter.com/en/portal/dashboard) and create/setup your app. In the **Keys and Tokens** section, you'll need to save your **Client ID** and **Client Secret** so that these values can be uploaded to Turnkey's servers: alt text #### Required Scopes In order for Turnkey to access the `/2/users/me` endpoint, the following scopes must be set during Authorization: * `tweet.read` * `user.read` ### Setting Up Discord Navigate to the [Discord developer portal](https://discord.com/developers) and create/setup your app. In the **General Information** section, you'll need to save your **Client ID** and **Client Secret** so that these values can be uploaded to Turnkey's servers: alt text #### Required Scopes In order for Turnkey to access the `/api/users/@me` endpoint, the following scopes must be set during Authorization: * `identify` * `email` ### Client Secret Upload For every OAuth 2.0-Only Social Provider that you wish to integrate with, you must upload the **Client ID** and **Client Secret** issued by that Provider to Turnkey's Servers. In order to protect these sensitive credentials, they will be encrypted to the Quorum Key of the TLS Fetcher enclave, which ensures they cannot be accessed outside of that environment. You can upload these credentials through the Turnkey Dashboard. In the **Wallet Kit** section of the dashboard, head to the **Socials** tab and click **Add provider**. OAuth2.0 providers configuration Select the provider you want to add from the dropdown, and fill in the required fields. You can find these values in the provider's developer console. Any secrets will automatically be encrypted before uploading to Turnkey. Adding an OAuth2.0 provider Once uploaded, you can then use the **Credential Id** from the table shown to make requests to the `OAUTH2_AUTHENTICATE` activity. Facebook OAuth flow You can also see the example [here](https://github.com/tkhq/sdk/blob/main/examples/with-x/credential-upload.tsx) demonstrating how to encrypt and upload your client secrets using our SDK instead. ### Returning the Encrypted Bearer Token When using OAuth 2.0-Only Social Providers, it is also possible to have the bearer token returned by the `OAuth2Authenticate` endpoint, which can be useful if you would like your app to have additional integrations involving this Social Provider. In order to guaruntee the secure transfer of the bearer token, it must be encrypted to a P256 Encryption Key inside our secure enclave, returned to the caller, and then finally decrypted. Therefore, the return of the encrypted bearer token is dependent on the caller providing an optional `bearerTokenTargetPublicKey` parameter in the request to `OAuth2Authenticate`. An example demonstrating this flow can be seen [here](https://github.com/tkhq/sdk/blob/main/examples/with-x/src/app/auth/turnkey/x/route.ts). # Advanced Source: https://docs.turnkey.com/category/advanced Use Turnkey's low-level http libraries directly Detailed guide on installing and initializing the TurnkeyClient Guide on using the ApiKeyStamper Guide on using the WalletStamper Guide on using the WebauthnStamper Guide on using the IframeStamper Guide on using the IndexedDbStamper # Code examples Source: https://docs.turnkey.com/category/code-examples Create a sub-org with a passkey user Authenticate a user with a passkey credential Create a user passkey session Create a user with email only Authenticate a user with email Add an additional passkey Authenticate a user with an Ethereum wallet Signing transactions Sending sponsored transactions Import wallet or private key Export wallet or private key Social linking # Code examples Source: https://docs.turnkey.com/category/code-examples-1 Signing transactions Smart contract management # Security & Architecture Source: https://docs.turnkey.com/category/security Learn how Turnkey achieves innovative, cloud scale, no single point of failure security. Turnkey is the first verifiable key management system of its kind, securing millions of wallets and private keys for a wide variety of use cases. Turnkey's security architecture ensures that raw private keys are never exposed to Turnkey, your software, or your team. We provide end-to-end private key generation and access control within secure enclaves, with strong isolation guarantees and cryptographic attestation proving that only authorized code is running. Our custom-built operating system, QuorumOS, minimizes attack surface and enables reproducible, auditable deployments. From hardware-backed trust to multi-factor access controls, every layer of Turnkey's architecture is designed to be secure, verifiable, and developer-friendly by default. Our whitepaper covers our holistic security model in-depth, and speaks to our vision for building verifiable key management infrastructure. Learn more about our approach to security here. Learn about Turnkey's unique security framework Learn how Turnkey handles private keys Overview of secure enclaves and how we use them Learn how we deploy our secure applications Learn how we ensure an end-to-end audit trail Turnkey's disaster recovery process Learn about Turnkey's enclave to end-user secure channels Read about Turnkey's ambitious foundations with the Turnkey Whitepaper Overview of Turnkey's responsible disclosure program # Web3 libraries Source: https://docs.turnkey.com/category/web3-libraries Turnkey Web3 libraries Ethers wrapper Viem wrapper CosmJS wrapper EIP 1193 provider Solana Web3 wrapper # Api Key Stamper Source: https://docs.turnkey.com/changelogs/api-key-stamper/readme # @turnkey/api-key-stamper ## 0.6.0 ### Minor Changes * [#1135](https://github.com/tkhq/sdk/pull/1135) [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6) Author [@ethankonk](https://github.com/ethankonk) - Exposed a `sign` method from the stamper for signing arbitrary payloads * Accepts a string payload and returns a signature in either `RAW` or `DER` format. ### Patch Changes * Updated dependencies \[[`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314)]: * @turnkey/crypto\@2.8.9 ## 0.5.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/encoding\@0.6.0 ## 0.5.0-beta.6 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.6 ## 0.5.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.5 ## 0.4.8-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.4 ## 0.4.8-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.3 ## 0.4.8-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.2 ## 0.4.8-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.1 ## 0.4.8-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.0 ## 0.4.7 ### Patch Changes * [#698](https://github.com/tkhq/sdk/pull/698) [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164) Author [@moeodeh3](https://github.com/moeodeh3) - Introduces an optional `runtimeOverride` parameter that allows the ability to explicitly specify the crypto environment: `"browser"`, `"node"`, or `"purejs"`. ## 0.4.6 ### Patch Changes * Updated dependencies \[[`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a)]: * @turnkey/encoding\@0.5.0 ## 0.4.5 ### Patch Changes * 4d1d775: Better error message and docstring for API key import ## 0.4.4 ### Patch Changes * 2d5977b: Update error messaging around api key and target public key usage ## 0.4.3 ### Patch Changes * Updated dependencies \[e5c4fe9] * @turnkey/encoding\@0.4.0 ## 0.4.2 ### Patch Changes * Updated dependencies \[93666ff] * @turnkey/encoding\@0.3.0 ## 0.4.1 ### Patch Changes * Changes: Resolves bugs where byte arrays might not be sufficiently padded (32 bytes are expected for x, y, and d elements of a JWK) * Updated dependencies * @turnkey/encoding\@0.2.1 ## 0.4.0 ### Minor Changes * New PureJS implementation for \`@turnkey/api-key-stamper\`\` to support React Native * Introduce a dependency on `@turnkey/encoding` to consolidate utility functions ## 0.3.1 ### Patch Changes * Upgrade to Node v18 (#184) ## 0.3.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ## 0.2.0 ### Minor Changes * Add ESM support (#154) ## 0.1.1 ### Patch Changes * Hint for web bundlers not to polyfill Node crypto ## 0.1.0 Initial release # Core Source: https://docs.turnkey.com/changelogs/core/readme # @turnkey/core ## 1.11.0 ### Minor Changes * [#1135](https://github.com/tkhq/sdk/pull/1135) [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6) Author [@ethankonk](https://github.com/ethankonk) - - Added client signature support for OTP authentication flows * Synced with `mono` v2025.12.2 ### Patch Changes * [#1117](https://github.com/tkhq/sdk/pull/1117) [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289) Author [@ethankonk](https://github.com/ethankonk) - Fixed broken OTP flow when "Verification Token Required for Account Lookups" was enabled in the Auth Proxy * Updated dependencies \[[`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/crypto\@2.8.9 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/sdk-types\@0.11.1 * @turnkey/http\@3.16.1 * @turnkey/react-native-passkey-stamper\@1.2.7 ## 1.10.0 ### Minor Changes * [#1153](https://github.com/tkhq/sdk/pull/1153) [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea) Thanks [@moe-dev](https://github.com/moe-dev)! - Update as per mono v2025.12.3. ### Behavioral Changes * `appName` is now **required**: * In `emailCustomization` for Email Auth activities * At the top-level intent for OTP activities * Auth proxy endpoints are **not affected** ### Activity Version Bumps The following activity types have been versioned: * `ACTIVITY_TYPE_INIT_OTP` → `ACTIVITY_TYPE_INIT_OTP_V2` * `ACTIVITY_TYPE_INIT_OTP_AUTH_V2` → `ACTIVITY_TYPE_INIT_OTP_V3` * `ACTIVITY_TYPE_EMAIL_AUTH_V2` → `ACTIVITY_TYPE_EMAIL_AUTH_V3` * `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY` -> `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2` ### Patch Changes * [#1145](https://github.com/tkhq/sdk/pull/1145) [`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301) Author [@moeodeh3](https://github.com/moeodeh3) - Add session `organizationId` fallback to HTTP client stamp functions * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/sdk-types\@0.11.0 * @turnkey/http\@3.16.0 * @turnkey/crypto\@2.8.8 * @turnkey/react-native-passkey-stamper\@1.2.6 ## 1.9.0 ### Minor Changes * [#1118](https://github.com/tkhq/sdk/pull/1118) [`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e) Thanks [@moe-dev](https://github.com/moe-dev)! - Add support for high-level Ethereum transaction utilities (**for embedded wallet use only**): * **`ethSendTransaction`** — new helper used as a dedicated method for submitting Ethereum transactions (sign and broadcast) via the Turnkey API. * **`pollTransactionStatus`** — new helper for polling Turnkey’s transaction status endpoint until the transaction reaches a terminal state. These methods enable a clean two-step flow: 1. Submit the transaction intent using `ethSendTransaction`, receiving a `sendTransactionStatusId`. 2. Poll for completion using `pollTransactionStatus` to retrieve the final on-chain transaction hash and execution status. ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/sdk-types\@0.10.0 * @turnkey/crypto\@2.8.7 ## 1.8.3 ### Patch Changes * [#1136](https://github.com/tkhq/sdk/pull/1136) [`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed missing `X-Client-Version` header in `sendSignedRequest()` ## 1.8.2 ### Patch Changes * [#1127](https://github.com/tkhq/sdk/pull/1127) [`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9) Author [@moeodeh3](https://github.com/moeodeh3) - Fix duplicate providers returned by `fetchWalletProviders()` when external wallet providers announce multiple EIP-1193 providers (e.g., Backpack) ## 1.8.1 ### Patch Changes * [#1113](https://github.com/tkhq/sdk/pull/1113) [`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255) Author [@moeodeh3](https://github.com/moeodeh3) - Prevented unnecessary permission prompts in non-Ethereum-native wallets (e.g., Cosmos-based wallets like Keplr) by avoiding chainId requests before accounts are connected ## 1.8.0 ### Minor Changes * [#1090](https://github.com/tkhq/sdk/pull/1090) [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421) Author [@moeodeh3](https://github.com/moeodeh3) - - Fixed `stamp*` methods for query endpoints in `httpClient` incorrectly formatting request body * Parallelized stamper and session initialization * Separated WalletConnect initialization from client init * Optimized `fetchWallet` by reducing redundant queries and running wallet/user fetches in parallel * Added optional `authenticatorAddresses` param to `fetchWalletAccounts()` * Updated to latest `@walletconnect/sign-client` for performance improvements ### Patch Changes * [#1096](https://github.com/tkhq/sdk/pull/1096) [`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7) Author [@ethankonk](https://github.com/ethankonk) - Fixed legacy transactions not working in `signAndSendTransaction()` for **EVM connected wallet**. This does not affect Turnkey's embedded wallet flow, previously, connected wallet transactions were all formatted into EIP-1559 transactions, updated to respect legacy + future formats passed in. * Updated dependencies \[[`80ea306`](https://github.com/tkhq/sdk/commit/80ea306025a2161ff575a5e2b45794460eafdf1b)]: * @turnkey/sdk-types\@0.9.0 * @turnkey/crypto\@2.8.6 ## 1.7.0 ### Minor Changes * [#1072](https://github.com/tkhq/sdk/pull/1072) [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b) Thanks [@moe-dev](https://github.com/moe-dev)! - Bump packages as per mono v2025.11.0 ### Patch Changes * [#1074](https://github.com/tkhq/sdk/pull/1074) [`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607) Author [@moeodeh3](https://github.com/moeodeh3) - - added optional `organizationId` to `loginWithOAuth()` * added optional `invalidateExisting` to `signUpWithOAuth()` * fixed `invalidateExisting` being ignored in `completeOAuth()` during signup * Updated dependencies \[[`5f829c6`](https://github.com/tkhq/sdk/commit/5f829c67af03bb85c3806acd202b2debf8274e78), [`084acce`](https://github.com/tkhq/sdk/commit/084acce85fe7c15513a025e77c1571012ac82e4b), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/crypto\@2.8.5 * @turnkey/sdk-types\@0.8.0 * @turnkey/http\@3.15.0 * @turnkey/react-native-passkey-stamper\@1.2.5 ## 1.6.0 ### Minor Changes * [#1058](https://github.com/tkhq/sdk/pull/1058) [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release `v2025.10.10-hotfix.2` ### Patch Changes * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/http\@3.14.0 * @turnkey/crypto\@2.8.4 * @turnkey/react-native-passkey-stamper\@1.2.4 ## 1.5.2 ### Patch Changes * Updated dependencies \[[`c745646`](https://github.com/tkhq/sdk/commit/c745646ae4b2a275e116abca07c6e108f89beb04)]: * @turnkey/crypto\@2.8.4 ## 1.5.1 ### Patch Changes * [#1031](https://github.com/tkhq/sdk/pull/1031) [`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0) Author [@ethankonk](https://github.com/ethankonk) - Fixed session token getting cleared when using loginWithWallet ## 1.5.0 ### Minor Changes * [#992](https://github.com/tkhq/sdk/pull/992) [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186) Author [@amircheikh](https://github.com/amircheikh) - - Added `verifyAppProofs` function. Used alongside activities that return app proofs, this function will fetch the corresponding boot proof for a list of app proofs and securely verify them on the client. Learn more about Turnkey Verified [here](https://docs.turnkey.com/security/turnkey-verified) * All auth methods that make signup requests now optionally return a list of `appProofs` ### Patch Changes * [#1020](https://github.com/tkhq/sdk/pull/1020) [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed an issue in `signAndSendTransaction` where Ethereum embedded wallet transactions failed during broadcast due to missing `0x` prefixes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186)]: * @turnkey/crypto\@2.8.3 * @turnkey/sdk-types\@0.6.3 ## 1.4.2 ### Patch Changes * [#1016](https://github.com/tkhq/sdk/pull/1016) [`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1) Author [@amircheikh](https://github.com/amircheikh) - Synced API as per mono v2025.10.2 * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1), [`429e4c4`](https://github.com/tkhq/sdk/commit/429e4c4b5d897a7233584d4ec429b21bba7a1f2b)]: * @turnkey/sdk-types\@0.6.2 * @turnkey/http\@3.13.1 * @turnkey/react-native-passkey-stamper\@1.2.3 * @turnkey/crypto\@2.8.2 ## 1.4.1 ### Patch Changes * [#1010](https://github.com/tkhq/sdk/pull/1010) [`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3) Author [@moeodeh3](https://github.com/moeodeh3) - - Fixed errors not being deserialized in `withTurnkeyErrorHandling()`, which previously caused them to stringify as `[object Object]` * Improved error messages surfaced by `connectWalletAccount()` ## 1.4.0 ### Minor Changes * [#986](https://github.com/tkhq/sdk/pull/986) [`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa) Author [@amircheikh](https://github.com/amircheikh) - - Added `defaultStamperType` param to the configuration. This will force the underlying `httpClient` to default to a specific stamper for all requests * Added `createHttpClient` function. This allows a duplicate instance of `TurnkeySDKClientBase` to be created and returned. Custom configuration can be passed in to create an entirely new client with a unique config. This is useful for creating different HTTP clients with different default stampers to be used in our helper packages (`@turnkey/viem`, `@turnkey/ethers`, etc) * [#993](https://github.com/tkhq/sdk/pull/993) [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9) Author [@moeodeh3](https://github.com/moeodeh3) - - Added `sendSignedRequest()` to execute any `TSignedRequest` returned by SDK stamping methods. * Added `buildWalletLoginRequest()` method, which prepares and signs a wallet login request without sending it to Turnkey, returning the `stampLogin` signed request alongside the wallet’s public key used for login. ### Patch Changes * Updated dependencies \[[`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/sdk-types\@0.6.1 * @turnkey/crypto\@2.8.1 ## 1.3.0 ### Minor Changes * [#974](https://github.com/tkhq/sdk/pull/974) [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c) Author [@narimonf](https://github.com/narimonf) - Added `fetchBootProofForAppProof`, which fetches the boot proof for a given app proof. ### Patch Changes * [#982](https://github.com/tkhq/sdk/pull/982) [`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86) Author [@ethankonk](https://github.com/ethankonk) - - Fixed signing and broadcasting transactions with connected solana accounts * Fixed `fetchWallets` wallet account pagination issue * [#983](https://github.com/tkhq/sdk/pull/983) [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1) Author [@moeodeh3](https://github.com/moeodeh3) - WalletConnect initialization now has a 5-second timeout. If setup fails, it no longer blocks overall client initialization * Updated dependencies \[[`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/crypto\@2.8.0 * @turnkey/sdk-types\@0.6.0 ## 1.2.0 ### Minor Changes * [#977](https://github.com/tkhq/sdk/pull/977) [`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241) Author [@besler613](https://github.com/besler613) - OAuth2Authenticate now supports returning the encrypted bearer token via the optional `bearerTokenTargetPublicKey` request parameter (mono release v2025.9.5) ### Patch Changes * [#972](https://github.com/tkhq/sdk/pull/972) [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4) Author [@moeodeh3](https://github.com/moeodeh3) - Fix exported types * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241)]: * @turnkey/sdk-types\@0.5.0 * @turnkey/http\@3.13.0 * @turnkey/crypto\@2.7.0 * @turnkey/react-native-passkey-stamper\@1.2.2 ## 1.1.0 ### Minor Changes * [#940](https://github.com/tkhq/sdk/pull/940) [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4) Author [@moeodeh3](https://github.com/moeodeh3) - - Added optional params for sessionless stamping (passkey/wallet only setups) ### Patch Changes * [#946](https://github.com/tkhq/sdk/pull/946) [`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef) Author [@moeodeh3](https://github.com/moeodeh3) - - Added `proposalExpired` event emission in WalletConnect provider * Added automatic URI regeneration when a WalletConnect URI expires * [#958](https://github.com/tkhq/sdk/pull/958) [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f) Author [@amircheikh](https://github.com/amircheikh) - - Synced api with mono * [#960](https://github.com/tkhq/sdk/pull/960) [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963) Author [@moeodeh3](https://github.com/moeodeh3) - - Removed requirement of session for external wallet usage * `connectExternalWalletAccount()` now returns the wallet address instead of `void` * `fetchWallets()` now supports an optional `connectedOnly` parameter to fetch only connected wallets * [#940](https://github.com/tkhq/sdk/pull/940) [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7) Author [@moeodeh3](https://github.com/moeodeh3) - - Fixed signMessage() to respect the provided encoding override instead of silently ignoring it * Corrected Ethereum message prefixing for embedded wallets in `signMessage()` to fully align with EIP-191 standards * Updated dependencies \[[`2191a1b`](https://github.com/tkhq/sdk/commit/2191a1b201fb17dea4c79cf9e02b3a493b18f97a), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f)]: * @turnkey/crypto\@2.7.0 * @turnkey/sdk-types\@0.4.1 * @turnkey/http\@3.12.1 * @turnkey/react-native-passkey-stamper\@1.2.1 ## 1.0.0 ### Major Changes * Initial Stable Release: `@turnkey/core` 🎉\ Turnkey’s **core TypeScript client-side SDK** for Embedded Wallets is now generally available. * Provides a set of functions and utilities to interact with Turnkey’s APIs * Includes a powerful session management system * Comes with built-in stampers for signing flows * Exposes a raw HTTP client for advanced use cases * Designed to be the foundation for building Embedded Wallets across frameworks (React, React Native, Angular, Vue, Svelte) 📚 [Read the full docs here](https://docs.turnkey.com/sdks/typescript-frontend) ### Minor Changes * [#677](https://github.com/tkhq/sdk/pull/677) [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e) Author [@amircheikh](https://github.com/amircheikh) - @turnkey/react-wallet-kit and @turnkey/core beta-3 release * [#677](https://github.com/tkhq/sdk/pull/677) [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e) Author [@amircheikh](https://github.com/amircheikh) - @turnkey/react-wallet-kit and @turnkey/core beta-3 release * [#677](https://github.com/tkhq/sdk/pull/677) [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823) Author [@amircheikh](https://github.com/amircheikh) - @turnkey/react-wallet-kit and @turnkey/core beta release * [#677](https://github.com/tkhq/sdk/pull/677) [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c) Author [@amircheikh](https://github.com/amircheikh) - updating package versions * [#677](https://github.com/tkhq/sdk/pull/677) [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c) Author [@amircheikh](https://github.com/amircheikh) - test build * [#677](https://github.com/tkhq/sdk/pull/677) [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624) Author [@amircheikh](https://github.com/amircheikh) - SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/sdk-types\@0.4.0 * @turnkey/encoding\@0.6.0 * @turnkey/http\@3.12.0 * @turnkey/crypto\@2.6.0 * @turnkey/react-native-passkey-stamper\@1.2.0 * @turnkey/webauthn-stamper\@0.6.0 * @turnkey/api-key-stamper\@0.5.0 ## 1.0.0-beta.6 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.6 * @turnkey/encoding\@0.6.0-beta.6 * @turnkey/crypto\@2.6.0-beta.6 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/react-native-passkey-stamper\@1.2.0-beta.1 ## 1.0.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/react-native-passkey-stamper\@1.2.0-beta.0 * @turnkey/webauthn-stamper\@0.6.0-beta.0 * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/sdk-types\@0.4.0-beta.5 * @turnkey/encoding\@0.6.0-beta.5 * @turnkey/crypto\@2.6.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 1.0.0-beta.4 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.4 * @turnkey/encoding\@0.6.0-beta.4 * @turnkey/http\@3.10.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 * @turnkey/crypto\@2.5.1-beta.4 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.4 ## 1.0.0-beta.3 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.3 * @turnkey/encoding\@0.6.0-beta.3 * @turnkey/http\@3.10.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 * @turnkey/crypto\@2.5.1-beta.3 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.3 ## 1.0.0-beta.2 ### Minor Changes * updating package versions ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.2 * @turnkey/encoding\@0.6.0-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/crypto\@2.5.1-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.2 ## 1.0.0-beta.1 ### Minor Changes * test build ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.1 * @turnkey/encoding\@0.6.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 * @turnkey/crypto\@2.5.1-beta.1 * @turnkey/http\@3.8.1-beta.1 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.1 ## 1.0.0-beta.0 ### Major Changes * beta for @turnkey/react-wallet-kit and @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.0 * @turnkey/encoding\@0.6.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/crypto\@2.5.1-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.0 ## 1.0.0 ### Major Changes * Initial beta release for react wallet kit ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0 * @turnkey/encoding\@0.6.0 * @turnkey/api-key-stamper\@0.4.8 * @turnkey/crypto\@2.5.1 * @turnkey/http\@3.8.1 * @turnkey/react-native-passkey-stamper\@1.1.2 ## 1.0.0 ### Major Changes * Initial beta release for @turnkey/react-wallet-kit and @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0 * @turnkey/encoding\@0.6.0 * @turnkey/api-key-stamper\@0.4.8 * @turnkey/crypto\@2.5.1 * @turnkey/http\@3.8.1 * @turnkey/react-native-passkey-stamper\@1.1.2 # Cosmjs Source: https://docs.turnkey.com/changelogs/cosmjs/readme # @turnkey/cosmjs ## 0.8.22 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289)]: * @turnkey/core\@1.11.0 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/sdk-browser\@5.14.1 * @turnkey/http\@3.16.1 * @turnkey/sdk-server\@5.0.1 ## 0.8.21 ### Patch Changes * Updated dependencies \[[`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea), [`dbd4d8e`](https://github.com/tkhq/sdk/commit/dbd4d8e4ea567240c4d287452dd0d8f53050beca), [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/core\@1.10.0 * @turnkey/sdk-server\@5.0.0 * @turnkey/sdk-browser\@5.14.0 * @turnkey/http\@3.16.0 ## 0.8.20 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/core\@1.9.0 * @turnkey/sdk-browser\@5.13.6 * @turnkey/sdk-server\@4.12.2 ## 0.8.19 ### Patch Changes * Updated dependencies \[[`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3)]: * @turnkey/core\@1.8.3 * @turnkey/sdk-browser\@5.13.5 ## 0.8.18 ### Patch Changes * Updated dependencies \[[`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9)]: * @turnkey/core\@1.8.2 ## 0.8.17 ### Patch Changes * Updated dependencies \[[`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255)]: * @turnkey/core\@1.8.1 * @turnkey/sdk-browser\@5.13.4 ## 0.8.16 ### Patch Changes * Updated dependencies \[[`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7), [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421)]: * @turnkey/core\@1.8.0 * @turnkey/sdk-browser\@5.13.3 * @turnkey/sdk-server\@4.12.1 ## 0.8.15 ### Patch Changes * Updated dependencies \[[`4d29af2`](https://github.com/tkhq/sdk/commit/4d29af2dd7c735916c650d697f18f66dd76c1b79)]: * @turnkey/sdk-browser\@5.13.2 ## 0.8.14 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.1 ## 0.8.13 ### Patch Changes * Updated dependencies \[[`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/core\@1.7.0 * @turnkey/sdk-browser\@5.13.0 * @turnkey/sdk-server\@4.12.0 * @turnkey/http\@3.15.0 ## 0.8.12 ### Patch Changes * Updated dependencies \[[`71cdca3`](https://github.com/tkhq/sdk/commit/71cdca3b97ba520dc5327410a1e82cf9ad85fb0e), [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/sdk-server\@4.11.0 * @turnkey/sdk-browser\@5.12.0 * @turnkey/core\@1.6.0 * @turnkey/http\@3.14.0 ## 0.8.11 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.5.2 * @turnkey/sdk-browser\@5.11.6 * @turnkey/sdk-server\@4.10.5 ## 0.8.10 ### Patch Changes * [#1036](https://github.com/tkhq/sdk/pull/1036) [`13de561`](https://github.com/tkhq/sdk/commit/13de561bfe7e8a8ce26e4a5308d05be450868535) Author [@andrewkmin](https://github.com/andrewkmin) - noop: readme update ## 0.8.9 ### Patch Changes * Updated dependencies \[[`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0)]: * @turnkey/core\@1.5.1 ## 0.8.8 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0)]: * @turnkey/core\@1.5.0 * @turnkey/sdk-browser\@5.11.5 * @turnkey/sdk-server\@4.10.4 ## 0.8.7 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-browser\@5.11.4 * @turnkey/sdk-server\@4.10.3 * @turnkey/core\@1.4.2 * @turnkey/http\@3.13.1 ## 0.8.6 ### Patch Changes * Updated dependencies \[[`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3)]: * @turnkey/core\@1.4.1 ## 0.8.5 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.11.3 ## 0.8.4 ### Patch Changes * Updated dependencies \[[`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa), [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/core\@1.4.0 * @turnkey/sdk-browser\@5.11.2 * @turnkey/sdk-server\@4.10.2 ## 0.8.3 ### Patch Changes * Updated dependencies \[[`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86), [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/core\@1.3.0 * @turnkey/sdk-browser\@5.11.1 * @turnkey/sdk-server\@4.10.1 ## 0.8.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241), [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4)]: * @turnkey/sdk-browser\@5.11.0 * @turnkey/sdk-server\@4.10.0 * @turnkey/core\@1.2.0 * @turnkey/http\@3.13.0 ## 0.8.1 ### Patch Changes * Updated dependencies \[[`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f), [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963), [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7), [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4)]: * @turnkey/core\@1.1.0 * @turnkey/sdk-browser\@5.10.1 * @turnkey/sdk-server\@4.9.1 * @turnkey/http\@3.12.1 ## 0.8.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/sdk-server\@4.9.0 * @turnkey/core\@1.0.0 * @turnkey/http\@3.12.0 * @turnkey/api-key-stamper\@0.5.0 * @turnkey/sdk-browser\@5.10.0 ## 0.8.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0-beta.6 * @turnkey/sdk-browser\@5.9.0-beta.1 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/sdk-server\@4.8.1-beta.0 ## 0.8.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/sdk-browser\@5.9.0-beta.0 * @turnkey/sdk-server\@4.7.0-beta.2 * @turnkey/core\@1.0.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 0.7.27 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/sdk-browser\@5.9.0 * @turnkey/sdk-server\@4.8.0 * @turnkey/http\@3.11.0 ## 0.7.26 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/sdk-browser\@5.8.0 * @turnkey/sdk-server\@4.7.0 * @turnkey/http\@3.10.0 ## 0.7.25-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.1 * @turnkey/http\@3.10.0-beta.1 * @turnkey/sdk-browser\@5.7.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 ## 0.7.25-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.0 * @turnkey/http\@3.10.0-beta.0 * @turnkey/sdk-browser\@5.7.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 ## 0.7.25-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/sdk-server\@4.5.1-beta.2 ## 0.7.25-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 * @turnkey/http\@3.8.1-beta.1 * @turnkey/sdk-server\@4.5.1-beta.1 ## 0.7.25-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/sdk-server\@4.5.1-beta.0 ## 0.7.25 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9), [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5)]: * @turnkey/sdk-browser\@5.7.0 * @turnkey/sdk-server\@4.6.0 * @turnkey/http\@3.9.0 ## 0.7.24 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/sdk-browser\@5.6.0 * @turnkey/sdk-server\@4.5.0 * @turnkey/http\@3.8.0 ## 0.7.23 ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 * @turnkey/sdk-browser\@5.5.0 * @turnkey/sdk-server\@4.4.0 ## 0.7.22 ### Patch Changes * Updated dependencies \[[`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15)]: * @turnkey/sdk-browser\@5.4.1 ## 0.7.21 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/sdk-browser\@5.4.0 * @turnkey/sdk-server\@4.3.0 * @turnkey/http\@3.6.0 ## 0.7.20 ### Patch Changes * Updated dependencies \[[`2db00b0`](https://github.com/tkhq/sdk/commit/2db00b0a799d09ae33fa08a117e3b2f433f2b0b4)]: * @turnkey/sdk-server\@4.2.4 ## 0.7.19 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/sdk-browser\@5.3.4 * @turnkey/sdk-server\@4.2.3 * @turnkey/http\@3.5.1 ## 0.7.18 ### Patch Changes * Updated dependencies \[[`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf)]: * @turnkey/sdk-browser\@5.3.3 ## 0.7.17 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.3.2 * @turnkey/sdk-server\@4.2.2 ## 0.7.16 ### Patch Changes * Updated dependencies \[[`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/sdk-browser\@5.3.1 * @turnkey/sdk-server\@4.2.1 ## 0.7.15 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/http\@3.5.0 * @turnkey/sdk-browser\@5.3.0 * @turnkey/sdk-server\@4.2.0 * @turnkey/api-key-stamper\@0.4.7 ## 0.7.14 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.3 ## 0.7.13 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.2 ## 0.7.12 ### Patch Changes * [#665](https://github.com/tkhq/sdk/pull/665) [`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772) Author [@amircheikh](https://github.com/amircheikh) - Fix for `no runner registered` error when using mismatched versions of turnkey/http * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/sdk-browser\@5.2.1 * @turnkey/sdk-server\@4.1.1 ## 0.7.11 ### Patch Changes * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/sdk-browser\@5.2.0 * @turnkey/sdk-server\@4.1.0 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 ## 0.7.10 ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-browser\@5.1.0 * @turnkey/sdk-server\@4.0.1 ## 0.7.9 ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0), [`e8a5f1b`](https://github.com/tkhq/sdk/commit/e8a5f1b431623c4ff1cb85c6039464b328cf0e6a)]: * @turnkey/sdk-browser\@5.0.0 * @turnkey/sdk-server\@4.0.0 * @turnkey/http\@3.4.0 ## 0.7.8 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/sdk-browser\@4.3.0 * @turnkey/sdk-server\@3.3.0 * @turnkey/http\@3.3.0 ## 0.7.7 ### Patch Changes * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/sdk-browser\@4.2.0 * @turnkey/sdk-server\@3.2.0 * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 ## 0.7.6 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/sdk-browser\@4.1.0 * @turnkey/sdk-server\@3.1.0 * @turnkey/http\@3.1.0 ## 0.7.5 ### Patch Changes * Updated dependencies \[7b72769] * @turnkey/sdk-server\@3.0.1 ## 0.7.4 ### Patch Changes * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/sdk-browser\@4.0.0 * @turnkey/sdk-server\@3.0.0 * @turnkey/http\@3.0.0 ## 0.7.3 ### Patch Changes * Updated dependencies \[bf87774] * @turnkey/sdk-browser\@3.1.0 ## 0.7.2 ### Patch Changes * Updated dependencies \[5ec5187] * @turnkey/sdk-browser\@3.0.1 * @turnkey/sdk-server\@2.6.1 ## 0.7.1 ### Patch Changes * Updated dependencies \[0e4e959] * Updated dependencies \[856f449] * Updated dependencies \[c9ae537] * Updated dependencies \[d4ce5fa] * Updated dependencies \[ecdb29a] * Updated dependencies \[72890f5] * @turnkey/sdk-browser\@3.0.0 * @turnkey/sdk-server\@2.6.0 * @turnkey/http\@2.22.0 ## 0.7.0 ### Minor Changes * a7b5ce3: Update @cosmos/\* dependencies from v0.31.0 to v0.33.0 and cosmjs-types from v0.8.0 to v0.9.0 ### Patch Changes * Updated dependencies \[93540e7] * Updated dependencies \[fdb8bf0] * Updated dependencies \[9147962] * @turnkey/sdk-browser\@2.0.0 * @turnkey/sdk-server\@2.5.0 ## 0.6.14 ### Patch Changes * Updated dependencies \[233ae71] * Updated dependencies \[9317588] * @turnkey/sdk-browser\@1.16.0 * @turnkey/sdk-server\@2.4.0 ## 0.6.13 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/sdk-browser\@1.15.0 * @turnkey/sdk-server\@2.3.0 * @turnkey/http\@2.21.0 ## 0.6.12 ### Patch Changes * Updated dependencies \[3c44c4a] * Updated dependencies \[bfc833f] * @turnkey/sdk-browser\@1.14.0 * @turnkey/sdk-server\@2.2.0 * @turnkey/http\@2.20.0 ## 0.6.11 ### Patch Changes * Updated dependencies \[69d2571] * Updated dependencies \[57f9cb0] * @turnkey/sdk-browser\@1.13.0 * @turnkey/sdk-server\@2.1.0 * @turnkey/http\@2.19.0 ## 0.6.10 ### Patch Changes * Updated dependencies \[755833b] * @turnkey/sdk-browser\@1.12.1 * @turnkey/sdk-server\@2.0.1 ## 0.6.9 ### Patch Changes * Updated dependencies \[6695af2] * Updated dependencies \[1ebd4e2] * @turnkey/sdk-browser\@1.12.0 * @turnkey/sdk-server\@2.0.0 * @turnkey/http\@2.18.0 ## 0.6.8 ### Patch Changes * Updated dependencies \[053fbfb] * @turnkey/sdk-browser\@1.11.2 * @turnkey/sdk-server\@1.7.3 * @turnkey/http\@2.17.3 ## 0.6.7 ### Patch Changes * Updated dependencies \[328d6aa] * Updated dependencies \[b90947e] * Updated dependencies \[2d5977b] * Updated dependencies \[fad7c37] * @turnkey/sdk-browser\@1.11.1 * @turnkey/sdk-server\@1.7.2 * @turnkey/api-key-stamper\@0.4.4 * @turnkey/http\@2.17.2 ## 0.6.6 ### Patch Changes * Updated dependencies \[7988bc1] * Updated dependencies \[538d4fc] * Updated dependencies \[12d5aaa] * @turnkey/sdk-browser\@1.11.0 * @turnkey/sdk-server\@1.7.1 * @turnkey/http\@2.17.1 ## 0.6.5 ### Patch Changes * @turnkey/sdk-browser\@1.10.2 ## 0.6.4 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/sdk-server\@1.7.0 * @turnkey/http\@2.17.0 * @turnkey/sdk-browser\@1.10.1 ## 0.6.3 ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/sdk-browser\@1.10.0 ## 0.6.2 ### Patch Changes * Updated dependencies \[3dd74ac] * Updated dependencies \[1e36edf] * Updated dependencies \[4df8914] * Updated dependencies \[11a9e2f] * @turnkey/sdk-browser\@1.9.0 * @turnkey/sdk-server\@1.6.0 * @turnkey/http\@2.16.0 ## 0.6.1 ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/sdk-browser\@1.8.0 * @turnkey/sdk-server\@1.5.0 * @turnkey/http\@2.15.0 ## 0.6.0 ### Minor Changes * 5e60923: Add compatibility with wallet accounts and @turnkey/sdk-browser and @turnkey/sdk-server ### Patch Changes * Updated dependencies \[abe7138] * Updated dependencies \[96d7f99] * @turnkey/sdk-server\@1.4.2 * @turnkey/sdk-browser\@1.7.1 * @turnkey/http\@2.14.2 * @turnkey/api-key-stamper\@0.4.3 ## 0.5.21 ### Patch Changes * Updated dependencies \[ff059d5] * @turnkey/http\@2.14.1 ## 0.5.20 ### Patch Changes * Updated dependencies \[848f8d3] * @turnkey/http\@2.14.0 ## 0.5.19 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 ## 0.5.18 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/http\@2.12.3 ## 0.5.17 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.2 ## 0.5.16 ### Patch Changes * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 ## 0.5.15 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 ## 0.5.14 ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 ## 0.5.13 ### Patch Changes * Updated dependencies \[7a9ce7a] * @turnkey/http\@2.10.0 ## 0.5.12 ### Patch Changes * Updated dependencies * @turnkey/http\@2.9.1 ## 0.5.11 ### Patch Changes * Updated dependencies \[83b62b5] * @turnkey/http\@2.9.0 ## 0.5.10 ### Patch Changes * Updated dependencies \[46a7d90] * @turnkey/http\@2.8.0 ## 0.5.9 ### Patch Changes * Updated dependencies * @turnkey/http\@2.7.1 ## 0.5.8 ### Patch Changes * Updated dependencies \[d73725b] * @turnkey/http\@2.7.0 ## 0.5.7 ### Patch Changes * Updated dependencies \[f9d636c] * @turnkey/http\@2.6.2 ## 0.5.6 ### Patch Changes * Updated dependencies \[52e2389] * @turnkey/http\@2.6.1 ## 0.5.5 ### Patch Changes * Updated dependencies \[7a3c890] * @turnkey/http\@2.6.0 ## 0.5.4 ### Patch Changes * Upgrade to Node v18 (#184) * Updated dependencies * @turnkey/http\@2.5.1 ## 0.5.3 ### Patch Changes * Updated dependencies \[464ac0e] * @turnkey/http\@2.5.0 ## 0.5.2 ### Patch Changes * @turnkey/http\@2.4.2 ## 0.5.1 ### Patch Changes * Updated dependencies \[f87ced8] * @turnkey/http\@2.4.1 ## 0.5.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ### Patch Changes * Updated dependencies \[fc5b291] * @turnkey/http\@2.4.0 ## 0.4.14 ### Patch Changes * @turnkey/http\@2.3.1 ## 0.4.13 ### Patch Changes * Updated dependencies \[f1bd68a] * @turnkey/http\@2.3.0 ## 0.4.12 ### Patch Changes * Updated dependencies \[ed50a0f] * Updated dependencies * @turnkey/http\@2.2.0 ## 0.4.11 ### Patch Changes * Updated dependencies \[bb6ea0b] * @turnkey/http\@2.1.0 ## 0.4.10 ### Patch Changes * Updated dependencies * @turnkey/http\@2.0.0 * Updated the shape of signing ## 0.4.9 ### Patch Changes * Updated dependencies * @turnkey/http\@1.3.0 ## 0.4.8 ### Patch Changes * Updated dependencies * @turnkey/http\@1.2.0 ## 0.4.7 ### Patch Changes * @turnkey/http\@1.1.1 ## 0.4.6 ### Patch Changes * Updated dependencies * @turnkey/http\@1.1.0 ## 0.4.5 ### Patch Changes * Updated dependencies \[8d1d0e8] * @turnkey/http\@1.0.1 ## 0.4.4 ### Patch Changes * 46473ec: This breaking change updates generated code to be shorter and more intuitive to read: * generated fetchers do not include the HTTP method in their name. For example `useGetGetActivity` is now `useGetActivity`, and `usePostSignTransaction` is `useSignTransaction`. * input types follow the same convention (no HTTP method in the name): `TPostCreatePrivateKeysInput` is now `TCreatePrivateKeysInput`. * the "federated" request helpers introduced in `0.18.0` are now named "signed" requests to better reflect what they are. `FederatedRequest` is now `SignedRequest`, and generated types follow. For example: `federatedPostCreatePrivateKeys` is now `signCreatePrivateKeys`, `federatedGetGetActivity` is now `signGetActivity`, and so on. The name updates should be automatically suggested if you use VSCode since the new names are simply shorter versions of the old one. * Updated dependencies \[46473ec] * Updated dependencies \[38b424f] * @turnkey/http\@1.0.0 ## 0.4.3 ### Patch Changes * Updated dependencies * @turnkey/http\@0.18.1 ## 0.4.2 ### Patch Changes * Updated dependencies * @turnkey/http\@0.18.0 ## 0.4.1 ### Patch Changes * Updated dependencies * @turnkey/http\@0.17.1 ## 0.4.0 ### Minor Changes * No public facing changes ### Patch Changes * Updated dependencies \[9317f51] * @turnkey/http\@0.17.0 ## 0.3.0 ### Minor Changes * No public facing changes ### Patch Changes * Updated dependencies * @turnkey/http\@0.16.0 * Fix `.postGetPrivateKey(...)`'s underlying path, while adding `@deprecated` `.postGetPrivateKeyBackwardsCompat(...)` for backward compatibility ## 0.2.1 ### Patch Changes * Updated dependencies * @turnkey/http\@0.15.0 ## 0.2.0 ### Minor Changes * Moved `sha256` hashing from local to remote ### Patch Changes * Updated dependencies * @turnkey/http\@0.14.0 ## 0.1.1 ### Patch Changes * New `TurnkeyRequestError` error class that contains rich error details * Updated dependencies * @turnkey/http\@0.13.2 ## 0.1.0 * Initial release # Crypto Source: https://docs.turnkey.com/changelogs/crypto/readme # @turnkey/crypto ## 2.8.9 ### Patch Changes * [#1165](https://github.com/tkhq/sdk/pull/1165) [`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314) Author [@moeodeh3](https://github.com/moeodeh3) - Remove `@turnkey/http` and `@turnkey/api-key-stamper` from devDependencies * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/sdk-types\@0.11.1 ## 2.8.8 ### Patch Changes * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/sdk-types\@0.11.0 ## 2.8.7 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/sdk-types\@0.10.0 ## 2.8.6 ### Patch Changes * Updated dependencies \[[`80ea306`](https://github.com/tkhq/sdk/commit/80ea306025a2161ff575a5e2b45794460eafdf1b)]: * @turnkey/sdk-types\@0.9.0 ## 2.8.5 ### Patch Changes * [#1068](https://github.com/tkhq/sdk/pull/1068) [`5f829c6`](https://github.com/tkhq/sdk/commit/5f829c67af03bb85c3806acd202b2debf8274e78) Author [@moeodeh3](https://github.com/moeodeh3) - - Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b): * @turnkey/sdk-types\@0.7.0 * Updated dependencies \[[`084acce`](https://github.com/tkhq/sdk/commit/084acce85fe7c15513a025e77c1571012ac82e4b), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/sdk-types\@0.8.0 ## 2.8.4 ### Patch Changes * [#1050](https://github.com/tkhq/sdk/pull/1050) [`c745646`](https://github.com/tkhq/sdk/commit/c745646ae4b2a275e116abca07c6e108f89beb04) Author [@amircheikh](https://github.com/amircheikh) - - Removed `@peculiar/webcrypto` dependancy. This will fix build errors in environments where `webcrypto` is not defined but will still require a polyfill if you use a function where `webcrypto` is required. ## 2.8.3 ### Patch Changes * [#992](https://github.com/tkhq/sdk/pull/992) [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186) Author [@amircheikh](https://github.com/amircheikh) - - `verify` function is now exposed and supports web platforms * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186)]: * @turnkey/sdk-types\@0.6.3 ## 2.8.2 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-types\@0.6.2 ## 2.8.1 ### Patch Changes * Updated dependencies \[[`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/sdk-types\@0.6.1 ## 2.8.0 ### Minor Changes * [#974](https://github.com/tkhq/sdk/pull/974) [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c) Author [@narimonf](https://github.com/narimonf) - Added verification tooling for app proofs and boot proofs. Primarily adds `verify()`, which verifies an app proof boot proof pair. ### Patch Changes * Updated dependencies \[[`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/sdk-types\@0.6.0 ## 2.7.0 ### Minor Changes * [#947](https://github.com/tkhq/sdk/pull/947) [`2191a1b`](https://github.com/tkhq/sdk/commit/2191a1b201fb17dea4c79cf9e02b3a493b18f97a) Author [@amircheikh](https://github.com/amircheikh) - - Added `encryptOnRampSecret` helper function. This is used for encrypting your fiat on ramp secrets before passing into the `CreateFiatOnRampCredential` activity ## 2.6.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/encoding\@0.6.0 ## 2.6.0-beta.6 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta release ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.6 ## 2.6.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.5 ## 2.6.0 ### Minor Changes * [#840](https://github.com/tkhq/sdk/pull/840) [`d7420e6`](https://github.com/tkhq/sdk/commit/d7420e6c3559efc1024b58749b31d253150cb189) Author [@zkharit](https://github.com/zkharit) - This change adds a new encryption mechanism to allow for messages to be encrypted to an enclaves quorum public key. A helper function specifically for OAith 2.0 client secret encryption is also included ## 2.5.1-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.4 ## 2.5.1-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.3 ## 2.5.1-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.2 ## 2.5.1-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.1 ## 2.5.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.0 ## 2.5.0 ### Minor Changes * [#812](https://github.com/tkhq/sdk/pull/812) [`6cde41c`](https://github.com/tkhq/sdk/commit/6cde41cfecdfb7d54abf52cc65e28ef0e2ad6ba3) Author [@turnekybc](https://github.com/turnekybc) - Add `@turnkey/encoding` as a package dependency instead of a devDependency to `@turnkey/crypto`. This resolves an issue with transitive dependencies when devDependencies are not included in the artifact. ## 2.4.3 ### Patch Changes * [#720](https://github.com/tkhq/sdk/pull/720) [`6cbff7a`](https://github.com/tkhq/sdk/commit/6cbff7a0c0b3a9a05586399e5cef476154d3bdca) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed `decryptExportBundle` not working in some environments by adding a shim to handle `bs58`'s ESM-only export. ## 2.4.2 ### Patch Changes * [#699](https://github.com/tkhq/sdk/pull/699) [`c5cdf82`](https://github.com/tkhq/sdk/commit/c5cdf8229da5da1bd6d52db06b2fe42826e96d57) Author [@andrewkmin](https://github.com/andrewkmin) - Add validations to `fromDerSignature` for parsing DER signatures in the Turnkey context * [#716](https://github.com/tkhq/sdk/pull/716) [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed `decryptCredentialBundle` not working in React Native by adding a shim to handle `bs58check`'s ESM-only export. ## 2.4.1 ### Patch Changes * [#700](https://github.com/tkhq/sdk/pull/700) [`878e039`](https://github.com/tkhq/sdk/commit/878e03973856cfec83e6e3fda5b76d1b64943628) Author [@andrewkmin](https://github.com/andrewkmin) - Add validations to uncompressRawPublicKey method ## 2.4.0 ### Minor Changes * [#662](https://github.com/tkhq/sdk/pull/662) [`10ee5c5`](https://github.com/tkhq/sdk/commit/10ee5c524b477ce998e4fc635152cd101ae5a9cc) Thanks [@moe-dev](https://github.com/moe-dev)! - Add function `verifySessionJwtSignature` to verify session tokens return from Turnkey and signed by the notarizer ## 2.3.1 ### Patch Changes * 2bc0046: Migrated from WebCrypto (crypto.subtle.verify) to Noble for ECDSA signature verification ## 2.3.0 ### Minor Changes * 668edfa: Add keyformat to decryptExportBundle for displaying Solana private keys ## 2.2.0 ### Minor Changes * Added `toDerSignature` function used to convert a raw ECDSA signature into DER-encoded format for compatibility with our backend, which requires DER signatures ## 2.1.0 ### Minor Changes * [https://github.com/tkhq/sdk/pull/384](https://github.com/tkhq/sdk/pull/384): Reorganize into two subparts: * `crypto.ts`: core cryptography utilities * `turnkey.ts`: Turnkey-specific cryptography utilities Add `verifyStampSignature` method: * See in-line code docs for more details + example of usage * This is useful for checking the validity of a stamp (signature) against the request body ### Patch Changes * d989d46: Remove unnecessary react/typsecript packages ## 2.0.0 ### Major Changes * \[BREAKING CHANGE] renamed `decryptBundle` to `decryptCredentialBundle` (for decrypting email auth/recovery and oauth credential bundles) in order to distinguish from the new `decryptExportBundle` (for decrypting bundles containing wallet mnemonics or private key material) ### Patch Changes * Updated dependencies \[e5c4fe9] * @turnkey/encoding\@0.4.0 ## 1.0.0 ### Major Changes * 93666ff: turnkey/crypto standard HPKE encryption, first major release. Allows for programmatic importing in environments like node. Moved some encoding helper functions to turnkey/encoding ### Patch Changes * Updated dependencies \[93666ff] * @turnkey/encoding\@0.3.0 ## 0.2.1 ### Patch Changes * Updated dependencies * @turnkey/encoding\@0.2.1 ## 0.2.0 ### Minor Changes * Add HPKE encryption ## 0.1.1 ### Patch Changes * d968e0b: Bugfix: return public key ## 0.1.0 Initial release # Dart Source: https://docs.turnkey.com/changelogs/dart/readme # Change Log All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ## 2025-03-11 ### Changes *** Packages with breaking changes: * There are no breaking changes in this release. Packages with other changes: * [`turnkey_sdk_flutter` - `v0.1.0`](#turnkey_sdk_flutter---v010) *** #### `turnkey_sdk_flutter` - `v0.1.0` * Initial release. Client side abstracted functions for Turnkey-powered Flutter apps ## 2025-02-18 ### Changes *** Packages with breaking changes: * There are no breaking changes in this release. Packages with other changes: * [`turnkey_sessions` - `v0.1.2`](#turnkey_sessions---v012) *** #### `turnkey_sessions` - `v0.1.2` * **DOCS**: Added auto login / logout example to README. ## 2025-02-18 ### Changes *** Packages with breaking changes: * There are no breaking changes in this release. Packages with other changes: * [`turnkey_sessions` - `v0.1.1`](#turnkey_sessions---v011) *** #### `turnkey_sessions` - `v0.1.1` * **FEAT**: Listeners notified when session expires (turnkey\_sessions). ## 2025-02-11 ### Changes *** Packages with breaking changes: * There are no breaking changes in this release. Packages with other changes: * [`turnkey_sessions` - `v0.1.0`](#turnkey_sessions---v010) *** #### `turnkey_sessions` - `v0.1.0` ## 2025-02-11 ### Changes *** Packages with breaking changes: * There are no breaking changes in this release. Packages with other changes: * [`turnkey_crypto` - `v0.1.1`](#turnkey_crypto---v011) *** #### `turnkey_crypto` - `v0.1.1` * Exposed generateP256KeyPair function # Eip 1193 Provider Source: https://docs.turnkey.com/changelogs/eip-1193-provider/readme # @turnkey/eip-1193-provider ## 3.4.21 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289)]: * @turnkey/core\@1.11.0 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/sdk-browser\@5.14.1 * @turnkey/http\@3.16.1 ## 3.4.20 ### Patch Changes * Updated dependencies \[[`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea), [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/core\@1.10.0 * @turnkey/sdk-browser\@5.14.0 * @turnkey/http\@3.16.0 ## 3.4.19 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/core\@1.9.0 * @turnkey/sdk-browser\@5.13.6 ## 3.4.18 ### Patch Changes * Updated dependencies \[[`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3)]: * @turnkey/core\@1.8.3 * @turnkey/sdk-browser\@5.13.5 ## 3.4.17 ### Patch Changes * Updated dependencies \[[`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9)]: * @turnkey/core\@1.8.2 ## 3.4.16 ### Patch Changes * Updated dependencies \[[`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255)]: * @turnkey/core\@1.8.1 * @turnkey/sdk-browser\@5.13.4 ## 3.4.15 ### Patch Changes * Updated dependencies \[[`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7), [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421)]: * @turnkey/core\@1.8.0 * @turnkey/sdk-browser\@5.13.3 ## 3.4.14 ### Patch Changes * Updated dependencies \[[`4d29af2`](https://github.com/tkhq/sdk/commit/4d29af2dd7c735916c650d697f18f66dd76c1b79)]: * @turnkey/sdk-browser\@5.13.2 ## 3.4.13 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.1 ## 3.4.12 ### Patch Changes * Updated dependencies \[[`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/core\@1.7.0 * @turnkey/sdk-browser\@5.13.0 * @turnkey/http\@3.15.0 ## 3.4.11 ### Patch Changes * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/sdk-browser\@5.12.0 * @turnkey/core\@1.6.0 * @turnkey/http\@3.14.0 ## 3.4.10 ### Patch Changes * [#1044](https://github.com/tkhq/sdk/pull/1044) [`c0fa69c`](https://github.com/tkhq/sdk/commit/c0fa69cbf9de55d681c5bd67d8cbcb8cdcd4fd5b) Author [@andrewkmin](https://github.com/andrewkmin) - Only use relevant (Ethereum) wallet accounts, and better handle multiple chain IDs * Updated dependencies \[]: * @turnkey/core\@1.5.2 * @turnkey/sdk-browser\@5.11.6 ## 3.4.9 ### Patch Changes * Updated dependencies \[[`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0)]: * @turnkey/core\@1.5.1 ## 3.4.8 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0)]: * @turnkey/core\@1.5.0 * @turnkey/sdk-browser\@5.11.5 ## 3.4.7 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-browser\@5.11.4 * @turnkey/core\@1.4.2 * @turnkey/http\@3.13.1 ## 3.4.6 ### Patch Changes * Updated dependencies \[[`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3)]: * @turnkey/core\@1.4.1 ## 3.4.5 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.11.3 ## 3.4.4 ### Patch Changes * Updated dependencies \[[`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa), [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/core\@1.4.0 * @turnkey/sdk-browser\@5.11.2 ## 3.4.3 ### Patch Changes * Updated dependencies \[[`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86), [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/core\@1.3.0 * @turnkey/sdk-browser\@5.11.1 ## 3.4.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241), [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4)]: * @turnkey/sdk-browser\@5.11.0 * @turnkey/core\@1.2.0 * @turnkey/http\@3.13.0 ## 3.4.1 ### Patch Changes * Updated dependencies \[[`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f), [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963), [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7), [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4)]: * @turnkey/core\@1.1.0 * @turnkey/sdk-browser\@5.10.1 * @turnkey/http\@3.12.1 ## 3.4.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/core\@1.0.0 * @turnkey/http\@3.12.0 * @turnkey/api-key-stamper\@0.5.0 * @turnkey/sdk-browser\@5.10.0 ## 3.4.0-beta.6 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0-beta.6 * @turnkey/sdk-browser\@5.9.0-beta.1 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 ## 3.4.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/sdk-browser\@5.9.0-beta.0 * @turnkey/core\@1.0.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 3.4.0-beta.4 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/http\@3.10.0-beta.1 * @turnkey/sdk-browser\@5.7.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 ## 3.4.0-beta.3 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/http\@3.10.0-beta.0 * @turnkey/sdk-browser\@5.7.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 ## 3.3.26 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/sdk-browser\@5.9.0 * @turnkey/http\@3.11.0 ## 3.3.25 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/sdk-browser\@5.8.0 * @turnkey/http\@3.10.0 ## 3.3.24-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/http\@3.8.1-beta.2 ## 3.3.24-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 * @turnkey/http\@3.8.1-beta.1 ## 3.3.24-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/http\@3.8.1-beta.0 ## 3.3.24 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9)]: * @turnkey/sdk-browser\@5.7.0 * @turnkey/http\@3.9.0 ## 3.3.23 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/sdk-browser\@5.6.0 * @turnkey/http\@3.8.0 ## 3.3.22 ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 * @turnkey/sdk-browser\@5.5.0 ## 3.3.21 ### Patch Changes * Updated dependencies \[[`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15)]: * @turnkey/sdk-browser\@5.4.1 ## 3.3.20 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/sdk-browser\@5.4.0 * @turnkey/http\@3.6.0 ## 3.3.19 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/sdk-browser\@5.3.4 * @turnkey/http\@3.5.1 ## 3.3.18 ### Patch Changes * Updated dependencies \[[`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf)]: * @turnkey/sdk-browser\@5.3.3 ## 3.3.17 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.3.2 ## 3.3.16 ### Patch Changes * Updated dependencies \[[`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/sdk-browser\@5.3.1 ## 3.3.15 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/http\@3.5.0 * @turnkey/sdk-browser\@5.3.0 * @turnkey/api-key-stamper\@0.4.7 ## 3.3.14 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.3 ## 3.3.13 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.2 ## 3.3.12 ### Patch Changes * [#665](https://github.com/tkhq/sdk/pull/665) [`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772) Author [@amircheikh](https://github.com/amircheikh) - Fix for `no runner registered` error when using mismatched versions of turnkey/http * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/sdk-browser\@5.2.1 ## 3.3.11 ### Patch Changes * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/sdk-browser\@5.2.0 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 ## 3.3.10 ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-browser\@5.1.0 ## 3.3.9 ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0)]: * @turnkey/sdk-browser\@5.0.0 * @turnkey/http\@3.4.0 ## 3.3.8 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/sdk-browser\@4.3.0 * @turnkey/http\@3.3.0 ## 3.3.7 ### Patch Changes * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/sdk-browser\@4.2.0 * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 ## 3.3.6 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/sdk-browser\@4.1.0 * @turnkey/http\@3.1.0 ## 3.3.5 ### Patch Changes * 7a89040: Fix type resolution ## 3.3.4 ### Patch Changes * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/sdk-browser\@4.0.0 * @turnkey/http\@3.0.0 ## 3.3.3 ### Patch Changes * Updated dependencies \[bf87774] * @turnkey/sdk-browser\@3.1.0 ## 3.3.2 ### Patch Changes * Updated dependencies \[5ec5187] * @turnkey/sdk-browser\@3.0.1 ## 3.3.1 ### Patch Changes * Updated dependencies \[0e4e959] * Updated dependencies \[856f449] * Updated dependencies \[d4ce5fa] * Updated dependencies \[ecdb29a] * Updated dependencies \[72890f5] * @turnkey/sdk-browser\@3.0.0 * @turnkey/http\@2.22.0 ## 3.3.0 ### Minor Changes * 93540e7: ## Major Package Updates ### @turnkey/sdk-browser * create abstract `TurnkeyBaseClient` class which extends `TurnkeySDKClientBase` * `TurnkeyBrowserClient`, `TurnkeyIframeClient`, `TurnkeyPasskeyClient`, and `TurnkeyWalletClient` all extend `TurnkeyBaseClient` * TurnkeyBrowserClient * Session Management * `refreshSession` - attempts to refresh an existing, active session and will extend the session expiry using the `expirationSeconds` parameter * loginWithBundle - authenticate a user via a credential bundle and creates a read-write session * loginWithPasskey - attempts to authenticate a user via passkey and create a read-only or read-write session * loginWithSession - takes a `Session`, which can be either read-only or read-write, created via a server action and attempts to authenticate the user * TurnkeyPasskeyClient * Session Management * createPasskeySession - leverages passkey authentication to create a read-write session. Once authenticated, the user will not be prompted for additional passkey taps. ### @turnkey/sdk-react * update `TurnkeyContext` to use new `.getSession()` method to check if there is an active session * `OTPVerification` component no longer receives `authIframeClient` or `onValidateSuccess` props ## Minor Package Updates ### @turnkey/sdk-server * expose `sendCredential` server action * add `SessionType` enum * `READ_ONLY` & `READ_WRITE` ### @turnkey/eip-1193-provider * update dependencies in `package.json` * moved from `peerDependencies` to `dependencies` * `"@turnkey/http": "workspace:*"` * `"@turnkey/sdk-browser": "workspace:*"` * moved from `devDependencies` to `dependencies` * `"@turnkey/api-key-stamper": "workspace:*"` * specify TypeScript version ^5.1.5 ### Patch Changes * Updated dependencies \[93540e7] * Updated dependencies \[9147962] * @turnkey/sdk-browser\@2.0.0 ## 3.1.5 ### Patch Changes * Updated dependencies \[233ae71] * @turnkey/sdk-browser\@1.16.0 ## 3.1.4 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/sdk-browser\@1.15.0 * @turnkey/http\@2.21.0 ## 3.1.3 ### Patch Changes * Updated dependencies \[3c44c4a] * @turnkey/sdk-browser\@1.14.0 * @turnkey/http\@2.20.0 ## 3.1.2 ### Patch Changes * Updated dependencies \[69d2571] * Updated dependencies \[57f9cb0] * @turnkey/sdk-browser\@1.13.0 * @turnkey/http\@2.19.0 ## 3.1.1 ### Patch Changes * Updated dependencies \[755833b] * @turnkey/sdk-browser\@1.12.1 ## 3.1.0 ### Minor Changes * 4945c71: Add support for @turnkey/sdk-browser clients ### Patch Changes * Updated dependencies \[6695af2] * @turnkey/sdk-browser\@1.12.0 * @turnkey/http\@2.18.0 ## 3.0.5 ### Patch Changes * Updated dependencies \[053fbfb] * @turnkey/http\@2.17.3 ## 3.0.4 ### Patch Changes * @turnkey/http\@2.17.2 ## 3.0.3 ### Patch Changes * Updated dependencies \[538d4fc] * @turnkey/http\@2.17.1 ## 3.0.2 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/http\@2.17.0 ## 3.0.1 ### Patch Changes * Updated dependencies \[4df8914] * @turnkey/http\@2.16.0 ## 3.0.0 ### Patch Changes * 9c056d0: fix: personal\_sign parameters * Updated dependencies \[9ebd062] * @turnkey/http\@2.15.0 ## 2.0.8 ### Patch Changes * Updated dependencies \[96d7f99] * @turnkey/http\@2.14.2 ## 2.0.7 ### Patch Changes * Updated dependencies \[ff059d5] * @turnkey/http\@2.14.1 ## 2.0.6 ### Patch Changes * Updated dependencies \[848f8d3] * @turnkey/http\@2.14.0 ## 2.0.5 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 ## 2.0.4 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/http\@2.12.3 ## 2.0.3 ### Patch Changes * Removes unused VERSION from constants. Fixes issue with using process in a browser environment. ## 2.0.2 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.2 ## 2.0.1 ### Patch Changes * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 ## 2.0.0 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 ## 1.0.0 ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 ## 0.2.0 ### Minor Changes * 65f781b: Initial Release ## 0.1.0 Initial release! # Encoding Source: https://docs.turnkey.com/changelogs/encoding/readme # @turnkey/encoding ## 0.6.0 ### Minor Changes * [#886](https://github.com/tkhq/sdk/pull/886) [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17) Author [@moeodeh3](https://github.com/moeodeh3) - Expose `bs58` and `bs58check` shims for cross-platform usage. ## 0.6.0-beta.6 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta release ## 0.6.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ## 0.6.0-beta.4 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ## 0.6.0-beta.3 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ## 0.6.0-beta.2 ### Minor Changes * updating package versions ## 0.6.0-beta.1 ### Minor Changes * test build ## 0.6.0-beta.0 ### Minor Changes * beta for @turnkey/react-wallet-kit and @turnkey/core ## 0.5.0 ### Minor Changes * [#653](https://github.com/tkhq/sdk/pull/653) [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a) Thanks [@moe-dev](https://github.com/moe-dev)! - Add pointEncode function ## 0.4.0 ### Minor Changes * added hexToAscii function, useful for converting a raw hex string to a (wallet) mnemonic ## 0.3.0 ### Minor Changes * 93666ff: turnkey/crypto standard HPKE encryption, first major release. Allows for programmatic importing in environments like node. Moved some encoding helper functions to turnkey/encoding ## 0.2.1 ### Patch Changes * 2d7e5a9: include additional utility functions ## 0.2.0 ### Minor Changes * fac7770: Add uint8ArrayFromHexstring and drop language saying this is an internal package ## 0.1.0 Initial release # Ethers Source: https://docs.turnkey.com/changelogs/ethers/readme # @turnkey/ethers ## 1.3.21 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289)]: * @turnkey/core\@1.11.0 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/sdk-browser\@5.14.1 * @turnkey/http\@3.16.1 * @turnkey/sdk-server\@5.0.1 ## 1.3.20 ### Patch Changes * Updated dependencies \[[`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea), [`dbd4d8e`](https://github.com/tkhq/sdk/commit/dbd4d8e4ea567240c4d287452dd0d8f53050beca), [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/core\@1.10.0 * @turnkey/sdk-server\@5.0.0 * @turnkey/sdk-browser\@5.14.0 * @turnkey/http\@3.16.0 ## 1.3.19 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/core\@1.9.0 * @turnkey/sdk-browser\@5.13.6 * @turnkey/sdk-server\@4.12.2 ## 1.3.18 ### Patch Changes * [#1133](https://github.com/tkhq/sdk/pull/1133) [`4bd1183`](https://github.com/tkhq/sdk/commit/4bd1183418ec88e2ab0995f042fafff427ccbe90) Author [@zkharit](https://github.com/zkharit) - Fix a bug where the payload encoding parameter is not used with non Turnkey http clients * Updated dependencies \[[`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3)]: * @turnkey/core\@1.8.3 * @turnkey/sdk-browser\@5.13.5 ## 1.3.17 ### Patch Changes * Updated dependencies \[[`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9)]: * @turnkey/core\@1.8.2 ## 1.3.16 ### Patch Changes * Updated dependencies \[[`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255)]: * @turnkey/core\@1.8.1 * @turnkey/sdk-browser\@5.13.4 ## 1.3.15 ### Patch Changes * Updated dependencies \[[`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7), [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421)]: * @turnkey/core\@1.8.0 * @turnkey/sdk-browser\@5.13.3 * @turnkey/sdk-server\@4.12.1 ## 1.3.14 ### Patch Changes * Updated dependencies \[[`4d29af2`](https://github.com/tkhq/sdk/commit/4d29af2dd7c735916c650d697f18f66dd76c1b79)]: * @turnkey/sdk-browser\@5.13.2 ## 1.3.13 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.1 ## 1.3.12 ### Patch Changes * Updated dependencies \[[`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/core\@1.7.0 * @turnkey/sdk-browser\@5.13.0 * @turnkey/sdk-server\@4.12.0 * @turnkey/http\@3.15.0 ## 1.3.11 ### Patch Changes * Updated dependencies \[[`71cdca3`](https://github.com/tkhq/sdk/commit/71cdca3b97ba520dc5327410a1e82cf9ad85fb0e), [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/sdk-server\@4.11.0 * @turnkey/sdk-browser\@5.12.0 * @turnkey/core\@1.6.0 * @turnkey/http\@3.14.0 ## 1.3.10 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.5.2 * @turnkey/sdk-browser\@5.11.6 * @turnkey/sdk-server\@4.10.5 ## 1.3.9 ### Patch Changes * Updated dependencies \[[`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0)]: * @turnkey/core\@1.5.1 ## 1.3.8 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0)]: * @turnkey/core\@1.5.0 * @turnkey/sdk-browser\@5.11.5 * @turnkey/sdk-server\@4.10.4 ## 1.3.7 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-browser\@5.11.4 * @turnkey/sdk-server\@4.10.3 * @turnkey/core\@1.4.2 * @turnkey/http\@3.13.1 ## 1.3.6 ### Patch Changes * Updated dependencies \[[`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3)]: * @turnkey/core\@1.4.1 ## 1.3.5 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.11.3 ## 1.3.4 ### Patch Changes * Updated dependencies \[[`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa), [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/core\@1.4.0 * @turnkey/sdk-browser\@5.11.2 * @turnkey/sdk-server\@4.10.2 ## 1.3.3 ### Patch Changes * Updated dependencies \[[`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86), [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/core\@1.3.0 * @turnkey/sdk-browser\@5.11.1 * @turnkey/sdk-server\@4.10.1 ## 1.3.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241), [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4)]: * @turnkey/sdk-browser\@5.11.0 * @turnkey/sdk-server\@4.10.0 * @turnkey/core\@1.2.0 * @turnkey/http\@3.13.0 ## 1.3.1 ### Patch Changes * Updated dependencies \[[`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f), [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963), [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7), [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4)]: * @turnkey/core\@1.1.0 * @turnkey/sdk-browser\@5.10.1 * @turnkey/sdk-server\@4.9.1 * @turnkey/http\@3.12.1 ## 1.3.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/sdk-server\@4.9.0 * @turnkey/core\@1.0.0 * @turnkey/http\@3.12.0 * @turnkey/api-key-stamper\@0.5.0 * @turnkey/sdk-browser\@5.10.0 ## 1.3.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0-beta.6 * @turnkey/sdk-browser\@5.9.0-beta.1 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/sdk-server\@4.8.1-beta.0 ## 1.3.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/sdk-browser\@5.9.0-beta.0 * @turnkey/sdk-server\@4.7.0-beta.2 * @turnkey/core\@1.0.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 1.2.10 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/sdk-browser\@5.9.0 * @turnkey/sdk-server\@4.8.0 * @turnkey/http\@3.11.0 ## 1.2.9 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/sdk-browser\@5.8.0 * @turnkey/sdk-server\@4.7.0 * @turnkey/http\@3.10.0 ## 1.2.8-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.1 * @turnkey/http\@3.10.0-beta.1 * @turnkey/sdk-browser\@5.7.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 ## 1.2.8-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.0 * @turnkey/http\@3.10.0-beta.0 * @turnkey/sdk-browser\@5.7.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 ## 1.2.8-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/sdk-server\@4.5.1-beta.2 ## 1.2.8-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 * @turnkey/http\@3.8.1-beta.1 * @turnkey/sdk-server\@4.5.1-beta.1 ## 1.2.8-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/sdk-server\@4.5.1-beta.0 ## 1.2.8 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9), [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5)]: * @turnkey/sdk-browser\@5.7.0 * @turnkey/sdk-server\@4.6.0 * @turnkey/http\@3.9.0 ## 1.2.7 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/sdk-browser\@5.6.0 * @turnkey/sdk-server\@4.5.0 * @turnkey/http\@3.8.0 ## 1.2.6 ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 * @turnkey/sdk-browser\@5.5.0 * @turnkey/sdk-server\@4.4.0 ## 1.2.5 ### Patch Changes * Updated dependencies \[[`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15)]: * @turnkey/sdk-browser\@5.4.1 ## 1.2.4 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/sdk-browser\@5.4.0 * @turnkey/sdk-server\@4.3.0 * @turnkey/http\@3.6.0 ## 1.2.3 ### Patch Changes * Updated dependencies \[[`2db00b0`](https://github.com/tkhq/sdk/commit/2db00b0a799d09ae33fa08a117e3b2f433f2b0b4)]: * @turnkey/sdk-server\@4.2.4 ## 1.2.2 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/sdk-browser\@5.3.4 * @turnkey/sdk-server\@4.2.3 * @turnkey/http\@3.5.1 ## 1.2.1 ### Patch Changes * Updated dependencies \[[`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf)]: * @turnkey/sdk-browser\@5.3.3 ## 1.2.0 ### Minor Changes * [#733](https://github.com/tkhq/sdk/pull/733) [`cc463d3`](https://github.com/tkhq/sdk/commit/cc463d3fde57f4d434fc41c5ed4ce42a0a506874) Author [@besler613](https://github.com/besler613) - Typed data hashing is now performed server-side using the new `PAYLOAD_ENCODING_EIP712` encoding, and EIP-712 Policies are supported via the `eth.eip_712` namespace. ## 1.1.34 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.3.2 * @turnkey/sdk-server\@4.2.2 ## 1.1.33 ### Patch Changes * Updated dependencies \[[`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/sdk-browser\@5.3.1 * @turnkey/sdk-server\@4.2.1 ## 1.1.32 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/http\@3.5.0 * @turnkey/sdk-browser\@5.3.0 * @turnkey/sdk-server\@4.2.0 * @turnkey/api-key-stamper\@0.4.7 ## 1.1.31 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.3 ## 1.1.30 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.2 ## 1.1.29 ### Patch Changes * [#665](https://github.com/tkhq/sdk/pull/665) [`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772) Author [@amircheikh](https://github.com/amircheikh) - Fix for `no runner registered` error when using mismatched versions of turnkey/http * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/sdk-browser\@5.2.1 * @turnkey/sdk-server\@4.1.1 ## 1.1.28 ### Patch Changes * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/sdk-browser\@5.2.0 * @turnkey/sdk-server\@4.1.0 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 ## 1.1.27 ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-browser\@5.1.0 * @turnkey/sdk-server\@4.0.1 ## 1.1.26 ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0), [`e8a5f1b`](https://github.com/tkhq/sdk/commit/e8a5f1b431623c4ff1cb85c6039464b328cf0e6a)]: * @turnkey/sdk-browser\@5.0.0 * @turnkey/sdk-server\@4.0.0 * @turnkey/http\@3.4.0 ## 1.1.25 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/sdk-browser\@4.3.0 * @turnkey/sdk-server\@3.3.0 * @turnkey/http\@3.3.0 ## 1.1.24 ### Patch Changes * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/sdk-browser\@4.2.0 * @turnkey/sdk-server\@3.2.0 * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 ## 1.1.23 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/sdk-browser\@4.1.0 * @turnkey/sdk-server\@3.1.0 * @turnkey/http\@3.1.0 ## 1.1.22 ### Patch Changes * Updated dependencies \[7b72769] * @turnkey/sdk-server\@3.0.1 ## 1.1.21 ### Patch Changes * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/sdk-browser\@4.0.0 * @turnkey/sdk-server\@3.0.0 * @turnkey/http\@3.0.0 ## 1.1.20 ### Patch Changes * Updated dependencies \[bf87774] * @turnkey/sdk-browser\@3.1.0 ## 1.1.19 ### Patch Changes * Updated dependencies \[5ec5187] * @turnkey/sdk-browser\@3.0.1 * @turnkey/sdk-server\@2.6.1 ## 1.1.18 ### Patch Changes * Updated dependencies \[0e4e959] * Updated dependencies \[856f449] * Updated dependencies \[c9ae537] * Updated dependencies \[d4ce5fa] * Updated dependencies \[ecdb29a] * Updated dependencies \[72890f5] * @turnkey/sdk-browser\@3.0.0 * @turnkey/sdk-server\@2.6.0 * @turnkey/http\@2.22.0 ## 1.1.17 ### Patch Changes * Updated dependencies \[93540e7] * Updated dependencies \[fdb8bf0] * Updated dependencies \[9147962] * @turnkey/sdk-browser\@2.0.0 * @turnkey/sdk-server\@2.5.0 ## 1.1.16 ### Patch Changes * Updated dependencies \[233ae71] * Updated dependencies \[9317588] * @turnkey/sdk-browser\@1.16.0 * @turnkey/sdk-server\@2.4.0 ## 1.1.15 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/sdk-browser\@1.15.0 * @turnkey/sdk-server\@2.3.0 * @turnkey/http\@2.21.0 ## 1.1.14 ### Patch Changes * Updated dependencies \[3c44c4a] * Updated dependencies \[bfc833f] * @turnkey/sdk-browser\@1.14.0 * @turnkey/sdk-server\@2.2.0 * @turnkey/http\@2.20.0 ## 1.1.13 ### Patch Changes * Updated dependencies \[69d2571] * Updated dependencies \[57f9cb0] * @turnkey/sdk-browser\@1.13.0 * @turnkey/sdk-server\@2.1.0 * @turnkey/http\@2.19.0 ## 1.1.12 ### Patch Changes * Updated dependencies \[755833b] * @turnkey/sdk-browser\@1.12.1 * @turnkey/sdk-server\@2.0.1 ## 1.1.11 ### Patch Changes * Updated dependencies \[6695af2] * Updated dependencies \[1ebd4e2] * @turnkey/sdk-browser\@1.12.0 * @turnkey/sdk-server\@2.0.0 * @turnkey/http\@2.18.0 ## 1.1.10 ### Patch Changes * Updated dependencies \[053fbfb] * @turnkey/sdk-browser\@1.11.2 * @turnkey/sdk-server\@1.7.3 * @turnkey/http\@2.17.3 ## 1.1.9 ### Patch Changes * Updated dependencies \[328d6aa] * Updated dependencies \[b90947e] * Updated dependencies \[2d5977b] * Updated dependencies \[fad7c37] * @turnkey/sdk-browser\@1.11.1 * @turnkey/sdk-server\@1.7.2 * @turnkey/api-key-stamper\@0.4.4 * @turnkey/http\@2.17.2 ## 1.1.8 ### Patch Changes * Updated dependencies \[7988bc1] * Updated dependencies \[538d4fc] * Updated dependencies \[12d5aaa] * @turnkey/sdk-browser\@1.11.0 * @turnkey/sdk-server\@1.7.1 * @turnkey/http\@2.17.1 ## 1.1.7 ### Patch Changes * @turnkey/sdk-browser\@1.10.2 ## 1.1.6 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/sdk-server\@1.7.0 * @turnkey/http\@2.17.0 * @turnkey/sdk-browser\@1.10.1 ## 1.1.5 ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/sdk-browser\@1.10.0 ## 1.1.4 ### Patch Changes * Updated dependencies \[3dd74ac] * Updated dependencies \[1e36edf] * Updated dependencies \[4df8914] * Updated dependencies \[11a9e2f] * @turnkey/sdk-browser\@1.9.0 * @turnkey/sdk-server\@1.6.0 * @turnkey/http\@2.16.0 ## 1.1.3 ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/sdk-browser\@1.8.0 * @turnkey/sdk-server\@1.5.0 * @turnkey/http\@2.15.0 ## 1.1.2 ### Patch Changes * Updated dependencies \[abe7138] * Updated dependencies \[96d7f99] * @turnkey/sdk-server\@1.4.2 * @turnkey/sdk-browser\@1.7.1 * @turnkey/http\@2.14.2 * @turnkey/api-key-stamper\@0.4.3 ## 1.1.1 ### Patch Changes * Updated dependencies \[ff059d5] * Updated dependencies \[ff059d5] * @turnkey/sdk-browser\@1.7.0 * @turnkey/sdk-server\@1.4.1 * @turnkey/http\@2.14.1 * @turnkey/api-key-stamper\@0.4.2 ## 1.1.0 ### Minor Changes * bdded80: Support awaiting consensus * Add a few new helper functions: * `serializeSignature` serializes a raw signature ### Patch Changes * Updated dependencies \[c988ed0] * Updated dependencies \[848f8d3] * @turnkey/sdk-browser\@1.6.0 * @turnkey/sdk-server\@1.4.0 * @turnkey/http\@2.14.0 ## 1.0.21 ### Patch Changes * Updated dependencies \[1813ed5] * @turnkey/sdk-browser\@1.5.0 ## 1.0.20 ### Patch Changes * Updated dependencies \[bab5393] * Updated dependencies \[a16073c] * Updated dependencies \[7e7d209] * @turnkey/sdk-browser\@1.4.0 ## 1.0.19 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 * @turnkey/sdk-browser\@1.3.0 * @turnkey/sdk-server\@1.3.0 ## 1.0.18 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/sdk-browser\@1.2.4 * @turnkey/sdk-server\@1.2.4 * @turnkey/http\@2.12.3 ## 1.0.17 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.2.3 * @turnkey/sdk-server\@1.2.3 ## 1.0.16 ### Patch Changes * Updated dependencies * @turnkey/api-key-stamper\@0.4.1 * @turnkey/http\@2.12.2 * @turnkey/sdk-browser\@1.2.2 * @turnkey/sdk-server\@1.2.2 ## 1.0.15 ### Patch Changes * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 * @turnkey/sdk-browser\@1.2.1 * @turnkey/sdk-server\@1.2.1 ## 1.0.14 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 * @turnkey/sdk-browser\@1.2.0 * @turnkey/sdk-server\@1.2.0 ## 1.0.13 ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 * @turnkey/sdk-browser\@1.1.0 * @turnkey/sdk-server\@1.1.0 ## 1.0.12 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.0.0 * @turnkey/sdk-server\@1.0.0 ## 1.0.11 ### Patch Changes * @turnkey/sdk-browser\@0.4.1 ## 1.0.10 ### Patch Changes * Updated dependencies \[e4b29da] * @turnkey/sdk-browser\@0.4.0 ## 1.0.9 ### Patch Changes * Updated dependencies \[d409d81] * @turnkey/sdk-browser\@0.3.0 ## 1.0.8 ### Patch Changes * @turnkey/sdk-browser\@0.2.1 ## 1.0.7 ### Patch Changes * Updated dependencies * Updated dependencies \[e4d2a84] * @turnkey/sdk-browser\@0.2.0 * @turnkey/sdk-server\@0.2.0 ## 1.0.6 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@0.1.0 * @turnkey/sdk-server\@0.1.0 ## 1.0.5 ### Patch Changes * a6502e6: Add support for new Turnkey Client types ## 1.0.4 ### Patch Changes * Updated dependencies \[7a9ce7a] * @turnkey/http\@2.10.0 ## 1.0.3 ### Patch Changes * Updated dependencies * @turnkey/http\@2.9.1 ## 1.0.2 ### Patch Changes * Updated dependencies \[83b62b5] * @turnkey/http\@2.9.0 ## 1.0.1 ### Patch Changes * Updated dependencies \[46a7d90] * @turnkey/http\@2.8.0 ## 1.0.0 ### Major Changes Updates @turnkey/ethers package and examples to use ethers v6. Refer to [https://docs.ethers.org/v6/migrating](https://docs.ethers.org/v6/migrating) for full migration instructions. ✨Summary of Changes✨ `getBalance` is no longer a method on the signer. It must be obtained via the provider instance. Additionally, it requires an address to be passed in: ``` // before const balance = await connectedSigner.getBalance(); // after // first get the address const address = await connectedSigner.getAddress() // then pass it in const balance = await connectedSigner.provider?.getBalance(address) ``` `getChainId` is no longer a method on the signer. It must be obtained via the network object on the provider instance: ``` // before const chainId = await connectedSigner.getChainId(); // after const chainId = (await connectedSigner.provider?.getNetwork())?.chainId; ``` `getTransactionCount` is no longer a method on the signer. It must be obtained via the provider instance. Additionally, it requires an address to be passed in: ``` // before const transactionCount = await connectedSigner.getTransactionCount(); // after // first get the address const address = await connectedSigner.getAddress() // then pass it in const transactionCount = await connectedSigner.provider?.getTransactionCount(address); ``` `getFeeData` is no longer a method on the signer. It must be obtained via the provider instance: ``` // before const feeData = await connectedSigner.getFeeData(); // after const feeData = await connectedSigner.provider?.getFeeData(); ``` BigNumber -> bigint: numerical values such as, chainId, fee data, balance now use new ES6 primitive `bigint` instead of `BigNumber`. For example, when checking if the balance is `0`, `bigint` must now be used for comparison: ``` // before if (balance.isZero()) {...} // after if (balance === 0n) {...} ``` ## 0.19.9 ### Patch Changes * Updated dependencies * @turnkey/http\@2.7.1 ## 0.19.8 ### Patch Changes * Updated dependencies (\[c3b423b], \[d73725b]) * @turnkey/api-key-stamper\@0.4.0 * @turnkey/http\@2.7.0 ## 0.19.7 ### Patch Changes * Updated dependencies \[f9d636c] * @turnkey/http\@2.6.2 ## 0.19.6 ### Patch Changes * Updated dependencies \[52e2389] * @turnkey/http\@2.6.1 ## 0.19.5 ### Patch Changes * Updated dependencies \[7a3c890] * @turnkey/http\@2.6.0 ## 0.19.4 ### Patch Changes * Upgrade to Node v18 (#184) * Updated dependencies * @turnkey/api-key-stamper\@0.3.1 * @turnkey/http\@2.5.1 ## 0.19.3 ### Patch Changes * Updated dependencies \[464ac0e] * @turnkey/http\@2.5.0 ## 0.19.2 ### Patch Changes * @turnkey/http\@2.4.2 ## 0.19.1 ### Patch Changes * Updated dependencies \[f87ced8] * @turnkey/http\@2.4.1 ## 0.19.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ### Patch Changes * Updated dependencies \[fc5b291] * @turnkey/api-key-stamper\@0.3.0 * @turnkey/http\@2.4.0 ## 0.18.3 ### Patch Changes * Updated dependencies * @turnkey/api-key-stamper\@0.3.0 * @turnkey/http\@2.3.1 ## 0.18.2 ### Patch Changes * Updated dependencies \[f1bd68a] * @turnkey/http\@2.3.0 ## 0.18.1 ### Patch Changes * Updated dependencies \[ed50a0f] * Updated dependencies * @turnkey/http\@2.2.0 ## 0.18.0 ### Minor Changes * cf8631a: Update interface to support `signWith` This change supports signing with wallet account addresses, private key addresses, or private key IDs. See below for an example: ```js theme={"system"} const turnkeyClient = new TurnkeyClient( { baseUrl: "https://api.turnkey.com", }, // This uses API key credentials. // If you're using passkeys, use `@turnkey/webauthn-stamper` to collect webauthn signatures: // new WebauthnStamper({...options...}) new ApiKeyStamper({ apiPublicKey: "...", apiPrivateKey: "...", }), ); // Initialize a Turnkey Signer const turnkeySigner = new TurnkeySigner({ client: turnkeyClient, organizationId: "...", signWith: "...", }); ``` ## 0.17.4 ### Patch Changes * Updated dependencies \[bb6ea0b] * @turnkey/http\@2.1.0 ## 0.17.3 ### Patch Changes * Updated dependencies * @turnkey/http\@2.0.0 * Updated the shape of signing ## 0.17.2 ### Patch Changes * Updated dependencies * @turnkey/http\@1.3.0 ## 0.17.1 ### Patch Changes * Update documentation as follows: * ebf87a9: This breaking change adds support for stampers (@turnkey/api-key-stamper / @turnkey/webauthn-stamper) to integrate with API keys or passkeys, bringing it to parity with our [Viem](https://github.com/tkhq/sdk/tree/main/packages/viem) package. See the following examples for sample usage: * [with-ethers](https://github.com/tkhq/sdk/tree/main/examples/with-ethers): updated to use `@turnkey/api-key-stamper` * [with-ethers-and-passkeys](https://github.com/tkhq/sdk/tree/main/examples/with-ethers-and-passkeys): demonstrates usage of `@turnkey/webauthn-stamper` ## 0.17.0 ### Minor Changes * Add support for stampers (@turnkey/api-key-stamper / @turnkey/webauthn-stamper) to integrate with API keys or passkeys. ## 0.16.8 ### Patch Changes * Updated dependencies * @turnkey/http\@1.2.0 ## 0.16.7 ### Patch Changes * @turnkey/http\@1.1.1 ## 0.16.6 ### Patch Changes * Updated dependencies * @turnkey/http\@1.1.0 ## 0.16.5 ### Patch Changes * Updated dependencies \[8d1d0e8] * @turnkey/http\@1.0.1 ## 0.16.4 ### Patch Changes * 46473ec: This breaking change updates generated code to be shorter and more intuitive to read: * generated fetchers do not include the HTTP method in their name. For example `useGetGetActivity` is now `useGetActivity`, and `usePostSignTransaction` is `useSignTransaction`. * input types follow the same convention (no HTTP method in the name): `TPostCreatePrivateKeysInput` is now `TCreatePrivateKeysInput`. * the "federated" request helpers introduced in `0.18.0` are now named "signed" requests to better reflect what they are. `FederatedRequest` is now `SignedRequest`, and generated types follow. For example: `federatedPostCreatePrivateKeys` is now `signCreatePrivateKeys`, `federatedGetGetActivity` is now `signGetActivity`, and so on. The name updates should be automatically suggested if you use VSCode since the new names are simply shorter versions of the old one. * Updated dependencies \[46473ec] * Updated dependencies \[38b424f] * @turnkey/http\@1.0.0 ## 0.16.3 ### Patch Changes * Updated dependencies * @turnkey/http\@0.18.1 ## 0.16.2 ### Patch Changes * Updated dependencies * @turnkey/http\@0.18.0 ## 0.16.1 ### Patch Changes * Updated dependencies * @turnkey/http\@0.17.1 ## 0.16.0 ### Minor Changes * No public facing changes ### Patch Changes * Updated dependencies \[9317f51] * @turnkey/http\@0.17.0 ## 0.15.0 ### Minor Changes * No public facing changes ### Patch Changes * Updated dependencies * @turnkey/http\@0.16.0 * Fix `.postGetPrivateKey(...)`'s underlying path, while adding `@deprecated` `.postGetPrivateKeyBackwardsCompat(...)` for backward compatibility ## 0.14.1 ### Patch Changes * Updated dependencies * @turnkey/http\@0.15.0 ## 0.14.0 ### Minor Changes * `signTransaction(...)` now verifies and drops `tx.from` if present * This mimics the behavior of ethers' Wallet [implementation](https://github.com/ethers-io/ethers.js/blob/f97b92bbb1bde22fcc44100af78d7f31602863ab/packages/wallet/src.ts/index.ts#L117-L121) ### Patch Changes * Updated dependencies * @turnkey/http\@0.14.0 ## 0.13.2 ### Patch Changes * New `TurnkeyRequestError` error class that contains rich error details * Updated dependencies * @turnkey/http\@0.13.2 ## 0.13.1 ### Patch Changes * Error messages now contain Turnkey-specific error details * Updated dependencies * @turnkey/http\@0.13.1 ## 0.13.0 ### Minor Changes * No public facing changes ### Patch Changes * Updated dependencies * @turnkey/http\@0.13.0 ## 0.12.0 ### Minor Changes * Error messages now contain Turnkey-specific error code and message ### Patch Changes * Updated dependencies * @turnkey/http\@0.12.0 ## 0.11.0 ### Minor Changes * `TurnkeySigner` now conforms to ethers' `TypedDataSigner` interface ### Patch Changes * Updated dependencies * @turnkey/http\@0.11.0 ## 0.10.0 ### Minor Changes * Added EIP-712 support for signing typed data to Ethers. * Update Gnosis example to make use of new signing functionality. ### Patch Changes * Updated dependencies * @turnkey/http\@0.10.0 ## 0.9.0 ### Minor Changes * Improved support for React Native runtime ([https://github.com/tkhq/sdk/pull/37](https://github.com/tkhq/sdk/pull/37)) ### Patch Changes * Updated dependencies * @turnkey/http\@0.9.0 ## 0.8.1 ### Patch Changes * Switched from `undici` to `cross-fetch` to improve bundler compatibility * Updated dependencies * @turnkey/http\@0.8.1 ## 0.8.0 ### Minor Changes * Added browser runtime support — `@turnkey/ethers` is now a universal (isomorphic) package * Dropped support for Node.js v14; we recommend using Node v18+ ### Patch Changes * Updated dependencies * @turnkey/http\@0.8.0 ## 0.7.0 ### Minor Changes * No public facing changes ### Patch Changes * Updated dependencies * @turnkey/http\@0.7.0 ## 0.6.0 ### Minor Changes * `#signMessage(...)`: move encoding and hashing logic to client side, `eth_sign` style ### Patch Changes * Updated dependencies * @turnkey/http\@0.6.0 ## 0.5.0 ### Minor Changes * Arbitrary message signing ### Patch Changes * Updated dependencies * @turnkey/http\@0.5.0 ## 0.4.0 ### Minor Changes * `timestamp` -> `timestampMs` ### Patch Changes * Updated dependencies * @turnkey/http\@0.4.0 ## 0.3.1 ### Patch Changes * Fix outdated artifact * Updated dependencies * @turnkey/http\@0.3.1 ## 0.3.0 ### Minor Changes * `keyId` -> `privateKeyId` everywhere ### Patch Changes * Updated dependencies * @turnkey/http\@0.3.0 ## 0.2.0 ### Minor Changes * Change parameter from `keyId` to `privateKeyId` * Bump API version to latest Beta ### Patch Changes * Updated dependencies * @turnkey/http\@0.2.0 ## 0.1.3 ### Patch Changes * Support runtime config for credentials * Updated dependencies * @turnkey/http\@0.1.3 ## 0.1.2 ### Patch Changes * Drop internal dev dependency * Updated dependencies * @turnkey/http\@0.1.2 ## 0.1.1 ### Patch Changes * Initial release * Updated dependencies * @turnkey/http\@0.1.1 # Go Source: https://docs.turnkey.com/changelogs/golang/readme # CHANGELOG ## [v0.3.0](https://github.com/tkhq/go-sdk/compare/v0.2.0...v0.3.0) (2025-02-19) * Update per mono release v2025.2.1 * Introduces new `GetWalletAccount` query ## [v0.2.0](https://github.com/tkhq/go-sdk/compare/v0.1.0...v0.2.0) (2025-02-13) * Update per mono release v2025.1.11 * Update vulnerable go crypto package ## [v0.1.0](https://github.com/tkhq/go-sdk/compare/8c73e973e9a5e1e4cfabef7aaae24a8fad91478f...v0.1.0) (2025-01-17) * First "official" beta release! 🥳 * Because it's the first, this release version corresponds to the latest changes merged in `8c73e973e9a5e1e4cfabef7aaae24a8fad91478f` # Http Source: https://docs.turnkey.com/changelogs/http/readme # @turnkey/http ## 3.16.1 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/api-key-stamper\@0.6.0 ## 3.16.0 ### Minor Changes * [#1153](https://github.com/tkhq/sdk/pull/1153) [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea) Thanks [@moe-dev](https://github.com/moe-dev)! - Update as per mono v2025.12.3. ### Behavioral Changes * `appName` is now **required**: * In `emailCustomization` for Email Auth activities * At the top-level intent for OTP activities * Auth proxy endpoints are **not affected** ### Activity Version Bumps The following activity types have been versioned: * `ACTIVITY_TYPE_INIT_OTP` → `ACTIVITY_TYPE_INIT_OTP_V2` * `ACTIVITY_TYPE_INIT_OTP_AUTH_V2` → `ACTIVITY_TYPE_INIT_OTP_V3` * `ACTIVITY_TYPE_EMAIL_AUTH_V2` → `ACTIVITY_TYPE_EMAIL_AUTH_V3` * `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY` -> `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2` ## 3.15.0 ### Minor Changes * [#1072](https://github.com/tkhq/sdk/pull/1072) [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b) Thanks [@moe-dev](https://github.com/moe-dev)! - Bump packages as per mono v2025.11.0 ## 3.14.0 ### Minor Changes * [#1058](https://github.com/tkhq/sdk/pull/1058) [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release `v2025.10.10-hotfix.2` ## 3.13.1 ### Patch Changes * [#1016](https://github.com/tkhq/sdk/pull/1016) [`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1) Author [@amircheikh](https://github.com/amircheikh) - Synced API as per mono v2025.10.2 ## 3.13.0 ### Minor Changes * [#977](https://github.com/tkhq/sdk/pull/977) [`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241) Author [@besler613](https://github.com/besler613) - OAuth2Authenticate now supports returning the encrypted bearer token via the optional `bearerTokenTargetPublicKey` request parameter (mono release v2025.9.5) ## 3.12.1 ### Patch Changes * [#958](https://github.com/tkhq/sdk/pull/958) [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f) Author [@amircheikh](https://github.com/amircheikh) - - Synced api with mono ## 3.12.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/encoding\@0.6.0 * @turnkey/webauthn-stamper\@0.6.0 * @turnkey/api-key-stamper\@0.5.0 ## 3.11.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.6 * @turnkey/api-key-stamper\@0.5.0-beta.6 ## 3.11.0 ### Minor Changes * [#879](https://github.com/tkhq/sdk/pull/879) [`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158) Author [@zkharit](https://github.com/zkharit) - Update packages to include new activities as of the newest release (mono v2025.8.10) ## 3.10.0-beta.2 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/webauthn-stamper\@0.6.0-beta.0 * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/encoding\@0.6.0-beta.5 ## 3.10.0-beta.1 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.4 * @turnkey/api-key-stamper\@0.4.8-beta.4 ## 3.10.0-beta.0 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.3 * @turnkey/api-key-stamper\@0.4.8-beta.3 ## 3.10.0 ### Minor Changes * [#861](https://github.com/tkhq/sdk/pull/861) [`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6) Author [@amircheikh](https://github.com/amircheikh) - Synced as per mono 2025.8.4 ## 3.9.0 ### Minor Changes * [#834](https://github.com/tkhq/sdk/pull/834) [`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release v2025.8.3-hotfix.0 ## 3.8.1-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 ## 3.8.1-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 ## 3.8.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@1.0.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 ## 3.8.0 ### Minor Changes * [#826](https://github.com/tkhq/sdk/pull/826) [`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0) Author [@turnekybc](https://github.com/turnekybc) - Update per mono release v2025.8.1 ## 3.7.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ## 3.6.0 ### Minor Changes * [#782](https://github.com/tkhq/sdk/pull/782) [`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e) Thanks [@r-n-o](https://github.com/r-n-o)! - Release v2025.7.16 ## 3.5.1 ### Patch Changes * [#763](https://github.com/tkhq/sdk/pull/763) [`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a) Author [@andrewkmin](https://github.com/andrewkmin) - Release per mono v2025.7.1. This release contains the following API changes: * Introduction of `SmartContractInterfaces`: we've now exposed endpoints for uploading ABIs and IDLs to help secure EVM and Solana signing flows. For more information, see our docs [here](https://docs.turnkey.com/concepts/policies/smart-contract-interfaces) ## 3.5.0 ### Minor Changes * [#704](https://github.com/tkhq/sdk/pull/704) [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd) Author [@amircheikh](https://github.com/amircheikh) - Added `name` field to constructor. `isHttpClient` now uses this new field to complete the check. This fixes a bug where `isHttpClient` would fail the check under certain production environments. Synced with mono 2025.6.10 to include the following endpoints: `update_user_email`: Update a User's email in an existing Organization `update_user_name`: Update a User's name in an existing Organization `update_user_phone_number`: Update a User's phone number in an existing Organization ### Patch Changes * Updated dependencies \[[`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/api-key-stamper\@0.4.7 ## 3.4.2 ### Patch Changes * [#665](https://github.com/tkhq/sdk/pull/665) [`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772) Author [@amircheikh](https://github.com/amircheikh) - Exposed `isHttpClient` function for determining if a passed in client is from turnkey/http ## 3.4.1 ### Patch Changes * [#663](https://github.com/tkhq/sdk/pull/663) [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2) Thanks [@moe-dev](https://github.com/moe-dev)! - Update to endpoints as per mono v2025.5.7. Add V5 TON address format generation. Non breaking * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a)]: * @turnkey/webauthn-stamper\@0.5.1 * @turnkey/encoding\@0.5.0 * @turnkey/api-key-stamper\@0.4.6 ## 3.4.0 ### Minor Changes * Added new authentication activities: * STAMP\_LOGIN: Handles authentication flows for passkeys, wallet logins, and session refresh. Initiated by sub-organizations; returns a session JWT. * INIT\_OTP: Initiates sending a 6–9 digit or bech32 alphanumeric OTP to an email or phone. Initiated by the parent organization. * VERIFY\_OTP: Verifies the OTP and returns a verification token. Initiated by the parent organization. * OTP\_LOGIN: Completes OTP-based authentication by verifying a tokenized OTP challenge and establishing a session. Initiated by the parent organization; returns a session JWT. * OAUTH\_LOGIN: Finalizes OAuth-based logins from third-party OIDC providers. Initiated by the parent organization; returns a session JWT. ## 3.3.0 ### Minor Changes * 25ca339: Adding replyToEmailAddress field for specifying reply-to when using a customer sender ## 3.2.0 ### Minor Changes * 3f6e415: Update per mono v2025.4.5 * Introduces Tron transaction parsing and policy engine support. For more information, take a look at our [docs](https://docs.turnkey.com/networks/tron) ### Patch Changes * Updated dependencies \[4d1d775] * @turnkey/api-key-stamper\@0.4.5 ## 3.1.0 ### Minor Changes * 3e4a482: Release per mono v2025.4.4 * Adds parsing and policy engine support for Ethereum Type 3 (EIP-4844) and Type 4 (EIP-7702) transactions. There is no change to any signing interface or API; you simply can now use Turnkey's signing endpoints to sign those transaction types. See [with-viem](https://github.com/tkhq/sdk/blob/main/examples/with-viem/) for examples. * New wallet account creations will now automatically derive the underlying derived account's public key. For example: previously, if derived an Ethereum wallet account, you would get the resulting Ethereum address (`0x...`). If you also wanted the public key associated with that underlying key, you would've had to derive an additional wallet account with `ADDRESS_FORMAT_COMPRESSED`. Now, this will automatically be derived for you. It is now a property that has been added to the wallet account primitive (i.e. accessible via `walletAccount.publicKey`). ## 3.0.0 ### Major Changes * f94d36e: Remove deprecated TurnkeyApiService. TurnkeyApi should be used instead. ### Minor Changes * d1083bd: New activity `INIT_OTP_AUTH_V2` which allows alphanumeric boolean and otpLength (6-9) to be passed * This release introduces the `INIT_OTP_AUTH_V2` activity. The difference between it and `INIT_OTP_AUTH` is that it can now accept `alphanumeric` and `otpLength` for selecting crockford bech32 alphanumeric codes and the length of those codes. By default alphanumeric = true, otpLength = 9 * This release introduces `sendFromEmailSenderName` to `INIT_OTP_AUTH`, `INIT_OTP_AUTH_V2`, `EMAIL_AUTH` and `EMAIL_AUTH_V2`. This is an optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'. ## 2.22.0 ### Minor Changes * ecdb29a: Update API as per mono v2025.3.2 * This release introduces the `CREATE_USERS_V3` activity. The difference between it and `CREATE_USERS_V2` is that it can now accept `userPhoneNumber` and `oauthProviders`. In total, it accepts the following parameters: ```javascript theme={"system"} /** @description A list of Users. */ users: { /** @description Human-readable name for a User. */ userName: string; /** @description The user's email address. */ userEmail?: string; /** @description The user's phone number in E.164 format e.g. +13214567890 */ userPhoneNumber?: string; /** @description A list of API Key parameters. This field, if not needed, should be an empty array in your request body. */ apiKeys: definitions["v1ApiKeyParamsV2"][]; /** @description A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body. */ authenticators: definitions["v1AuthenticatorParamsV2"][]; /** @description A list of Oauth providers. This field, if not needed, should be an empty array in your request body. */ oauthProviders: definitions["v1OauthProviderParams"][]; /** @description A list of User Tag IDs. This field, if not needed, should be an empty array in your request body. */ userTags: string[]; } ``` See [source code](https://github.com/tkhq/sdk/blob/60c0c03440785b841d1f6f393612046423dc665f/packages/http/src/__generated__/services/coordinator/public/v1/public_api.types.ts#L2894-L2909) to view details on the nested types. ## 2.21.0 ### Minor Changes * 56a307e: Update API to mono v2025.3.0 * This release introduces an `invalidateExisting` flag to the `CreateReadWriteSession` and `Oauth` activities. If enabled, this will invalidate existing read-write and oauth API keys. This is useful in scenarios where a user attempts to create numerous `ReadWrite` or `Oauth` sessions. Because our API caps the number of session keys associated with a user, this flag can clear all other existing session keys of that specific type (e.g. setting `invalidateExisting: true` for `CreateReadWriteSession` will invalidate all previously created read-write session keys) ## 2.20.0 ### Minor Changes * 3c44c4a: Updates per mono release v2025.2.2 ## 2.19.0 ### Minor Changes * 57f9cb0: Update endpoints - surface `GetWalletAccount`. This endpoint takes in the following args: ```javascript theme={"system"} /** @description Unique identifier for a given Organization. */ organizationId: string; /** @description Unique identifier for a given Wallet. */ walletId: string; /** @description Address corresponding to a Wallet Account. */ address?: string; /** @description Path corresponding to a Wallet Account. */ path?: string; ``` ## 2.18.0 ### Minor Changes * 6695af2: Update per mono release v2025.1.11 ## 2.17.3 ### Patch Changes * 053fbfb: Update mono dependencies ## 2.17.2 ### Patch Changes * Updated dependencies \[2d5977b] * @turnkey/api-key-stamper\@0.4.4 ## 2.17.1 ### Patch Changes * 538d4fc: Update api endpoints - NEW: User verification, SMS customization params ## 2.17.0 ### Minor Changes * 78bc39c: Add default accounts for various address types * Add wallet account ID to list wallets endpoint ## 2.16.0 ### Minor Changes * 4df8914: Version bump corresponding to mono release v2024.10.10. * Improved error message for duplicate activity submission * Address derivation support for DOGE, TON, SEI, XLM * Fix server side error if sub\_org doesn’t have email and/or phone number ## 2.15.0 ### Minor Changes * 9ebd062: Release OTP functionality ## 2.14.2 ### Patch Changes * 96d7f99: Update dependencies * Updated dependencies \[e5c4fe9] * @turnkey/encoding\@0.4.0 * @turnkey/api-key-stamper\@0.4.3 ## 2.14.1 ### Patch Changes * ff059d5: Update dependencies * Updated dependencies \[93666ff] * @turnkey/encoding\@0.3.0 * @turnkey/api-key-stamper\@0.4.2 ## 2.14.0 ### Minor Changes * 848f8d3: Add new helpers and update types and errors * `getSignatureFromActivity` returns the signature corresponding to a completed activity * `getSignedTransactionFromActivity` returns the signed transaction corresponding to a completed activity * `assertActivityCompleted` checks the state of an activity and throws an error if the activity either requires consensus or is otherwise not yet completed * `TERMINAL_ACTIVITY_STATUSES` is a const containing all terminal activity statuses. Useful for checking on an activity * `TurnkeyActivityError` now uses `undefined` instead of `null` * Export some additional types: `TActivity`, `TActivityId`, `TActivityStatus`, `TActivityType` ## 2.13.0 ### Minor Changes * 93dee46: Add create read write session v2 which allows for user targeting directly from stamp or optional userId in intent ## 2.12.3 ### Patch Changes * e2f2e0b: Added two new endpoints for deleting private keys and deleting wallets ## 2.12.2 ### Patch Changes * 2d7e5a9: fix a (currently unused) return value * Updated dependencies * @turnkey/api-key-stamper\@0.4.1 * @turnkey/encoding\@0.2.1 ## 2.12.1 ### Patch Changes * f17a229: Update to oauth related endpoints to drop jwks uri from oauth providers ## 2.12.0 ### Minor Changes * Add Email Auth V2 - Optional invalidate exisiting Email Authentication API keys ## 2.11.0 ### Minor Changes * Update to use new endpoints. Including CREATE\_READ\_WRITE\_SESSION which allows one shot passkey sessions (returns org information and a credential bundle) and CREATE\_API\_KEYS\_V2 which allows a curve type to be passed (SECP256K1 or P256) ## 2.10.0 ### Minor Changes * 7a9ce7a: Sync 2024.3.16 ## 2.9.1 ### Patch Changes * Update generated files to latest release: optional pagination options were added to list sub-organization and list wallet account endpoints. ## 2.9.0 ### Minor Changes * 83b62b5: Sync types for latest release ## 2.8.0 ### Minor Changes * 46a7d90: Update to v2024.2.1 API: add activities to initialize wallet import, import wallet, delete users, delete private key tags, delete user tags, and list sub-organizations ## 2.7.1 ### Patch Changes * Update to v2024.2.0 API types: `mnemonicLength` is now a number instead of a string ## 2.7.0 ### Minor Changes * Introduce and reference `@turnkey/encoding` to consolidate utility functions * Updated dependencies (\[c3b423b], \[d73725b]) * @turnkey/webauthn-stamper\@0.5.0 * @turnkey/api-key-stamper\@0.4.0 * @turnkey/encoding\@0.1.0 ## 2.6.2 ### Patch Changes * b45a9ac: Include package version in request headers * f9d636c: Export VERSION from turnkey/http ## 2.6.1 ### Patch Changes * 52e2389: Revert version export (#186 and #187) ## 2.6.0 ### Minor Changes * 0794f41: Add VERSION constant * 7a3c890: Add key export support ### Patch Changes * 4517e3b: Update version string to include package name ## 2.5.1 ### Patch Changes * Upgrade to Node v18 (#184) * Updated dependencies * @turnkey/webauthn-stamper\@0.4.3 * @turnkey/api-key-stamper\@0.3.1 ## 2.5.0 ### Minor Changes * 464ac0e: Update protos for latest release, which includes: * Support optional expirations for API keys, configurable via the `expirationSeconds` parameter. * Support Email Auth. Details to follow ⚡️ ## 2.4.2 ### Patch Changes * Updated dependencies \[a03e385] * @turnkey/webauthn-stamper\@0.4.2 ## 2.4.1 ### Patch Changes * Fix universal files to stop using `require`. Use ES6 imports instead (#178) * Updated dependencies \[f87ced8] * @turnkey/webauthn-stamper\@0.4.1 ## 2.4.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ### Patch Changes * Updated dependencies \[fc5b291] * @turnkey/api-key-stamper\@0.3.0 * @turnkey/webauthn-stamper\@0.4.0 ## 2.3.1 ### Patch Changes * Updated dependencies * @turnkey/api-key-stamper\@0.2.0 ## 2.3.0 ### Minor Changes * Sync protos from latest public endpoints ## 2.2.0 ### Minor Changes * Add ESM to package dist (#154) ### Patch Changes * ed50a0f: simplify types ## 2.1.0 ### Minor Changes * bb6ea0b: Update generated files * new query endpoints to retrieve wallets (`/public/v1/query/list_wallets`) * new query endpoint to retrieve wallet accounts (`/public/v1/query/list_wallet_accounts`) ## 2.0.0 ### Major Changes * Synced protos from mono ### Upgrade notes * `signRawPayload` and `signTransaction` now expect a `signWith` param instead of `privateKeyId` previously * `signRawPayload` and `signTransaction` have been updated to expect a new type: `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2` and `ACTIVITY_TYPE_SIGN_TRANSACTION_V2`, respectively * If you have policies authorizing `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD` or `ACTIVITY_TYPE_SIGN_TRANSACTION` specifically, they will need to be updated to authorize `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2` and `ACTIVITY_TYPE_SIGN_TRANSACTION_V2` (or better yet, update your policies to allow all signing actions categorically using policy resources and actions. See [https://docs.turnkey.com/managing-policies/examples](https://docs.turnkey.com/managing-policies/examples)) * `createSubOrganization` now uses `ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4` under the hood, which utilizes wallets. The shape of the request has been updated to include the following parameter, `wallet`. Here's an example: ```js theme={"system"} { ... wallet: { walletName: "Default Wallet", accounts: [ { curve: "CURVE_SECP256K1", pathFormat: "PATH_FORMAT_BIP32", path: "m/44'/60'/0'/0/0", addressFormat: "ADDRESS_FORMAT_ETHEREUM", }, ], }, } ``` See [https://docs.turnkey.com/concepts/sub-organizations](https://docs.turnkey.com/concepts/sub-organizations) for more details. ## 1.3.0 ### Minor Changes * Synced protos from mono * Adds base URL check during initialization (closes [https://github.com/tkhq/sdk/issues/124](https://github.com/tkhq/sdk/issues/124)) * The following are new features additions, fresh out the oven. Still getting them ready for primetime! Refreshed examples to come soon™️. Stay tuned and reach out to the Turnkey team if you have any questions. * Wallets: * 🟢 `ACTIVITY_TYPE_CREATE_WALLET` (via `/api/v1/submit/create_wallet`): create a HD wallet * 🟢 `ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS` (via `/api/v1/submit/create_wallet_accounts`): create a wallet account (address) * 🟢 `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2` (via `/api/v1/submit/sign_raw_payload_v2`): sign a payload with a specified private key or address * 🟢 `ACTIVITY_TYPE_SIGN_TRANSACTION_V2` (via `/api/v1/submit/sign_transaction_v2`): sign a transaction with a specified private key or address * Organization features: * 🟢 `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` (via `/api/v1/submit/set_organization_feature`): set an organization feature * 🟢 `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE` (via `/api/v1/submit/remove_organization_feature`): remove an organization feature * Only one feature supported as of this time; additional documentation to follow. * Export private key: * 🟡 `ACTIVITY_TYPE_EXPORT_PRIVATE_KEY` (via `/api/v1/submit/export_private_key`): export a private key, encrypted to a target public key. We do not yet have CLI or front-end tooling to use this safely; stay tuned! * Email recovery: * 🟡 `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY` (via `/api/v1/submit/init_user_email_recovery`): initialize a new email recovery flow Note: * 🟢: good to go! * 🟡: these endpoints are safe to use, but still experimental/unstable. Check back for updates and guidance. ### Patch Changes * Updated dependencies * @turnkey/webauthn-stamper\@0.2.0 ## 1.2.0 ### Minor Changes * The `createSubOrganization` request has been updated under the hood: * Calling `.createSubOrganization` on our HTTP client will trigger an activity of type `CREATE_SUB_ORGANIZATION_V3` instead of `CREATE_SUB_ORGANIZATION_V2` previously. * If there are any policies referencing `CREATE_SUB_ORGANIZATION_V2` specifically, they will no longer work out of the box if creating sub-orgs via SDK. These policies will need to be updated to allow `CREATE_SUB_ORGANIZATION_V3`. See policy examples related to access control [here](https://docs.turnkey.com/managing-policies/examples#access-control) for additional methods of constructing policies. * `CREATE_SUB_ORGANIZATION_V3` supports everything `CREATE_SUB_ORGANIZATION_V2` supports, with the addition of a `privateKeys` field to atomically create a sub-org with private keys. If no private keys are desired, simply provide an empty array. * **NOTE**: when reading `createSubOrganization` results, SDK users will now need to look at `activity.result.createSubOrganizationResultV3` instead of the previously valid `activity.result.createSubOrganizationResult`. ## 1.1.1 ### Patch Changes * Updated dependencies * @turnkey/api-key-stamper\@0.1.1 ## 1.1.0 ### Minor Changes New exports: * new `TurnkeyClient`. This is now the preferred interface to make Turnkey requests, because it supports both API keys and webauthn-signed requests. It also doesn't rely on global initialization * new method to poll requests: `createActivityPoller` Deprecation notices: * deprecate `TurnkeyApi` (use `TurnkeyClient` instead), `init`, `browserInit` (no need for them anymore if you're using `TurnkeyClient`), and `withAsyncPolling` (use `createActivityPoller` instead) * deprecate `SignedRequest` in favor of `TSignedRequest`. Besides the more correct name, `TSignedRequest` differs in its `stamp` property. It now stores the stamper header name as well as value, so users do not have to hardcode Turnkey stamp header names (e.g. "X-Stamp-Webauthn"). Update our swagger and generated files to latest versions: * new endpoint to update users: `/public/v1/submit/update_user` * pagination `limit` option has been updated to `string` instead of number for consistency with other pagination options Signing is now performed through Turnkey stampers. New dependencies: * @turnkey/webauthn-stamper\@0.1.0 * @turnkey/api-key-stamper\@0.1.0 ## 1.0.1 ### Patch Changes * 8d1d0e8: Synced protos from mono ## 1.0.0 ### Major Changes * 46473ec: This breaking change updates generated code to be shorter and more intuitive to read: * generated fetchers do not include the HTTP method in their name. For example `useGetGetActivity` is now `useGetActivity`, and `usePostSignTransaction` is `useSignTransaction`. * input types follow the same convention (no HTTP method in the name): `TPostCreatePrivateKeysInput` is now `TCreatePrivateKeysInput`. * the "federated" request helpers introduced in `0.18.0` are now named "signed" requests to better reflect what they are. `FederatedRequest` is now `SignedRequest`, and generated types follow. For example: `federatedPostCreatePrivateKeys` is now `signCreatePrivateKeys`, `federatedGetGetActivity` is now `signGetActivity`, and so on. The name updates should be automatically suggested if you use VSCode since the new names are simply shorter versions of the old one. ### Patch Changes * 38b424f: Sync public api types ## 0.18.1 ### Patch Changes * Synced protos from mono ## 0.18.0 ### Minor Changes * Add support for federated requests (an example is included under `sdk/examples/with-federated-passkeys`) * Routine re-sync protos from mono ## 0.17.1 ### Patch Changes * Re-sync protos from mono. No public-facing changes. ## 0.17.0 ### Minor Changes * Added support for ed25519 * New endpoint to programmatically approve or reject activities (`/submit/approve_activity`, `/submit/reject_activity`) * New endpoint to programmatically create authenticators (`/submit/create_authenticators`) * New endpoints to update Private Key tags (`/submit/update_private_key_tag`) * New endpoints to update User tags (`/submit/update_user_tag`) * Simplified shape for `AuthenticatorParams` with a new `AuthenticatorParamsV2`. To take advantage of this new shape, use `ACTIVITY_TYPE_CREATE_USERS_V2` and the new `ACTIVITY_TYPE_CREATE_AUTHENTICATORS`. ## 0.16.0 ### Minor Changes * Fix `.postGetPrivateKey(...)`'s underlying path, while adding `@deprecated` `.postGetPrivateKeyBackwardsCompat(...)` for backward compatibility ## 0.15.0 ### Minor Changes * Export a new helper for offline request signing: `sealAndStampRequestBody(...)`. ## 0.14.0 ### Minor Changes * Updated the `addressFormats` enum field in `/submit/create_private_keys` ## 0.13.2 ### Patch Changes * New `TurnkeyRequestError` error class that contains rich error details ## 0.13.1 ### Patch Changes * Error messages now contain Turnkey-specific error details ## 0.13.0 ### Minor Changes * New `/submit/create_api_only_users` endpoint: `TurnkeyApi.postCreateApiOnlyUsers(...)` * Marked `TurnkeyApi.postCreateUsers(...)` as deprecated * Improved documentation on methods (via TSDoc) ## 0.12.0 ### Minor Changes * Error messages now contain Turnkey-specific error code and message ## 0.11.0 ### Minor Changes * New `/submit/create_users` endpoint: `TurnkeyApi.postCreateUsers(...)` ## 0.10.0 ### Minor Changes * No public-facing changes ## 0.9.0 ### Minor Changes * Improved support for React Native runtime ([https://github.com/tkhq/sdk/pull/37](https://github.com/tkhq/sdk/pull/37)) ## 0.8.1 ### Patch Changes * Switched from `undici` to `cross-fetch` to improve bundler compatibility ## 0.8.0 ### Minor Changes * Added browser runtime support — `@turnkey/http` is now a universal (isomorphic) package * The API fetchers are now exported as namespace `TurnkeyApi`. `PublicApiService` has been marked as deprecated, but will remain functional until we hit v1.0. * Dropped support for Node.js v14; we recommend using Node v18+ ## 0.7.0 ### Minor Changes * Improved documentation * Added `withAsyncPolling(...)` helper to provide built-in async polling support. Read more: * [https://github.com/tkhq/sdk/tree/main/packages/http#withasyncpolling-helper](https://github.com/tkhq/sdk/tree/main/packages/http#withasyncpolling-helper) ## 0.6.0 ### Minor Changes * Improved OpenAPI documentation ## 0.5.0 ### Minor Changes * Arbitrary message signing ## 0.4.0 ### Minor Changes * `timestamp` -> `timestampMs` ## 0.3.1 ### Patch Changes * Fix outdated artifact ## 0.3.0 ### Minor Changes * `keyId` -> `privateKeyId` everywhere ## 0.2.0 ### Minor Changes * Change parameter from `keyId` to `privateKeyId` * Bump API version to latest Beta ## 0.1.3 ### Patch Changes * Support runtime config for credentials ## 0.1.2 ### Patch Changes * Drop internal dev dependency ## 0.1.1 ### Patch Changes * Initial release * Updated dependencies * @turnkey/jest-config\@0.1.1 # Iframe Stamper Source: https://docs.turnkey.com/changelogs/iframe-stamper/readme # @turnkey/iframe-stamper ## 2.9.0 ### Minor Changes * [#1104](https://github.com/tkhq/sdk/pull/1104) [`850a3ee`](https://github.com/tkhq/sdk/commit/850a3ee5dbb5e2cc46bda50348c917c555e55f73) Author [@ethankonk](https://github.com/ethankonk) - Added ability to toggle passphrase input for the import iframe ## 2.8.0 ### Minor Changes * [#1103](https://github.com/tkhq/sdk/pull/1103) [`7ac558c`](https://github.com/tkhq/sdk/commit/7ac558c39c3fa0ddeb6e695182a49f03ee6d4f00) Author [@andrewkmin](https://github.com/andrewkmin) - Add optional address parameter for methods intended to be used within the export-and-sign iframe. Also improves documentation (TypeDocs) ## 2.7.1 ### Patch Changes * [#1086](https://github.com/tkhq/sdk/pull/1086) [`2fd1d55`](https://github.com/tkhq/sdk/commit/2fd1d5555dd358a1c0210ca65fd6ca70ff172058) Author [@amircheikh](https://github.com/amircheikh) - Updated `TIframeStamperConfig` to include `clearClipboardOnPaste`. Defaulting to true, this will grant the iframe `clipboard-write` permissions. Allows clipboard to be cleared after pasting in secrets to import. ## 2.7.0 ### Minor Changes * [#945](https://github.com/tkhq/sdk/pull/945) [`e76d2bf`](https://github.com/tkhq/sdk/commit/e76d2bfbe3fb481aedac9b992260c50217823e8a) Author [@andrewkmin](https://github.com/andrewkmin) - Pressure-test and add the following functionality: `signMessage`, `signTransaction`, `clearEmbeddedPrivateKey`. Each of these are to be used in very specific scenarios where we want to perform operations with a decrypted key living in an iframe. ## 2.6.0 ## 2.6.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ## 2.5.0 ### Minor Changes * e501690: Add new utility functions * Add `clearEmbeddedKey()` async function, which clears the embedded key within an iframe * Add `initEmbeddedKey()` async function, which reinitializes the embedded key within an iframe ## 2.4.0 ### Minor Changes * a833088: Add `getEmbeddedPublicKey()` async function to get the public key of the live embedded key within the iframe ## 2.3.0 ### Minor Changes * 9147962: Add `dangerouslyOverrideIframeKeyTtl` option to override iframe embedded key TTL (for longer lived read/write sessions) ## 2.2.0 ### Minor Changes * a216a47: Add `requestId` to iframe requests. This allows developers to send multiple requests at once to an iframe, and have the corresponding responses be handled correctly (in order) ## 2.1.0 ### Minor Changes * fad7c37: `@turnkey/iframe-stamper` - Implemented MessageChannel API for secure communication between the parent and iframe. @turnkey/sdk-browser - fixed spelling in package.json @turnkey/sdk-server - fixed spelling in package.json ## 2.0.0 ### Major Changes * 5d0bfde: Include `organizationId` and `userId` in injected import and export bundles. ### Minor Changes * 2f2d09a: Add implementation for `applySettings()` * This is a function to apply settings on allowed parameters in the iframe. * Ultimately, this is used to style the HTML element used for plaintext in wallet and private key import. ### Patch Changes * 976663e: Add `sandbox` attribute to iframe element ## 1.2.0 ### Minor Changes * 0281b88: Remove optional publicKey parameter from injectKeyExportBundle. * 0e3584a: Add optional keyFormat and publicKey parameters to injectKeyExportBundle. Add extractKeyEncryptedBundle. ## 1.1.0 ### Minor Changes * 46a7d90: Add injectImportBundle and extractWalletEncryptedBundle to support wallet import. ## 1.0.0 ### Major Changes * This breaking change uses an HTML element instead of an ID to reference the iframe's container. ## 0.4.1 ### Patch Changes * Upgrade to Node v18 (#184) ## 0.4.0 ### Minor Changes * c98c222: - Add support for auth (e.g. via email), and include recovery under it. Note that the preferred path is now to use `injectCredentialBundle`, as opposed to `injectRecoveryBundle` (deprecated). ## 0.3.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ## 0.2.1 ### Patch Changes * Catch and bubble up errors in the underlying iframe by listening to `ERROR` events (#165) ## 0.2.0 ### Minor Changes * Support wallet and private key export ## 0.1.0 Initial release # React Native Passkey Stamper Source: https://docs.turnkey.com/changelogs/react-native-passkey-stamper/readme # @turnkey/react-native-passkey-stamper ## 1.2.7 ### Patch Changes * Updated dependencies \[]: * @turnkey/http\@3.16.1 ## 1.2.6 ### Patch Changes * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/http\@3.16.0 ## 1.2.5 ### Patch Changes * Updated dependencies \[[`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/http\@3.15.0 ## 1.2.4 ### Patch Changes * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/http\@3.14.0 ## 1.2.3 ### Patch Changes * [#1015](https://github.com/tkhq/sdk/pull/1015) [`429e4c4`](https://github.com/tkhq/sdk/commit/429e4c4b5d897a7233584d4ec429b21bba7a1f2b) Author [@moeodeh3](https://github.com/moeodeh3) - Update react-native-passkey to the include the latest version for Expo 54 compatibility * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/http\@3.13.1 ## 1.2.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241)]: * @turnkey/http\@3.13.0 ## 1.2.1 ### Patch Changes * Updated dependencies \[[`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f)]: * @turnkey/http\@3.12.1 ## 1.2.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/encoding\@0.6.0 * @turnkey/http\@3.12.0 ## 1.2.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.6 * @turnkey/http\@3.11.1-beta.0 ## 1.2.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 1.1.4 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/http\@3.11.0 ## 1.1.3 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/http\@3.10.0 ## 1.1.2-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.4 * @turnkey/http\@3.10.0-beta.1 ## 1.1.2-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.3 * @turnkey/http\@3.10.0-beta.0 ## 1.1.2-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.2 * @turnkey/http\@3.8.1-beta.2 ## 1.1.2-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.1 * @turnkey/http\@3.8.1-beta.1 ## 1.1.2-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@1.0.0-beta.0 * @turnkey/http\@3.8.1-beta.0 ## 1.1.2 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9)]: * @turnkey/http\@3.9.0 ## 1.1.1 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/http\@3.8.0 ## 1.1.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 ## 1.0.19 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/http\@3.6.0 ## 1.0.18 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/http\@3.5.1 ## 1.0.17 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd)]: * @turnkey/http\@3.5.0 ## 1.0.16 ### Patch Changes * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 ## 1.0.15 ### Patch Changes * Updated dependencies \[[`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/encoding\@0.5.0 * @turnkey/http\@3.4.1 ## 1.0.14 ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0)]: * @turnkey/http\@3.4.0 ## 1.0.13 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/http\@3.3.0 ## 1.0.12 ### Patch Changes * Updated dependencies \[3f6e415] * @turnkey/http\@3.2.0 ## 1.0.11 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/http\@3.1.0 ## 1.0.10 ### Patch Changes * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/http\@3.0.0 ## 1.0.9 ### Patch Changes * Updated dependencies \[ecdb29a] * @turnkey/http\@2.22.0 ## 1.0.8 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/http\@2.21.0 ## 1.0.7 ### Patch Changes * Updated dependencies \[3c44c4a] * @turnkey/http\@2.20.0 ## 1.0.6 ### Patch Changes * Updated dependencies \[57f9cb0] * @turnkey/http\@2.19.0 ## 1.0.5 ### Patch Changes * Updated dependencies \[6695af2] * @turnkey/http\@2.18.0 ## 1.0.4 ### Patch Changes * Updated dependencies \[053fbfb] * @turnkey/http\@2.17.3 ## 1.0.3 ### Patch Changes * @turnkey/http\@2.17.2 ## 1.0.2 ### Patch Changes * Updated dependencies \[538d4fc] * @turnkey/http\@2.17.1 ## 1.0.1 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/http\@2.17.0 ## 1.0.0 ### Major Changes Upgrade react-native-passkey to 3.0.0 (see [release notes](https://github.com/f-23/react-native-passkey/releases/tag/v3.0.0)). Among other things you can now specify `withSecurityKey` and `withPlatformKey` (new optional arguments to `createPasskey`) to target platform passkeys or security keys on iOS. The same options can be passed as configuration to `PasskeyStamper` to target these features at authentication time. This is a major change because the `transports` property, previously a string array (`Array`) is now an array of enums (`Array`). ## 0.2.16 ### Patch Changes * Updated dependencies \[4df8914] * @turnkey/http\@2.16.0 ## 0.2.15 ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/http\@2.15.0 ## 0.2.14 ### Patch Changes * Updated dependencies \[e5c4fe9] * Updated dependencies \[96d7f99] * @turnkey/encoding\@0.4.0 * @turnkey/http\@2.14.2 ## 0.2.13 ### Patch Changes * Updated dependencies \[ff059d5] * Updated dependencies \[93666ff] * @turnkey/http\@2.14.1 * @turnkey/encoding\@0.3.0 ## 0.2.12 ### Patch Changes * Updated dependencies \[848f8d3] * @turnkey/http\@2.14.0 ## 0.2.11 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 ## 0.2.10 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/http\@2.12.3 ## 0.2.9 ### Patch Changes * Updated dependencies * @turnkey/encoding\@0.2.1 * @turnkey/http\@2.12.2 ## 0.2.8 ### Patch Changes * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 ## 0.2.7 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 ## 0.2.6 ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 ## 0.2.5 ### Patch Changes * Updated dependencies \[7a9ce7a] * @turnkey/http\@2.10.0 ## 0.2.4 ### Patch Changes * Updated dependencies * @turnkey/http\@2.9.1 ## 0.2.3 ### Patch Changes * Updated dependencies \[83b62b5] * @turnkey/http\@2.9.0 ## 0.2.2 ### Patch Changes * Updated dependencies \[46a7d90] * @turnkey/http\@2.8.0 ## 0.2.1 ### Patch Changes * Updated dependencies * @turnkey/http\@2.7.1 ## 0.2.0 ### Minor Changes * Introduce `@turnkey/encoding` to consolidate utility functions * Updated dependencies \[d73725b] * @turnkey/encoding\@0.1.0 * @turnkey/http\@2.7.0 ## 0.1.0 Initial release # React Wallet Kit Source: https://docs.turnkey.com/changelogs/react-wallet-kit/readme # @turnkey/react-wallet-kit ## 1.7.2 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/core\@1.11.0 * @turnkey/sdk-types\@0.11.1 ## 1.7.1 ### Patch Changes * Updated dependencies \[[`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/core\@1.10.0 * @turnkey/sdk-types\@0.11.0 ## 1.7.0 ### Minor Changes * [#1118](https://github.com/tkhq/sdk/pull/1118) [`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e) Thanks [@moe-dev](https://github.com/moe-dev)! - Add a new `handleSendTransaction` helper to the Wallet Kit (**for embedded wallet use only**). This handler provides a complete transaction-submission flow, including: * Construction of the Ethereum transaction intent (sponsored and non-sponsored) * Submission via `ethSendTransaction` from `@turnkey/core` * Integrated modal UI for progress + success states * Polling for transaction confirmation using `pollTransactionStatus` * Surfacing of the final on-chain `txHash` back to the caller This addition centralizes all transaction UX and logic into a single, reusable helper and enables consistent send-transaction flows across applications using the Wallet Kit. ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e), [`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/sdk-types\@0.10.0 * @turnkey/core\@1.9.0 ## 1.6.3 ### Patch Changes * Updated dependencies \[[`850a3ee`](https://github.com/tkhq/sdk/commit/850a3ee5dbb5e2cc46bda50348c917c555e55f73), [`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3)]: * @turnkey/iframe-stamper\@2.9.0 * @turnkey/core\@1.8.3 ## 1.6.2 ### Patch Changes * Updated dependencies \[[`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9)]: * @turnkey/core\@1.8.2 ## 1.6.1 ### Patch Changes * Updated dependencies \[[`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255), [`7ac558c`](https://github.com/tkhq/sdk/commit/7ac558c39c3fa0ddeb6e695182a49f03ee6d4f00)]: * @turnkey/core\@1.8.1 * @turnkey/iframe-stamper\@2.8.0 ## 1.6.0 ### Minor Changes * [#1090](https://github.com/tkhq/sdk/pull/1090) [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421) Author [@moeodeh3](https://github.com/moeodeh3) - - Fixed unnecessary re-renders by ensuring all `useCallback` hooks include only direct dependencies * ConnectWallet and Auth model updated to show WalletConnect loading state during initialization ### Patch Changes * [#1102](https://github.com/tkhq/sdk/pull/1102) [`8ed182a`](https://github.com/tkhq/sdk/commit/8ed182aa95218b348d1f8e79c235ce86f418e0bf) Author [@amircheikh](https://github.com/amircheikh) - - Added `autoFetchWalletKitConfig` option to the `TurnkeyProvider` config. Setting this to false will disable the initial `walletKitConfig` fetch, saving on initialization time. If this is disabled and you want to use the `handleLogin` modal with Turnkey's Auth Proxy, you must pass in the enabled auth methods manually into the `TurnkeyProvider` config. * Fixed `refreshWallets` and `refreshUser` not working when `autoRefreshManagedState` is disabled. * Updated dependencies \[[`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7), [`80ea306`](https://github.com/tkhq/sdk/commit/80ea306025a2161ff575a5e2b45794460eafdf1b), [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421)]: * @turnkey/core\@1.8.0 * @turnkey/sdk-types\@0.9.0 ## 1.5.1 ### Patch Changes * [#1086](https://github.com/tkhq/sdk/pull/1086) [`2fd1d55`](https://github.com/tkhq/sdk/commit/2fd1d5555dd358a1c0210ca65fd6ca70ff172058) Author [@amircheikh](https://github.com/amircheikh) - Added optional `clearClipboardOnPaste` to `handleImportWallet` and `handleImportPrivateKey`. Defaulting to true, this will create the import iframe with `clipboard-write` permissions. Allows clipboard to be cleared after pasting in secrets to import. * [#1083](https://github.com/tkhq/sdk/pull/1083) [`658b89c`](https://github.com/tkhq/sdk/commit/658b89c9036f03ec52963ca0a4ea68d00f39e94e) Thanks [@moe-dev](https://github.com/moe-dev)! - Minor fixes - change on-ramp to onramp and change sandbox info text to match primary colour * Updated dependencies \[[`2fd1d55`](https://github.com/tkhq/sdk/commit/2fd1d5555dd358a1c0210ca65fd6ca70ff172058)]: * @turnkey/iframe-stamper\@2.7.1 ## 1.5.0 ### Minor Changes * [#1062](https://github.com/tkhq/sdk/pull/1062) [`084acce`](https://github.com/tkhq/sdk/commit/084acce85fe7c15513a025e77c1571012ac82e4b) Thanks [@moe-dev](https://github.com/moe-dev)! - - **Added `handleOnRamp()` helper** to simplify fiat-to-crypto on-ramping flows directly from the SDK. * Supports overriding defaults through optional parameters: * `network` (e.g., `FiatOnRampBlockchainNetwork.ETHEREUM`) * `cryptoCurrencyCode` (e.g., `FiatOnRampCryptoCurrency.ETHEREUM`) * `fiatCurrencyAmount`, `fiatCurrencyCode`, `paymentMethod`, and `onrampProvider`. * Integrates seamlessly with the `client.httpClient.initFiatOnRamp()` method to open a provider popup (Coinbase, MoonPay, etc.) and monitor transaction completion. ### Patch Changes * Updated dependencies \[[`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607), [`084acce`](https://github.com/tkhq/sdk/commit/084acce85fe7c15513a025e77c1571012ac82e4b), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/core\@1.7.0 * @turnkey/sdk-types\@0.8.0 ## 1.4.3 ### Patch Changes * [#1059](https://github.com/tkhq/sdk/pull/1059) [`046544f`](https://github.com/tkhq/sdk/commit/046544fa4243f31b28068f5b82917e54b8442be5) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed `storeSession` not updating wallet and user state * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/core\@1.6.0 ## 1.4.2 ### Patch Changes * [#1049](https://github.com/tkhq/sdk/pull/1049) [`4ea9649`](https://github.com/tkhq/sdk/commit/4ea9649f458b7f24f68bc2b64264128928bfc89b) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed `userId` param being ignored in handleUpdateUserName and handleAddPhoneNumber * [#1049](https://github.com/tkhq/sdk/pull/1049) [`c9f29a4`](https://github.com/tkhq/sdk/commit/c9f29a4bb19a4f7ded7ecc8dc7e53994aa45be63) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed `expirationSeconds` param being ignored in auth functions * Updated dependencies \[]: * @turnkey/core\@1.5.2 ## 1.4.1 ### Patch Changes * Updated dependencies \[[`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0)]: * @turnkey/core\@1.5.1 ## 1.4.0 ### Minor Changes * [#992](https://github.com/tkhq/sdk/pull/992) [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186) Author [@amircheikh](https://github.com/amircheikh) - - Added `verifyAppProofs` function. Used alongside activities that return app proofs, this function will fetch the corresponding boot proof for a list of app proofs and securely verify them on the client. Learn more about Turnkey Verified [here](https://docs.turnkey.com/security/turnkey-verified) * All auth methods that make signup requests now optionally return a list of `appProofs` * Added `handleVerifyAppProofs` function. This will do the same actions as `verifyAppProofs` but will also show a loading and confirmation modal * Added `verifyWalletOnSignup` param to the `TurnkeyProvider` config. This will automatically run `handleVerifyAppProofs` after a successful signup ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0)]: * @turnkey/core\@1.5.0 * @turnkey/sdk-types\@0.6.3 ## 1.3.3 ### Patch Changes * [#1012](https://github.com/tkhq/sdk/pull/1012) [`9e123eb`](https://github.com/tkhq/sdk/commit/9e123eb154df7183bef002c7f94c57a72c6ef81b) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed `switchWalletAccountChain` referencing stale `walletProvider` state * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-types\@0.6.2 * @turnkey/core\@1.4.2 ## 1.3.2 ### Patch Changes * [#1010](https://github.com/tkhq/sdk/pull/1010) [`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed stuck connecting state in `handleConnectExternalWallet()` * Updated dependencies \[[`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3)]: * @turnkey/core\@1.4.1 ## 1.3.1 ### Patch Changes * [#997](https://github.com/tkhq/sdk/pull/997) [`b6f9675`](https://github.com/tkhq/sdk/commit/b6f96757356c8b35563e4147d73a99a95e522a64) Author [@moeodeh3](https://github.com/moeodeh3) - Added missing `publicKey` field to the `onOauthSuccess` callback in OAuth handler functions ## 1.3.0 ### Minor Changes * [#986](https://github.com/tkhq/sdk/pull/986) [`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa) Author [@amircheikh](https://github.com/amircheikh) - - Added `defaultStamperType` param to the configuration. This will force the underlying `httpClient` to default to a specific stamper for all requests * Added `createHttpClient` function. This allows a duplicate instance of `TurnkeySDKClientBase` to be created and returned. Custom configuration can be passed in to create an entirely new client with a unique config. This is useful for creating different HTTP clients with different default stampers to be used in our helper packages (`@turnkey/viem`, `@turnkey/ethers`, etc) * [#993](https://github.com/tkhq/sdk/pull/993) [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9) Author [@moeodeh3](https://github.com/moeodeh3) - - Added `sendSignedRequest()` to execute any `TSignedRequest` returned by SDK stamping methods. * Added `buildWalletLoginRequest()` method, which prepares and signs a wallet login request without sending it to Turnkey, returning the `stampLogin` signed request alongside the wallet’s public key used for login. ### Patch Changes * [#989](https://github.com/tkhq/sdk/pull/989) [`9ca7b8b`](https://github.com/tkhq/sdk/commit/9ca7b8bdf7cb897948d377d544b85b69a98b7a29) Author [@amircheikh](https://github.com/amircheikh) - Padding and margin styles are now only forced under `.tk-modal` * Updated dependencies \[[`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9), [`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa), [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/sdk-types\@0.6.1 * @turnkey/core\@1.4.0 ## 1.2.0 ### Minor Changes * [#974](https://github.com/tkhq/sdk/pull/974) [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c) Author [@narimonf](https://github.com/narimonf) - Added `fetchBootProofForAppProof`, which fetches the boot proof for a given app proof. ### Patch Changes * [#973](https://github.com/tkhq/sdk/pull/973) [`48f59f9`](https://github.com/tkhq/sdk/commit/48f59f9ffe7f64ec526b40bb8e03feac8ad0d7ba) Author [@moeodeh3](https://github.com/moeodeh3) - Fix handling of providers that cannot be disconnected * Updated dependencies \[[`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86), [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/core\@1.3.0 * @turnkey/sdk-types\@0.6.0 ## 1.1.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241), [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4)]: * @turnkey/sdk-types\@0.5.0 * @turnkey/core\@1.2.0 ## 1.1.1 ### Patch Changes * [#968](https://github.com/tkhq/sdk/pull/968) [`14424ee`](https://github.com/tkhq/sdk/commit/14424eeeabb9cea8067f978051dceb0537c22e34) Author [@moeodeh3](https://github.com/moeodeh3) - Fixed type re-exports from `@turnkey/core` * [#962](https://github.com/tkhq/sdk/pull/962) [`62937e7`](https://github.com/tkhq/sdk/commit/62937e74e1e27093906e434c62f6f0545f73e934) Author [@moeodeh3](https://github.com/moeodeh3) - - Fixed memory leaks in `handle*` functions * `handleConnectExternalWallet` now returns `{ type: "connect" | "disconnect"; account?: WalletAccount }` * [#964](https://github.com/tkhq/sdk/pull/964) [`1e15cc9`](https://github.com/tkhq/sdk/commit/1e15cc9d672905b87566324ec5b10580318fca19) Author [@moeodeh3](https://github.com/moeodeh3) - Fix `onClose` callbacks not triggering in child modal pages ## 1.1.0 ### Minor Changes * [#941](https://github.com/tkhq/sdk/pull/941) [`f2c95ae`](https://github.com/tkhq/sdk/commit/f2c95aed9c5fc56efa6ecda62e5231fc05d0c96e) Author [@ethankonk](https://github.com/ethankonk) - - Added options in the config and handleLogin() to add a logo for light and/or dark mode * [#951](https://github.com/tkhq/sdk/pull/951) [`3ad8718`](https://github.com/tkhq/sdk/commit/3ad87184fab0e66c36276210b8c1c2c598888014) Author [@ethankonk](https://github.com/ethankonk) - - Added sheets to the modal system which popup from below within the modal. Future proofing for more OAuth methods and such * [#944](https://github.com/tkhq/sdk/pull/944) [`e7edb0f`](https://github.com/tkhq/sdk/commit/e7edb0f7fe03ff453ddb8ff05c3283b608ad2b86) Author [@ethankonk](https://github.com/ethankonk) - Added optional name overide param for handleImportWallet & handleImportPrivateKey. If provided, the input field for wallet name will no longer be shown and the passed in name param will be used instead. * [#931](https://github.com/tkhq/sdk/pull/931) [`f8a8d20`](https://github.com/tkhq/sdk/commit/f8a8d204ccf1831a742ecd47b2c42dc3a672dd7e) Author [@ethankonk](https://github.com/ethankonk) - - Added config option to disable managed state auto refreshing. * The session state is automatically cleared if a request to Turnkey returns an unauthorized error indicating that the session keypair is no longer valid. * [#940](https://github.com/tkhq/sdk/pull/940) [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4) Author [@moeodeh3](https://github.com/moeodeh3) - - Added optional params for sessionless stamping (passkey/wallet only setups) ### Patch Changes * [#952](https://github.com/tkhq/sdk/pull/952) [`6e3114b`](https://github.com/tkhq/sdk/commit/6e3114bd16246b0e1dcb540f30ff3a430164c2fd) Author [@amircheikh](https://github.com/amircheikh) - - Fixed broken padding on Safari using iOS 26 and MacOS 26 * [#955](https://github.com/tkhq/sdk/pull/955) [`c534b5b`](https://github.com/tkhq/sdk/commit/c534b5ba7834bf8f16a5e903b468b262972f9320) Author [@ethankonk](https://github.com/ethankonk) - Methods no longer rely on the session state variable, meaning functions that modify session can be placed in-line with methods reliant on session updates * [#934](https://github.com/tkhq/sdk/pull/934) [`9c1fea5`](https://github.com/tkhq/sdk/commit/9c1fea51ba156c176f81ba5883e7d8c837f95c19) Author [@moeodeh3](https://github.com/moeodeh3) - Re-exported useful modules from `@turnkey/core`: * `TurnkeyClient` * `TurnkeyClientMethods` * `TurnkeySDKClientBase` * `isEthereumProvider` * `isSolanaProvider` * [#954](https://github.com/tkhq/sdk/pull/954) [`474ba20`](https://github.com/tkhq/sdk/commit/474ba20e90c4d7c056d108c44fc2442a0e1cd992) Author [@moeodeh3](https://github.com/moeodeh3) - Added a Copy Link button to the WalletConnect screen in the auth component * [#958](https://github.com/tkhq/sdk/pull/958) [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f) Author [@amircheikh](https://github.com/amircheikh) - - otpLength and alphanumeric settings now properly apply from dashboard * [#946](https://github.com/tkhq/sdk/pull/946) [`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef) Author [@moeodeh3](https://github.com/moeodeh3) - - Fixed double sign prompt for WalletConnect in React Dev Mode * Fixed expired WalletConnect URIs * Fixed errors on unapproved WalletConnect sessions * [#960](https://github.com/tkhq/sdk/pull/960) [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963) Author [@moeodeh3](https://github.com/moeodeh3) - - Removed requirement of session for external wallet usage * `connectExternalWalletAccount()` now returns the full `WalletAccount` object instead of `void` * `fetchWallets()` now supports an optional `connectedOnly` parameter to fetch only connected wallets * Updated dependencies \[[`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f), [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963), [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7), [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4)]: * @turnkey/core\@1.1.0 * @turnkey/sdk-types\@0.4.1 ## 1.0.0 ### Major Changes * Initial Stable Release: `@turnkey/react-wallet-kit` 🎉 Turnkey’s **Embedded Wallet Kit** is the easiest way to integrate Turnkey’s Embedded Wallets into your React applications, with no backend required. * Built on [`@turnkey/core`](https://www.npmjs.com/package/@turnkey/core) * Provides a set of UI components and simple functions, all exported through a React hook * Designed to help you quickly build secure embedded wallet experiences 📚 [Read the full docs here](https://docs.turnkey.com/sdks/react) ### Minor Changes * [#677](https://github.com/tkhq/sdk/pull/677) [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e) Author [@amircheikh](https://github.com/amircheikh) - @turnkey/react-wallet-kit and @turnkey/core beta-3 release * [#677](https://github.com/tkhq/sdk/pull/677) [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e) Author [@amircheikh](https://github.com/amircheikh) - @turnkey/react-wallet-kit and @turnkey/core beta-3 release * [#677](https://github.com/tkhq/sdk/pull/677) [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823) Author [@amircheikh](https://github.com/amircheikh) - @turnkey/react-wallet-kit and @turnkey/core beta release * [#677](https://github.com/tkhq/sdk/pull/677) [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c) Author [@amircheikh](https://github.com/amircheikh) - updating package versions * [#677](https://github.com/tkhq/sdk/pull/677) [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c) Author [@amircheikh](https://github.com/amircheikh) - test build * [#677](https://github.com/tkhq/sdk/pull/677) [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624) Author [@amircheikh](https://github.com/amircheikh) - SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/sdk-types\@0.4.0 * @turnkey/core\@1.0.0 * @turnkey/iframe-stamper\@2.6.0 ## 1.0.0-beta.6 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.6 * @turnkey/core\@1.0.0-beta.6 ## 1.0.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/iframe-stamper\@2.6.0-beta.0 * @turnkey/sdk-types\@0.4.0-beta.5 * @turnkey/core\@1.0.0-beta.5 ## 1.0.0-beta.4 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.4 * @turnkey/core\@1.0.0-beta.4 ## 1.0.0-beta.3 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.3 * @turnkey/core\@1.0.0-beta.3 ## 1.0.0-beta.2 ### Minor Changes * updating package versions ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.2 * @turnkey/core\@1.0.0-beta.2 ## 1.0.0-beta.1 ### Minor Changes * test build ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.1 * @turnkey/core\@1.0.0-beta.1 ## 1.0.0-beta.0 ### Major Changes * beta for @turnkey/react-wallet-kit and @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0-beta.0 * @turnkey/sdk-types\@0.4.0-beta.0 ## 1.0.0 ### Major Changes * Initial beta release for react wallet kit ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0 * @turnkey/sdk-types\@0.4.0 ## 1.0.0 ### Major Changes * Initial beta release for @turnkey/react-wallet-kit and @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0 * @turnkey/sdk-types\@0.4.0 # SDK Browser Source: https://docs.turnkey.com/changelogs/sdk-browser/readme # @turnkey/sdk-browser ## 5.14.1 ### Patch Changes * Updated dependencies \[[`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/crypto\@2.8.9 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/sdk-types\@0.11.1 * @turnkey/wallet-stamper\@1.1.11 * @turnkey/http\@3.16.1 * @turnkey/indexed-db-stamper\@1.2.1 ## 5.14.0 ### Minor Changes * [#1153](https://github.com/tkhq/sdk/pull/1153) [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea) Thanks [@moe-dev](https://github.com/moe-dev)! - Update as per mono v2025.12.3. ### Breaking/Behavioral Changes * `appName` is now **required**: * In `emailCustomization` for Email Auth activities * At the top-level intent for OTP activities * Auth proxy endpoints are **not affected** ### Activity Version Bumps The following activity types have been versioned: * `ACTIVITY_TYPE_INIT_OTP` → `ACTIVITY_TYPE_INIT_OTP_V2` * `ACTIVITY_TYPE_INIT_OTP_AUTH_V2` → `ACTIVITY_TYPE_INIT_OTP_V3` * `ACTIVITY_TYPE_EMAIL_AUTH_V2` → `ACTIVITY_TYPE_EMAIL_AUTH_V3` * `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY` -> `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2` ### Patch Changes * [#1145](https://github.com/tkhq/sdk/pull/1145) [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1) Author [@moeodeh3](https://github.com/moeodeh3) - Stamp function improvements * Queries: add `organizationId` fallback from config * Activities: fix request structure to include the `parameters wrapper`, `organizationId`, `timestampMs`, and `type` fields * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/sdk-types\@0.11.0 * @turnkey/http\@3.16.0 * @turnkey/crypto\@2.8.8 * @turnkey/wallet-stamper\@1.1.10 ## 5.13.6 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/sdk-types\@0.10.0 * @turnkey/crypto\@2.8.7 * @turnkey/wallet-stamper\@1.1.9 ## 5.13.5 ### Patch Changes * Updated dependencies \[[`850a3ee`](https://github.com/tkhq/sdk/commit/850a3ee5dbb5e2cc46bda50348c917c555e55f73)]: * @turnkey/iframe-stamper\@2.9.0 ## 5.13.4 ### Patch Changes * Updated dependencies \[[`7ac558c`](https://github.com/tkhq/sdk/commit/7ac558c39c3fa0ddeb6e695182a49f03ee6d4f00)]: * @turnkey/iframe-stamper\@2.8.0 ## 5.13.3 ### Patch Changes * Updated dependencies \[[`80ea306`](https://github.com/tkhq/sdk/commit/80ea306025a2161ff575a5e2b45794460eafdf1b)]: * @turnkey/sdk-types\@0.9.0 * @turnkey/crypto\@2.8.6 * @turnkey/wallet-stamper\@1.1.8 ## 5.13.2 ### Patch Changes * [#1097](https://github.com/tkhq/sdk/pull/1097) Bumping `hpke/core` to `1.7.5` to resolve [https://github.com/dajiaji/hpke-js/security/advisories/GHSA-73g8-5h73-26h4](https://github.com/dajiaji/hpke-js/security/advisories/GHSA-73g8-5h73-26h4). Thanks [@r-n-o](https://github.com/r-n-o) for the bump, and thank you to [@dajiaji](https://github.com/dajiaji) for the disclosure and the underlying fix! ## 5.13.1 ### Patch Changes * Updated dependencies \[[`2fd1d55`](https://github.com/tkhq/sdk/commit/2fd1d5555dd358a1c0210ca65fd6ca70ff172058)]: * @turnkey/iframe-stamper\@2.7.1 ## 5.13.0 ### Minor Changes * [#1072](https://github.com/tkhq/sdk/pull/1072) [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b) Thanks [@moe-dev](https://github.com/moe-dev)! - Bump packages as per mono v2025.11.0 ### Patch Changes * Updated dependencies \[[`5f829c6`](https://github.com/tkhq/sdk/commit/5f829c67af03bb85c3806acd202b2debf8274e78), [`084acce`](https://github.com/tkhq/sdk/commit/084acce85fe7c15513a025e77c1571012ac82e4b), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/crypto\@2.8.5 * @turnkey/sdk-types\@0.8.0 * @turnkey/http\@3.15.0 * @turnkey/wallet-stamper\@1.1.7 ## 5.12.0 ### Minor Changes * [#1058](https://github.com/tkhq/sdk/pull/1058) [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release `v2025.10.10-hotfix.2` ### Patch Changes * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/http\@3.14.0 * @turnkey/crypto\@2.8.4 * @turnkey/wallet-stamper\@1.1.6 ## 5.11.6 ### Patch Changes * Updated dependencies \[[`c745646`](https://github.com/tkhq/sdk/commit/c745646ae4b2a275e116abca07c6e108f89beb04)]: * @turnkey/crypto\@2.8.4 * @turnkey/wallet-stamper\@1.1.6 ## 5.11.5 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186)]: * @turnkey/crypto\@2.8.3 * @turnkey/sdk-types\@0.6.3 * @turnkey/wallet-stamper\@1.1.5 ## 5.11.4 ### Patch Changes * [#1016](https://github.com/tkhq/sdk/pull/1016) [`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1) Author [@amircheikh](https://github.com/amircheikh) - Synced API as per mono v2025.10.2 * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-types\@0.6.2 * @turnkey/http\@3.13.1 * @turnkey/crypto\@2.8.2 * @turnkey/wallet-stamper\@1.1.4 ## 5.11.3 ### Patch Changes * Updated dependencies \[[`e76d2bf`](https://github.com/tkhq/sdk/commit/e76d2bfbe3fb481aedac9b992260c50217823e8a)]: * @turnkey/iframe-stamper\@2.7.0 ## 5.11.2 ### Patch Changes * Updated dependencies \[[`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/sdk-types\@0.6.1 * @turnkey/crypto\@2.8.1 * @turnkey/wallet-stamper\@1.1.3 ## 5.11.1 ### Patch Changes * Updated dependencies \[[`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/crypto\@2.8.0 * @turnkey/sdk-types\@0.6.0 * @turnkey/wallet-stamper\@1.1.2 ## 5.11.0 ### Minor Changes * [#977](https://github.com/tkhq/sdk/pull/977) [`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241) Author [@besler613](https://github.com/besler613) - OAuth2Authenticate now supports returning the encrypted bearer token via the optional `bearerTokenTargetPublicKey` request parameter (mono release v2025.9.5) ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241)]: * @turnkey/sdk-types\@0.5.0 * @turnkey/http\@3.13.0 * @turnkey/crypto\@2.7.0 * @turnkey/wallet-stamper\@1.1.1 ## 5.10.1 ### Patch Changes * [#958](https://github.com/tkhq/sdk/pull/958) [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f) Author [@amircheikh](https://github.com/amircheikh) - - Synced api with mono * Updated dependencies \[[`2191a1b`](https://github.com/tkhq/sdk/commit/2191a1b201fb17dea4c79cf9e02b3a493b18f97a), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f)]: * @turnkey/crypto\@2.7.0 * @turnkey/sdk-types\@0.4.1 * @turnkey/http\@3.12.1 * @turnkey/wallet-stamper\@1.1.1 ## 5.10.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/sdk-types\@0.4.0 * @turnkey/encoding\@0.6.0 * @turnkey/http\@3.12.0 * @turnkey/crypto\@2.6.0 * @turnkey/indexed-db-stamper\@1.2.0 * @turnkey/webauthn-stamper\@0.6.0 * @turnkey/api-key-stamper\@0.5.0 * @turnkey/iframe-stamper\@2.6.0 * @turnkey/wallet-stamper\@1.1.0 ## 5.9.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.6 * @turnkey/encoding\@0.6.0-beta.6 * @turnkey/crypto\@2.6.0-beta.6 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/indexed-db-stamper\@1.2.0-beta.6 * @turnkey/wallet-stamper\@1.1.0-beta.6 ## 5.9.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/indexed-db-stamper\@1.2.0-beta.5 * @turnkey/webauthn-stamper\@0.6.0-beta.0 * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/iframe-stamper\@2.6.0-beta.0 * @turnkey/wallet-stamper\@1.1.0-beta.5 * @turnkey/sdk-types\@0.4.0-beta.5 * @turnkey/encoding\@0.6.0-beta.5 * @turnkey/crypto\@2.6.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 5.9.0 ### Minor Changes * [#879](https://github.com/tkhq/sdk/pull/879) [`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158) Author [@zkharit](https://github.com/zkharit) - Update packages to include new activities as of the newest release (mono v2025.8.10) ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158), [`d7420e6`](https://github.com/tkhq/sdk/commit/d7420e6c3559efc1024b58749b31d253150cb189)]: * @turnkey/http\@3.11.0 * @turnkey/crypto\@2.6.0 * @turnkey/wallet-stamper\@1.0.9 ## 5.8.0 ### Minor Changes * [#861](https://github.com/tkhq/sdk/pull/861) [`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6) Author [@amircheikh](https://github.com/amircheikh) - Synced as per mono 2025.8.4 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/http\@3.10.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.7.1-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.4 * @turnkey/encoding\@0.6.0-beta.4 * @turnkey/http\@3.10.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 * @turnkey/crypto\@2.5.1-beta.4 * @turnkey/indexed-db-stamper\@1.1.2-beta.4 * @turnkey/wallet-stamper\@1.0.9-beta.4 ## 5.7.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.3 * @turnkey/encoding\@0.6.0-beta.3 * @turnkey/http\@3.10.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 * @turnkey/crypto\@2.5.1-beta.3 * @turnkey/indexed-db-stamper\@1.1.2-beta.3 * @turnkey/wallet-stamper\@1.0.9-beta.3 ## 5.7.0 ### Minor Changes * [#834](https://github.com/tkhq/sdk/pull/834) [`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release v2025.8.3-hotfix.0 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9)]: * @turnkey/http\@3.9.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.6.1-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.2 * @turnkey/encoding\@0.6.0-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/crypto\@2.5.1-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/indexed-db-stamper\@1.1.2-beta.2 * @turnkey/wallet-stamper\@1.0.9-beta.2 ## 5.6.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@1.0.0-beta.0 * @turnkey/encoding\@1.0.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/crypto\@2.5.1-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/indexed-db-stamper\@1.1.2-beta.0 * @turnkey/wallet-stamper\@1.0.9-beta.0 ## 5.6.0 ### Minor Changes * [#826](https://github.com/tkhq/sdk/pull/826) [`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0) Author [@turnekybc](https://github.com/turnekybc) - Update per mono release v2025.8.1 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/http\@3.8.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.5.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed), [`6cde41c`](https://github.com/tkhq/sdk/commit/6cde41cfecdfb7d54abf52cc65e28ef0e2ad6ba3)]: * @turnkey/http\@3.7.0 * @turnkey/sdk-types\@0.3.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.4.1 ### Patch Changes * [#787](https://github.com/tkhq/sdk/pull/787) [`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15) Author [@andrewkmin](https://github.com/andrewkmin) - Add optional `organizationId` parameter to `loginWithPasskey()` and `loginWithWallet()` to allow targeting a specific organization. ## 5.4.0 ### Minor Changes * [#782](https://github.com/tkhq/sdk/pull/782) [`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e) Thanks [@r-n-o](https://github.com/r-n-o)! - Release v2025.7.16 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/http\@3.6.0 * @turnkey/crypto\@2.4.3 * @turnkey/wallet-stamper\@1.0.7 ## 5.3.4 ### Patch Changes * [#763](https://github.com/tkhq/sdk/pull/763) [`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a) Author [@andrewkmin](https://github.com/andrewkmin) - Release per mono v2025.7.1. This release contains the following API changes: * Introduction of `SmartContractInterfaces`: we've now exposed endpoints for uploading ABIs and IDLs to help secure EVM and Solana signing flows. For more information, see our docs [here](https://docs.turnkey.com/concepts/policies/smart-contract-interfaces) * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/http\@3.5.1 * @turnkey/crypto\@2.4.3 * @turnkey/wallet-stamper\@1.0.7 ## 5.3.3 ### Patch Changes * [#750](https://github.com/tkhq/sdk/pull/750) [`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf) Thanks [@moe-dev](https://github.com/moe-dev)! - Surface keyFormat for extractKeyEncryptedBundle in iframe client abstraction ## 5.3.2 ### Patch Changes * Updated dependencies \[[`6cbff7a`](https://github.com/tkhq/sdk/commit/6cbff7a0c0b3a9a05586399e5cef476154d3bdca)]: * @turnkey/crypto\@2.4.3 * @turnkey/wallet-stamper\@1.0.7 ## 5.3.1 ### Patch Changes * [#716](https://github.com/tkhq/sdk/pull/716) [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79) Author [@moeodeh3](https://github.com/moeodeh3) - Updated dependencies * bs58check\@4.0.0 * Updated dependencies \[[`c5cdf82`](https://github.com/tkhq/sdk/commit/c5cdf8229da5da1bd6d52db06b2fe42826e96d57), [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/crypto\@2.4.2 * @turnkey/wallet-stamper\@1.0.6 ## 5.3.0 ### Minor Changes * [#704](https://github.com/tkhq/sdk/pull/704) [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd) Author [@amircheikh](https://github.com/amircheikh) - Synced with mono 2025.6.10 to include the following endpoints: `update_user_email`: Update a User's email in an existing Organization `update_user_name`: Update a User's name in an existing Organization `update_user_phone_number`: Update a User's phone number in an existing Organization ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164), [`878e039`](https://github.com/tkhq/sdk/commit/878e03973856cfec83e6e3fda5b76d1b64943628)]: * @turnkey/http\@3.5.0 * @turnkey/api-key-stamper\@0.4.7 * @turnkey/crypto\@2.4.1 * @turnkey/wallet-stamper\@1.0.5 * @turnkey/indexed-db-stamper\@1.1.1 ## 5.2.3 ### Patch Changes * Updated dependencies \[[`039602a`](https://github.com/tkhq/sdk/commit/039602a015d20783952b992d1d339f5fc003f658)]: * @turnkey/sdk-types\@0.2.1 ## 5.2.2 ### Patch Changes * Updated dependencies \[[`0dd3fc3`](https://github.com/tkhq/sdk/commit/0dd3fc31956992c5b449da5868f6eef8b0bb194c)]: * @turnkey/sdk-types\@0.2.0 ## 5.2.1 ### Patch Changes * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/crypto\@2.4.0 * @turnkey/wallet-stamper\@1.0.4 ## 5.2.0 ### Minor Changes * [#659](https://github.com/tkhq/sdk/pull/659) [`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc) Author [@turnekybc](https://github.com/turnekybc) - export types and models from @turnkey/sdk-browser ### Patch Changes * [#653](https://github.com/tkhq/sdk/pull/653) [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a) Thanks [@moe-dev](https://github.com/moe-dev)! - Allow external keys to be passed to resetKeyPair in the indexedDbClient/Stamper enabling refreshing RW sessions * [#663](https://github.com/tkhq/sdk/pull/663) [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2) Thanks [@moe-dev](https://github.com/moe-dev)! - Update to endpoints as per mono v2025.5.7. Add V5 TON address format generation. Non breaking * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`10ee5c5`](https://github.com/tkhq/sdk/commit/10ee5c524b477ce998e4fc635152cd101ae5a9cc), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/wallet-stamper\@1.0.4 * @turnkey/webauthn-stamper\@0.5.1 * @turnkey/encoding\@0.5.0 * @turnkey/crypto\@2.4.0 * @turnkey/indexed-db-stamper\@1.1.0 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 ## 5.1.0 ### Minor Changes * Update @turnkey/sdk-types readme and install dependency in packages with common types * [#650](https://github.com/tkhq/sdk/pull/650) [`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412) Author [@turnekybc](https://github.com/turnekybc) - Update @turnkey/sdk-types readme and install dependency in packages with common types ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-types\@0.1.0 ## 5.0.0 ### Major Changes * [#601](https://github.com/tkhq/sdk/pull/601) [`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0) Author [@moe-dev](https://github.com/moe-dev) This release introduces the new `indexedDbClient`, leveraging the `indexedDbStamper` to securely store cryptographic keys directly in IndexedDB. It provides persistent, secure, non-extractable authentication, replacing legacy iframe-based flows for OTP, passkey, external wallet, and OAuth authentications. ### Key Changes: * **IndexedDB Client (`indexedDbClient`)**: * Offers persistent, tamper-resistant authentication using P-256 keys stored securely in IndexedDB. * Eliminates the need for credential injection via iframes, significantly improving the DevEx and UX of session management. * Provides human-readable sessions through `getSession()`. * **Deprecation Notice**: * Authentication via the `iframeClient` (e.g., `auth.turnkey.com`) is deprecated. Developers should migrate authentication flows to the new IndexedDB-based client. * Existing iframe-based wallet flows (Email Recovery, Import, and Export) remain supported. These enhancements simplify integrations, improve UX, and deliver a more robust client-side experience. ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0)]: * @turnkey/indexed-db-stamper\@1.0.0 * @turnkey/http\@3.4.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.3.0 ### Minor Changes * 25ca339: Adding replyToEmailAddress field for specifying reply-to when using a customer sender ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/http\@3.3.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.2.0 ### Minor Changes * 3f6e415: Update per mono v2025.4.5 ### Patch Changes * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.1.0 ### Minor Changes * 3e4a482: Release per mono v2025.4.4 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/http\@3.1.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.0.0 ### Major Changes * d1083bd: initOtpAuth now defaults to v2 (breaking) which allows alphanumeric boolean and otpLength (6-9) to be passed. More details below. * This release introduces the `INIT_OTP_AUTH_V2` activity. The difference between it and `INIT_OTP_AUTH` is that it can now accept `alphanumeric` and `otpLength` for selecting crockford bech32 alphanumeric codes and the length of those codes. By default alphanumeric = true, otpLength = 9 * This release introduces `sendFromEmailSenderName` to `INIT_OTP_AUTH`, `INIT_OTP_AUTH_V2`, `EMAIL_AUTH` and `EMAIL_AUTH_V2`. This is an optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'. ### Minor Changes * e501690: Add new utility functions: * Add `clearEmbeddedKey()` async function, which clears the embedded key within an iframe * Add `initEmbeddedKey()` async function, which reinitializes the embedded key within an iframe These can be used in tandem to reset the embedded key within an iframe. See demo video in this PR's description: [https://github.com/tkhq/sdk/pull/571](https://github.com/tkhq/sdk/pull/571) Usage may look like the following: ```javascript theme={"system"} import { Turnkey } from "@turnkey/sdk-browser"; ... // create an instance of TurnkeyBrowserSDK const turnkeyBrowserSDK = new Turnkey(config); // create an instance of TurnkeyIframeClient const iframeClient = await turnkeyBrowserSDK.iframeClient({ iframeContainer: document.getElementById( "turnkey-auth-iframe-container-id", ), iframeUrl: "https://auth.turnkey.com", iframeElementId: "turnkey-auth-iframe-element-id", }); ... // Clear the existing embedded key await iframeClient.clearEmbeddedKey(); const newPublicKey = await iframeClient.initEmbeddedKey(); ``` ### Patch Changes * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/iframe-stamper\@2.5.0 * @turnkey/http\@3.0.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 3.1.0 ### Minor Changes * bf87774: Expose `getEmbeddedPublicKey()` via `TurnkeyIframeClient`. This can be used to fetch the live public key of the target embedded key living within an iframe. Usage may look like the following: ```javascript theme={"system"} import { Turnkey } from "@turnkey/sdk-browser"; // create an instance of TurnkeyBrowserSDK const turnkeyBrowserSDK = new Turnkey(config); // create an instance of TurnkeyIframeClient const iframeClient = await turnkeyBrowserSDK.iframeClient({ iframeContainer: document.getElementById( "turnkey-auth-iframe-container-id", ), iframeUrl: "https://auth.turnkey.com", iframeElementId: "turnkey-auth-iframe-element-id", }); ... const publicKey = await iframeClient.getEmbeddedPublicKey(); ``` Functionally, this can be useful for scenarios where the developer would like to verify whether an iframe has a live embedded key within it. This contrasts from the static `iframeStamper.iframePublicKey` exposed by `@turnkey/iframe-stamper`'s `publicKey()` method. ### Patch Changes * Updated dependencies \[a833088] * @turnkey/iframe-stamper\@2.4.0 ## 3.0.1 ### Patch Changes * 5ec5187: Fix initOtpAuth bug with improper version result (to be updated to V2 following release r2025.3.8) ## 3.0.0 ### Major Changes * 72890f5: ### @turnkey/sdk-browser * Move all type definitions to [`./__types__/base.ts`](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts) * `TurnkeyBrowserClient` * `refereshSession()` now consumes a [RefreshSessionParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L213) parameter * `loginWithBundle()` now consumes a [LoginWithBundleParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L219) parameter * `loginWithPasskey()` now consumes a [LoginWithPasskeyParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L224) parameter * `loginWithWallet()` now consumes a [LoginWithWalletParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L231) parameter ### @turnkey/sdk-react * `Auth.tsx` * updated `passkeyClient?.loginWithPasskey()` to implement new method signature * updated `walletClient?.loginWithWallet()` to implement new method signature ### @turnkey/sdk-server * Move all type definitions to [`./__types__/base.ts`](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-server/src/__types__/base.ts) ### Minor Changes * ecdb29a: Update API as per mono v2025.3.2 - Add CREATE\_USERS\_V3 ### Patch Changes * 0e4e959: bump update policy activity to v2 * 856f449: update `TurnkeyBrowserClient.login()` to align with other functions like `loginWithPasskey()` and `loginWithWallet()` * d4ce5fa: fix unexpected error when using read-only session type when calling loginWithPasskey & loginWithWallet * Updated dependencies \[ecdb29a] * @turnkey/http\@2.22.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 2.0.0 ### Major Changes * 93540e7: ## Major Package Updates ### @turnkey/sdk-browser * create abstract `TurnkeyBaseClient` class which extends `TurnkeySDKClientBase` * `TurnkeyBrowserClient`, `TurnkeyIframeClient`, `TurnkeyPasskeyClient`, and `TurnkeyWalletClient` all extend `TurnkeyBaseClient` * TurnkeyBrowserClient * Session Management * `refreshSession` - attempts to refresh an existing, active session and will extend the session expiry using the `expirationSeconds` parameter * loginWithBundle - authenticate a user via a credential bundle and creates a read-write session * loginWithPasskey - attempts to authenticate a user via passkey and create a read-only or read-write session * loginWithSession - takes a `Session`, which can be either read-only or read-write, created via a server action and attempts to authenticate the user * TurnkeyPasskeyClient * Session Management * createPasskeySession - leverages passkey authentication to create a read-write session. Once authenticated, the user will not be prompted for additional passkey taps. ### @turnkey/sdk-react * update `TurnkeyContext` to use new `.getSession()` method to check if there is an active session * `OTPVerification` component no longer receives `authIframeClient` or `onValidateSuccess` props ## Minor Package Updates ### @turnkey/sdk-server * expose `sendCredential` server action * add `SessionType` enum * `READ_ONLY` & `READ_WRITE` ### @turnkey/eip-1193-provider * update dependencies in `package.json` * moved from `peerDependencies` to `dependencies` * `"@turnkey/http": "workspace:*"` * `"@turnkey/sdk-browser": "workspace:*"` * moved from `devDependencies` to `dependencies` * `"@turnkey/api-key-stamper": "workspace:*"` * specify TypeScript version ^5.1.5 ### Minor Changes * 9147962: add dangerouslyOverrideIframeKeyTtl option to override iframe embedded key TTL (for longer lived read/write sessions) ### Patch Changes * Updated dependencies \[9147962] * @turnkey/iframe-stamper\@2.3.0 * @turnkey/crypto\@2.3.1 ## 1.16.0 ### Minor Changes * 233ae71: Add updateUserAuth, addUserAuth, deleteUserAuth helper functions ### Patch Changes * @turnkey/crypto\@2.3.1 ## 1.15.0 ### Minor Changes * 56a307e: Update api to mono v2025.3.0 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/http\@2.21.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 1.14.0 ### Minor Changes * 3c44c4a: Updates per mono release v2025.2.2 ### Patch Changes * Updated dependencies \[3c44c4a] * @turnkey/http\@2.20.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 1.13.0 ### Minor Changes * 57f9cb0: Update endpoints - surface GetWalletAccount ### Patch Changes * 69d2571: Upgrade elliptic * Updated dependencies \[57f9cb0] * @turnkey/http\@2.19.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 1.12.1 ### Patch Changes * 755833b: refactor stamper out of config object and move it directly onto the client to match @turnkey/http * Updated dependencies \[2bc0046] * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 1.12.0 ### Minor Changes * 6695af2: Update per mono release v2025.1.11 ### Patch Changes * Updated dependencies \[6695af2] * @turnkey/http\@2.18.0 * @turnkey/crypto\@2.3.0 * @turnkey/wallet-stamper\@1.0.2 ## 1.11.2 ### Patch Changes * 053fbfb: Update mono dependencies * Updated dependencies \[053fbfb] * Updated dependencies \[a216a47] * @turnkey/http\@2.17.3 * @turnkey/iframe-stamper\@2.2.0 * @turnkey/crypto\@2.3.0 * @turnkey/wallet-stamper\@1.0.2 ## 1.11.1 ### Patch Changes * 328d6aa: Add defaultXrpAccountAtIndex helper * b90947e: Update default account exports, surface WalletAccount type * 2d5977b: Update error messaging around api key and target public key usage * fad7c37: @turnkey/iframe-stamper - Implemented MessageChannel API for secure communication between the parent and iframe. @turnkey/sdk-browser - fixed spelling in package.json @turnkey/sdk-server - fixed spelling in package.json * Updated dependencies \[2d5977b] * Updated dependencies \[fad7c37] * @turnkey/api-key-stamper\@0.4.4 * @turnkey/iframe-stamper\@2.1.0 * @turnkey/crypto\@2.3.0 * @turnkey/http\@2.17.2 * @turnkey/wallet-stamper\@1.0.2 ## 1.11.0 ### Minor Changes * 7988bc1: Fix readWrite session to use credentialBundle and add loginWithAuthBundle to create a session when you already have a credentialBundle ### Patch Changes * 538d4fc: Update api endpoints - NEW: User verification, SMS customization params * 12d5aaa: Update TurnkeySDKBrowserConfig type with an optional iframeUrl field. The TurnkeyContext provider will check for an iframeUrl otherwise it will fallback to the default. * Updated dependencies \[c895c8f] * Updated dependencies \[538d4fc] * @turnkey/wallet-stamper\@1.0.2 * @turnkey/http\@2.17.1 * @turnkey/crypto\@2.3.0 ## 1.10.2 ### Patch Changes * Updated dependencies \[668edfa] * @turnkey/crypto\@2.3.0 * @turnkey/wallet-stamper\@1.0.1 ## 1.10.1 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/http\@2.17.0 * @turnkey/crypto\@2.2.0 * @turnkey/wallet-stamper\@1.0.0 ## 1.10.0 ### Minor Changes ##### `TurnkeyWalletClient` * Added new `TurnkeyWalletClient` to the `@turnkey/sdk-browser` **Reason**: Allows using the `WalletStamper` with the browser sdk * Added `getPublicKey` method to `TurnkeyWalletClient` **Reason**: Enables easy access to wallet public key for sub-organization creation and future authentication flows * Updated `TurnkeyWalletClient` to use new `WalletInterface` **Reason**: Ensures compatibility with the updated Wallet Stamper interfaces ##### `AuthClient` (new enum) * Introduced a new enum to track which client is authenticated (Passkey, Wallet, Iframe) ##### `TurnkeyBrowserClient`, `TurnkeyIframeClient`, `TurnkeyPasskeyClient`, `TurnkeyWalletClient` * Added a static `authClient` property to base `TurnkeyBrowserClient` to be used by the child classes to track which client was used for the initial authentication ##### `UserSession` interface * Added a new `UserSession` interface which is to be stored in local storage to track the authentication state of the user and to eliminate the need to store the write and read sessions separately. * Added `authClient` in the session object to store the authentication method used in the user's session data. Will be used in the `@turnkey/sdk-react` to determine which client to return. * Added new versioned `UserSession` key: `"@turnkey/session/v1"` ##### `login` and `loginWithReadWriteSession` methods * Updated to use the new `authClient` property to track and store the authentication method used during login ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/wallet-stamper\@2.0.0 * @turnkey/crypto\@2.2.0 ## 1.9.0 ### Minor Changes * 3dd74ac: Added functionality for constructing and returning stamped requests for all packages * 1e36edf: Support RS256 by default when invoking createUserPasskey * 4df8914: Version bump corresponding to mono release v2024.10.10. More detailed changelog to follow * 11a9e2f: Allow override of WebauthnStamper configuration ### Patch Changes * Updated dependencies \[33e8e03] * Updated dependencies \[d989d46] * Updated dependencies \[4df8914] * @turnkey/crypto\@2.1.0 * @turnkey/http\@2.16.0 ## 1.8.0 ### Minor Changes * 9ebd062: Release OTP functionality ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/http\@2.15.0 ## 1.7.1 ### Patch Changes * 96d7f99: Update dependencies * Updated dependencies \[e5c4fe9] * Updated dependencies \[96d7f99] * @turnkey/crypto\@2.0.0 * @turnkey/encoding\@0.4.0 * @turnkey/http\@2.14.2 * @turnkey/api-key-stamper\@0.4.3 ## 1.7.0 ### Minor Changes * ff059d5: Add ability to create a read + write session ### Patch Changes * Updated dependencies \[ff059d5] * Updated dependencies \[93666ff] * @turnkey/http\@2.14.1 * @turnkey/crypto\@1.0.0 * @turnkey/encoding\@0.3.0 * @turnkey/api-key-stamper\@0.4.2 ## 1.6.0 ### Minor Changes * c988ed0: Support activity polling (e.g. for awaiting consensus) * \[Breaking] Update the `activityPoller` parameter for configuring polling behavior * Polling continues until either a max number of retries is reached, or if the activity hits a terminal status The shape of the parameter has gone from: ``` { duration: number; timeout: number; } ``` to ``` { intervalMs: number; numRetries: number; } ``` ### Patch Changes * Updated dependencies \[848f8d3] * @turnkey/http\@2.14.0 ## 1.5.0 ### Minor Changes * 1813ed5: Allow `organizationId` override for `TurnkeyBrowserClient.login` with an extra `config` argument ## 1.4.0 ### Minor Changes * bab5393: Add keyformat to key export bundle injection ### Patch Changes * a16073c: Exposes storage APIs used by the sdk for managing users & sessions * 7e7d209: Add authenticatorAttachment option ## 1.3.0 ### Minor Changes * 93dee46: Add create read write session v2 which allows for user targeting directly from stamp or optional userId in intent ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 ## 1.2.4 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/http\@2.12.3 ## 1.2.3 ### Patch Changes * Fix activity versioning for CREATE\_SUB\_ORGANIZATION (V5=>V6) ## 1.2.2 ### Patch Changes * f4b607f: Verify and pad uncompressed public keys while creating passkey sessions * Updated dependencies * @turnkey/api-key-stamper\@0.4.1 * @turnkey/encoding\@0.2.1 * @turnkey/http\@2.12.2 * @turnkey/crypto\@0.2.1 ## 1.2.1 ### Patch Changes * f17a229: Update to oauth related endpoints to drop jwks uri from oauth providers * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 ## 1.2.0 ### Minor Changes * Add Email Auth V2 - Optional invalidate exisiting Email Authentication API keys ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 ## 1.1.0 ### Minor Changes * Update to use new endpoints. Including CREATE\_READ\_WRITE\_SESSION which allows one shot passkey sessions (returns org information and a credential bundle) and CREATE\_API\_KEYS\_V2 which allows a curve type to be passed (SECP256K1 or P256) ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 ## 1.0.0 ### Major Changes * Stable Release: Add Oauth integration. New suborg creation version will now require an oauthProviders field under root users. ## 0.4.1 ### Patch Changes * Updated dependencies * @turnkey/crypto\@0.2.0 ## 0.4.0 ### Minor Changes * e4b29da: Deprecate the `getAuthBundle()` path for passkey sessions and replace it with `getReadWriteSession()` to store authBundles with their expirationTimestamps so applications can better manually manage active writing sessions ## 0.3.0 ### Minor Changes * d409d81: Add support for Passkey Sessions ## 0.2.1 ### Patch Changes * Updated dependencies \[5d0bfde] * Updated dependencies \[2f2d09a] * Updated dependencies \[976663e] * @turnkey/iframe-stamper\@2.0.0 ## 0.2.0 ### Minor Changes * updated syntax ### Patch Changes * Updated dependencies \[5d0bfde] * Updated dependencies \[2f2d09a] * Updated dependencies \[976663e] * @turnkey/iframe-stamper\@2.0.0 ## 0.1.0 ### Minor Changes * Ready for 0.1.0 ## 0.0.1 Initial (experimental) release! This is an alpha release and subject to change. # SDK React Native Source: https://docs.turnkey.com/changelogs/sdk-react-native/readme # @turnkey/sdk-react-native ## 1.5.14 ### Patch Changes * Updated dependencies \[[`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/crypto\@2.8.9 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/http\@3.16.1 * @turnkey/react-native-passkey-stamper\@1.2.7 ## 1.5.13 ### Patch Changes * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/http\@3.16.0 * @turnkey/crypto\@2.8.8 * @turnkey/react-native-passkey-stamper\@1.2.6 ## 1.5.12 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.7 ## 1.5.11 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.6 ## 1.5.10 ### Patch Changes * Updated dependencies \[[`5f829c6`](https://github.com/tkhq/sdk/commit/5f829c67af03bb85c3806acd202b2debf8274e78), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/crypto\@2.8.5 * @turnkey/http\@3.15.0 * @turnkey/react-native-passkey-stamper\@1.2.5 ## 1.5.9 ### Patch Changes * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/http\@3.14.0 * @turnkey/crypto\@2.8.4 * @turnkey/react-native-passkey-stamper\@1.2.4 ## 1.5.8 ### Patch Changes * Updated dependencies \[[`c745646`](https://github.com/tkhq/sdk/commit/c745646ae4b2a275e116abca07c6e108f89beb04)]: * @turnkey/crypto\@2.8.4 ## 1.5.7 ### Patch Changes * [#1027](https://github.com/tkhq/sdk/pull/1027) [`6e25b17`](https://github.com/tkhq/sdk/commit/6e25b171365707a2653dcf171dd4b14d4291838e) Author [@moeodeh3](https://github.com/moeodeh3) - Expand peer dependency range to include newer versions of `react-native-keychain` ## 1.5.6 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186)]: * @turnkey/crypto\@2.8.3 ## 1.5.5 ### Patch Changes * [#1015](https://github.com/tkhq/sdk/pull/1015) [`429e4c4`](https://github.com/tkhq/sdk/commit/429e4c4b5d897a7233584d4ec429b21bba7a1f2b) Author [@moeodeh3](https://github.com/moeodeh3) - Update react-native-passkey to the latest version for Expo 54 compatibility * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1), [`429e4c4`](https://github.com/tkhq/sdk/commit/429e4c4b5d897a7233584d4ec429b21bba7a1f2b)]: * @turnkey/http\@3.13.1 * @turnkey/react-native-passkey-stamper\@1.2.3 * @turnkey/crypto\@2.8.2 ## 1.5.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.1 ## 1.5.3 ### Patch Changes * Updated dependencies \[[`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/crypto\@2.8.0 ## 1.5.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241)]: * @turnkey/http\@3.13.0 * @turnkey/crypto\@2.7.0 * @turnkey/react-native-passkey-stamper\@1.2.2 ## 1.5.1 ### Patch Changes * Updated dependencies \[[`2191a1b`](https://github.com/tkhq/sdk/commit/2191a1b201fb17dea4c79cf9e02b3a493b18f97a), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f)]: * @turnkey/crypto\@2.7.0 * @turnkey/http\@3.12.1 * @turnkey/react-native-passkey-stamper\@1.2.1 ## 1.5.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/encoding\@0.6.0 * @turnkey/http\@3.12.0 * @turnkey/crypto\@2.6.0 * @turnkey/react-native-passkey-stamper\@1.2.0 * @turnkey/api-key-stamper\@0.5.0 ## 1.5.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.6 * @turnkey/crypto\@2.6.0-beta.6 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/react-native-passkey-stamper\@1.2.0-beta.1 ## 1.5.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/react-native-passkey-stamper\@1.2.0-beta.0 * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/encoding\@0.6.0-beta.5 * @turnkey/crypto\@2.6.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 1.4.4 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158), [`d7420e6`](https://github.com/tkhq/sdk/commit/d7420e6c3559efc1024b58749b31d253150cb189)]: * @turnkey/http\@3.11.0 * @turnkey/crypto\@2.6.0 * @turnkey/react-native-passkey-stamper\@1.1.4 ## 1.4.3 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/http\@3.10.0 * @turnkey/crypto\@2.5.0 * @turnkey/react-native-passkey-stamper\@1.1.3 ## 1.4.2-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.4 * @turnkey/http\@3.10.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 * @turnkey/crypto\@2.5.1-beta.4 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.4 ## 1.4.2-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.3 * @turnkey/http\@3.10.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 * @turnkey/crypto\@2.5.1-beta.3 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.3 ## 1.4.2-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/crypto\@2.5.1-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.2 ## 1.4.2-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 * @turnkey/crypto\@2.5.1-beta.1 * @turnkey/http\@3.8.1-beta.1 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.1 ## 1.4.2-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@1.0.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/crypto\@2.5.1-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/react-native-passkey-stamper\@1.1.2-beta.0 ## 1.4.2 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9)]: * @turnkey/http\@3.9.0 * @turnkey/crypto\@2.5.0 * @turnkey/react-native-passkey-stamper\@1.1.2 ## 1.4.1 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/http\@3.8.0 * @turnkey/crypto\@2.5.0 * @turnkey/react-native-passkey-stamper\@1.1.1 ## 1.4.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed), [`6cde41c`](https://github.com/tkhq/sdk/commit/6cde41cfecdfb7d54abf52cc65e28ef0e2ad6ba3)]: * @turnkey/react-native-passkey-stamper\@1.1.0 * @turnkey/http\@3.7.0 * @turnkey/crypto\@2.5.0 ## 1.3.7 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/http\@3.6.0 * @turnkey/crypto\@2.4.3 * @turnkey/react-native-passkey-stamper\@1.0.19 ## 1.3.6 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/http\@3.5.1 * @turnkey/crypto\@2.4.3 * @turnkey/react-native-passkey-stamper\@1.0.18 ## 1.3.5 ### Patch Changes * Updated dependencies \[[`6cbff7a`](https://github.com/tkhq/sdk/commit/6cbff7a0c0b3a9a05586399e5cef476154d3bdca)]: * @turnkey/crypto\@2.4.3 ## 1.3.4 ### Patch Changes * [#711](https://github.com/tkhq/sdk/pull/711) [`22dc1aa`](https://github.com/tkhq/sdk/commit/22dc1aa3f289ddc5818fb7328235eaa873f8f367) Author [@moeodeh3](https://github.com/moeodeh3) - Added `onInitialized`. A callback function that runs when context initialization is complete, useful for notifying connected apps. * Updated dependencies \[[`c5cdf82`](https://github.com/tkhq/sdk/commit/c5cdf8229da5da1bd6d52db06b2fe42826e96d57), [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/crypto\@2.4.2 ## 1.3.3 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164), [`878e039`](https://github.com/tkhq/sdk/commit/878e03973856cfec83e6e3fda5b76d1b64943628)]: * @turnkey/http\@3.5.0 * @turnkey/api-key-stamper\@0.4.7 * @turnkey/crypto\@2.4.1 * @turnkey/react-native-passkey-stamper\@1.0.17 ## 1.3.2 ### Patch Changes * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/crypto\@2.4.0 * @turnkey/react-native-passkey-stamper\@1.0.16 ## 1.3.1 ### Patch Changes * Updated dependencies \[[`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`10ee5c5`](https://github.com/tkhq/sdk/commit/10ee5c524b477ce998e4fc635152cd101ae5a9cc), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/encoding\@0.5.0 * @turnkey/crypto\@2.4.0 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 * @turnkey/react-native-passkey-stamper\@1.0.15 ## 1.3.0 ### Minor Changes * [#622](https://github.com/tkhq/sdk/pull/622) [`59f8941`](https://github.com/tkhq/sdk/commit/59f8941f77e548e248b2fdafcad36f5f0c2a5d29) Author [@moeodeh3](https://github.com/moeodeh3) - Added support for React 19 Renamed `sessionKey` parameter to `storageKey` in `createEmbeddedKey` `saveEmbeddedKey` and `getEmbeddedKey`. Added optional `embeddedStorageKey` parameter to `createSession`. This allows for retrieval of the embedded key from a custom location in secure storage. ### Patch Changes * [#641](https://github.com/tkhq/sdk/pull/641) [`77611c8`](https://github.com/tkhq/sdk/commit/77611c8f15aa16b316d81ee6addab62d86f2f3bc) Author [@amircheikh](https://github.com/amircheikh) - Added `onSessionEmpty`. A callback function that runs when there is no active session on app launch. * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0)]: * @turnkey/http\@3.4.0 * @turnkey/crypto\@2.3.1 * @turnkey/react-native-passkey-stamper\@1.0.14 ## 1.2.3 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/http\@3.3.0 * @turnkey/crypto\@2.3.1 * @turnkey/react-native-passkey-stamper\@1.0.13 ## 1.2.2 ### Patch Changes * ef399e1: - Eliminated a race condition in `refreshSession` that could throw: `TurnkeyReactNativeError: Embedded key not found when refreshing the session` * The embedded key is now generated entirely in memory using `generateP256KeyPair` * Removed the need to store and immediately retrieve the private key from secure storage * `refreshSession` now accepts a single optional parameter object * `StorageKeys.RefreshEmbeddedKey` is now deprecated and no longer used during session refresh * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 * @turnkey/crypto\@2.3.1 * @turnkey/react-native-passkey-stamper\@1.0.12 ## 1.2.1 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/http\@3.1.0 * @turnkey/crypto\@2.3.1 * @turnkey/react-native-passkey-stamper\@1.0.11 ## 1.2.0 ### Minor Changes * ab45d29: Added `createSessionFromEmbeddedKey` function. This allows creation of a session using a compressed embedded key stored by calling `createEmbeddedKey`. You may also optionally pass in an embedded key created seperately. Utilizing these two functions with a `createSuborg` api call allows for a '1 tap' passkey sign up flow [(example)](https://github.com/tkhq/react-native-demo-wallet/blob/ccf2d6c182b9e5c5ce98014a56b0b9f4282277c2/providers/auth-provider.tsx#L186). Added optional `isCompressed` boolean field to the `createEmbeddedKey` function. This field is necessary for calling `createSessionFromEmbeddedKey`. ## 1.1.0 ### Minor Changes * e8bc05b: Introduces handleGoogleOAuth(): Adds a utility function to handle the Google OAuth authentication flow in React Native. **Usage Summary**:\ `handleGoogleOAuth` launches an InAppBrowser to initiate the OAuth flow using your client ID, nonce, and app scheme. After a successful login, it extracts the `oidcToken` from the redirect URL and calls your `onSuccess` callback with the token. ```ts theme={"system"} handleGoogleOAuth({ clientId: string, // Google OAuth client ID nonce: string, // Random nonce scheme: string, // App’s custom URL scheme (e.g., "myapp") originUri?: string, // Optional custom origin URI - defaults to Turnkey proxies redirectUri?: string, // Optional custom redirect URI - defaults to Turnkey proxies onSuccess: (oidcToken: string) => void, // Called with token on success }); ``` ## 1.0.5 ### Patch Changes * 3b5b360: - Adds optional parameter for createEmbeddedKey(): * You can now pass a sessionKey to createEmbeddedKey() to generate separate embedded keys for different sessions, which is helpful when running multiple authentication flows concurrently. * Introduces onSessionExpiryWarning(): * You can now add a callback via the provider config that triggers 15 seconds before a session expires. * Introduces refreshSession(): * You now can refresh an active session that is about to expire. ## 1.0.4 ### Patch Changes * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/http\@3.0.0 * @turnkey/crypto\@2.3.1 ## 1.0.3 ### Minor Changes * a7e7de0: Fixed compatibility issue with `@turnkey/viem` ## 1.0.2 ### Patch Changes * Updated dependencies \[ecdb29a] * @turnkey/http\@2.22.0 * @turnkey/crypto\@2.3.1 ## 1.0.1 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/http\@2.21.0 * @turnkey/crypto\@2.3.1 ## 1.0.0 ### Major Changes * fcf9503: This breaking change adds support for multiple sessions: * The concept of a **selected session** has been introduced: * Users can switch between sessions using `setSelectedSession({ sessionKey: })`. * The selected session determines the active `client`, `user`, and `session` state. * API calls such as `updateUser`, `createWallet`, and `signRawPayload` now apply to the selected session. * A session limit of **15 active sessions** has been enforced: * If the limit is reached, users must remove an existing session before creating a new one. * Expired or invalid sessions are automatically cleaned up. ## 0.1.1 ### Patch Changes * Updated dependencies \[3c44c4a] * @turnkey/http\@2.20.0 * @turnkey/crypto\@2.3.1 # SDK React Source: https://docs.turnkey.com/changelogs/sdk-react/readme # @turnkey/sdk-react ## 5.5.1 ### Patch Changes * Updated dependencies \[[`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/crypto\@2.8.9 * @turnkey/sdk-types\@0.11.1 * @turnkey/sdk-browser\@5.14.1 * @turnkey/wallet-stamper\@1.1.11 * @turnkey/sdk-server\@5.0.1 ## 5.5.0 ### Minor Changes * [#1153](https://github.com/tkhq/sdk/pull/1153) [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea) Thanks [@moe-dev](https://github.com/moe-dev)! - Deprecated auth component. Developers should use @turnkey/react-wallet-kit instead ### Patch Changes * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea), [`dbd4d8e`](https://github.com/tkhq/sdk/commit/dbd4d8e4ea567240c4d287452dd0d8f53050beca), [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/sdk-server\@5.0.0 * @turnkey/sdk-browser\@5.14.0 * @turnkey/sdk-types\@0.11.0 * @turnkey/crypto\@2.8.8 * @turnkey/wallet-stamper\@1.1.10 ## 5.4.19 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/sdk-types\@0.10.0 * @turnkey/crypto\@2.8.7 * @turnkey/sdk-browser\@5.13.6 * @turnkey/wallet-stamper\@1.1.9 * @turnkey/sdk-server\@4.12.2 ## 5.4.18 ### Patch Changes * [#1142](https://github.com/tkhq/sdk/pull/1142) [`e8bc3d3`](https://github.com/tkhq/sdk/commit/e8bc3d381734dbf12cac1e6317e1a251a9600114) Author [@andrewkmin](https://github.com/andrewkmin) - Bump `NextJS` to 15.5.9 to address [https://github.com/advisories/GHSA-5j59-xgg2-r9c4](https://github.com/advisories/GHSA-5j59-xgg2-r9c4) ## 5.4.17 ### Patch Changes * [#1140](https://github.com/tkhq/sdk/pull/1140) [`28c0e5c`](https://github.com/tkhq/sdk/commit/28c0e5c52a5b55a3459d43493c3fab3dcf70f8de) Author [@andrewkmin](https://github.com/andrewkmin) - Bump `Next.js` to `15.5.8` to address [https://github.com/advisories/GHSA-mwv6-3258-q52c](https://github.com/advisories/GHSA-mwv6-3258-q52c). ## 5.4.16 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.5 ## 5.4.15 ### Patch Changes * [#1120](https://github.com/tkhq/sdk/pull/1120) [`84a9689`](https://github.com/tkhq/sdk/commit/84a96893bd2a0c73496d934499e1645ba4a33b41) Author [@moeodeh3](https://github.com/moeodeh3) - Bump `Next.js` dependency to `15.5.7` to address [Next.js RCE vulnerability in React flight protocol](https://github.com/advisories/GHSA-9qr9-h5gf-34mp) ## 5.4.14 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.4 ## 5.4.13 ### Patch Changes * Updated dependencies \[[`80ea306`](https://github.com/tkhq/sdk/commit/80ea306025a2161ff575a5e2b45794460eafdf1b)]: * @turnkey/sdk-types\@0.9.0 * @turnkey/crypto\@2.8.6 * @turnkey/sdk-browser\@5.13.3 * @turnkey/wallet-stamper\@1.1.8 * @turnkey/sdk-server\@4.12.1 ## 5.4.12 ### Patch Changes * Updated dependencies \[[`4d29af2`](https://github.com/tkhq/sdk/commit/4d29af2dd7c735916c650d697f18f66dd76c1b79)]: * @turnkey/sdk-browser\@5.13.2 ## 5.4.11 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.1 ## 5.4.10 ### Patch Changes * Updated dependencies \[[`5f829c6`](https://github.com/tkhq/sdk/commit/5f829c67af03bb85c3806acd202b2debf8274e78), [`084acce`](https://github.com/tkhq/sdk/commit/084acce85fe7c15513a025e77c1571012ac82e4b), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/crypto\@2.8.5 * @turnkey/sdk-types\@0.8.0 * @turnkey/sdk-browser\@5.13.0 * @turnkey/sdk-server\@4.12.0 * @turnkey/wallet-stamper\@1.1.7 ## 5.4.9 ### Patch Changes * Updated dependencies \[[`71cdca3`](https://github.com/tkhq/sdk/commit/71cdca3b97ba520dc5327410a1e82cf9ad85fb0e), [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/sdk-server\@4.11.0 * @turnkey/sdk-browser\@5.12.0 * @turnkey/crypto\@2.8.4 * @turnkey/wallet-stamper\@1.1.6 ## 5.4.8 ### Patch Changes * Updated dependencies \[[`c745646`](https://github.com/tkhq/sdk/commit/c745646ae4b2a275e116abca07c6e108f89beb04)]: * @turnkey/crypto\@2.8.4 * @turnkey/sdk-browser\@5.11.6 * @turnkey/wallet-stamper\@1.1.6 * @turnkey/sdk-server\@4.10.5 ## 5.4.7 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186)]: * @turnkey/crypto\@2.8.3 * @turnkey/sdk-types\@0.6.3 * @turnkey/sdk-browser\@5.11.5 * @turnkey/wallet-stamper\@1.1.5 * @turnkey/sdk-server\@4.10.4 ## 5.4.6 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-browser\@5.11.4 * @turnkey/sdk-server\@4.10.3 * @turnkey/sdk-types\@0.6.2 * @turnkey/crypto\@2.8.2 * @turnkey/wallet-stamper\@1.1.4 ## 5.4.5 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.11.3 ## 5.4.4 ### Patch Changes * Updated dependencies \[[`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/sdk-types\@0.6.1 * @turnkey/crypto\@2.8.1 * @turnkey/sdk-browser\@5.11.2 * @turnkey/wallet-stamper\@1.1.3 * @turnkey/sdk-server\@4.10.2 ## 5.4.3 ### Patch Changes * Updated dependencies \[[`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/crypto\@2.8.0 * @turnkey/sdk-types\@0.6.0 * @turnkey/sdk-browser\@5.11.1 * @turnkey/wallet-stamper\@1.1.2 * @turnkey/sdk-server\@4.10.1 ## 5.4.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241)]: * @turnkey/sdk-browser\@5.11.0 * @turnkey/sdk-server\@4.10.0 * @turnkey/sdk-types\@0.5.0 * @turnkey/crypto\@2.7.0 * @turnkey/wallet-stamper\@1.1.1 ## 5.4.1 ### Patch Changes * Updated dependencies \[[`2191a1b`](https://github.com/tkhq/sdk/commit/2191a1b201fb17dea4c79cf9e02b3a493b18f97a), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f)]: * @turnkey/crypto\@2.7.0 * @turnkey/sdk-browser\@5.10.1 * @turnkey/sdk-server\@4.9.1 * @turnkey/sdk-types\@0.4.1 * @turnkey/wallet-stamper\@1.1.1 ## 5.4.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/sdk-server\@4.9.0 * @turnkey/sdk-types\@0.4.0 * @turnkey/crypto\@2.6.0 * @turnkey/wallet-stamper\@1.1.0 * @turnkey/sdk-browser\@5.10.0 ## 5.4.0-beta.6 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.6 * @turnkey/crypto\@2.6.0-beta.6 * @turnkey/sdk-browser\@5.9.0-beta.1 * @turnkey/wallet-stamper\@1.1.0-beta.6 * @turnkey/sdk-server\@4.8.1-beta.0 ## 5.4.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.0-beta.5 * @turnkey/sdk-browser\@5.9.0-beta.0 * @turnkey/sdk-server\@4.7.0-beta.2 * @turnkey/sdk-types\@0.4.0-beta.5 * @turnkey/crypto\@2.6.0-beta.5 ## 5.4.0-beta.4 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.1 * @turnkey/sdk-types\@0.4.0-beta.4 * @turnkey/sdk-browser\@5.7.1-beta.1 * @turnkey/crypto\@2.5.1-beta.4 * @turnkey/wallet-stamper\@1.0.9-beta.4 ## 5.4.0-beta.3 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.0 * @turnkey/sdk-types\@0.4.0-beta.3 * @turnkey/sdk-browser\@5.7.1-beta.0 * @turnkey/crypto\@2.5.1-beta.3 * @turnkey/wallet-stamper\@1.0.9-beta.3 ## 5.3.4 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158), [`d7420e6`](https://github.com/tkhq/sdk/commit/d7420e6c3559efc1024b58749b31d253150cb189)]: * @turnkey/sdk-browser\@5.9.0 * @turnkey/sdk-server\@4.8.0 * @turnkey/crypto\@2.6.0 * @turnkey/wallet-stamper\@1.0.9 ## 5.3.3 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/sdk-browser\@5.8.0 * @turnkey/sdk-server\@4.7.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.3.2-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.2 * @turnkey/sdk-browser\@5.6.1-beta.2 * @turnkey/crypto\@2.5.1-beta.2 * @turnkey/wallet-stamper\@1.0.9-beta.2 * @turnkey/sdk-server\@4.5.1-beta.2 ## 5.3.2-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@0.4.0-beta.1 * @turnkey/sdk-browser\@5.6.1-beta.1 * @turnkey/crypto\@2.5.1-beta.1 * @turnkey/wallet-stamper\@1.0.9-beta.1 * @turnkey/sdk-server\@4.5.1-beta.1 ## 5.3.2-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-types\@1.0.0-beta.0 * @turnkey/sdk-browser\@5.6.1-beta.0 * @turnkey/crypto\@2.5.1-beta.0 * @turnkey/wallet-stamper\@1.0.9-beta.0 * @turnkey/sdk-server\@4.5.1-beta.0 ## 5.3.2 ### Patch Changes * [#833](https://github.com/tkhq/sdk/pull/833) [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5) Author [@moeodeh3](https://github.com/moeodeh3) - - Add optional `includeUnverifiedSubOrgs` to `otpConfig` in the Auth component to allow inclusion of unverified subOrgs * Fix `customAccounts` being ignored for subOrgs created through OTP and external wallets * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9), [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5)]: * @turnkey/sdk-browser\@5.7.0 * @turnkey/sdk-server\@4.6.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.3.1 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/sdk-browser\@5.6.0 * @turnkey/sdk-server\@4.5.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.3.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed), [`6cde41c`](https://github.com/tkhq/sdk/commit/6cde41cfecdfb7d54abf52cc65e28ef0e2ad6ba3)]: * @turnkey/sdk-browser\@5.5.0 * @turnkey/sdk-server\@4.4.0 * @turnkey/sdk-types\@0.3.0 * @turnkey/crypto\@2.5.0 * @turnkey/wallet-stamper\@1.0.8 ## 5.2.11 ### Patch Changes * [#787](https://github.com/tkhq/sdk/pull/787) [`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15) Author [@andrewkmin](https://github.com/andrewkmin) - Add `showTitle` toggle in authConfig for the Auth component to control visibility of the "Log in or Sign up" title. * Updated dependencies \[[`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15)]: * @turnkey/sdk-browser\@5.4.1 ## 5.2.10 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/sdk-browser\@5.4.0 * @turnkey/sdk-server\@4.3.0 * @turnkey/crypto\@2.4.3 * @turnkey/wallet-stamper\@1.0.7 ## 5.2.9 ### Patch Changes * Updated dependencies \[[`2db00b0`](https://github.com/tkhq/sdk/commit/2db00b0a799d09ae33fa08a117e3b2f433f2b0b4)]: * @turnkey/sdk-server\@4.2.4 ## 5.2.8 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/sdk-browser\@5.3.4 * @turnkey/sdk-server\@4.2.3 * @turnkey/crypto\@2.4.3 * @turnkey/wallet-stamper\@1.0.7 ## 5.2.7 ### Patch Changes * Updated dependencies \[[`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf)]: * @turnkey/sdk-browser\@5.3.3 ## 5.2.6 ### Patch Changes * Updated dependencies \[[`6cbff7a`](https://github.com/tkhq/sdk/commit/6cbff7a0c0b3a9a05586399e5cef476154d3bdca)]: * @turnkey/crypto\@2.4.3 * @turnkey/sdk-browser\@5.3.2 * @turnkey/wallet-stamper\@1.0.7 * @turnkey/sdk-server\@4.2.2 ## 5.2.5 ### Patch Changes * Updated dependencies \[[`c5cdf82`](https://github.com/tkhq/sdk/commit/c5cdf8229da5da1bd6d52db06b2fe42826e96d57), [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79), [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/crypto\@2.4.2 * @turnkey/sdk-browser\@5.3.1 * @turnkey/wallet-stamper\@1.0.6 * @turnkey/sdk-server\@4.2.1 ## 5.2.4 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164), [`878e039`](https://github.com/tkhq/sdk/commit/878e03973856cfec83e6e3fda5b76d1b64943628)]: * @turnkey/sdk-browser\@5.3.0 * @turnkey/sdk-server\@4.2.0 * @turnkey/crypto\@2.4.1 * @turnkey/wallet-stamper\@1.0.5 ## 5.2.3 ### Patch Changes * Updated dependencies \[[`039602a`](https://github.com/tkhq/sdk/commit/039602a015d20783952b992d1d339f5fc003f658)]: * @turnkey/sdk-types\@0.2.1 * @turnkey/sdk-browser\@5.2.3 ## 5.2.2 ### Patch Changes * Updated dependencies \[[`0dd3fc3`](https://github.com/tkhq/sdk/commit/0dd3fc31956992c5b449da5868f6eef8b0bb194c)]: * @turnkey/sdk-types\@0.2.0 * @turnkey/sdk-browser\@5.2.2 ## 5.2.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.4.0 * @turnkey/sdk-browser\@5.2.1 * @turnkey/sdk-server\@4.1.1 * @turnkey/wallet-stamper\@1.0.4 ## 5.2.0 ### Minor Changes * [#632](https://github.com/tkhq/sdk/pull/632) [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a) Author [@amircheikh](https://github.com/amircheikh) - Added optional `socialLinking` boolean to the `authConfig`. If true, this will enable social linking for new Google \<-> Gmail users. For more information on social linking, visit [our docs](https://docs.turnkey.com/authentication/social-logins#social-linking). ### Patch Changes * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`10ee5c5`](https://github.com/tkhq/sdk/commit/10ee5c524b477ce998e4fc635152cd101ae5a9cc), [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/sdk-browser\@5.2.0 * @turnkey/wallet-stamper\@1.0.4 * @turnkey/crypto\@2.4.0 * @turnkey/sdk-server\@4.1.0 ## 5.1.0 ### Minor Changes * Update @turnkey/sdk-types readme and install dependency in packages with common types * [#650](https://github.com/tkhq/sdk/pull/650) [`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412) Author [@turnekybc](https://github.com/turnekybc) - Update @turnkey/sdk-types readme and install dependency in packages with common types ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-browser\@5.1.0 * @turnkey/sdk-types\@0.1.0 * @turnkey/sdk-server\@4.0.1 ## 5.0.2 ### Patch Changes * [#648](https://github.com/tkhq/sdk/pull/648) [`fd2eb18`](https://github.com/tkhq/sdk/commit/fd2eb18afd7a1338f584eda65962f9880eea7092) Thanks [@moe-dev](https://github.com/moe-dev)! - Patch fix for inpage oauth on EWK sometimes failing with Google ## 5.0.1 ### Patch Changes * [#646](https://github.com/tkhq/sdk/pull/646) [`c6754f2`](https://github.com/tkhq/sdk/commit/c6754f29cce16f0d4451e380742f581a2bf55e77) Thanks [@moe-dev](https://github.com/moe-dev)! - Patch releases fixes Google Oauth edge case in the Auth Component where logins fail due to indexedDbPublic key not being available yet ## 5.0.0 ### Major Changes * [#601](https://github.com/tkhq/sdk/pull/601) [`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0) Author [@moe-dev](https://github.com/moe-dev) This release significantly enhances authentication by integrating the new `indexedDbClient` within the `useTurnkey` hook and updating the `Auth` component to leverage IndexedDB for secure, persistent client-side authentication. ### Key Changes: * **IndexedDB Authentication**: * Replaced the legacy iframe-based authentication with `indexedDbClient` for all authentication flows in the `Auth` component. * Secure, persistent, non-extractable P-256 keys stored in IndexedDB now provide authentication and session management. * **Enhanced Developer Experience**: * The `useTurnkey` hook now includes direct access to the new `indexedDbClient`. * Simplified and secure client-side authentication without iframe complexity or credential injection. ### Deprecation Notice: * The `iframeClient` for authentication flows is now deprecated. All new integrations should migrate to the IndexedDB-based authentication provided by `indexedDbClient`. ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0), [`e8a5f1b`](https://github.com/tkhq/sdk/commit/e8a5f1b431623c4ff1cb85c6039464b328cf0e6a)]: * @turnkey/sdk-browser\@5.0.0 * @turnkey/sdk-server\@4.0.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.2.6 ### Patch Changes * fe0957d: Updated the styling of the OtpInput component in the Auth component to remove spinner buttons from numeric inputs. * Updated dependencies \[25ca339] * @turnkey/sdk-browser\@4.3.0 * @turnkey/sdk-server\@3.3.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.2.5 ### Patch Changes * 1cf9243: - Added `openOAuthInPage` to the `authConfig`. This makes the Google, Apple and Facebook login pages replace the current URL, rather than opening in a popup. * Fixed keyboard input type on mobile. Now, the keyboard will correctly default to "number" input for numeric OTP codes and "text" input for alphanumeric OTP codes. * Updated dependencies \[3f6e415] * @turnkey/sdk-browser\@4.2.0 * @turnkey/sdk-server\@3.2.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.2.4 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/sdk-browser\@4.1.0 * @turnkey/sdk-server\@3.1.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.2.3 ### Patch Changes * 0e630b2: Update supported countries for SMS deliverability in EWK ## 4.2.2 ### Patch Changes * 7755413: Ensure that iframe has an embedded key ## 4.2.1 ### Patch Changes * Updated dependencies \[7b72769] * @turnkey/sdk-server\@3.0.1 ## 4.2.0 ### Minor Changes * de59993: Update default country codes to supported deliveries: USA, Canada, France, Czech Republic, Finland, Germany, Greece, Hungary, Iceland, Ireland, Italy, Latvia (with a 1 min delay), Lithuania, Luxembourg, Malta, Mexico, Moldova, Montenegro, Netherlands, Norway, Poland, Portugal, Romania, Serbia, Slovenia, Spain, Sweden, Switzerland. * d1083bd: Add `otpConfig` param to `Auth` component that allows you to pass in `alphanumeric` and `otpLength` default for the Auth component is still false, 6 respectively (non breaking) ### Patch Changes * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * @turnkey/sdk-browser\@4.0.0 * @turnkey/sdk-server\@3.0.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.1.3 ### Patch Changes * Updated dependencies \[bf87774] * @turnkey/sdk-browser\@3.1.0 * Expose `getEmbeddedPublicKey()` via `TurnkeyIframeClient`. This can be used to fetch the live public key of the target embedded key living within an iframe. Usage may look like the following: ```javascript theme={"system"} import { useTurnkey } from "@turnkey/sdk-react"; ... const { authIframeClient } = useTurnkey(); const publicKey = await authIframeClient!.getEmbeddedPublicKey(); ``` Functionally, this can be useful for scenarios where the developer would like to verify whether an iframe has a live embedded key within it. This contrasts from the static `iframeStamper.iframePublicKey` exposed by `@turnkey/iframe-stamper`'s `publicKey()` method. ## 4.1.2 ### Patch Changes * Updated dependencies \[5ec5187] * @turnkey/sdk-browser\@3.0.1 * @turnkey/sdk-server\@2.6.1 ## 4.1.1 ### Patch Changes * 2b8de45: Add passkeyConfig to EWK You can do this by passing optional `passkeyConfig` of interface `PasskeyConfig` to the `` component ``` export interface PasskeyConfig { displayName?: string; name?: string; } ``` ## 4.1.0 ### Minor Changes * 72890f5: ### @turnkey/sdk-browser * Move all type definitions to [`./__types__/base.ts`](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts) * `TurnkeyBrowserClient` * `refereshSession()` now consumes a [RefreshSessionParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L213) parameter * `loginWithBundle()` now consumes a [LoginWithBundleParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L219) parameter * `loginWithPasskey()` now consumes a [LoginWithPasskeyParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L224) parameter * `loginWithWallet()` now consumes a [LoginWithWalletParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L231) parameter ### @turnkey/sdk-react * `Auth.tsx` * updated `passkeyClient?.loginWithPasskey()` to implement new method signature * updated `walletClient?.loginWithWallet()` to implement new method signature ### @turnkey/sdk-server * Move all type definitions to [`./__types__/base.ts`](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-server/src/__types__/base.ts) ### Patch Changes * c9ae537: Update nextJs to >= 15.2.3 as per github advisory: [https://github.com/advisories/GHSA-f82v-jwr5-mffw](https://github.com/advisories/GHSA-f82v-jwr5-mffw) For Next.js 15.x, this issue is fixed in 15.2.3 For Next.js 14.x, this issue is fixed in 14.2.25 For Next.js 13.x, this issue is fixed in 13.5.9 For Next.js 12.x, this issue is fixed in 12.3.5 * Updated dependencies \[0e4e959] * Updated dependencies \[856f449] * Updated dependencies \[c9ae537] * Updated dependencies \[d4ce5fa] * Updated dependencies \[ecdb29a] * Updated dependencies \[72890f5] * @turnkey/sdk-browser\@3.0.0 * @turnkey/sdk-server\@2.6.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 4.0.0 ### Major Changes * 93540e7: ## Major Package Updates ### @turnkey/sdk-browser * create abstract `TurnkeyBaseClient` class which extends `TurnkeySDKClientBase` * `TurnkeyBrowserClient`, `TurnkeyIframeClient`, `TurnkeyPasskeyClient`, and `TurnkeyWalletClient` all extend `TurnkeyBaseClient` * TurnkeyBrowserClient * Session Management * `refreshSession` - attempts to refresh an existing, active session and will extend the session expiry using the `expirationSeconds` parameter * loginWithBundle - authenticate a user via a credential bundle and creates a read-write session * loginWithPasskey - attempts to authenticate a user via passkey and create a read-only or read-write session * loginWithSession - takes a `Session`, which can be either read-only or read-write, created via a server action and attempts to authenticate the user * TurnkeyPasskeyClient * Session Management * createPasskeySession - leverages passkey authentication to create a read-write session. Once authenticated, the user will not be prompted for additional passkey taps. ### @turnkey/sdk-react * update `TurnkeyContext` to use new `.getSession()` method to check if there is an active session * `OTPVerification` component no longer receives `authIframeClient` or `onValidateSuccess` props ## Minor Package Updates ### @turnkey/sdk-server * expose `sendCredential` server action * add `SessionType` enum * `READ_ONLY` & `READ_WRITE` ### @turnkey/eip-1193-provider * update dependencies in `package.json` * moved from `peerDependencies` to `dependencies` * `"@turnkey/http": "workspace:*"` * `"@turnkey/sdk-browser": "workspace:*"` * moved from `devDependencies` to `dependencies` * `"@turnkey/api-key-stamper": "workspace:*"` * specify TypeScript version ^5.1.5 ### Minor Changes * 9147962: add dangerouslyOverrideIframeKeyTtl option to override iframe embedded key TTL (for longer lived read/write sessions) ### Patch Changes * fdb8bf0: Add loading indicators for EWK. Exposed email customization to EWK. * Updated dependencies \[93540e7] * Updated dependencies \[fdb8bf0] * Updated dependencies \[9147962] * @turnkey/sdk-browser\@2.0.0 * @turnkey/sdk-server\@2.5.0 * @turnkey/crypto\@2.3.1 ## 3.1.0 ### Minor Changes * 9317588: Adds wallet as an authentication option in the Embedded Wallet Kit components for sdk-react ### Patch Changes * Updated dependencies \[233ae71] * Updated dependencies \[9317588] * @turnkey/sdk-browser\@1.16.0 * @turnkey/sdk-server\@2.4.0 * @turnkey/crypto\@2.3.1 ## 3.0.6 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/sdk-browser\@1.15.0 * @turnkey/sdk-server\@2.3.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 3.0.5 ### Patch Changes * cdf2e6e: Fix issue in EWK preventing sign up flow ## 3.0.4 ### Patch Changes * 9256e75: Fix apple login issue on mobile web browser * bfc833f: Add getOrCreateSuborg server action * Updated dependencies \[3c44c4a] * Updated dependencies \[bfc833f] * @turnkey/sdk-browser\@1.14.0 * @turnkey/sdk-server\@2.2.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 3.0.3 ### Patch Changes * 5f6de98: Fix phone number validation issue causing issues with non +1 country codes * Updated dependencies \[69d2571] * Updated dependencies \[57f9cb0] * @turnkey/sdk-browser\@1.13.0 * @turnkey/sdk-server\@2.1.0 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 3.0.2 ### Patch Changes * faa757c: Patch EWK custom session lengths - previously not working as intended (defaulted to 15 minute sessions only) and fix the following useLocalStorage issue when compiling: \[Error: useLocalStorage is a client-only hook] * a8bd73b: Fix issue with EWK where suborgs were being created on failed fetches ## 3.0.1 ### Patch Changes * cb8cf7e: Add all supported country codes to phone input field * 2eb2179: Fix bundling issue with sdk-react * Updated dependencies \[755833b] * Updated dependencies \[2bc0046] * @turnkey/sdk-browser\@1.12.1 * @turnkey/sdk-server\@2.0.1 * @turnkey/crypto\@2.3.1 * @turnkey/wallet-stamper\@1.0.3 ## 3.0.0 ### Major Changes * 1ebd4e2: Remove references to server actions and import from sdk-server ### Patch Changes * Updated dependencies \[6695af2] * Updated dependencies \[1ebd4e2] * @turnkey/sdk-browser\@1.12.0 * @turnkey/sdk-server\@2.0.0 * @turnkey/crypto\@2.3.0 * @turnkey/wallet-stamper\@1.0.2 ## 2.0.4 ### Patch Changes * 99ebe78: Fixed MUI components not inheriting fonts. * Updated dependencies \[053fbfb] * @turnkey/sdk-browser\@1.11.2 * @turnkey/sdk-server\@1.7.3 * @turnkey/crypto\@2.3.0 * @turnkey/wallet-stamper\@1.0.2 ## 2.0.3 ### Patch Changes * d43c52c: Add session length customization, wallet generation customization, enter to continue, more css customization and css fixes (icon sizing issues, etc) * 5419d49: fix css bundling bug * Updated dependencies \[328d6aa] * Updated dependencies \[b90947e] * Updated dependencies \[2d5977b] * Updated dependencies \[fad7c37] * @turnkey/sdk-browser\@1.11.1 * @turnkey/sdk-server\@1.7.2 * @turnkey/crypto\@2.3.0 * @turnkey/wallet-stamper\@1.0.2 ## 2.0.2 ### Patch Changes * eaf3e20: Fix css related build issues with React 19+ & NextJs 15+ ## 2.0.1 ### Patch Changes * 0da96aa: Add readme to react sdk ## 2.0.0 ### Major Changes * 95717d7: New Feature: UI components - Auth, Export, Import. Leverages server and client directives on NextJS 13+ to abstract functionalities away from the developer ### Patch Changes * c8330fa: Add a user identifier for sms rate limiting * 12d5aaa: Update TurnkeySDKBrowserConfig type with an optional iframeUrl field. The TurnkeyContext provider will check for an iframeUrl otherwise it will fallback to the default. * Updated dependencies \[7988bc1] * Updated dependencies \[c895c8f] * Updated dependencies \[538d4fc] * Updated dependencies \[12d5aaa] * @turnkey/sdk-browser\@1.11.0 * @turnkey/wallet-stamper\@1.0.2 * @turnkey/sdk-server\@1.7.1 * @turnkey/crypto\@2.3.0 ## 1.1.2 ### Patch Changes * @turnkey/sdk-browser\@1.10.2 * @turnkey/wallet-stamper\@1.0.1 ## 1.1.1 ### Patch Changes * @turnkey/sdk-browser\@1.10.1 * @turnkey/wallet-stamper\@1.0.0 ## 1.1.0 ### Minor Changes * The `useTurnkey` hook now returns the new `walletClient`, used for authenticating requests via wallet signatures * Added new `client` object returned from the `useTurnkey` hook. This is the authenticated client. It will be null if the user is not authenticated. Example: ```typescript theme={"system"} const { client } = useTurnkey(); ``` ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/wallet-stamper\@2.0.0 * @turnkey/sdk-browser\@1.10.0 ## 1.0.14 ### Patch Changes * Updated dependencies \[3dd74ac] * Updated dependencies \[1e36edf] * Updated dependencies \[4df8914] * Updated dependencies \[11a9e2f] * @turnkey/sdk-browser\@1.9.0 ## 1.0.13 ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/sdk-browser\@1.8.0 ## 1.0.12 ### Patch Changes * Updated dependencies \[96d7f99] * @turnkey/sdk-browser\@1.7.1 ## 1.0.11 ### Patch Changes * Updated dependencies \[ff059d5] * @turnkey/sdk-browser\@1.7.0 ## 1.0.10 ### Patch Changes * Updated dependencies \[c988ed0] * @turnkey/sdk-browser\@1.6.0 ## 1.0.9 ### Patch Changes * Updated dependencies \[1813ed5] * @turnkey/sdk-browser\@1.5.0 ## 1.0.8 ### Patch Changes * Updated dependencies \[bab5393] * Updated dependencies \[a16073c] * Updated dependencies \[7e7d209] * @turnkey/sdk-browser\@1.4.0 ## 1.0.7 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/sdk-browser\@1.3.0 ## 1.0.6 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/sdk-browser\@1.2.4 ## 1.0.5 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.2.3 ## 1.0.4 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.2.2 ## 1.0.3 ### Patch Changes * f17a229: Update to oauth related endpoints to drop jwks uri from oauth providers * Updated dependencies \[f17a229] * @turnkey/sdk-browser\@1.2.1 ## 1.0.2 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.2.0 ## 1.0.1 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.1.0 ## 1.0.0 ### Major Changes * Stable Release: Add Oauth integration. New suborg creation version will now require an oauthProviders field under root users. ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.0.0 ## 0.4.1 ### Patch Changes * @turnkey/sdk-browser\@0.4.1 ## 0.4.0 ### Minor Changes * e4b29da: Deprecate the `getAuthBundle()` path for passkey sessions and replace it with `getReadWriteSession()` to store authBundles with their expirationTimestamps so applications can better manually manage active writing sessions ### Patch Changes * Updated dependencies \[e4b29da] * @turnkey/sdk-browser\@0.4.0 ## 0.3.0 ### Minor Changes * d409d81: Add support for Passkey Sessions ### Patch Changes * Updated dependencies \[d409d81] * @turnkey/sdk-browser\@0.3.0 ## 0.2.1 ### Patch Changes * @turnkey/sdk-browser\@0.2.1 ## 0.2.0 ### Minor Changes * updated syntax ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@0.2.0 ## 0.1.0 ### Minor Changes * Ready for 0.1.0 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@0.1.0 ## 0.0.1 Initial (experimental) release! This is an alpha release and subject to change. # SDK Server Source: https://docs.turnkey.com/changelogs/sdk-server/readme # @turnkey/sdk-server ## 5.0.1 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/api-key-stamper\@0.6.0 * @turnkey/wallet-stamper\@1.1.11 * @turnkey/http\@3.16.1 ## 5.0.0 ### Major Changes * [#1153](https://github.com/tkhq/sdk/pull/1153) [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea) Thanks [@moe-dev](https://github.com/moe-dev)! - Update as per mono v2025.12.3. ### Breaking/Behavioral Changes * `appName` is now **required**: * In `emailCustomization` for Email Auth activities * At the top-level intent for OTP activities * Auth proxy endpoints are **not affected** ### Activity Version Bumps The following activity types have been versioned: * `ACTIVITY_TYPE_INIT_OTP` → `ACTIVITY_TYPE_INIT_OTP_V2` * `ACTIVITY_TYPE_INIT_OTP_AUTH_V2` → `ACTIVITY_TYPE_INIT_OTP_V3` * `ACTIVITY_TYPE_EMAIL_AUTH_V2` → `ACTIVITY_TYPE_EMAIL_AUTH_V3` * `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY` -> `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2` ### Patch Changes * [#1145](https://github.com/tkhq/sdk/pull/1145) [`dbd4d8e`](https://github.com/tkhq/sdk/commit/dbd4d8e4ea567240c4d287452dd0d8f53050beca) Author [@moeodeh3](https://github.com/moeodeh3) - Stamp function improvements * Queries: add `organizationId` fallback from config * Activities: fix request structure to include the `parameters wrapper`, `organizationId`, `timestampMs`, and `type` fields * Updated dependencies \[[`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/http\@3.16.0 * @turnkey/wallet-stamper\@1.1.10 ## 4.12.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.9 ## 4.12.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.8 ## 4.12.0 ### Minor Changes * [#1072](https://github.com/tkhq/sdk/pull/1072) [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b) Thanks [@moe-dev](https://github.com/moe-dev)! - Bump packages as per mono v2025.11.0 ### Patch Changes * Updated dependencies \[[`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/http\@3.15.0 * @turnkey/wallet-stamper\@1.1.7 ## 4.11.0 ### Minor Changes * [#1063](https://github.com/tkhq/sdk/pull/1063) [`71cdca3`](https://github.com/tkhq/sdk/commit/71cdca3b97ba520dc5327410a1e82cf9ad85fb0e) Author [@zkharit](https://github.com/zkharit) - Omit optional email parameter if not set * [#1058](https://github.com/tkhq/sdk/pull/1058) [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release `v2025.10.10-hotfix.2` ### Patch Changes * Updated dependencies \[[`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/http\@3.14.0 * @turnkey/wallet-stamper\@1.1.6 ## 4.10.5 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.6 ## 4.10.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.5 ## 4.10.3 ### Patch Changes * [#1016](https://github.com/tkhq/sdk/pull/1016) [`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1) Author [@amircheikh](https://github.com/amircheikh) - Synced API as per mono v2025.10.2 * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/http\@3.13.1 * @turnkey/wallet-stamper\@1.1.4 ## 4.10.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.3 ## 4.10.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.1.2 ## 4.10.0 ### Minor Changes * [#977](https://github.com/tkhq/sdk/pull/977) [`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241) Author [@besler613](https://github.com/besler613) - OAuth2Authenticate now supports returning the encrypted bearer token via the optional `bearerTokenTargetPublicKey` request parameter (mono release v2025.9.5) ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241)]: * @turnkey/http\@3.13.0 * @turnkey/wallet-stamper\@1.1.1 ## 4.9.1 ### Patch Changes * [#958](https://github.com/tkhq/sdk/pull/958) [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f) Author [@amircheikh](https://github.com/amircheikh) - - Synced api with mono * Updated dependencies \[[`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f)]: * @turnkey/http\@3.12.1 * @turnkey/wallet-stamper\@1.1.1 ## 4.9.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/http\@3.12.0 * @turnkey/api-key-stamper\@0.5.0 * @turnkey/wallet-stamper\@1.1.0 ## 4.8.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/wallet-stamper\@1.1.0-beta.6 ## 4.8.0 ### Minor Changes * [#879](https://github.com/tkhq/sdk/pull/879) [`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158) Author [@zkharit](https://github.com/zkharit) - Update packages to include new activities as of the newest release (mono v2025.8.10) ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/http\@3.11.0 * @turnkey/wallet-stamper\@1.0.9 ## 4.7.0-beta.2 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/wallet-stamper\@1.1.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 4.7.0-beta.1 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/http\@3.10.0-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 * @turnkey/wallet-stamper\@1.0.9-beta.4 ## 4.7.0-beta.0 ### Minor Changes * @turnkey/react-wallet-kit and @turnkey/core beta-3 release ### Patch Changes * Updated dependencies \[]: * @turnkey/http\@3.10.0-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 * @turnkey/wallet-stamper\@1.0.9-beta.3 ## 4.7.0 ### Minor Changes * [#861](https://github.com/tkhq/sdk/pull/861) [`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6) Author [@amircheikh](https://github.com/amircheikh) - Synced as per mono 2025.8.4 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/http\@3.10.0 * @turnkey/wallet-stamper\@1.0.8 ## 4.6.0 ### Minor Changes * [#834](https://github.com/tkhq/sdk/pull/834) [`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9) Author [@moeodeh3](https://github.com/moeodeh3) - Update per mono release v2025.8.3-hotfix.0 ### Patch Changes * [#833](https://github.com/tkhq/sdk/pull/833) [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5) Author [@moeodeh3](https://github.com/moeodeh3) - Add optional `includeUnverified` parameter to `getOrCreateSuborg()` to allow inclusion of unverified subOrgs * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9)]: * @turnkey/http\@3.9.0 * @turnkey/wallet-stamper\@1.0.8 ## 4.5.1-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/wallet-stamper\@1.0.9-beta.2 ## 4.5.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/wallet-stamper\@1.0.9-beta.0 ## 4.5.0 ### Minor Changes * [#826](https://github.com/tkhq/sdk/pull/826) [`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0) Author [@turnekybc](https://github.com/turnekybc) - Update per mono release v2025.8.1 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/http\@3.8.0 * @turnkey/wallet-stamper\@1.0.8 ## 4.4.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 * @turnkey/wallet-stamper\@1.0.8 ## 4.3.0 ### Minor Changes * [#782](https://github.com/tkhq/sdk/pull/782) [`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e) Thanks [@r-n-o](https://github.com/r-n-o)! - Release v2025.7.16 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/http\@3.6.0 * @turnkey/wallet-stamper\@1.0.7 ## 4.2.4 ### Patch Changes * [#780](https://github.com/tkhq/sdk/pull/780) [`2db00b0`](https://github.com/tkhq/sdk/commit/2db00b0a799d09ae33fa08a117e3b2f433f2b0b4) Thanks [@moe-dev](https://github.com/moe-dev)! - Patch fix for server actions leading to unwanted suborg creation when query requests time out ## 4.2.3 ### Patch Changes * [#763](https://github.com/tkhq/sdk/pull/763) [`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a) Author [@andrewkmin](https://github.com/andrewkmin) - Release per mono v2025.7.1. This release contains the following API changes: * Introduction of `SmartContractInterfaces`: we've now exposed endpoints for uploading ABIs and IDLs to help secure EVM and Solana signing flows. For more information, see our docs [here](https://docs.turnkey.com/concepts/policies/smart-contract-interfaces) * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/http\@3.5.1 * @turnkey/wallet-stamper\@1.0.7 ## 4.2.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.0.7 ## 4.2.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/wallet-stamper\@1.0.6 ## 4.2.0 ### Minor Changes * [#704](https://github.com/tkhq/sdk/pull/704) [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd) Author [@amircheikh](https://github.com/amircheikh) - Synced with mono 2025.6.10 to include the following endpoints: `update_user_email`: Update a User's email in an existing Organization `update_user_name`: Update a User's name in an existing Organization `update_user_phone_number`: Update a User's phone number in an existing Organization ### Patch Changes * [#698](https://github.com/tkhq/sdk/pull/698) [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164) Author [@moeodeh3](https://github.com/moeodeh3) - Introduces an optional `runtimeOverride` parameter that allows the ability to explicitly specify the crypto environment: `"browser"`, `"node"`, or `"purejs"`. * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/http\@3.5.0 * @turnkey/api-key-stamper\@0.4.7 * @turnkey/wallet-stamper\@1.0.5 ## 4.1.1 ### Patch Changes * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/wallet-stamper\@1.0.4 ## 4.1.0 ### Minor Changes * [#632](https://github.com/tkhq/sdk/pull/632) [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a) Author [@amircheikh](https://github.com/amircheikh) - Exposed `createOauthProviders` and `getUsers` as server actions. These are used for social linking within `@turnkey/sdk-react`. ### Patch Changes * [#663](https://github.com/tkhq/sdk/pull/663) [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2) Thanks [@moe-dev](https://github.com/moe-dev)! - Update to endpoints as per mono v2025.5.7. Add V5 TON address format generation. Non breaking * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/wallet-stamper\@1.0.4 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 ## 4.0.1 ### Patch Changes * Update @turnkey/sdk-types readme and install dependency in packages with common types * [#650](https://github.com/tkhq/sdk/pull/650) [`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412) Author [@turnekybc](https://github.com/turnekybc) - Update @turnkey/sdk-types readme and install dependency in packages with common types ## 4.0.0 ### Major Changes * [#601](https://github.com/tkhq/sdk/pull/601) [`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0) Author [@moe-dev](https://github.com/moe-dev). This release introduces significant updates and new actions to the SDK server methods, enhancing authentication flows and simplifying usage: **Updated Actions:** * `sendOtp`: No longer requires a suborganization ID; OTPs can now be sent directly under a parent organization's context to any email or phone number. * `verifyOtp`: Now returns a `verificationToken`, which is required for creating sessions via the new `otpLogin` action. **New Actions:** * `otpLogin`: Creates a session using a previously obtained `verificationToken`. Returns a session JWT. * `oauthLogin`: Authenticates using an OIDC token obtained from a third-party provider (e.g., Google, Apple, Facebook). Returns a session JWT. These changes standardize authentication processes, simplify integration, and streamline session management across the SDK. ### Patch Changes * [#631](https://github.com/tkhq/sdk/pull/631) [`e8a5f1b`](https://github.com/tkhq/sdk/commit/e8a5f1b431623c4ff1cb85c6039464b328cf0e6a) Author [@andrewkmin](https://github.com/andrewkmin) - Remove unused Next.js dependency * while the `"use server"` directive in `actions.ts` is to be used specifically with Next, removing it from this package (`@turnkey/sdk-server`) is fine, though applications *using* this package will need Next.js * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0)]: * @turnkey/http\@3.4.0 * @turnkey/wallet-stamper\@1.0.3 ## 3.3.0 ### Minor Changes * 25ca339: Adding replyToEmailAddress field for specifying reply-to when using a customer sender ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/http\@3.3.0 * @turnkey/wallet-stamper\@1.0.3 ## 3.2.0 ### Minor Changes * 3f6e415: Update per mono v2025.4.5 ### Patch Changes * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 * @turnkey/wallet-stamper\@1.0.3 ## 3.1.0 ### Minor Changes * 3e4a482: Release per mono v2025.4.4 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/http\@3.1.0 * @turnkey/wallet-stamper\@1.0.3 ## 3.0.1 ### Patch Changes * 7b72769: Add sendFromEmailSenderName to sendOtp server action ## 3.0.0 ### Major Changes * d1083bd: initOtpAuth now defaults to v2 (breaking) which allows alphanumeric boolean and otpLength (6-9) to be passed + associated updates to server actions. More details below. * This release introduces the `INIT_OTP_AUTH_V2` activity. The difference between it and `INIT_OTP_AUTH` is that it can now accept `alphanumeric` and `otpLength` for selecting crockford bech32 alphanumeric codes and the length of those codes. By default alphanumeric = true, otpLength = 9 * This release introduces `sendFromEmailSenderName` to `INIT_OTP_AUTH`, `INIT_OTP_AUTH_V2`, `EMAIL_AUTH` and `EMAIL_AUTH_V2`. This is an optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'. ### Patch Changes * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/http\@3.0.0 * @turnkey/wallet-stamper\@1.0.3 ## 2.6.1 ### Patch Changes * 5ec5187: Fix initOtpAuth bug with improper version result (to be updated to V2 following release r2025.3.8) ## 2.6.0 ### Minor Changes * ecdb29a: Update API as per mono v2025.3.2 - Add CREATE\_USERS\_V3 ### Patch Changes * 0e4e959: bump update policy activity to v2 * c9ae537: Update nextJs to >= 15.2.3 as per github advisory: [https://github.com/advisories/GHSA-f82v-jwr5-mffw](https://github.com/advisories/GHSA-f82v-jwr5-mffw) For Next.js 15.x, this issue is fixed in 15.2.3 For Next.js 14.x, this issue is fixed in 14.2.25 For Next.js 13.x, this issue is fixed in 13.5.9 For Next.js 12.x, this issue is fixed in 12.3.5 * 72890f5: ### @turnkey/sdk-browser * Move all type definitions to [`./__types__/base.ts`](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts) * `TurnkeyBrowserClient` * `refereshSession()` now consumes a [RefreshSessionParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L213) parameter * `loginWithBundle()` now consumes a [LoginWithBundleParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L219) parameter * `loginWithPasskey()` now consumes a [LoginWithPasskeyParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L224) parameter * `loginWithWallet()` now consumes a [LoginWithWalletParams](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-browser/src/__types__/base.ts#L231) parameter ### @turnkey/sdk-react * `Auth.tsx` * updated `passkeyClient?.loginWithPasskey()` to implement new method signature * updated `walletClient?.loginWithWallet()` to implement new method signature ### @turnkey/sdk-server * Move all type definitions to [`./__types__/base.ts`](https://github.com/tkhq/sdk/blob/494911d948d0a53c0d00aa01e9821aefd5e3f80d/packages/sdk-server/src/__types__/base.ts) * Updated dependencies \[ecdb29a] * @turnkey/http\@2.22.0 * @turnkey/wallet-stamper\@1.0.3 ## 2.5.0 ### Minor Changes * 93540e7: ## Major Package Updates ### @turnkey/sdk-browser * create abstract `TurnkeyBaseClient` class which extends `TurnkeySDKClientBase` * `TurnkeyBrowserClient`, `TurnkeyIframeClient`, `TurnkeyPasskeyClient`, and `TurnkeyWalletClient` all extend `TurnkeyBaseClient` * TurnkeyBrowserClient * Session Management * `refreshSession` - attempts to refresh an existing, active session and will extend the session expiry using the `expirationSeconds` parameter * loginWithBundle - authenticate a user via a credential bundle and creates a read-write session * loginWithPasskey - attempts to authenticate a user via passkey and create a read-only or read-write session * loginWithSession - takes a `Session`, which can be either read-only or read-write, created via a server action and attempts to authenticate the user * TurnkeyPasskeyClient * Session Management * createPasskeySession - leverages passkey authentication to create a read-write session. Once authenticated, the user will not be prompted for additional passkey taps. ### @turnkey/sdk-react * update `TurnkeyContext` to use new `.getSession()` method to check if there is an active session * `OTPVerification` component no longer receives `authIframeClient` or `onValidateSuccess` props ## Minor Package Updates ### @turnkey/sdk-server * expose `sendCredential` server action * add `SessionType` enum * `READ_ONLY` & `READ_WRITE` ### @turnkey/eip-1193-provider * update dependencies in `package.json` * moved from `peerDependencies` to `dependencies` * `"@turnkey/http": "workspace:*"` * `"@turnkey/sdk-browser": "workspace:*"` * moved from `devDependencies` to `dependencies` * `"@turnkey/api-key-stamper": "workspace:*"` * specify TypeScript version ^5.1.5 ### Patch Changes * fdb8bf0: Add loading indicators for EWK. Exposed email customization to EWK. ## 2.4.0 ### Minor Changes * 9317588: Adds wallet as an authentication option in the Embedded Wallet Kit components for sdk-react ## 2.3.0 ### Minor Changes * 56a307e: Update api to mono v2025.3.0 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/http\@2.21.0 ## 2.2.0 ### Minor Changes * 3c44c4a: Updates per mono release v2025.2.2 ### Patch Changes * bfc833f: Add getOrCreateSuborg server action * Updated dependencies \[3c44c4a] * @turnkey/http\@2.20.0 ## 2.1.0 ### Minor Changes * 57f9cb0: Update endpoints - surface GetWalletAccount ### Patch Changes * 69d2571: Upgrade elliptic * Updated dependencies \[57f9cb0] * @turnkey/http\@2.19.0 ## 2.0.1 ### Patch Changes * 755833b: refactor stamper out of config object and move it directly onto the client to match @turnkey/http ## 2.0.0 ### Major Changes * 1ebd4e2: Add server actions ### Minor Changes * 6695af2: Update per mono release v2025.1.11 ### Patch Changes * Updated dependencies \[6695af2] * @turnkey/http\@2.18.0 ## 1.7.3 ### Patch Changes * 053fbfb: Update mono dependencies * Updated dependencies \[053fbfb] * @turnkey/http\@2.17.3 ## 1.7.2 ### Patch Changes * 328d6aa: Add defaultXrpAccountAtIndex helper * b90947e: Update default account exports, surface WalletAccount type * fad7c37: @turnkey/iframe-stamper - Implemented MessageChannel API for secure communication between the parent and iframe. @turnkey/sdk-browser - fixed spelling in package.json @turnkey/sdk-server - fixed spelling in package.json * Updated dependencies \[2d5977b] * @turnkey/api-key-stamper\@0.4.4 * @turnkey/http\@2.17.2 ## 1.7.1 ### Patch Changes * 538d4fc: Update api endpoints - NEW: User verification, SMS customization params * Updated dependencies \[538d4fc] * @turnkey/http\@2.17.1 ## 1.7.0 ### Minor Changes * 78bc39c: Add default accounts for various address types * Add wallet account ID to list wallets endpoint ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/http\@2.17.0 ## 1.6.0 ### Minor Changes * 3dd74ac: Added functionality for constructing and returning stamped requests for all packages * 4df8914: Version bump corresponding to mono release v2024.10.10. More detailed changelog to follow ### Patch Changes * Updated dependencies \[4df8914] * @turnkey/http\@2.16.0 ## 1.5.0 ### Minor Changes * 9ebd062: Release OTP functionality ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/http\@2.15.0 ## 1.4.2 ### Patch Changes * abe7138: Export DEFAULT\_SOLANA\_ACCOUNTS * 96d7f99: Update dependencies * Updated dependencies \[96d7f99] * @turnkey/http\@2.14.2 * @turnkey/api-key-stamper\@0.4.3 ## 1.4.1 ### Patch Changes * ff059d5: Update dependencies * Updated dependencies \[ff059d5] * @turnkey/http\@2.14.1 * @turnkey/api-key-stamper\@0.4.2 ## 1.4.0 ### Minor Changes * c988ed0: Support activity polling (e.g. for awaiting consensus) * \[Breaking] Update the `activityPoller` parameter for configuring polling behavior * Polling continues until either a max number of retries is reached, or if the activity hits a terminal status The shape of the parameter has gone from: ``` { duration: number; timeout: number; } ``` to ``` { intervalMs: number; numRetries: number; } ``` ### Patch Changes * Updated dependencies \[848f8d3] * @turnkey/http\@2.14.0 ## 1.3.0 ### Minor Changes * 93dee46: Add create read write session v2 which allows for user targeting directly from stamp or optional userId in intent ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 ## 1.2.4 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/http\@2.12.3 ## 1.2.3 ### Patch Changes * Fix activity versioning for CREATE\_SUB\_ORGANIZATION (V5=>V6) ## 1.2.2 ### Patch Changes * Updated dependencies \[2d7e5a9] * @turnkey/api-key-stamper\@0.4.1 * @turnkey/http\@2.12.2 ## 1.2.1 ### Patch Changes * f17a229: Update to oauth related endpoints to drop jwks uri from oauth providers * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 ## 1.2.0 ### Minor Changes * Add Email Auth V2 - Optional invalidate exisiting Email Authentication API keys ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 ## 1.1.0 ### Minor Changes * Update to use new endpoints. Including CREATE\_READ\_WRITE\_SESSION which allows one shot passkey sessions (returns org information and a credential bundle) and CREATE\_API\_KEYS\_V2 which allows a curve type to be passed (SECP256K1 or P256) ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 ## 1.0.0 ### Major Changes * Stable Release: Add Oauth integration. New suborg creation version will now require an oauthProviders field under root users. ## 0.2.0 ### Minor Changes * updated syntax ### Patch Changes * e4d2a84: Update client name ## 0.1.0 ### Minor Changes * Ready for 0.1.0 ## 0.0.1 Initial (experimental) release! This is an alpha release and subject to change. # Solana Source: https://docs.turnkey.com/changelogs/solana/readme # @turnkey/solana ## 1.1.21 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289)]: * @turnkey/core\@1.11.0 * @turnkey/sdk-browser\@5.14.1 * @turnkey/http\@3.16.1 * @turnkey/sdk-server\@5.0.1 ## 1.1.20 ### Patch Changes * Updated dependencies \[[`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea), [`dbd4d8e`](https://github.com/tkhq/sdk/commit/dbd4d8e4ea567240c4d287452dd0d8f53050beca), [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/core\@1.10.0 * @turnkey/sdk-server\@5.0.0 * @turnkey/sdk-browser\@5.14.0 * @turnkey/http\@3.16.0 ## 1.1.19 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/core\@1.9.0 * @turnkey/sdk-browser\@5.13.6 * @turnkey/sdk-server\@4.12.2 ## 1.1.18 ### Patch Changes * Updated dependencies \[[`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3)]: * @turnkey/core\@1.8.3 * @turnkey/sdk-browser\@5.13.5 ## 1.1.17 ### Patch Changes * Updated dependencies \[[`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9)]: * @turnkey/core\@1.8.2 ## 1.1.16 ### Patch Changes * Updated dependencies \[[`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255)]: * @turnkey/core\@1.8.1 * @turnkey/sdk-browser\@5.13.4 ## 1.1.15 ### Patch Changes * Updated dependencies \[[`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7), [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421)]: * @turnkey/core\@1.8.0 * @turnkey/sdk-browser\@5.13.3 * @turnkey/sdk-server\@4.12.1 ## 1.1.14 ### Patch Changes * Updated dependencies \[[`4d29af2`](https://github.com/tkhq/sdk/commit/4d29af2dd7c735916c650d697f18f66dd76c1b79)]: * @turnkey/sdk-browser\@5.13.2 ## 1.1.13 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.1 ## 1.1.12 ### Patch Changes * Updated dependencies \[[`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/core\@1.7.0 * @turnkey/sdk-browser\@5.13.0 * @turnkey/sdk-server\@4.12.0 * @turnkey/http\@3.15.0 ## 1.1.11 ### Patch Changes * Updated dependencies \[[`71cdca3`](https://github.com/tkhq/sdk/commit/71cdca3b97ba520dc5327410a1e82cf9ad85fb0e), [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/sdk-server\@4.11.0 * @turnkey/sdk-browser\@5.12.0 * @turnkey/core\@1.6.0 * @turnkey/http\@3.14.0 ## 1.1.10 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.5.2 * @turnkey/sdk-browser\@5.11.6 * @turnkey/sdk-server\@4.10.5 ## 1.1.9 ### Patch Changes * Updated dependencies \[[`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0)]: * @turnkey/core\@1.5.1 ## 1.1.8 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0)]: * @turnkey/core\@1.5.0 * @turnkey/sdk-browser\@5.11.5 * @turnkey/sdk-server\@4.10.4 ## 1.1.7 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-browser\@5.11.4 * @turnkey/sdk-server\@4.10.3 * @turnkey/core\@1.4.2 * @turnkey/http\@3.13.1 ## 1.1.6 ### Patch Changes * Updated dependencies \[[`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3)]: * @turnkey/core\@1.4.1 ## 1.1.5 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.11.3 ## 1.1.4 ### Patch Changes * Updated dependencies \[[`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa), [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/core\@1.4.0 * @turnkey/sdk-browser\@5.11.2 * @turnkey/sdk-server\@4.10.2 ## 1.1.3 ### Patch Changes * Updated dependencies \[[`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86), [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/core\@1.3.0 * @turnkey/sdk-browser\@5.11.1 * @turnkey/sdk-server\@4.10.1 ## 1.1.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241), [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4)]: * @turnkey/sdk-browser\@5.11.0 * @turnkey/sdk-server\@4.10.0 * @turnkey/core\@1.2.0 * @turnkey/http\@3.13.0 ## 1.1.1 ### Patch Changes * Updated dependencies \[[`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f), [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963), [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7), [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4)]: * @turnkey/core\@1.1.0 * @turnkey/sdk-browser\@5.10.1 * @turnkey/sdk-server\@4.9.1 * @turnkey/http\@3.12.1 ## 1.1.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/sdk-server\@4.9.0 * @turnkey/core\@1.0.0 * @turnkey/http\@3.12.0 * @turnkey/sdk-browser\@5.10.0 ## 1.1.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0-beta.6 * @turnkey/sdk-browser\@5.9.0-beta.1 * @turnkey/http\@3.11.1-beta.0 * @turnkey/sdk-server\@4.8.1-beta.0 ## 1.1.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.9.0-beta.0 * @turnkey/sdk-server\@4.7.0-beta.2 * @turnkey/core\@1.0.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 1.0.43 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/sdk-browser\@5.9.0 * @turnkey/sdk-server\@4.8.0 * @turnkey/http\@3.11.0 ## 1.0.42 ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/sdk-browser\@5.8.0 * @turnkey/sdk-server\@4.7.0 * @turnkey/http\@3.10.0 ## 1.0.41-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.1 * @turnkey/http\@3.10.0-beta.1 * @turnkey/sdk-browser\@5.7.1-beta.1 ## 1.0.41-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.0 * @turnkey/http\@3.10.0-beta.0 * @turnkey/sdk-browser\@5.7.1-beta.0 ## 1.0.41-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/sdk-server\@4.5.1-beta.2 ## 1.0.41-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.1 * @turnkey/http\@3.8.1-beta.1 * @turnkey/sdk-server\@4.5.1-beta.1 ## 1.0.41-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/sdk-server\@4.5.1-beta.0 ## 1.0.41 ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9), [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5)]: * @turnkey/sdk-browser\@5.7.0 * @turnkey/sdk-server\@4.6.0 * @turnkey/http\@3.9.0 ## 1.0.40 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/sdk-browser\@5.6.0 * @turnkey/sdk-server\@4.5.0 * @turnkey/http\@3.8.0 ## 1.0.39 ### Patch Changes * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 * @turnkey/sdk-browser\@5.5.0 * @turnkey/sdk-server\@4.4.0 ## 1.0.38 ### Patch Changes * Updated dependencies \[[`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15)]: * @turnkey/sdk-browser\@5.4.1 ## 1.0.37 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/sdk-browser\@5.4.0 * @turnkey/sdk-server\@4.3.0 * @turnkey/http\@3.6.0 ## 1.0.36 ### Patch Changes * Updated dependencies \[[`2db00b0`](https://github.com/tkhq/sdk/commit/2db00b0a799d09ae33fa08a117e3b2f433f2b0b4)]: * @turnkey/sdk-server\@4.2.4 ## 1.0.35 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/sdk-browser\@5.3.4 * @turnkey/sdk-server\@4.2.3 * @turnkey/http\@3.5.1 ## 1.0.34 ### Patch Changes * Updated dependencies \[[`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf)]: * @turnkey/sdk-browser\@5.3.3 ## 1.0.33 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.3.2 * @turnkey/sdk-server\@4.2.2 ## 1.0.32 ### Patch Changes * Updated dependencies \[[`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/sdk-browser\@5.3.1 * @turnkey/sdk-server\@4.2.1 ## 1.0.31 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/http\@3.5.0 * @turnkey/sdk-browser\@5.3.0 * @turnkey/sdk-server\@4.2.0 ## 1.0.30 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.3 ## 1.0.29 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.2 ## 1.0.28 ### Patch Changes * [#665](https://github.com/tkhq/sdk/pull/665) [`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772) Author [@amircheikh](https://github.com/amircheikh) - Fix for `no runner registered` error when using mismatched versions of turnkey/http * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/sdk-browser\@5.2.1 * @turnkey/sdk-server\@4.1.1 ## 1.0.27 ### Patch Changes * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/sdk-browser\@5.2.0 * @turnkey/sdk-server\@4.1.0 * @turnkey/http\@3.4.1 ## 1.0.26 ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-browser\@5.1.0 * @turnkey/sdk-server\@4.0.1 ## 1.0.25 ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0), [`e8a5f1b`](https://github.com/tkhq/sdk/commit/e8a5f1b431623c4ff1cb85c6039464b328cf0e6a)]: * @turnkey/sdk-browser\@5.0.0 * @turnkey/sdk-server\@4.0.0 * @turnkey/http\@3.4.0 ## 1.0.24 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/sdk-browser\@4.3.0 * @turnkey/sdk-server\@3.3.0 * @turnkey/http\@3.3.0 ## 1.0.23 ### Patch Changes * Updated dependencies \[3f6e415] * @turnkey/sdk-browser\@4.2.0 * @turnkey/sdk-server\@3.2.0 * @turnkey/http\@3.2.0 ## 1.0.22 ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/sdk-browser\@4.1.0 * @turnkey/sdk-server\@3.1.0 * @turnkey/http\@3.1.0 ## 1.0.21 ### Patch Changes * Updated dependencies \[7b72769] * @turnkey/sdk-server\@3.0.1 ## 1.0.20 ### Patch Changes * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/sdk-browser\@4.0.0 * @turnkey/sdk-server\@3.0.0 * @turnkey/http\@3.0.0 ## 1.0.19 ### Patch Changes * Updated dependencies \[bf87774] * @turnkey/sdk-browser\@3.1.0 ## 1.0.18 ### Patch Changes * Updated dependencies \[5ec5187] * @turnkey/sdk-browser\@3.0.1 * @turnkey/sdk-server\@2.6.1 ## 1.0.17 ### Patch Changes * Updated dependencies \[0e4e959] * Updated dependencies \[856f449] * Updated dependencies \[c9ae537] * Updated dependencies \[d4ce5fa] * Updated dependencies \[ecdb29a] * Updated dependencies \[72890f5] * @turnkey/sdk-browser\@3.0.0 * @turnkey/sdk-server\@2.6.0 * @turnkey/http\@2.22.0 ## 1.0.16 ### Patch Changes * Updated dependencies \[93540e7] * Updated dependencies \[fdb8bf0] * Updated dependencies \[9147962] * @turnkey/sdk-browser\@2.0.0 * @turnkey/sdk-server\@2.5.0 ## 1.0.15 ### Patch Changes * Updated dependencies \[233ae71] * Updated dependencies \[9317588] * @turnkey/sdk-browser\@1.16.0 * @turnkey/sdk-server\@2.4.0 ## 1.0.14 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/sdk-browser\@1.15.0 * @turnkey/sdk-server\@2.3.0 * @turnkey/http\@2.21.0 ## 1.0.13 ### Patch Changes * Updated dependencies \[3c44c4a] * Updated dependencies \[bfc833f] * @turnkey/sdk-browser\@1.14.0 * @turnkey/sdk-server\@2.2.0 * @turnkey/http\@2.20.0 ## 1.0.12 ### Patch Changes * Updated dependencies \[69d2571] * Updated dependencies \[57f9cb0] * @turnkey/sdk-browser\@1.13.0 * @turnkey/sdk-server\@2.1.0 * @turnkey/http\@2.19.0 ## 1.0.11 ### Patch Changes * Updated dependencies \[755833b] * @turnkey/sdk-browser\@1.12.1 * @turnkey/sdk-server\@2.0.1 ## 1.0.10 ### Patch Changes * Updated dependencies \[6695af2] * Updated dependencies \[1ebd4e2] * @turnkey/sdk-browser\@1.12.0 * @turnkey/sdk-server\@2.0.0 * @turnkey/http\@2.18.0 ## 1.0.9 ### Patch Changes * Updated dependencies \[053fbfb] * @turnkey/sdk-browser\@1.11.2 * @turnkey/sdk-server\@1.7.3 * @turnkey/http\@2.17.3 ## 1.0.8 ### Patch Changes * Updated dependencies \[328d6aa] * Updated dependencies \[b90947e] * Updated dependencies \[2d5977b] * Updated dependencies \[fad7c37] * @turnkey/sdk-browser\@1.11.1 * @turnkey/sdk-server\@1.7.2 * @turnkey/http\@2.17.2 ## 1.0.7 ### Patch Changes * c895c8f: Update @solana/web3.js from ^1.88.1 to ^1.95.8 * Updated dependencies \[7988bc1] * Updated dependencies \[538d4fc] * Updated dependencies \[12d5aaa] * @turnkey/sdk-browser\@1.11.0 * @turnkey/sdk-server\@1.7.1 * @turnkey/http\@2.17.1 ## 1.0.6 ### Patch Changes * @turnkey/sdk-browser\@1.10.2 ## 1.0.5 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/sdk-server\@1.7.0 * @turnkey/http\@2.17.0 * @turnkey/sdk-browser\@1.10.1 ## 1.0.4 ### Patch Changes * 9eaf38a: Add optional org id for all signing methods ## 1.0.3 ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/sdk-browser\@1.10.0 ## 1.0.2 ### Patch Changes * b55bc32: Add optional org id to addSignature function * Updated dependencies \[3dd74ac] * Updated dependencies \[1e36edf] * Updated dependencies \[4df8914] * Updated dependencies \[11a9e2f] * @turnkey/sdk-browser\@1.9.0 * @turnkey/sdk-server\@1.6.0 * @turnkey/http\@2.16.0 ## 1.0.1 ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/sdk-browser\@1.8.0 * @turnkey/sdk-server\@1.5.0 * @turnkey/http\@2.15.0 ## 1.0.0 ### Major Changes * a4f0f69: Integrate @turnkey/solana with Turnkey's Sign Transaction endpoint. There are no breaking changes, but a major release felt right given this is effectively adding "full" Solana support. This release introduces a new method: `signTransaction`. Under the hood, this creates an activity of type `ACTIVITY_TYPE_SIGN_TRANSACTION_V2`. There is **no action required** for existing users of `addSignature`. * `addSignature` does not use our Policy Engine, and instead signs a transaction's message straight up * While `addSignature` mutates the incoming transaction by adding a signature to it directly, `signTransaction` returns a new transaction object * Both legacy and versioned (V0) transactions are supported For some examples of how you can use Turnkey's Policy Engine with Solana transactions, see [https://docs.turnkey.com/concepts/policies/examples](https://docs.turnkey.com/concepts/policies/examples). ### Patch Changes * Updated dependencies \[abe7138] * Updated dependencies \[96d7f99] * @turnkey/sdk-server\@1.4.2 * @turnkey/sdk-browser\@1.7.1 * @turnkey/http\@2.14.2 ## 0.5.1 ### Patch Changes * Updated dependencies \[ff059d5] * Updated dependencies \[ff059d5] * @turnkey/sdk-browser\@1.7.0 * @turnkey/sdk-server\@1.4.1 * @turnkey/http\@2.14.1 ## 0.5.0 ### Minor Changes * bdded80: Support awaiting consensus ### Patch Changes * Updated dependencies \[c988ed0] * Updated dependencies \[848f8d3] * @turnkey/sdk-browser\@1.6.0 * @turnkey/sdk-server\@1.4.0 * @turnkey/http\@2.14.0 ## 0.4.3 ### Patch Changes * Updated dependencies \[1813ed5] * @turnkey/sdk-browser\@1.5.0 ## 0.4.2 ### Patch Changes * Updated dependencies \[bab5393] * Updated dependencies \[a16073c] * Updated dependencies \[7e7d209] * @turnkey/sdk-browser\@1.4.0 ## 0.4.1 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 * @turnkey/sdk-browser\@1.3.0 * @turnkey/sdk-server\@1.3.0 ## 0.4.0 ### Minor Changes * c342954: Add compatibility with @turnkey/sdk-server and @turnkey/sdk-browser ## 0.3.10 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/http\@2.12.3 ## 0.3.9 ### Patch Changes * Updated dependencies \[2d7e5a9] * @turnkey/http\@2.12.2 ## 0.3.8 ### Patch Changes * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 ## 0.3.7 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 ## 0.3.6 ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 ## 0.3.5 ### Patch Changes * Updated dependencies \[7a9ce7a] * @turnkey/http\@2.10.0 ## 0.3.4 ### Patch Changes * Updated dependencies * @turnkey/http\@2.9.1 ## 0.3.3 ### Patch Changes * Updated dependencies \[83b62b5] * @turnkey/http\@2.9.0 ## 0.3.2 ### Patch Changes * Updated dependencies \[46a7d90] * @turnkey/http\@2.8.0 ## 0.3.1 ### Patch Changes Adjust logic for signing transactions and versioned transactions to avoid typechecks (#218) ## 0.3.0 ### Minor Changes Add support for signing Solana versioned transactions (#216) ## 0.2.2 ### Patch Changes * Updated dependencies * @turnkey/http\@2.7.1 ## 0.2.1 ### Patch Changes * Updated dependencies \[d73725b] * @turnkey/http\@2.7.0 ## 0.2.0 ### Minor Changes * \#202: implements `signMessage` on the Solana `TurnkeySigner` ## 0.1.1 * Fix readme link ## 0.1.0 * Initial release # Telegram Cloud Storage Stamper Source: https://docs.turnkey.com/changelogs/telegram-cloud-storage-stamper/readme # @turnkey/telegram-cloud-storage-stamper ## 2.1.1 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6)]: * @turnkey/api-key-stamper\@0.6.0 ## 2.1.0 ### Minor Changes * Updated dependencies \[[`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/api-key-stamper\@0.5.0 ## 2.1.0-beta.6 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.6 ## 2.1.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.5 ## 2.0.4-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.4 ## 2.0.4-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.3 ## 2.0.4-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.2 ## 2.0.4-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.1 ## 2.0.4-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.8-beta.0 ## 2.0.3 ### Patch Changes * Updated dependencies \[[`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/api-key-stamper\@0.4.7 ## 2.0.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.4.6 ## 2.0.1 ### Patch Changes * Updated dependencies \[4d1d775] * @turnkey/api-key-stamper\@0.4.5 ## 2.0.0 ### Major Changes * 24ca647: Remove default export and used all named exports for consistency ### Package imports for `@turnkey/telegram-cloud-storage-stamper` #### for versions \< v2.0.0 ```typescript theme={"system"} import TelegramCloudStorageStamper, { CloudStorageAPIKey, } from "@turnkey/telegram-cloud-storage-stamper"; ``` #### for versions >= v2.0.0 ```typescript theme={"system"} import { TelegramCloudStorageStamper, CloudStorageAPIKey, } from "@turnkey/telegram-cloud-storage-stamper"; ``` ## 1.0.3 ### Patch Changes * Updated dependencies \[2d5977b] * @turnkey/api-key-stamper\@0.4.4 ## 1.0.2 ### Patch Changes * Export the default cloud storage api key location ## 1.0.1 ### Patch Changes * Update the default cloud storage key to conform to cloud storage key constraints ## 1.0.0 ### Major Changes * Initial release of the telegram-cloud-storage-stamper package. This package is to be used alongside Telegram mini-app development and provides a stamping utility and an interface into Telegram Cloud Storage. More can be read in the [readme](../packages/telegram-cloud-storage-stamper/readme.md). # Viem Source: https://docs.turnkey.com/changelogs/viem/readme # @turnkey/viem ## 0.14.21 ### Patch Changes * Updated dependencies \[[`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`91d6a9e`](https://github.com/tkhq/sdk/commit/91d6a9eb1b9ac9e21745749615ac7a7be66f5cf6), [`699fbd7`](https://github.com/tkhq/sdk/commit/699fbd75ef3f44f768ae641ab4f652e966b8e289)]: * @turnkey/core\@1.11.0 * @turnkey/api-key-stamper\@0.6.0 * @turnkey/sdk-browser\@5.14.1 * @turnkey/http\@3.16.1 * @turnkey/sdk-server\@5.0.1 ## 0.14.20 ### Patch Changes * Updated dependencies \[[`6261eed`](https://github.com/tkhq/sdk/commit/6261eed95af8627bf1e95e7291b9760a2267e301), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea), [`dbd4d8e`](https://github.com/tkhq/sdk/commit/dbd4d8e4ea567240c4d287452dd0d8f53050beca), [`cfd34ab`](https://github.com/tkhq/sdk/commit/cfd34ab14ff2abed0e22dca9a802c58a96b9e8e1), [`78ec1d9`](https://github.com/tkhq/sdk/commit/78ec1d9afcafde3ca7107fc720323d486d6afaea)]: * @turnkey/core\@1.10.0 * @turnkey/sdk-server\@5.0.0 * @turnkey/sdk-browser\@5.14.0 * @turnkey/http\@3.16.0 ## 0.14.19 ### Patch Changes * Updated dependencies \[[`29a42db`](https://github.com/tkhq/sdk/commit/29a42db8f5f3ef8b9c23c90cd00f4c21027aac2e)]: * @turnkey/core\@1.9.0 * @turnkey/sdk-browser\@5.13.6 * @turnkey/sdk-server\@4.12.2 ## 0.14.18 ### Patch Changes * Updated dependencies \[[`7185545`](https://github.com/tkhq/sdk/commit/7185545ea1fc05eb738af09de5a594455f2e08f3)]: * @turnkey/core\@1.8.3 * @turnkey/sdk-browser\@5.13.5 ## 0.14.17 ### Patch Changes * Updated dependencies \[[`3c23fc2`](https://github.com/tkhq/sdk/commit/3c23fc27eda5325a90e79afff4cc3a16f682e1d9)]: * @turnkey/core\@1.8.2 ## 0.14.16 ### Patch Changes * Updated dependencies \[[`d4768c7`](https://github.com/tkhq/sdk/commit/d4768c71b6796532c9800d546154116e5d36b255)]: * @turnkey/core\@1.8.1 * @turnkey/sdk-browser\@5.13.4 ## 0.14.15 ### Patch Changes * Updated dependencies \[[`fd2e031`](https://github.com/tkhq/sdk/commit/fd2e0318079de922512b1f5adb404b11921f77b7), [`e1bd68f`](https://github.com/tkhq/sdk/commit/e1bd68f963d6bbd9c797b1a8f077efadccdec421)]: * @turnkey/core\@1.8.0 * @turnkey/sdk-browser\@5.13.3 * @turnkey/sdk-server\@4.12.1 ## 0.14.14 ### Patch Changes * Updated dependencies \[[`4d29af2`](https://github.com/tkhq/sdk/commit/4d29af2dd7c735916c650d697f18f66dd76c1b79)]: * @turnkey/sdk-browser\@5.13.2 ## 0.14.13 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.13.1 ## 0.14.12 ### Patch Changes * Updated dependencies \[[`beee465`](https://github.com/tkhq/sdk/commit/beee465a13f64abeb71c5c00519f7abab9942607), [`67b03a5`](https://github.com/tkhq/sdk/commit/67b03a5d9ab1b6eabfb0b41938ac91365b5dcd9b)]: * @turnkey/core\@1.7.0 * @turnkey/sdk-browser\@5.13.0 * @turnkey/sdk-server\@4.12.0 * @turnkey/http\@3.15.0 ## 0.14.11 ### Patch Changes * Updated dependencies \[[`71cdca3`](https://github.com/tkhq/sdk/commit/71cdca3b97ba520dc5327410a1e82cf9ad85fb0e), [`9fbd5c4`](https://github.com/tkhq/sdk/commit/9fbd5c459782dc3721dd0935d0a4458babce258b)]: * @turnkey/sdk-server\@4.11.0 * @turnkey/sdk-browser\@5.12.0 * @turnkey/core\@1.6.0 * @turnkey/http\@3.14.0 ## 0.14.10 ### Patch Changes * [#1030](https://github.com/tkhq/sdk/pull/1030) [`a177cd5`](https://github.com/tkhq/sdk/commit/a177cd5ba4bcb52d7d2121871e50a21f75622667) Author [@Serdnad](https://github.com/Serdnad) - Fix object returned by signAuthorization to not include duplicate 0x prefixes. * Updated dependencies \[]: * @turnkey/core\@1.5.2 * @turnkey/sdk-browser\@5.11.6 * @turnkey/sdk-server\@4.10.5 ## 0.14.9 ### Patch Changes * Updated dependencies \[[`886f319`](https://github.com/tkhq/sdk/commit/886f319fab8b0ba560d040e34598436f3beceff0)]: * @turnkey/core\@1.5.1 ## 0.14.8 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186), [`001d822`](https://github.com/tkhq/sdk/commit/001d8225202500e53aa399d6aee0c8f48f6060e0)]: * @turnkey/core\@1.5.0 * @turnkey/sdk-browser\@5.11.5 * @turnkey/sdk-server\@4.10.4 ## 0.14.7 ### Patch Changes * Updated dependencies \[[`9df42ad`](https://github.com/tkhq/sdk/commit/9df42adc02c7ff77afba3b938536e79b57882ef1)]: * @turnkey/sdk-browser\@5.11.4 * @turnkey/sdk-server\@4.10.3 * @turnkey/core\@1.4.2 * @turnkey/http\@3.13.1 ## 0.14.6 ### Patch Changes * Updated dependencies \[[`e5b9c5c`](https://github.com/tkhq/sdk/commit/e5b9c5c5694b1f4d60c0b8606822bcd6d61da4a3)]: * @turnkey/core\@1.4.1 ## 0.14.5 ### Patch Changes * [#995](https://github.com/tkhq/sdk/pull/995) [`9fbcbba`](https://github.com/tkhq/sdk/commit/9fbcbbafb824a24c4f99b54966920ba78e924025) Author [@ethankonk](https://github.com/ethankonk) - Fixed the signAuthorization return type to match viem's signAuthorization return * Updated dependencies \[]: * @turnkey/sdk-browser\@5.11.3 ## 0.14.4 ### Patch Changes * Updated dependencies \[[`6ceb06e`](https://github.com/tkhq/sdk/commit/6ceb06ebdbb11b017ed97e81a7e0dcb862813bfa), [`68631c4`](https://github.com/tkhq/sdk/commit/68631c4008387f845dfe4f1a139981011727f6c9)]: * @turnkey/core\@1.4.0 * @turnkey/sdk-browser\@5.11.2 * @turnkey/sdk-server\@4.10.2 ## 0.14.3 ### Patch Changes * Updated dependencies \[[`4adbf9b`](https://github.com/tkhq/sdk/commit/4adbf9bbb6b93f84aa80e06a1eeabd61d1dbbb86), [`4ead6da`](https://github.com/tkhq/sdk/commit/4ead6da626468fde41daf85eae90faf18651d1c1), [`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/core\@1.3.0 * @turnkey/sdk-browser\@5.11.1 * @turnkey/sdk-server\@4.10.1 ## 0.14.2 ### Patch Changes * Updated dependencies \[[`4567059`](https://github.com/tkhq/sdk/commit/45670598f102223925b87a5295edca15a6ce8241), [`010543c`](https://github.com/tkhq/sdk/commit/010543c3b1b56a18816ea92a1a1cbe028cf988e4)]: * @turnkey/sdk-browser\@5.11.0 * @turnkey/sdk-server\@4.10.0 * @turnkey/core\@1.2.0 * @turnkey/http\@3.13.0 ## 0.14.1 ### Patch Changes * Updated dependencies \[[`0080c4d`](https://github.com/tkhq/sdk/commit/0080c4d011a7f8d04b41d89b31863b75d1a816ef), [`5a96fe8`](https://github.com/tkhq/sdk/commit/5a96fe80db4c4c45e09ad8c613695ee4c2b8e51f), [`c2a0bd7`](https://github.com/tkhq/sdk/commit/c2a0bd7ea8a53524cde16897f375f8a7088ba963), [`90841f9`](https://github.com/tkhq/sdk/commit/90841f95f3f738c47c04797096902d9d0a23afc7), [`e4bc82f`](https://github.com/tkhq/sdk/commit/e4bc82fc51c692d742923ccfff72c2c862ee71a4)]: * @turnkey/core\@1.1.0 * @turnkey/sdk-browser\@5.10.1 * @turnkey/sdk-server\@4.9.1 * @turnkey/http\@3.12.1 ## 0.14.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624)]: * @turnkey/sdk-server\@4.9.0 * @turnkey/core\@1.0.0 * @turnkey/http\@3.12.0 * @turnkey/api-key-stamper\@0.5.0 * @turnkey/sdk-browser\@5.10.0 ## 0.14.0-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/core\@1.0.0-beta.6 * @turnkey/sdk-browser\@5.9.0-beta.1 * @turnkey/api-key-stamper\@0.5.0-beta.6 * @turnkey/http\@3.11.1-beta.0 * @turnkey/sdk-server\@4.8.1-beta.0 ## 0.14.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/api-key-stamper\@0.5.0-beta.5 * @turnkey/sdk-browser\@5.9.0-beta.0 * @turnkey/sdk-server\@4.7.0-beta.2 * @turnkey/core\@1.0.0-beta.5 * @turnkey/http\@3.10.0-beta.2 ## 0.13.1 ### Patch Changes * Updated dependencies \[[`026264c`](https://github.com/tkhq/sdk/commit/026264c55aa16342c8925af0bdcdf72dc00e5158)]: * @turnkey/sdk-browser\@5.9.0 * @turnkey/sdk-server\@4.8.0 * @turnkey/http\@3.11.0 ## 0.13.0 ### Minor Changes * [#847](https://github.com/tkhq/sdk/pull/847) [`bc88e60`](https://github.com/tkhq/sdk/commit/bc88e60955883b13d93c04d5681f9b081cdaee92) Author [@andrewkmin](https://github.com/andrewkmin) - Support `signAuthorization` with bespoke, policy-engine compatible payload encoding type. This means you can now target an `address`, `nonce`, or `chainId` within policies. For more information, see an example in our docs [here](https://docs.turnkey.com/policies/examples/ethereum#allow-signing-of-eip-7702-authorizations). ### Patch Changes * Updated dependencies \[[`5d8be2d`](https://github.com/tkhq/sdk/commit/5d8be2d0329070c7aa025dddb1b28f04257ae4e6)]: * @turnkey/sdk-browser\@5.8.0 * @turnkey/sdk-server\@4.7.0 * @turnkey/http\@3.10.0 ## 0.12.1 ### Patch Changes * [#848](https://github.com/tkhq/sdk/pull/848) [`8305dd2`](https://github.com/tkhq/sdk/commit/8305dd2cbfbb3cfc55ed37c9626198627c752fd9) Author [@andrewkmin](https://github.com/andrewkmin) - Fix: update serialization of typed data to conform to Viem's implementation ## 0.12.1-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.1 * @turnkey/http\@3.10.0-beta.1 * @turnkey/sdk-browser\@5.7.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.4 ## 0.12.1-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-server\@4.7.0-beta.0 * @turnkey/http\@3.10.0-beta.0 * @turnkey/sdk-browser\@5.7.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.3 ## 0.12.0 ### Minor Changes * [#642](https://github.com/tkhq/sdk/pull/642) [`7898dce`](https://github.com/tkhq/sdk/commit/7898dce1b71c1f956a588636a29c56e47b013426) Author [@andrewkmin](https://github.com/andrewkmin) - - Add implementation for `sign`. This is primarily applicable for account abstraction use cases. * Enforce message hashing at an abstracted level. * Minor bugfixes: pass through payload encoding; enforce default value for `to` parameter (abstracted away from user -- non-breaking) ### Patch Changes * Updated dependencies \[[`8b39dba`](https://github.com/tkhq/sdk/commit/8b39dbabf68d3e376b5b07f26960d5b61ae87fa9), [`1a549b7`](https://github.com/tkhq/sdk/commit/1a549b71f9a6e7ab59d52aaae7e58e34c8f2e8b5)]: * @turnkey/sdk-browser\@5.7.0 * @turnkey/sdk-server\@4.6.0 * @turnkey/http\@3.9.0 ## 0.11.2-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.2 * @turnkey/api-key-stamper\@0.4.8-beta.2 * @turnkey/http\@3.8.1-beta.2 * @turnkey/sdk-server\@4.5.1-beta.2 ## 0.11.2-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.1 * @turnkey/api-key-stamper\@0.4.8-beta.1 * @turnkey/http\@3.8.1-beta.1 * @turnkey/sdk-server\@4.5.1-beta.1 ## 0.11.2-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.6.1-beta.0 * @turnkey/api-key-stamper\@0.4.8-beta.0 * @turnkey/http\@3.8.1-beta.0 * @turnkey/sdk-server\@4.5.1-beta.0 ## 0.11.1 ### Patch Changes * Updated dependencies \[[`f83f25b`](https://github.com/tkhq/sdk/commit/f83f25ba33ef15dbd66723531eebe2fd00f43ac0)]: * @turnkey/sdk-browser\@5.6.0 * @turnkey/sdk-server\@4.5.0 * @turnkey/http\@3.8.0 ## 0.11.0 ### Minor Changes * [#651](https://github.com/tkhq/sdk/pull/651) [`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed) Author [@turnekybc](https://github.com/turnekybc) - Add Coinbase & MoonPay Fiat Onramp. View the [Fiat Onramp feature docs](https://docs.turnkey.com/wallets/fiat-on-ramp). ### Patch Changes * [#808](https://github.com/tkhq/sdk/pull/808) [`517d1d8`](https://github.com/tkhq/sdk/commit/517d1d83f7d4f9e000c7b47ff93e7a23daf4f6d2) Author [@moeodeh3](https://github.com/moeodeh3) - Fix serialization with BigInt values in `signTypedData()` * Updated dependencies \[[`81e355c`](https://github.com/tkhq/sdk/commit/81e355c9a8321feffcac056916b65139cf35eeed)]: * @turnkey/http\@3.7.0 * @turnkey/sdk-browser\@5.5.0 * @turnkey/sdk-server\@4.4.0 ## 0.10.5 ### Patch Changes * Updated dependencies \[[`0d1eb2c`](https://github.com/tkhq/sdk/commit/0d1eb2c464bac3cf6f4386f402604ecf8f373f15)]: * @turnkey/sdk-browser\@5.4.1 ## 0.10.4 ### Patch Changes * Updated dependencies \[[`e90a478`](https://github.com/tkhq/sdk/commit/e90a478c9208d858b1144df9b2c2c7ba956c406e)]: * @turnkey/sdk-browser\@5.4.0 * @turnkey/sdk-server\@4.3.0 * @turnkey/http\@3.6.0 ## 0.10.3 ### Patch Changes * [#777](https://github.com/tkhq/sdk/pull/777) [`cbb0ba0`](https://github.com/tkhq/sdk/commit/cbb0ba0dc2ea960415e1e7f21c3621e85765b02a) Author [@turnekybc](https://github.com/turnekybc) - Publish latest version of @turnkey/viem * Updated dependencies \[[`2db00b0`](https://github.com/tkhq/sdk/commit/2db00b0a799d09ae33fa08a117e3b2f433f2b0b4)]: * @turnkey/sdk-server\@4.2.4 ## 0.10.2 ### Patch Changes * Updated dependencies \[[`cb13c26`](https://github.com/tkhq/sdk/commit/cb13c26edb79a01ab651e3b2897334fd154b436a)]: * @turnkey/sdk-browser\@5.3.4 * @turnkey/sdk-server\@4.2.3 * @turnkey/http\@3.5.1 ## 0.10.1 ### Patch Changes * Updated dependencies \[[`2c4f42c`](https://github.com/tkhq/sdk/commit/2c4f42c747ac8017cf17e86b0ca0c3fa6f593bbf)]: * @turnkey/sdk-browser\@5.3.3 ## 0.10.0 ### Minor Changes * [#733](https://github.com/tkhq/sdk/pull/733) [`cc463d3`](https://github.com/tkhq/sdk/commit/cc463d3fde57f4d434fc41c5ed4ce42a0a506874) Author [@besler613](https://github.com/besler613) - Typed data hashing is now performed server-side using the new `PAYLOAD_ENCODING_EIP712` encoding, and EIP-712 Policies are supported via the `eth.eip_712` namespace. ## 0.9.12 ### Patch Changes * Updated dependencies \[]: * @turnkey/sdk-browser\@5.3.2 * @turnkey/sdk-server\@4.2.2 ## 0.9.11 ### Patch Changes * Updated dependencies \[[`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/sdk-browser\@5.3.1 * @turnkey/sdk-server\@4.2.1 ## 0.9.10 ### Patch Changes * Updated dependencies \[[`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`5f3dd98`](https://github.com/tkhq/sdk/commit/5f3dd9814650308b3bf3198168c453e7b1a98efd), [`7625df0`](https://github.com/tkhq/sdk/commit/7625df0538002c3455bd5862211210e38472e164)]: * @turnkey/http\@3.5.0 * @turnkey/sdk-browser\@5.3.0 * @turnkey/sdk-server\@4.2.0 * @turnkey/api-key-stamper\@0.4.7 ## 0.9.9 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.3 ## 0.9.8 ### Patch Changes * Updated dependencies: * @turnkey/sdk-browser\@5.2.2 ## 0.9.7 ### Patch Changes * [#665](https://github.com/tkhq/sdk/pull/665) [`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772) Author [@amircheikh](https://github.com/amircheikh) - Fix for `no runner registered` error when using mismatched versions of turnkey/http * Updated dependencies \[[`be0a621`](https://github.com/tkhq/sdk/commit/be0a621fb962bd51d2df1a1e79f5260d7c696772)]: * @turnkey/http\@3.4.2 * @turnkey/sdk-browser\@5.2.1 * @turnkey/sdk-server\@4.1.1 ## 0.9.6 ### Patch Changes * Updated dependencies \[[`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc), [`a38a6e3`](https://github.com/tkhq/sdk/commit/a38a6e36dc2bf9abdea64bc817d1cad95b8a289a), [`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`593de2d`](https://github.com/tkhq/sdk/commit/593de2d9404ec8cf53426f9cf832c13eefa3fbf2)]: * @turnkey/sdk-browser\@5.2.0 * @turnkey/sdk-server\@4.1.0 * @turnkey/http\@3.4.1 * @turnkey/api-key-stamper\@0.4.6 ## 0.9.5 ### Patch Changes * Updated dependencies \[[`27fe590`](https://github.com/tkhq/sdk/commit/27fe590cdc3eb6a8cde093eeefda2ee1cdc79412)]: * @turnkey/sdk-browser\@5.1.0 * @turnkey/sdk-server\@4.0.1 ## 0.9.4 ### Patch Changes * Updated dependencies \[[`07dfd33`](https://github.com/tkhq/sdk/commit/07dfd3397472687092e1c73b1d68714f421b9ca0), [`e8a5f1b`](https://github.com/tkhq/sdk/commit/e8a5f1b431623c4ff1cb85c6039464b328cf0e6a)]: * @turnkey/sdk-browser\@5.0.0 * @turnkey/sdk-server\@4.0.0 * @turnkey/http\@3.4.0 ## 0.9.3 ### Patch Changes * Updated dependencies \[25ca339] * @turnkey/sdk-browser\@4.3.0 * @turnkey/sdk-server\@3.3.0 * @turnkey/http\@3.3.0 ## 0.9.2 ### Patch Changes * d440e7b: Update `signAuthorization` implementation to explicitly include `yParity` in the response ## 0.9.1 ### Patch Changes * Updated dependencies \[3f6e415] * Updated dependencies \[4d1d775] * @turnkey/sdk-browser\@4.2.0 * @turnkey/sdk-server\@3.2.0 * @turnkey/http\@3.2.0 * @turnkey/api-key-stamper\@0.4.5 ## 0.9.0 ### Minor Changes * 2f75cf1: Add support for signing Type 3 (EIP-4844) transactions * Note the inline comments on the `signTransaction` [implementation](https://github.com/tkhq/sdk/blob/5e5666aba978f756e2021c261830effc5559811f/packages/viem/src/index.ts#L392): when signing Type 3 transactions, our Viem implementation will extract the transaction payload (not including blobs, commitments, or proofs), sign it, extract the signature, and then reassemble the entire transaction payload. * See [with-viem](https://github.com/tkhq/sdk/tree/main/examples/with-viem/) for examples. ### Patch Changes * Updated dependencies \[3e4a482] * @turnkey/sdk-browser\@4.1.0 * @turnkey/sdk-server\@3.1.0 * @turnkey/http\@3.1.0 ## 0.8.0 ### Minor Changes * 1d709ce: - Add support for EIP 7702 (Type 4) transactions by way of a new `signAuthorization` method * Update upstream `viem` version to `^2.24.2` (required for 7702) * Introduce new `to` parameter, used for indicating the result shape of `signMessage` (and related) requests * Affects `signTypedData` as well * Is used by `signAuthorization` * As a result, `serializeSignature` is updated as well ## 0.7.2 ### Patch Changes * Updated dependencies \[7b72769] * @turnkey/sdk-server\@3.0.1 ## 0.7.1 ### Patch Changes * 123406b: The organizationId parameter is ignored when using a client other than TurnkeyClient (e.g., passkeyClient). Consequently, the SDK calls the client without the specified organizationId, which is unintended. This patch resolves the issue * Updated dependencies \[e501690] * Updated dependencies \[d1083bd] * Updated dependencies \[f94d36e] * @turnkey/sdk-browser\@4.0.0 * @turnkey/sdk-server\@3.0.0 * @turnkey/http\@3.0.0 ## 0.7.0 ### Minor Changes * d99fe40: Upgrade upstream viem dependency ### Patch Changes * Updated dependencies \[bf87774] * @turnkey/sdk-browser\@3.1.0 ## 0.6.18 ### Patch Changes * Updated dependencies \[5ec5187] * @turnkey/sdk-browser\@3.0.1 * @turnkey/sdk-server\@2.6.1 ## 0.6.17 ### Patch Changes * Updated dependencies \[0e4e959] * Updated dependencies \[856f449] * Updated dependencies \[c9ae537] * Updated dependencies \[d4ce5fa] * Updated dependencies \[ecdb29a] * Updated dependencies \[72890f5] * @turnkey/sdk-browser\@3.0.0 * @turnkey/sdk-server\@2.6.0 * @turnkey/http\@2.22.0 ## 0.6.16 ### Patch Changes * Updated dependencies \[93540e7] * Updated dependencies \[fdb8bf0] * Updated dependencies \[9147962] * @turnkey/sdk-browser\@2.0.0 * @turnkey/sdk-server\@2.5.0 ## 0.6.15 ### Patch Changes * Updated dependencies \[233ae71] * Updated dependencies \[9317588] * @turnkey/sdk-browser\@1.16.0 * @turnkey/sdk-server\@2.4.0 ## 0.6.14 ### Patch Changes * Updated dependencies \[56a307e] * @turnkey/sdk-browser\@1.15.0 * @turnkey/sdk-server\@2.3.0 * @turnkey/http\@2.21.0 ## 0.6.13 ### Patch Changes * Updated dependencies \[3c44c4a] * Updated dependencies \[bfc833f] * @turnkey/sdk-browser\@1.14.0 * @turnkey/sdk-server\@2.2.0 * @turnkey/http\@2.20.0 ## 0.6.12 ### Patch Changes * Updated dependencies \[69d2571] * Updated dependencies \[57f9cb0] * @turnkey/sdk-browser\@1.13.0 * @turnkey/sdk-server\@2.1.0 * @turnkey/http\@2.19.0 ## 0.6.11 ### Patch Changes * Updated dependencies \[755833b] * @turnkey/sdk-browser\@1.12.1 * @turnkey/sdk-server\@2.0.1 ## 0.6.10 ### Patch Changes * Updated dependencies \[6695af2] * Updated dependencies \[1ebd4e2] * @turnkey/sdk-browser\@1.12.0 * @turnkey/sdk-server\@2.0.0 * @turnkey/http\@2.18.0 ## 0.6.9 ### Patch Changes * Updated dependencies \[053fbfb] * @turnkey/sdk-browser\@1.11.2 * @turnkey/sdk-server\@1.7.3 * @turnkey/http\@2.17.3 ## 0.6.8 ### Patch Changes * Updated dependencies \[328d6aa] * Updated dependencies \[b90947e] * Updated dependencies \[2d5977b] * Updated dependencies \[fad7c37] * @turnkey/sdk-browser\@1.11.1 * @turnkey/sdk-server\@1.7.2 * @turnkey/api-key-stamper\@0.4.4 * @turnkey/http\@2.17.2 ## 0.6.7 ### Patch Changes * Updated dependencies \[7988bc1] * Updated dependencies \[538d4fc] * Updated dependencies \[12d5aaa] * @turnkey/sdk-browser\@1.11.0 * @turnkey/sdk-server\@1.7.1 * @turnkey/http\@2.17.1 ## 0.6.6 ### Patch Changes * @turnkey/sdk-browser\@1.10.2 ## 0.6.5 ### Patch Changes * Updated dependencies \[78bc39c] * @turnkey/sdk-server\@1.7.0 * @turnkey/http\@2.17.0 * @turnkey/sdk-browser\@1.10.1 ## 0.6.4 ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/sdk-browser\@1.10.0 ## 0.6.3 ### Patch Changes * Updated dependencies \[3dd74ac] * Updated dependencies \[1e36edf] * Updated dependencies \[4df8914] * Updated dependencies \[11a9e2f] * @turnkey/sdk-browser\@1.9.0 * @turnkey/sdk-server\@1.6.0 * @turnkey/http\@2.16.0 ## 0.6.2 ### Patch Changes * Updated dependencies \[9ebd062] * @turnkey/sdk-browser\@1.8.0 * @turnkey/sdk-server\@1.5.0 * @turnkey/http\@2.15.0 ## 0.6.1 ### Patch Changes * Updated dependencies \[abe7138] * Updated dependencies \[96d7f99] * @turnkey/sdk-server\@1.4.2 * @turnkey/sdk-browser\@1.7.1 * @turnkey/http\@2.14.2 * @turnkey/api-key-stamper\@0.4.3 ## 0.6.0 ### Minor Changes * 2bb9ea0: Add synchronous createAccount variant (thank you @mshrieve) * Closes [https://github.com/tkhq/sdk/issues/349](https://github.com/tkhq/sdk/issues/349) * Originally attributed to [https://github.com/tkhq/sdk/pull/348](https://github.com/tkhq/sdk/pull/348) * Upshot: no change required if your setup was working. However, if you would like a synchronous option for creating a Viem account, now you may do so with `createAccountWithAddress` ### Patch Changes * Updated dependencies \[ff059d5] * Updated dependencies \[ff059d5] * @turnkey/sdk-browser\@1.7.0 * @turnkey/sdk-server\@1.4.1 * @turnkey/http\@2.14.1 * @turnkey/api-key-stamper\@0.4.2 ## 0.5.0 ### Minor Changes * 848f8d3: Support awaiting consensus and improve error handling * Add new error types that extend `BaseError` (and thus implement `error.walk`) * `TurnkeyConsensusNeededError` wraps consensus-related errors * `TurnkeyActivityError` wraps base Turnkey errors * Add a few new helper functions: * `serializeSignature` serializes a raw signature * `isTurnkeyActivityConsensusNeededError` and `isTurnkeyActivityError` use `error.walk` to check the type of a Viem error ### Patch Changes * Updated dependencies \[c988ed0] * Updated dependencies \[848f8d3] * @turnkey/sdk-browser\@1.6.0 * @turnkey/sdk-server\@1.4.0 * @turnkey/http\@2.14.0 ## 0.4.31 ### Patch Changes * Updated dependencies \[1813ed5] * @turnkey/sdk-browser\@1.5.0 ## 0.4.30 ### Patch Changes * Updated dependencies \[bab5393] * Updated dependencies \[a16073c] * Updated dependencies \[7e7d209] * @turnkey/sdk-browser\@1.4.0 ## 0.4.29 ### Patch Changes * Updated dependencies \[93dee46] * @turnkey/http\@2.13.0 * @turnkey/sdk-browser\@1.3.0 * @turnkey/sdk-server\@1.3.0 ## 0.4.28 ### Patch Changes * Updated dependencies \[e2f2e0b] * @turnkey/sdk-browser\@1.2.4 * @turnkey/sdk-server\@1.2.4 * @turnkey/http\@2.12.3 ## 0.4.27 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.2.3 * @turnkey/sdk-server\@1.2.3 ## 0.4.26 ### Patch Changes * Updated dependencies \[2d7e5a9] * Updated dependencies \[f4b607f] * @turnkey/api-key-stamper\@0.4.1 * @turnkey/http\@2.12.2 * @turnkey/sdk-browser\@1.2.2 * @turnkey/sdk-server\@1.2.2 ## 0.4.25 ### Patch Changes * Updated dependencies \[f17a229] * @turnkey/http\@2.12.1 * @turnkey/sdk-browser\@1.2.1 * @turnkey/sdk-server\@1.2.1 ## 0.4.24 ### Patch Changes * Updated dependencies * @turnkey/http\@2.12.0 * @turnkey/sdk-browser\@1.2.0 * @turnkey/sdk-server\@1.2.0 ## 0.4.23 ### Patch Changes * Updated dependencies * @turnkey/http\@2.11.0 * @turnkey/sdk-browser\@1.1.0 * @turnkey/sdk-server\@1.1.0 ## 0.4.22 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@1.0.0 * @turnkey/sdk-server\@1.0.0 ## 0.4.21 ### Patch Changes * @turnkey/sdk-browser\@0.4.1 ## 0.4.20 ### Patch Changes * d59e1b6: Add export of turnkey viem account functions * Updated dependencies \[e4b29da] * @turnkey/sdk-browser\@0.4.0 ## 0.4.19 ### Patch Changes * Updated dependencies \[d409d81] * @turnkey/sdk-browser\@0.3.0 ## 0.4.18 ### Patch Changes * @turnkey/sdk-browser\@0.2.1 ## 0.4.17 ### Patch Changes * Updated dependencies * Updated dependencies \[e4d2a84] * @turnkey/sdk-browser\@0.2.0 * @turnkey/sdk-server\@0.2.0 ## 0.4.16 ### Patch Changes * Updated dependencies * @turnkey/sdk-browser\@0.1.0 * @turnkey/sdk-server\@0.1.0 ## 0.4.15 ### Patch Changes * a6502e6: Add support for new Turnkey Client types ## 0.4.14 ### Patch Changes * Updated dependencies \[7a9ce7a] * @turnkey/http\@2.10.0 ## 0.4.13 ### Patch Changes * Updated dependencies * @turnkey/http\@2.9.1 ## 0.4.12 ### Patch Changes * Updated dependencies \[83b62b5] * @turnkey/http\@2.9.0 ## 0.4.11 ### Patch Changes * Updated dependencies \[46a7d90] * @turnkey/http\@2.8.0 ## 0.4.10 ### Patch Changes * Updated dependencies * @turnkey/http\@2.7.1 ## 0.4.9 ### Patch Changes * Updated dependencies (\[c3b423b], \[d73725b]) * @turnkey/api-key-stamper\@0.4.0 * @turnkey/http\@2.7.0 ## 0.4.8 ### Patch Changes * 4794c64: Updated dependencies ## 0.4.7 ### Patch Changes * Updated dependencies \[f9d636c] * @turnkey/http\@2.6.2 ## 0.4.6 ### Patch Changes * Updated dependencies \[52e2389] * @turnkey/http\@2.6.1 ## 0.4.5 ### Patch Changes * Updated dependencies \[7a3c890] * @turnkey/http\@2.6.0 ## 0.4.4 ### Patch Changes * Upgrade to Node v18 (#184) * Updated dependencies * @turnkey/api-key-stamper\@0.3.1 * @turnkey/http\@2.5.1 ## 0.4.3 ### Patch Changes * Updated dependencies \[464ac0e] * @turnkey/http\@2.5.0 ## 0.4.2 ### Patch Changes * @turnkey/http\@2.4.2 ## 0.4.1 ### Patch Changes * Updated dependencies \[f87ced8] * @turnkey/http\@2.4.1 ## 0.4.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ### Patch Changes * Updated dependencies \[fc5b291] * @turnkey/api-key-stamper\@0.3.0 * @turnkey/http\@2.4.0 ## 0.3.4 ### Patch Changes * Updated dependencies * @turnkey/api-key-stamper\@0.2.0 * @turnkey/http\@2.3.1 ## 0.3.3 ### Patch Changes * Updated dependencies \[f1bd68a] * @turnkey/http\@2.3.0 ## 0.3.2 ### Patch Changes * Updated dependencies \[ed50a0f] * Updated dependencies * @turnkey/http\@2.2.0 ## 0.3.0 ### Minor Changes * cf8631a: Update interface to support `signWith` This change supports signing with wallet account addresses, private key addresses, or private key IDs. See below for an example: ```js theme={"system"} const httpClient = new TurnkeyClient( { baseUrl: "https://api.turnkey.com", }, // This uses API key credentials. // If you're using passkeys, use `@turnkey/webauthn-stamper` to collect webauthn signatures: // new WebauthnStamper({...options...}) new ApiKeyStamper({ apiPublicKey: "...", apiPrivateKey: "...", }), ); // Create the Viem custom account const turnkeyAccount = await createAccount({ client: httpClient, organizationId: "...", signWith: "...", // optional; will be fetched from Turnkey if not provided ethereumAddress: "...", }); ``` ## 0.2.7 ### Patch Changes * Updated dependencies \[bb6ea0b] * @turnkey/http\@2.1.0 ## 0.2.6 ### Patch Changes * 59dcd2f: Unpin typescript * da7c960: Bump Viem dependency to fix `getAddresses()` for LocalAccount * Updated dependencies * @turnkey/http\@2.0.0 * Updated the shape of signing ## 0.2.5 ### Patch Changes * Updated dependencies * @turnkey/http\@1.3.0 ## 0.2.4 ### Patch Changes * 0ec2d94: Addresses a bug when signing raw messages (see [https://github.com/tkhq/sdk/issues/116](https://github.com/tkhq/sdk/issues/116)) ## 0.2.3 ### Patch Changes * Updated dependencies * @turnkey/http\@1.2.0 ## 0.2.2 ### Patch Changes * Updated dependencies * @turnkey/api-key-stamper\@0.1.1 * @turnkey/http\@1.1.1 ## 0.2.1 ### Patch Changes * Fix code sample in the readme; add more details and links ## 0.2.0 ### Minor Changes * Add new `createAccount` method and deprecates the existing `createApiAccount`. `createAccount` offers a superset of functionality and works with stampers (`@turnkey/api-key-stamper` / `@turnkey/webauthn-stamper`) to integrate with API keys or passkeys. ### Patch Changes * Updated dependencies: @turnkey/http\@1.1.0 * New dependency: @turnkey/api-key-stamper\@0.1.0 ## 0.1.1 ### Patch Changes * readme updates ## 0.1.0 Initial release! # Wallet Stamper Source: https://docs.turnkey.com/changelogs/wallet-stamper/readme # @turnkey/wallet-stamper ## 1.1.11 ### Patch Changes * Updated dependencies \[[`d0dba04`](https://github.com/tkhq/sdk/commit/d0dba0412fa7b0c7c9b135e73cc0ef6f55187314)]: * @turnkey/crypto\@2.8.9 ## 1.1.10 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.8 ## 1.1.9 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.7 ## 1.1.8 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.6 ## 1.1.7 ### Patch Changes * Updated dependencies \[[`5f829c6`](https://github.com/tkhq/sdk/commit/5f829c67af03bb85c3806acd202b2debf8274e78)]: * @turnkey/crypto\@2.8.5 ## 1.1.6 ### Patch Changes * Updated dependencies \[[`c745646`](https://github.com/tkhq/sdk/commit/c745646ae4b2a275e116abca07c6e108f89beb04)]: * @turnkey/crypto\@2.8.4 ## 1.1.5 ### Patch Changes * Updated dependencies \[[`5c4495b`](https://github.com/tkhq/sdk/commit/5c4495bff1b0abfe3c427ead1b8e1a8d510c8186)]: * @turnkey/crypto\@2.8.3 ## 1.1.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.2 ## 1.1.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/crypto\@2.8.1 ## 1.1.2 ### Patch Changes * Updated dependencies \[[`3997c0f`](https://github.com/tkhq/sdk/commit/3997c0fd08a8a85108acf904c0bf39d69f8dc79c)]: * @turnkey/crypto\@2.8.0 ## 1.1.1 ### Patch Changes * Updated dependencies \[[`2191a1b`](https://github.com/tkhq/sdk/commit/2191a1b201fb17dea4c79cf9e02b3a493b18f97a)]: * @turnkey/crypto\@2.7.0 ## 1.1.0 ### Minor Changes * Updated dependencies \[[`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`fc1d6e2`](https://github.com/tkhq/sdk/commit/fc1d6e2d26f4a53116633e9e8cccccd792267f4e), [`4880f26`](https://github.com/tkhq/sdk/commit/4880f26a4dd324c049bff7f35284098ccfc55823), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`c6ee323`](https://github.com/tkhq/sdk/commit/c6ee3239c389a7bbbbb23610c84b883ed298f95c), [`06347ad`](https://github.com/tkhq/sdk/commit/06347adfa08fb0867c350e43821d0fed06c49624), [`6bfcbc5`](https://github.com/tkhq/sdk/commit/6bfcbc5c098e64ab1d115518733b87cfc1653e17)]: * @turnkey/encoding\@0.6.0 * @turnkey/crypto\@2.6.0 ## 1.1.0-beta.6 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.6 * @turnkey/crypto\@2.6.0-beta.6 ## 1.1.0-beta.5 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.5 * @turnkey/crypto\@2.6.0-beta.5 ## 1.0.9-beta.4 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.4 * @turnkey/crypto\@2.5.1-beta.4 ## 1.0.9-beta.3 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.3 * @turnkey/crypto\@2.5.1-beta.3 ## 1.0.9-beta.2 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.2 * @turnkey/crypto\@2.5.1-beta.2 ## 1.0.9-beta.1 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.1 * @turnkey/crypto\@2.5.1-beta.1 ## 1.0.9-beta.0 ### Patch Changes * Updated dependencies \[]: * @turnkey/encoding\@0.6.0-beta.0 * @turnkey/crypto\@2.5.1-beta.0 ## 1.0.9 ### Patch Changes * Updated dependencies \[[`d7420e6`](https://github.com/tkhq/sdk/commit/d7420e6c3559efc1024b58749b31d253150cb189)]: * @turnkey/crypto\@2.6.0 ## 1.0.8 ### Patch Changes * Updated dependencies \[[`6cde41c`](https://github.com/tkhq/sdk/commit/6cde41cfecdfb7d54abf52cc65e28ef0e2ad6ba3)]: * @turnkey/crypto\@2.5.0 ## 1.0.7 ### Patch Changes * Updated dependencies \[[`6cbff7a`](https://github.com/tkhq/sdk/commit/6cbff7a0c0b3a9a05586399e5cef476154d3bdca)]: * @turnkey/crypto\@2.4.3 ## 1.0.6 ### Patch Changes * Updated dependencies \[[`c5cdf82`](https://github.com/tkhq/sdk/commit/c5cdf8229da5da1bd6d52db06b2fe42826e96d57), [`fa46701`](https://github.com/tkhq/sdk/commit/fa467019eef34b5199372248edff1e7a64934e79)]: * @turnkey/crypto\@2.4.2 ## 1.0.5 ### Patch Changes * Updated dependencies \[[`878e039`](https://github.com/tkhq/sdk/commit/878e03973856cfec83e6e3fda5b76d1b64943628)]: * @turnkey/crypto\@2.4.1 ## 1.0.4 ### Patch Changes * [#659](https://github.com/tkhq/sdk/pull/659) [`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc) Author [@turnekybc](https://github.com/turnekybc) - export types and models from @turnkey/sdk-browser * Updated dependencies \[[`40c4035`](https://github.com/tkhq/sdk/commit/40c40359ec7096d0bca39ffc93e89361b3b11a1a), [`10ee5c5`](https://github.com/tkhq/sdk/commit/10ee5c524b477ce998e4fc635152cd101ae5a9cc)]: * @turnkey/encoding\@0.5.0 * @turnkey/crypto\@2.4.0 ## 1.0.3 ### Patch Changes * Updated dependencies \[2bc0046] * @turnkey/crypto\@2.3.1 ## 1.0.2 ### Patch Changes * c895c8f: Update @solana/web3.js from ^1.88.1 to ^1.95.8 * @turnkey/crypto\@2.3.0 ## 1.0.1 ### Patch Changes * Updated dependencies \[668edfa] * @turnkey/crypto\@2.3.0 ## 1.0.0 ### Major Changes * Renamed `recoverPublicKey` to `getPublicKey` on the `EthereumWallet` interface to improve clarity and consistency across wallet interfaces * Changed `getPublicKey` method signature to take no parameters ```typescript theme={"system"} // Old method signature recoverPublicKey(message: string): Promise; ``` ```typescript theme={"system"} // New method signature getPublicKey(): Promise; ``` * Added an `EthereumWallet` implementation as a helper to simplify support for Ethereum wallets: ```typescript theme={"system"} import { EthereumWallet } from "@turnkey/wallet-stamper"; const wallet = new EthereumWallet(); // Instantiate the WalletStamper with the EthereumWallet const walletStamper = new WalletStamper(wallet); // Instantiate the TurnkeyClient with the WalletStamper const client = new TurnkeyClient({ baseUrl: BASE_URL }, walletStamper); ``` ### Patch Changes * Updated dependencies \[8bea78f] * @turnkey/crypto\@2.2.0 ## 0.0.5 ### Patch Changes * Updated dependencies \[e5c4fe9] * @turnkey/encoding\@0.4.0 ## 0.0.4 ### Patch Changes * Updated dependencies \[93666ff] * @turnkey/encoding\@0.3.0 ## 0.0.3 ### Patch Changes * Updated dependencies \[2d7e5a9] * Updated dependencies \[f4b607f] * @turnkey/encoding\@0.2.1 ## 0.0.2 ### Patch Changes * 68a14dd: Initial release! 🎉 # Webauthn Stamper Source: https://docs.turnkey.com/changelogs/webauthn-stamper/readme # @turnkey/webauthn-stamper ## 0.6.0 ## 0.6.0-beta.0 ### Minor Changes * SDK beta release @turnkey/react-wallet-kit @turnkey/core ## 0.5.1 ### Patch Changes * [#659](https://github.com/tkhq/sdk/pull/659) [`5afbe51`](https://github.com/tkhq/sdk/commit/5afbe51949bdd1997fad083a4c1e4272ff7409dc) Author [@turnekybc](https://github.com/turnekybc) - export types and models from @turnkey/sdk-browser ## 0.5.0 ### Minor Changes * Remove dependency on `noble/hashes` and `Buffer` in favor of a minimal sha256 lib * Introduce `@turnkey/encoding` to consolidate utility functions ## 0.4.3 ### Patch Changes * Upgrade to Node v18 (#184) ## 0.4.2 ### Patch Changes * Make sha256 computation synchronous to resolve ios passkey prompt issues (#179) ## 0.4.1 ### Patch Changes * Fix universal files to stop using `require`. Use ES6 imports instead (#178) ## 0.4.0 ### Minor Changes * Use rollup to build ESM and CommonJS, fix ESM support (#174) ## 0.3.0 ### Minor Changes * Add support for ESM (#154) ## 0.2.0 ### Minor Changes * Adds Buffer polyfill for environments where it is not globally available ([https://github.com/tkhq/sdk/pull/125](https://github.com/tkhq/sdk/pull/125)) ## 0.1.0 Initial release # Organizations Source: https://docs.turnkey.com/concepts/organizations An organization is a logical grouping of resources (e.g. users, policies, wallets). These resources can only be accessed by authorized and permissioned users within the organization. Resources are not shared between organizations. ## Root quorum All organizations are controlled by a [Root Quorum](/concepts/users/root-quorum) which contains the root users and the required threshold of approvals to take any action. Only the root quorum can update the root quorum or feature set. ## Features Organization features are Turnkey product offerings that organizations can opt-in to or opt-out of. Note that these features can be set and updated using the activities `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` and `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`. The following is a list of such features: | Name | Description | Default | Notes | | -------------------------------- | --------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | FEATURE\_NAME\_EMAIL\_AUTH | Enables email bundle authentication | Enabled | The `email_auth` activity can only be initiated by a parent organization for a sub-organization. | | FEATURE\_NAME\_OTP\_EMAIL\_AUTH | Enables email OTP authentication | Enabled | The `init_otp`, `verify_otp` and `otp_login` activities can only be initiated by a parent organization for a sub-organization. | | FEATURE\_NAME\_WEBAUTHN\_ORIGINS | The origin Webauthn credentials are scoped to | Disabled | Parent organization feature applies to all sub-organizations. If not enabled, sub-organizations default to allowing all origins: "\*". For Passkey WaaS, we highly recommend enabling this feature. Example value: "[https://www.turnkey.com"](https://www.turnkey.com%22) | | FEATURE\_NAME\_WEBHOOK | A URL to receive activity notification events | Disabled | Example value: "[https://your.service.com/webhook"](https://your.service.com/webhook%22) | ## Permissions All activity requests are subject to enforcement by Turnkey's policy engine. The policy engine determines if a request is allowed by checking the following: * Does this request violate our feature set? * Email auth cannot be initiated if disabled * Should this request be denied by default? * All import requests must target your own user * Does this request meet the root quorum threshold? * What is the outcome of evaluating this request against all organization policies? Outcomes include: * `OUTCOME_ALLOW`: the request is allowed to process * `OUTCOME_REQUIRES_CONSENSUS`: the request needs additional approvals * `OUTCOME_REJECTED`: the request should be rejected * `OUTCOME_DENY_EXPLICIT`: the request has been explicitly denied via policies * `OUTCOME_DENY_IMPLICIT`: the request has been implicitly denied as no policies grant the required permissions * Should this request be allowed by default? * Users can manage their own credentials unless policies explicitly deny this ## Resource limits Organizations have [resource limits](/concepts/resource-limits) for performance and security considerations. If you're bumping into these limits, check out sub-organizations below. ## Sub-organizations A sub-organization is an isolated organization that has a pointer to a parent organization. The parent organization has **read** access to all sub-organizations, but no **write** access. This means users within the parent organization have no ability to use wallets or alter any resources in the sub-organization. For more information on sub-organizations and common use cases for this functionality, follow along in the next section . # Overview Source: https://docs.turnkey.com/concepts/overview Turnkey is flexible, scalable, and secure wallet infrastructure that can be used for transaction automation (e.g., payments flows, smart contract management), or non-custodial embedded wallets. Turnkey offers low-level primitives that can be combined to accomplish a variety of goals. Turnkey’s security and flexibility enables you to build cutting-edge user experiences, whether you’re using our bare-bones API or pre-built UI components. To make the most out of your implementation, we recommend reading through the following Concepts page for a better understanding of how our products work, and how to best utilize all of Turnkey’s features. ### How Turnkey works At the core of Turnkey is an important concept: instead of directly managing private keys, wallets are accessed through authenticators like passkeys, social logins, or API keys: all concepts screenshot * **Organizations (parent orgs)** in Turnkey are top-level entities that contain users, wallets, and policies for a business, with the initial “parent organization” typically representing an entire Turnkey-powered application. * Parent organizations can create **sub-organizations (sub-orgs)**, which are fully segregated organizations nested under the parent organization. Parent orgs cannot modify the contents of a sub-org, and sub-orgs and typically represent an end user. * Both parent organizations and sub-organizations contain a set of **resources and authenticators** that you can configure, including their own users, wallets, API keys, private keys, and policies. * **Activities** (like signing transactions or creating users) are governed by **policies** created via Turnkey’s policy engine, though root users can bypass the policy engine when meeting root quorum requirements. * **Wallets** in Turnkey are HD seed phrases that can generate multiple wallet accounts (addresses) for signing operations. ### Managing Turnkey interactions and organizations There are two primary ways for users to interact with Turnkey — via the Turnkey Dashboard, and by submitting activity requests via our public API. The Turnkey Dashboard, which is where you’ll first create your Turnkey parent organization, is where root users of your parent organization will typically manage administrative activities. It supports passkey authentication only. On the other hand, interactions with Turnkey at scale (primarily, interactions initiated by end users) can be done via programmatically calling the Turnkey public API and submitting activity requests, with a variety of authentication methods supported. ## Concepts dictionary For more details on individual concepts, feel free to explore our concept-specific documentation (also accessible through the left navbar). ### Organizations An organization is a logical grouping of resources like users, policies, and wallets. There are two types of organizations: | Organization type | Description | | :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Parent Organization | When you first setup your implementation of Turnkey by signing up on the dashboard you create a parent organization controlled by your business. In most implementations, a top-level organization represents an entire Turnkey-powered implementation. For more information on Turnkey parent organizations [look here](/concepts/organizations). | | Sub-Organization | A fully segregated organization nested under the parent organization. Parent organizations have read access to all their sub-organizations, but do not have write access. Each sub-organization typically maps to an individual end user in a Turnkey-powered application. Parent organizations can initiate limited actions for sub-organizations that then must be completed by the sub-organization (e.g. `INIT_OTP`). For more information on Turnkey sub-organizations [look here](/concepts/sub-organizations). | ### Users Turnkey users are resources within organizations or sub-organizations that can submit activities to Turnkey via a valid credential (e.g., API key, passkey). These requests can be made either by making direct API calls or through the Turnkey Dashboard. Users must be set up to authenticate to Turnkey with credentials (API keys, passkeys), or via other authentication methods such as OAuth, or email auth, with upper limits on credentials defined here in our [resource limits](/concepts/resource-limits). Users can also have associated “tags” which are logical groupings that can be referenced in policies. Users can only submit activities within their given organization — they cannot take action across organizations. There are two main types of users: | User type | Description | | :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Root Users | The first user(s) created in an organization will have root permissions, meaning they can bypass the policy engine to take any action within that specific organization. This ability can be limited via root quorum, which requires a threshold of root users to access root permissions. For example, if there are five root users and the threshold is three, at least three users must approve an activity for the root quorum threshold to be reached. When you first create a Turnkey organization, your user is automatically created as the sole member of the root quorum by default. | | Normal Users | Other than managing their own credentials, non-root users have no permissions unless explicitly granted by [policies](/concepts/policies/overview). By combining non-root users with policies granting permission for specific actions, you can build support for experiences providing [delegated access](/concepts/policies/delegated-access) to business controlled service account. | In parent organizations, a user often maps to an individual from your team with administrative privileges and responsibilities. In sub-organizations, which are often used to manage an end user's resources, a user can represent an end user and their credentials. If there is only one user representing the end user with only end-user controlled credentials then this would be more akin to a standard non-custodial setup. However, this flexible primitive can often represent other aspects of your backend or application. For example, a Turnkey user might map to a: * Backend service used to automate certain transactions * Service with delegated access to take action on behalf of an end user * Required co-signer for all end user transactions For more information on Turnkey users [look here](/concepts/users/introduction). ### Credentials Interacting with the Turnkey API requires each API call to be authenticated by cryptographically stamping it with a credential. This process is abstracted away in our SDKs and ensures that the request cannot be tampered with as it travels to the secure enclave. Credentials include API keys and passkeys / Webauthn devices for all Users, while sub-organization users can also use email or OAuth to authenticate. Email and OAuth leverage API keys under the hood. For more information on Turnkey user credentials [look here](/concepts/users/credentials). ### Activities Activities are specific actions taken by users, such as signing a transaction, adding a new user, or creating a sub-organization. Activity requests are always evaluated through our policy engine, and can evaluate to ALLOW, DENY, or REQUIRES\_CONSENSUS (i.e., requires additional approvals before being allowed). For more information on Turnkey activities [look here](/developer-reference/api-overview/submissions). ### Policies Policies, enforced by Turnkey’s policy engine, grant users permissions to perform activities. These policies are a series of logical statements (e.g., User ID == 123 or ETH address == 0x543…9b34) that evaluate to either “ALLOW” or “DENY.” Through these policies you can set granular controls on which users can take which actions with which wallets. Policies can also require multi-party approval / consensus, meaning a threshold of certain users will be required to approve the activity. As mentioned above, the root quorum will bypass the policy engine. For more information on Turnkey policies [look here](/concepts/policies/overview). ### Wallets and private keys Resources used to generate crypto addresses and sign transactions or messages. We currently support secp256k1 and ed25519 curves and have two main types: | Resource type | Description | | :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Wallets (preferred) | A hierarchical deterministic (HD) wallet, which is a collection of cryptographic key pairs derived from a common seed phrase. A wallet (i.e., a single seed phrase) can have many wallet accounts (i.e., a set of derived addresses). Wallets support various cryptographic curves and can be represented by a checksummed mnemonic phrase, making them easier to back up and recover. We limit each organization to 100 Wallets, but there is no limit on the total number of wallet accounts. For more information on Turnkey HD wallets [look here](/concepts/wallets). | | Private Keys | Raw private keys represented by an alphanumeric string. We limit each organization to 1,000 private keys, therefore we recommend using wallets instead of private keys for better scalability. | Learn more about leveraging Wallets across different crypto ecosystems on our [Ecosystem Support](/networks/overview) page. Understand Turnkey's core features and fundamentals. Learn about Organizations on Turnkey Learn about sub-organizations on Turnkey 3 items Learn about Wallets on Turnkey Organization resource limits 5 items # Server-side Delegated Access setup Source: https://docs.turnkey.com/concepts/policies/delegated-access-backend Step by step implementation of the delegated access entirely server-side Before diving in, here’s what this setup accomplishes: You’ll create a **sub-organization** where the **end-user** has full control (root user) and a **Delegated Access (DA) user** (managed by your backend) can sign only specific transactions, for example, sending to approved recipient addresses. This ensures your backend can perform limited, policy-controlled actions on behalf of the user without ever holding their root privileges. The entire setup is initiated by your backend — no end-user interaction is required. A simple example demonstrating the server-side delegated access setup can be found [here](https://github.com/tkhq/sdk/tree/main/examples/delegated-access). ## Step-by-step implementation ### Step 1: Create a sub-organization with two root users[​](#step-1-create-a-sub-organization-with-two-root-users) * Create your sub-organization with the two root users being: * The end-user * A user you control (we'll call it the ‘Delegated Account’) ```json theme={"system"} { "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", "timestampMs": "", "organizationId": "your-organization-id", "parameters": { "subOrganizationName": "", "rootUsers": [ { "userName": "", "userEmail": "enduser@example.com", "authenticators": [ { "authenticatorName": "", "challenge": "", "attestation": { "credentialId": "", "clientDataJson": "", "attestationObject": "", "transports": ["AUTHENTICATOR_TRANSPORT_HYBRID"] } } ], "apiKeys": [], "oidcProviders": [] }, { "userName": "Delegated Account", "userEmail": "(optional)", "authenticators": [], "apiKeys": [ { "apiKeyName": "", "publicKey": "" } ], "oidcProviders": [] } ], "rootQuorumThreshold": 1, "wallet": { "walletName": "Default ETH Wallet", "accounts": [ { "curve": "CURVE_SECP256K1", "pathFormat": "PATH_FORMAT_BIP32", "path": "m/44'/60'/0'/0/0", "addressFormat": "ADDRESS_FORMAT_ETHEREUM" } ] } } } ``` ### Step 2: Limit the permissions of the Delegated Account user via policies * Create a custom policy granting the Delegated Account specific permissions. You might grant that user permissions to: * Sign any transaction * Sign only transactions to a specific address * Create new users in the sub-org * Or any other activity you want to be able to take using your Delegated Account Here’s one example, granting the Delegated Account only the permission to sign ethereum transactions to a specific receiver address: ```json theme={"system"} { "type": "ACTIVITY_TYPE_CREATE_POLICY", "timestampMs": "", "organizationId": "sub-organization-id", "parameters": { "policyName": "Allow Delegated Account to sign transactions to specific address", "policy": { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == )", "condition": "eth.tx.to == " }, } } ``` ### Step 3: Remove the Delegated Account from the root quorum using the Delegated Account's credentials: ```json theme={"system"} // Update the root quorum of the sub organization to ONLY include the end user, removing the delegated access user { "type": "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", "timestampMs": "", "organizationId": "", "parameters": { "threshold": 1, "userIds": [ "" ] } } ``` After completing these steps, the sub-organization will have two users: the end-user (the only root-user) and the Delegated Account user, which only has the permissions granted earlier via policies and no longer retains root user privileges. ## Delegated access code example Below is a code example outlining the implementation of the delegated access setup flow described above ```js theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; import dotenv from "dotenv"; dotenv.config(); // Initialize the Turnkey Server Client on the server-side const turnkeyServer = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY, apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, }).apiClient(); // To create an API key programmatically check https://github.com/tkhq/sdk/blob/main/examples/kitchen-sink/src/sdk-server/createApiKey.ts const publicKey = ""; const curveType = "API_KEY_CURVE_P256"; // this is the default const apiKeys = [ { apiKeyName: "Delegated - API Key", publicKey, curveType, }, ]; // STEP 1: Create a sub org with End User and Delegated access user in Root Quorum const subOrg = await turnkeyClient.createSubOrganization({ organizationId: process.env.TURNKEY_ORGANIZATION_ID!, subOrganizationName: `Sub Org - With Delegated Access User`, rootUsers: [ { userName: "Delegated Access User", apiKeys, authenticators: [], oauthProviders: [] }, { userName: "End User", userEmail: "", apiKeys: [], authenticators: [], oauthProviders: [] }, ], rootQuorumThreshold: 1, wallet: { "walletName": "Default ETH Wallet", "accounts": [ { "curve": "CURVE_SECP256K1", "pathFormat": "PATH_FORMAT_BIP32", "path": "m/44'/60'/0'/0/0", "addressFormat": "ADDRESS_FORMAT_ETHEREUM" } ] }, }); console.log("sub-org id:", subOrg.subOrganizationId); // Initializing the Turkey client used by the Delegated Access User // Notice the subOrganizationId created above const turnkeyDelegatedAccessClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPrivateKey: process.env.DELEGATED_API_PRIVATE_KEY!, apiPublicKey: process.env.DELEGATED_API_PUBLIC_KEY!, defaultOrganizationId: subOrg.subOrganizationId, }).apiClient(); // STEP 2: Create a policy allowing the Delegated access user to send Ethereum transactions to a particular address // Creating a policy for the Delegated account const delegated_userid = subOrg.rootUserIds[0]; const policyName = "Allow Delegated Account to sign transactions to specific address"; const effect = "EFFECT_ALLOW"; const consensus = `approvers.any(user, user.id == '${delegated_userid}')`; const condition = `eth.tx.to == '${process.env.RECIPIENT_ADDRESS}'`; const notes = ""; const { policyId } = await turnkeyDelegated.createPolicy({ policyName, condition, consensus, effect, notes, }); // STEP 3: Update the root quorum to only include the End User, removing the Delegated Access user // Remove the Delegated Account from the root quorum const RootQuorum = await turnkeyDelegated.updateRootQuorum({ threshold: 1, userIds: [subOrg.rootUserIds[1]], // retain the end user }); ``` # Client-side Delegated Access setup Source: https://docs.turnkey.com/concepts/policies/delegated-access-frontend Step-by-step guide for adding Delegated Access users and policies entirely client-side Before diving in, here’s what this setup accomplishes: You’ll create a **sub-organization** where the **end-user** has full control (root user) and a **Delegated Access (DA) user** (managed by your backend) can sign only specific transactions, for example, sending to approved recipient addresses. This ensures your backend can perform limited, policy-controlled actions on behalf of the user without ever holding their root privileges. The entire setup is initiated and approved by the end-user through their authenticated session, ensuring all actions occur under their explicit control within their sub-organization. A working example of client-side delegated access and policy validation can be found [here](https://github.com/tkhq/sdk/tree/main/examples/with-delegated). ## Step-by-step implementation You can configure **delegated access** entirely on the client side using the Turnkey SDKs — [@turnkey/react-wallet-kit](https://docs.turnkey.com/sdks/react) for React apps, or [@turnkey/core](https://docs.turnkey.com/sdks/typescript-frontend) for other frontend frameworks. This works whether you use the [Auth Proxy](https://docs.turnkey.com/reference/auth-proxy) or your own [backend](https://docs.turnkey.com/sdks/react/advanced-backend-authentication) to provision the sub-organization and issue the user's authenticated session. Both approaches follow the same principle — using an authenticated session to add a Delegated Access (DA) user and defining policies for that user within the sub-organization. ### Step 1: Create an embedded wallet In this guide we'll be using [@turnkey/react-wallet-kit](https://www.npmjs.com/package/@turnkey/react-wallet-kit) together with [Auth Proxy](https://docs.turnkey.com/sdks/react/getting-started). * Customize sub-organization creation process in your React application by defining the following TurnkeyProvider configuration. This will add a new Ethereum wallet account alongside the sub-organization creation. ```tsx proviers.tsx theme={"system"} export function Providers({ children }: { children: React.ReactNode }) { const router = useRouter(); const suborgParams = useMemo(() => { const ts = Date.now(); return { userName: `User-${ts}`, customWallet: { walletName: `Wallet-${ts}`, walletAccounts: [ { curve: "CURVE_SECP256K1", pathFormat: "PATH_FORMAT_BIP32", path: "m/44'/60'/0'/0/0", addressFormat: "ADDRESS_FORMAT_ETHEREUM", }, ], }, }; }, []); const turnkeyConfig: TurnkeyProviderConfig = { organizationId: process.env.NEXT_PUBLIC_ORGANIZATION_ID!, authProxyConfigId: process.env.NEXT_PUBLIC_AUTH_PROXY_CONFIG_ID!, auth: { createSuborgParams: { emailOtpAuth: suborgParams, smsOtpAuth: suborgParams, walletAuth: suborgParams, oauth: suborgParams, passkeyAuth: { ...suborgParams, passkeyName: "My Passkey", }, }, }, }; ``` * Handle authentication is using the `handleLogin` function from the useTurnkey hook. It’s idempotent — existing users simply log in to their sub-org. ```tsx page.tsx theme={"system"} "use client"; import { useTurnkey } from "@turnkey/react-wallet-kit"; function LoginButton() { const { handleLogin } = useTurnkey(); return ; } export default function Home() { return ( ); } ``` ### Step 2: Create P-256 API key user Next, use the authenticated end-user session to create a **P-256 API key user** whose key is managed by your backend for delegated actions. This will become the Delegated Access (DA) user once you define policies that grant it limited signing permissions. You can create this user at any point, either immediately after login or on-demand when an action (such as placing a limit order) requires delegated access. **Note:** This function is **idempotent** — calling it multiple times with the same publicKey will always return the same user rather than creating a new one. ```tsx src/dashboard/page.tsx theme={"system"} const handleDaSetup = async () => { if (!isHexCompressedPubKey(daPublicKey)) { setPublicKeyErr( "Public key must be a 66-hex-character compressed key (no 0x prefix).", ); return; } setPublicKeyErr(null); try { const res = await fetchOrCreateP256ApiKeyUser({ publicKey: daPublicKey, createParams: { userName: "Delegated Access", apiKeyName: "Delegated User API Key", }, }); setDaUser(res); } catch (err) { console.error("Error setting up DA user:", err); setDaUser({ error: "Failed to set up DA user." }); } }; ``` **Note:** At this stage, the DA user is non-root, so any signing attempts will be denied by the policy engine because: * the user is not part of the root quorum, and * no policy has been added yet to allow that action. ### Step 3: Add a restrictive policy Now that you’ve created the P-256 API key user, you can define policies that turn it into a Delegated Access (DA) user) — granting it limited permissions to sign specific transactions. In this example, we’ll allow the DA user to sign Ethereum transactions **only** to a given recipient address. ```tsx src/dashboard/page.tsx theme={"system"} const handleBuildPolicyTemplate = () => { if (!daUser?.userId) { setPolicyError("Set up the Delegated Access user first."); return; } if (!isEthAddress(recipientAddress)) { setRecipientErr("Enter a valid 0x-prefixed, 40-hex Ethereum address."); return; } setRecipientErr(null); setPolicyError(null); const template = [ { policyName: `Allow user ${daUser.userId} to sign only to ${recipientAddress}`, effect: "EFFECT_ALLOW", consensus: `approvers.any(user, user.id == '${daUser.userId}')`, condition: `eth.tx.to == '${recipientAddress}'`, notes: "Allow Delegated Access user to sign Ethereum transactions only to the specified recipient", }, ]; setPolicyJson(JSON.stringify(template, null, 2)); }; // Keep in sync setToAllowed if recipientAddress changes manually useEffect(() => { if (recipientAddress) { setToAllowed(recipientAddress); } }, [recipientAddress]); const handleSubmitPolicies = async () => { setPolicyError(null); setPolicyResult(null); setSubmittingPolicy(true); try { const parsed = JSON.parse(policyJson); if (!Array.isArray(parsed)) { throw new Error("JSON must be an array of policy objects."); } const res = await fetchOrCreatePolicies({ policies: parsed }); setPolicyResult(res); } catch (e: any) { setPolicyError(e?.message || "Failed to submit policies."); } finally { setSubmittingPolicy(false); } }; ``` **Note:** * Reminder, until this policy is added, the DA user cannot sign any transactions — it’s a non-root user with no permissions by default. * The `fetchOrCreatePolicies` method compares the full intent signature of each policy you pass in: * If a policy already exists with the **exact same fields**, it will be reused. * If **any field differs**, even something as small as the policy name or the notes text, it will be treated as a new policy and created again. That's all ! At this point, your DA user is configured with an API key and governed by a restrictive policy. You can now validate by attempting two signatures: one that matches the allowed recipient (success) and one with a different recipient (denied). # Overview Source: https://docs.turnkey.com/concepts/policies/delegated-access-overview With Turnkey you can create multi-user accounts with flexible co-ownership controls. This primitive enables you to establish delegated access to a user’s wallet, reducing or removing the need for them to manually approve each action. You can provide a smoother user experience while ensuring that end-users maintain full control over their wallets. Delegated access works by creating a specialized business-controlled user within each end-user’s sub-organization that has carefully scoped permissions to perform only specific actions, such as signing transactions to designated addresses. This can enable your backend to do things like: * Automate onchain actions such as staking, redemptions, or limit orders * Sign transactions to whitelisted addresses without user involvement * Perform scheduled operations (e.g. payouts, rebalances) * Respond to specific onchain events programmatically ## Implementation flow You can implement Delegated Access for an embedded wallet in two ways, depending on whether the setup runs from the frontend (recommended) or the backend. ### 1. Frontend (recommended) This approach uses the **end-user’s authenticated session** to configure delegated access directly within their sub-organization. The flow is: * Create an **API-only user (Delegated User)** with a P-256 API key authenticator that you control. This key can then be used server-side to sign transactions on the user’s behalf. * Define **policies** for the Delegated User that strictly limit which transactions they are allowed to sign. **Why this approach:** This avoids temporarily granting the Delegated User root access — see [Caution](#caution) for more details. Since you’re using the client-side authenticated session, the API-only user is created directly as a **non-root** user within the sub-organization. **Advantages:** * There’s no possibility of elevated (root-level) access for the delegated user. **Limitations:** * You can’t assume the delegated user or its policies already exist. Before referencing it, you’ll need to call `fetchOrCreateP256ApiKeyUser` and `fetchOrCreatePolicies` to ensure the user and permissions are properly set up. For a detailed step-by-step guide see [Client-side Delegated Access setup](concepts/policies/delegated-access-frontend). ### 2. Backend If you prefer to configure delegated access entirely server-side, the flow differs because the end-user in the embedded wallet model does not hold an API key. In this case, you must: * Create the sub-organization with **two root users**: the end-user and your Delegated User (API key authenticator). * Use the delegated access API key to add policies explicitly granting the DA user the limited actions you want them to perform. * Update the root quorum so that only the end-user remains a root user.

Caution ⚠️

When the delegated access setup is performed from the backend, your service (not the end-user) initiates and approves the sub-organization creation, delegated user addition, and root quorum updates. This means the delegated user is temporarily added to the root quorum without direct end-user consent. If any of these operations fail — particularly the quorum update — the delegated user may unintentionally retain root privileges, effectively gaining unrestricted access to the user’s wallet. If you adopt this approach, implement strict validation to confirm that: * The root quorum was successfully updated; and * The delegated user no longer retains unintended permissions once setup completes. **Advantages:** * Guarantees that the delegated user exists and can perform the required actions without additional setup. **Limitations:** * Risk of elevated access if the delegated user isn’t successfully removed as a root user, it may retain unintended control. * Since all actions are service-initiated, there’s no explicit end-user approval in this flow. For most end-user applications, it’s recommended to perform delegated access setup client-side, where all actions are explicitly initiated and approved by the user. For a detailed step-by-step guide see [Server-side Delegated Access setup](concepts/policies/delegated-access-backend). ## Frequently Asked Questions ### Policy Design and Creation Yes — if the delegated access (DA) user is part of the root quorum, they can create policies unilaterally. Once removed from the root quorum, only the remaining quorum member (typically the end-user) can make further policy changes. Note: This can also be done even if the initiating (delegated) user is not a root user, provided a policy explicitly grants them permission to create policies. However, such a configuration should be carefully scoped — additional restrictive policies are typically required to prevent the delegated user from granting themselves broader or unintended access. When the delegated access setup is performed **client-side**, all actions are initiated and approved by the authenticated end-user within their session. This ensures full transparency and explicit user consent for every operation.
When performed **server-side**, the setup happens without direct user involvement. This approach is generally used only in **enterprise or custodial environments**, where your backend manages sub-organizations and delegated users on behalf of end-users.
For typical end-user applications, the client-side setup is the recommended and more secure approach.
As long as the DA user remains authorized, they can remove policies programmatically. If they’ve been removed from the quorum, policy deletion will require the user’s explicit approval. **NOTE:** Turnkey is looking to support the concept of 'one-time-use policies' to make it easier to manage redundant policies. ### Security & Risk Management Yes — if the key is attached to a broad policy. That’s why it’s important to limit the scope of policies and enforce API hygiene practices. It's also recommended to have a policy in place that would allow this user to self-delete in case of a potential key leak: ```json theme={"system"} { policyName: `Allow the Delegated user to self-delete`, effect: "EFFECT_ALLOW", consensus: `approvers.any(user, user.id == '${delegated_userid}')`, condition: `activity.type == 'ACTIVITY_TYPE_DELETE_USERS' && activity.params.user_ids.count() == 1 && '${delegated_userid}' in activity.params.user_ids`, notes: "Allow the Delegated user to delete itself in case of a key leak" } ``` In effect, yes. The key difference is that granular policies **can restrict** what a DA user can do, offering better security hygiene even if there's still elevated access. Typically this is a combination of, or all of the following practices, though not exclusive to just these: * Using short-lived keys whenever viable * Rotating API keys regularly * Monitoring the usage * Secure storage (e.g. in HSMs or vaults) ### Best Practices You can define strict transaction conditions. For example: ```javascript theme={"system"} solana.tx.instructions.count() == 1 && solana.tx.transfers.count() == 1 && solana.tx.transfers.all(transfer, transfer.to == '') ``` You can also consider the following: * Recipient address restrictions (ie allowlisting addresses) * Contract method selectors * Transaction structure invariants * Blockhash constraints (on Solana) Yes — this is a common pattern. You can add a policy per order (limit, stop loss, TWAP, etc.) using either the end-user’s authenticated session or a Delegated Access (DA) user, as long as the DA user has the necessary permissions defined by policy. Turnkey's Policy Engine shines through its flexibility. There are many different approaches you can take based on your requirements, but various themes we see include: * Using **broad policies** with business-controlled API keys * Using \*\*fine-grained policies, \*\*scoped to predictable transaction shapes * Using delegated access to implement **limit orders, automation flows, or advanced trading logic** (e.g. perps, TWAPs) * Ensuring **strong operational security** (e.g. tight scoping & expiring keys) is increasingly common ### EVM and SVM-Specific Strategies Yes, on Solana via `solana.tx.recent_blockhash`, which restricts a transaction’s validity to a \~60–90 second window. Not ideal for delayed executions (e.g. limit orders), but useful for immediate, single-use actions. Yes, though it’s limited today. You can inspect calldata (e.g., using `eth.tx.data[...]`) and enforce conditions like: ```javascript theme={"system"} eth.tx.to == '' && eth.tx.data[0..4] == '' ``` Granular support for calldata parsing and value limits is coming soon. Not entirely. Even if you allowlist the router, it could still be abused to swap all assets. You can’t control downstream behavior unless you control the contract. > **Suggestion:** Only allow DA keys to interact with contracts you fully trust or control. Limit scope as much as possible (e.g., to specific instructions, amounts, or recipients). # Access control Source: https://docs.turnkey.com/concepts/policies/examples/access-control This page provides examples of policies governing access. #### Allow a specific user to create wallets ```json theme={"system"} { "policyName": "Allow user to create wallets", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.resource == 'WALLET' && activity.action == 'CREATE'" } ``` #### Allow users with a specific tag to create users ```json theme={"system"} { "policyName": "Allow user_tag to create users", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.tags.contains(''))", "condition": "activity.resource == 'USER' && activity.action == 'CREATE'" } ``` #### Require two users with a specific tag to add policies ```json theme={"system"} { "policyName": "Require two users with user_tag to create policies", "effect": "EFFECT_ALLOW", "consensus": "approvers.filter(user, user.tags.contains('')).count() >= 2", "condition": "activity.resource == 'POLICY' && activity.action == 'CREATE'" } ``` #### Deny all delete actions for users with a specific tag ```json theme={"system"} { "policyName": "Only user_tag can take actions", "effect": "EFFECT_DENY", "consensus": "approvers.any(user, user.tags.contains(''))", "condition": "activity.action == 'DELETE'" } ``` #### Allow a specific user (e.g. API-only user) to create a sub-org ```json theme={"system"} { "policyName": "Allow user to create a sub-org", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.resource == 'ORGANIZATION' && activity.action == 'CREATE'" } ``` #### Allow a specific user to perform auth type activities (full list [here](/concepts/policies/language#activity-breakdown)) Note: The `activity.resource` portion determines which activities can be performed. The `activity.action` determines what types of actions can be taken upon those resources. ```json theme={"system"} { "policyName": "Allow user to initiate auth type activities", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.resource == 'AUTH' && activity.action == 'CREATE'" } ``` #### Allow a specific user to perform [generic OTP](/api-reference/activities/init-generic-otp) activities ```json theme={"system"} { "policyName": "Allow user to initiate and verify generic OTP activities", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.resource in ['AUTH', 'OTP'] && activity.action in ['CREATE','VERIFY']" } ``` #### Allow a specific user to perform a specific activity type (full list [here](/concepts/policies/language#activity-breakdown)) Note: Activities may be upgraded over time, and thus new versions may be introduced. These policies will NOT be valid if an activity type is upgraded and requests are made on the new activity type. For example, if Turnkey introduces `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3` (upgraded from `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2`) and a request is made with the newer `V3` version, this policy with not allow that user to perform `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3` activities. ```json JSON theme={"system"} { "policyName": "Allow user to perform create read write session v2", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.type == 'ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2'" } ``` #### Allow a specific credential type to perform a specific action (full list of credential types [here](/authentication/credentials#credential-types)) This policy can be used to say, only passkeys are allowed to sign transactions and not authentication through SMS (or any other authentication method). ```json JSON theme={"system"} { "policyName": "Allow signing with only passkeys", "effect": "EFFECT_ALLOW", "consensus": "credentials.any(credential, credential.type == 'CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR')", "condition": "activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2'" } ``` #### Allow a specific credential with a specific public key type to perform a specific action ```json JSON theme={"system"} { "policyName": "Allow signing with only passkeys", "effect": "EFFECT_ALLOW", "consensus": "credentials.any(credential, credential.public_key == '')", "condition": "activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2'" } ``` # Bitcoin Source: https://docs.turnkey.com/concepts/policies/examples/bitcoin This page provides examples of policies governing signing. Note: see the [language section](/concepts/policies/language#bitcoin) for more details. For context on Bitcoin transaction reinsertion, see the [Bitcoin network support](/networks/bitcoin) page #### Allow signing Bitcoin transactions ONLY if all outputs are being sent to a certain address ```json theme={"system"} { "policyName": "Enable bitcoin transactions to be sent to ", "effect": "EFFECT_ALLOW", "condition": "bitcoin.tx.outputs.all(o, o.address == )" } ``` #### Allow signing Bitcoin transactions restricting output values ```json theme={"system"} { "policyName": "Allow signing bitcoin transactions only if all outputs have value < 200000 satoshis", "effect": "EFFECT_ALLOW", "condition": "bitcoin.tx.outputs.all(o, o.value < 200000)" } ``` #### Allow signing Bitcoin transactions only if ALL inputs are spending a particular UTXO (this key is only allowed to spend one input) ```json theme={"system"} { "policyName": "Only allow spending of a single bitcoin transaction input", "effect": "EFFECT_ALLOW", "condition": "bitcoin.tx.inputs.all(i, i.tx_id == && i.vout == )" } ``` # Ethereum (EVM) Source: https://docs.turnkey.com/concepts/policies/examples/ethereum This page provides examples of policies governing signing. Note: see the [language section](/concepts/policies/language#ethereum) for more details. #### Allow ABI-specific contract call parameters See [here](../../../concepts/policies/smart-contract-interfaces) for more information and examples. #### Allow ERC-20 transfers for a specific token smart contract ```json theme={"system"} { "policyName": "Enable ERC-20 transfers for ", "effect": "EFFECT_ALLOW", "condition": "eth.tx.to == '' && eth.tx.data[0..10] == '0xa9059cbb'" } ``` #### Allow anyone to sign transactions for testnet (Sepolia) ```json theme={"system"} { "policyName": "Allow signing ethereum sepolia transactions", "effect": "EFFECT_ALLOW", "condition": "eth.tx.chain_id == 11155111" } ``` #### Allow ETH transactions with a specific nonce range ```json theme={"system"} { "policyName": "Allow signing Ethereum transactions with an early nonce", "effect": "EFFECT_ALLOW", "condition": "eth.tx.nonce <= 3" } ``` #### Allow signing of EIP-712 payloads for Hyperliquid `ApproveAgent` operations ```json theme={"system"} { "policyName": "Allow signing of EIP-712 Payloads for Hyperliquid `ApproveAgent` operations", "effect": "EFFECT_ALLOW", "condition": "eth.eip_712.domain.name == 'HyperliquidSignTransaction' && eth.eip_712.primary_type == 'HyperliquidTransaction:ApproveAgent' && activity.type == 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2'" } ``` ### Deny signing of `NO_OP` keccak256 payloads ```json theme={"system"} { "policyName": "Deny NO_OP hash signing", "effect": "EFFECT_DENY", "condition": "activity.type == 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2' && activity.params.hash_function == 'HASH_FUNCTION_NO_OP' && activity.params.encoding != 'PAYLOAD_ENCODING_EIP712'" } ``` #### Allow signing of EIP-712 payloads for EIP-3009 Transfers ```json theme={"system"} { "policyName": "Allow signing of EIP-712 payloads for EIP-3009 Transfers for USD Coin", "effect": "EFFECT_ALLOW", "condition": "eth.eip_712.domain.name == 'USD Coin' && eth.eip_712.primary_type == 'TransferWithAuthorization' && activity.type == 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2'" } ``` #### Allow signing of EIP-712 payloads for EIP-2612 Permits for USD Coin ```json theme={"system"} { "policyName": "Allow signing of EIP-712 payloads for EIP-2612 Permits for USD Coin", "effect": "EFFECT_ALLOW", "condition": "eth.eip_712.domain.name == 'USD Coin' && eth.eip_712.primary_type == 'Permit' && activity.type == 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2'" } ``` #### Allow signing of EIP-7702 Authorizations ```json theme={"system"} { "policyName": "Allow signing of EIP-7702 Authorizations", "effect": "EFFECT_ALLOW", "condition": "eth.eip_7702_authorization.address == '
' && eth.eip_7702_authorization.chain_id == '' && eth.eip_7702_authorization.nonce == '' && activity.type == 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2'" } ``` # Signing control Source: https://docs.turnkey.com/concepts/policies/examples/signing-control This page provides examples of policies governing signing. #### Allow a specific user to sign transactions with any account address within a specific wallet ```JSON theme={"system"} { "policyName": "Allow to sign transactions with ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.action == 'SIGN' && wallet.id == ''" } ``` #### Allow a specific user to sign transactions with a specific wallet account address ```json theme={"system"} { "policyName": "Allow to sign transactions with ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.action == 'SIGN' && wallet_account.address == ''" } ``` #### Allow a specific user to sign transactions with a specific private key ```json theme={"system"} { "policyName": "Allow to sign transactions with ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "activity.action == 'SIGN' && private_key.id == ''" } ``` # Solana Source: https://docs.turnkey.com/concepts/policies/examples/solana This page provides examples of policies governing signing. Note: see the [language section](/concepts/policies/language#solana) for various approaches on writing Solana policies. #### Allow IDL-specific program instructions See [here](../../../concepts/policies/smart-contract-interfaces) for more information and examples. #### Allow Solana transactions that include a transfer from one specific sender ```json theme={"system"} { "policyName": "Enable transactions with a transfer sent by ", "effect": "EFFECT_ALLOW", "condition": "solana.tx.transfers.all(transfer, transfer.from == '')" } ``` #### Allow Solana transactions that include a transfer to only one specific recipient ```json theme={"system"} { "policyName": "Enable transactions with a single transfer sent to ", "effect": "EFFECT_ALLOW", "condition": "solana.tx.transfers.count == 1 && solana.tx.transfers[0].to == ''" } ``` #### Allow Solana transactions that have exactly one transfer, to one specific recipient ```json theme={"system"} { "policyName": "Enable transactions with a transfer sent to ", "effect": "EFFECT_ALLOW", "condition": "solana.tx.transfers.all(transfer, transfer.to == '')" } ``` #### Allow Solana transactions that only use the Solana System Program ```json theme={"system"} { "policyName": "Enable transactions that only use the system program", "effect": "EFFECT_ALLOW", "condition": "solana.tx.program_keys.all(p, p == '11111111111111111111111111111111')" } ``` #### Deny all Solana transactions transferring to an undesired address ```json theme={"system"} { "policyName": "Reject transactions with a transfer sent to ", "effect": "EFFECT_DENY", "condition": "solana.tx.transfers.any(transfer, transfer.to == '')" } ``` #### Allow Solana transactions with specific expected instruction data ```json theme={"system"} { "policyName": "Enable transactions where the first instruction has precisely ", "effect": "EFFECT_ALLOW", "condition": "solana.tx.instructions[0].instruction_data_hex == ''" } ``` #### Allow Solana transactions whose first instruction involves a specific address ```json theme={"system"} { "policyName": "Enable transactions where the first instruction has a first account involving
", "effect": "EFFECT_ALLOW", "condition": "solana.tx.instructions[0].accounts[0].account_key == '
'" } ``` #### Deny All Address Table Lookups ```json theme={"system"} { "policyName": "Deny Solana transactions that use address table lookups", "effect": "EFFECT_DENY", "condition": "solana.tx.address_table_lookups.count() > 0" } ``` #### Deny Sending To An Address From A Table Lookup ```json theme={"system"} { "policyName": "Deny Solana transactions sending directly to an address from a table lookup", "effect": "EFFECT_DENY", "condition": "solana.tx.transfers.any(t, t.to == 'ADDRESS_TABLE_LOOKUP') || solana.tx.spl_transfers.any(t, t.to == 'ADDRESS_TABLE_LOOKUP')" } ``` #### Solana SPL token transfers -- Context and Examples Turnkey’s policy engine supports policies for SPL token transfers. Specifically, we support creating policies for the `Transfer`, `TransferChecked` and `TransferCheckedWithFee` instructions across both the Solana Token Program and the Solana Token 2022 Program. Some important context for using SPL token policies with Turnkey: **Token Account Addresses** For context, Solana implements SPL token balances for a particular wallet address by creating a whole new account called a "token account" which has a pointer in its data field labeled "owner" that points back to the wallet address in question. So to hold a particular token in your Solana wallet, you have to have to create a new token account meant to hold that token, owned by your Solana wallet. For policies related to the receiving token address of an SPL transfer, the token address receiving the tokens will have to be used, NOT the wallet address that is the owner for the receiving token address. This is because, while both the owning wallet address and the receiving token address are specified in the transfer instruction, the owning wallet address of the recipient token address is not specified. For this we highly recommend using the convention of “associated token addresses” to set policies that, for example, allow SPL token transfers to a particular wallet address. For further context on associated token addresses check out Solana’s documentation on it: [https://spl.solana.com/associated-token-account](https://spl.solana.com/associated-token-account) An example implementation of using a policy to allow transfers to the associated token address of the intended recipient wallet address can be found in our SDK examples [here](https://github.com/tkhq/sdk/tree/main/examples/with-solana#6-running-the-create-spl-token-transfer-with-policy-example). **Mint Address Accessibility** The mint account address of the token will only be accessible when the transaction is constructed using instructions that specify the mint address – `TransferChecked` and `TransferCheckedWithFee`. For transactions constructed using the simple `Transfer` method, the mint account will be considered empty. Here are some example policies for SPL transfers: #### Allow a user to sign Solana transactions that include a single instruction which is an SPL token transfer from a particular sending token address ```json theme={"system"} { "policyName": "Allow user to sign Solana transactions that include only a single SPL Transfer FROM ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "solana.tx.instructions.count() == 1 && solana.tx.spl_transfers.count() == 1 && solana.tx.spl_transfers.all(transfer, transfer.from == '')" } ``` #### Allow a user to sign Solana transactions only if ALL of the instructions are SPL transfers TO a particular token address ```json theme={"system"} { "policyName": "Allow user to sign Solana transactions only if ALL of the instructions are SPL transfers TO ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.to == '')" } ``` #### Allow users with a specific tag to sign Solana transactions only if ALL of the instructions are SPL token transfers with a specific address as the owner of the sending token address ```json theme={"system"} { "policyName": "Allow users with to sign Solana transactions only if ALL of the instructions are SPL token transfers with as the owner of the sending token address", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.tags.contains('')" } ``` #### Allow a user to sign Solana transactions that include a single instruction which is an SPL token transfer where the atomic units of the transfer are less than a threshold amount ```json theme={"system"} { "policyName": "Allow user to sign Solana transactions that include a single instruction which is an SPL token transfer where the atomic units of the transfer are less than ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "solana.tx.instructions.count() == 1 && solana.tx.spl_transfers.count() == 1 && solana.tx.spl_transfers.all(transfer, transfer.amount < )" } ``` #### Allow a user to sign Solana transactions only if ALL of the instructions are SPL token transfers where the token mint address is a particular address ```json theme={"system"} { "policyName": "Allow to sign a Solana transaction only if ALL of the instructions are SPL token transfers where the token mint address is ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.token_mint == '')" } ``` #### Allow a user to sign Solana transactions that includes a single instruction which is an SPL token transfer where one of the multisig signers of the owner is a particular address ```json theme={"system"} { "policyName": "Allow to sign a Solana transaction only if ALL of it's instructions are SPL token transfers where one of the multisig signers of the owner is ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "solana.tx.instructions.count() == 1 && solana.tx.spl_transfers.count() == 1 && solana.tx.spl_transfers.all(transfer, transfer.signers.any(s, s == ''))" } ``` # Tron Source: https://docs.turnkey.com/concepts/policies/examples/tron This page provides examples of policies governing signing. Note: see the [language section](/concepts/policies/language#tron) for more details. #### Allow Tether TRC-20 transfers on the Nile Testnet This policy allows for all transfer calls on the Tether smart contract on the Nile testnet. The contract addresses on Nile testnet and Tron mainnet for Tether are different! ```json theme={"system"} { "policyName": "Enable Tether TRC-20 transfers on the Nile Testnet for the Tether contract address: 'TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf'", "effect": "EFFECT_ALLOW", "condition": "tron.tx.contract[0].contract_address == 'TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf' && tron.tx.contract[0].data[0..8] == 'a9059cbb'" } ``` #### Allow TRX transfers under 10,000,000 SUN (10 TRX) The amount field is denoted in SUN, the lowest denomination of TRX. ```json theme={"system"} { "policyName": "Allow TRX transfers under 10 TRX", "effect": "EFFECT_ALLOW", "condition": "tron.tx.contract[0].amount < 10000000" } ``` #### Allow all TransferContract transactions This policy allows for any TRX Transfer ```json theme={"system"} { "policyName": "Allow all TRX transfers", "effect": "EFFECT_ALLOW", "condition": "tron.tx.contract[0].type == 'TransferContract'" } ``` # Policy language Source: https://docs.turnkey.com/concepts/policies/language This page provides an overview of how to author policies using our policy language. To begin, we'll need to get familiar with the language's grammar, keywords, and types. ## Grammar The grammar has been designed for flexibility and expressiveness. We currently support the following operations: | Operation | Operators | Example | Types | | ---------- | ---------------------------- | ---------------------------- | ------------------------ | | logical | &&, \|\| | "true && false" | (bool, bool) -> bool | | comparison | ==, !=, \<, >, \<=, >= | "1 \< 2" | (int, int) -> bool | | comparison | ==, != | "'a' != 'b'" | (string, string) -> bool | | comparison | in | "1 in \[1, 2, 3]" | (T, list\) -> bool | | access | x\[\] | \[1,2,3]\[0] | (list\) -> T | | access | x\[\] | "'abc'\[0]" | (string) -> string | | access | x\[\..\] | \[1,2,3]\[0..2] | (list\) -> (list\) | | access | x\[\..\] | "'abc'\[0..2]" | (string) -> string | | access | x.\ | "user.tags" | (struct) -> T | | function | x.all(item, \) | "\[1,1,1].all(x, x == 1)" | (list\) -> bool | | function | x.any(item, \) | "\[1,2,3].any(x, x == 1)" | (list\) -> bool | | function | x.contains(\) | "\[1,2,3].contains(1)" | (list\) -> bool | | function | x.count() | "\[1,2,3].count()" | (list\) -> int | | function | x.filter(item, \) | "\[1,2,3].filter(x, x == 1)" | (list\) -> (list\) | ## Keywords Keywords are reserved words that are dynamically interchanged for real values at evaluation time. Each field supports a different set of keywords. ### Consensus | Keyword | Type | Description | | --------------- | ----------------- | ----------------------------------------------------- | | **approvers** | list\ | The users that have approved an activity | | **credentials** | list\ | The credentials that were used to approve an activity | ### Condition | Keyword | Type | Description | | -------------------------------- | -------------------- | --------------------------------------------------------------------------- | | **activity** | Activity | The activity metadata of the request | | **eth.tx** | EthereumTransaction | The parsed Ethereum transaction payload (see Appendix below) | | **eth.eip\_712** | Eip712TypedData | EIP-712 Typed Data (see Appendix below) | | **eth.eip\_7702\_authorization** | Eip7702Authorization | EIP-7702 Authorization (see Appendix below) | | **solana.tx** | SolanaTransaction | The parsed Solana transaction payload (see Appendix below) | | **tron.tx** | TronTransaction | The parsed Tron transaction payload (see Appendix below) | | **bitcoin.tx** | BitcoinTransaction | The parsed Bitcoin transaction payload (see Appendix below) | | **wallet** | Wallet | The target wallet used in sign + export requests | | **wallets** | list\ | The target wallets associated with requests involving with multiple wallets | | **private\_key** | PrivateKey | The target private key used in sign + export requests | | **wallet\_account** | WalletAccount | The target wallet account used in sign + export requests | ## Types The language is strongly typed which makes policies easy to author and maintain. ### Primitive | Type | Example | Notes | | ------------ | --------------------------------------- | ------------------------------------------------ | | **bool** | true | | | **int** | 256 | i128 | | **uint** | 170141183460469231731687303715884105728 | u256 | | **string** | 'a' | only single quotes are supported | | **list\** | \[1, 2, 3] | a list of type T | | **struct** | \{ id: 'abc' } | a key-value map of \{ field: T } (defined below) | ### Struct | Struct | Field | Type | Description | | ------------------------ | ---------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **User** | id | string | The identifier of the user | | | tags | list\ | The collection of tags for the user | | | email | string | The email address of the user | | | alias | string | The alias of the user | | **Credential** | id | string | The identifier of the API key or authenticator that was used to approve the request | | | user\_id | string | The identifier of the user who owns this request and approved the request | | | type | string | The credential type, a full list can be found [here](/authentication/credentials#credential-types) | | | credential\_id | string | The credential ID of a passkey. Note: this is only populated for passkeys (also known as Authenticators within Turnkey resources), not API keys | | | public\_key | string | The public key of the credential that approved the request | | **Activity** | type | string | The type of the activity (e.g. ACTIVITY\_TYPE\_SIGN\_TRANSACTION\_V2) | | | resource | string | The resource type the activity targets: `USER`, `PRIVATE_KEY`, `POLICY`, `WALLET`, `ORGANIZATION`, `INVITATION`, `CREDENTIAL`, `CONFIG`, `**RECOVERY`, `AUTH`, `OTP`, `PAYMENT_METHOD`, `SUBSCRIPTION` | | | action | string | The action of the activity: `CREATE`, `UPDATE`, `DELETE`, `SIGN`, `EXPORT`, `IMPORT` | | | params | string | The parameters of the activity: `SIGN_RAW_PAYLOADS`, `SIGN_RAW_PAYLOAD_V2` - `hash_function`, `encoding` | | **Wallet** | id | string | The identifier of the wallet | | | imported | bool | Boolean indicating whether or not this wallet has been imported | | | exported | bool | Boolean indicating whether or not this wallet has been exported | | | label | string | The label of this wallet | | **Wallet Account** | address | string | The wallet account address | | **PrivateKey** | id | string | The identifier of the private key | | | tags | list\ | The collection of tags for the private key | | | imported | bool | Boolean indicating whether or not this private key has been imported | | | exported | bool | Boolean indicating whether or not this private key has been exported | | | label | string | The label of this private key | | **EthereumTransaction** | from | string | The sender address of the transaction | | | to | string | The receiver address of the transaction (can be an EOA or smart contract) | | | data | string | The arbitrary calldata of the transaction (hex-encoded) | | | value | int | The amount being sent (in wei) | | | gas | int | The maximum allowed gas for the transaction | | | gas\_price | int | The price of gas for the transaction (Note: this field was used in legacy transactions and was replaced with max\_fee\_per\_gas in EIP 1559 transactions, however when evaluating policies on EIP 1559 transactions, this field will be populated with the same value as max\_fee\_per\_gas) | | | chain\_id | int | The chain identifier for the transaction | | | nonce | int | The nonce for the transaction | | | max\_fee\_per\_gas | int | EIP 1559 field specifying the max amount to pay per unit of gas for the transaction (Note: This is the sum of the gas for the transaction and the priority fee described below) | | | max\_priority\_fee\_per\_gas | int | EIP 1559 field specifying the max amount of the tip to be paid to miners for the transaction | | | max\_fee\_per\_blob\_gas | int | EIP 4844 field specifying the maximum fee users are willing to pay per unit of blob gas, akin to the tip in EIP 1559 | | | type | string | The EVM transaction type. This should be one of the following: "LEGACY", "TYPE\_1" (EIP 2930), "TYPE\_2" (EIP 1559), "TYPE\_3" (EIP 4844), "TYPE\_4" (EIP 7702) | | | function\_name | string | ABI field specifying the function name that the transaction call data is calling | | | function\_signature | string | ABI field specifying the leading bytes which denote the function being called in the call data | | | contract\_call\_args | Option\> | ABI field specifying all contract arguments parsed from the contract call data. It is a mapping of the string representations of the arg name to the argument itself | | **Eip712TypedData** | primary\_type | string | The type of the primary (i.e. outermost) structure in the `message` JSON | | | domain | Eip712Domain | The `Domain` of the payload | | | message | Map\ | JSON serializaiton of the message payload | | **Eip7702Authorization** | address | string | The address you would like to authorize | | | chain\_id | number | The EVM chain ID | | | nonce | number | The nonce of the authority | | **SolanaTransaction** | account\_keys | list\ | The accounts (public keys) involved in the transaction | | | program\_keys | list\ | The programs (public keys) involved in the transaction | | | instructions | list\ | A list of Instructions (see below) | | | transfers | list\ | A list of Transfers (see below) | | | recent\_blockhash | string | The recent blockhash specified in a transaction | | | spl\_transfers | list\ | A list of SPLTransfers (see below) | | | address\_table\_lookups | list\ | A list of AddressTableLookups (see below) | | **TronTransaction** | ref\_block\_bytes | string | The height of the transaction reference block | | | ref\_block\_hash | string | The hash of the transaction reference block | | | expiration | int | Transaction expiration time in milliseconds | | | timestamp | int | Transaction timestamp in milliseconds | | | data | string | Transaction memo (not the call data!) | | | fee\_limit | int | The maximum energy cost allowed for the execution of smart contract transactions | | | contract | list\ | A list of TronContract. This is the main content of a Tron transaction. This determines the type of transaction being executed and its parameters (see below) | | **BitcoinTransaction** | version | string | The version of the Bitcoin transaction | | | inputs | list\ | All inputs to this Bitcoin transaction | | | outputs | list\ | All outputs created by this Bitcoin transaction | | | locktime | BitcoinTxLocktime | The locktime of this bitcoin transaction | The `ContractArgument` type, used in documentation for ABI an IDL arguments represents an enum indicating this type could be any one of the string, number, array or struct types listed in our Primitives section. #### Nested Structs | Struct | Field | Type | Description | | ------------------------------- | ------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Eip712Domain** | name | string | The name | | | version | string | The version | | | chain\_id | uint | The chain ID | | | verifying\_contract | string (case insensitive) | The address of the verifying contract | | **Instruction** | program\_key | string | The program (public key) involved in the instruction | | | accounts | list\ | A list of Accounts involved in the instruction | | | instruction\_data\_hex | string | Raw hex bytes corresponding to instruction data | | | address\_table\_lookups | list\ | A list of AddressTableLookups used in the instruction. | | | parsed\_instruction\_data | Option\ | IDL related field specifying all additional information for an instruction calling a program for which an IDL has been uploaded | | **Transfer** | from | string | A Solana account (public key) representing the sender of the transfer | | | to | string | A Solana account (public key) representing the recipient of the transfer | | | amount | int | The native SOL amount for the transfer (lamports). Only transfers executed by direct calls to system programs are recognized, transfers performed indirectly inside other programs or via unsupported System Program instructions are not included. | | **SPLTransfer** | from | string | A Solana account (public key) representing the token account that is sending tokens in this SPL transfer | | | to | string | A Solana account (public key) representing the token account that is receiving tokens in this SPL transfer | | | amount | int | The amount (noted in raw atomic units) of this SPL transfer. Only parsed for top-level SPL transfers using `Transfer`, `TransferChecked`, or `TransferCheckedWithFee`. Transfers performed through other Token / Token-2022 instructions are not included. | | | owner | string | A Solana account (public key) representing the owner of the sending token account for this SPL transfer | | | signers | list\ | A list of Solana accounts (public keys) representing the multisig signers (if they exist) for this SPL transfer | | | token\_mint | string | A Solana account (public key) representing the token mint of the token being transferred in this SPL transfer | | **Account** | account\_key | string | A Solana account (public key) | | | signer | boolean | An indicator of whether or not the account is a signer | | | writable | boolean | An indicator of whether or not the account can perform a write operation | | **AddressTableLookup** | address\_table\_key | string | A Solana address (public key) corresponding to the address table | | | writable\_indexes | list\ | Indexes corresponding to accounts that can perform writes | | | readonly\_indexes | list\ | Indexes corresponding to accounts that can only perform reads | | **SolanaParsedInstructionData** | instruction\_name | string | IDL related field specifying the name of the instruction being called | | | discriminator | string | IDL related field specifying the byte discriminator denoting which instruction is being called by the instruction call data | | | named\_account | map\ | IDL related field specifying a mapping of account names to the account string, with the names as defined by the program IDL | | | program\_call\_args | map\ | IDL related field specifying a mapping of account names to the account string, with the names as defined by the program IDL | | **TronContract** | type | string | The contract type, a complete list can be found in the Tron Protocol Documentation | | | permission\_id | int | The transaction permission type | | | owner\_address | string | The address of the caller of the transaction | | | to\_address | string | The address of the recipient (Only available for TransferContract's) | | | amount | int | The amount of TRX to send (Only available for TransferContract's) | | | contract\_address | string | The address of the contract being called (Only available for TriggerSmartContract's) | | | call\_value | int | The amount of TRX passed to the contract (Only available for TriggerSmartContract's) | | | data | string | The function selector, and the functions parameters of the contract (Only available for TriggerSmartContract's) | | | call\_token\_value | int | The amount of a TRC-10 token passed to the contract (Only available for TriggerSmartContract's) | | | token\_id | int | The TRC-10 token id (Only available for TriggerSmartContract's) | | | resource | string | The resource to delegate/undelegate will be "ENERGY" or "BANDWIDTH" (Only available for Delegate, UnDelegate, FreezeBalanceV2, UnfreezeBalanceV2 contract's) | | | balance | int | The amount of sun (1,000,000 sun = 1 TRX) staked for resources to be delegated (Only available for DelegateContract and UnDelegateContract) | | | receiver\_address | string | The resource receiver address (Only available for DelegateContract and UnDelegateContract) | | | lock | bool | Indicates if the delegated resources are locked or not. If true resources cannot be undelegated within the lock\_period (Only available for DelegateContract's) | | | lock\_period | int | The time, in blocks, of how long the delegation is locked, only valid when lock is true (Only available for DelegateContract's) | | | frozen\_balance | int | The amount of sun (1,000,000 sun = 1 TRX) to be frozen (Only available for FreezeBalanceV2Contract's) | | | unfreeze\_balance | int | The amount of sun (1,000,000 sun = 1 TRX) to unfreeze (Only available for UnfreezeBalanceV2Contract's) | | | owner | TronPermission | The owner permission of the account (Only available for AccountPermissionUpdateContract's) | | | witness | TronPermission | The witness permission of the account (Only available for AccountPermissionUpdateContract's) | | | actives | list\ | A list of active permissions for the account (Only available for AccountPermissionUpdateContract's) | | **TronPermission** | type | string | The permission type either "Owner", "Witness", or "Active" | | | id | int | The permission id Owner = 0, Witness = 1, Active = 2+n where n is the 0 indexed active permission number | | | permission\_name | string | The name of the permission | | | threshold | int | The operation is allowed only when the sum of the weights of the participating signatures exceeds the domain value. Requires a maximum value less than the Long type (int64). | | | parent\_id | int | The parent id, currently always 0 | | | operations | String | Hex encoded 32 bytes (256 bits), each bit represents the authority of a contract, a 1 means the authority to own the contract | | | keys | TronKey | A list of address's and weight's that jointly own the permission can be up to 5 keys. | | **TronKey** | address | string | The address authorized for a specific TronPermission | | | weight | int | The weight of this address's signature for this permission, used to reach "threshold" in a TronPermission | | **BitcoinTxInput** | tx\_id | string | The transaction id of the Bitcoin transaction that created the output that is being spent by this input | | | vout | int | The index in the output array on the Bitcoin transaction that created the output being spent by this input | | | sequence | int | The sequence field on this input which is set whether the transaction can be replaced or when it can be mined | | **BitcoinTxOutput** | value | int | The value of this output in Satoshis | | | script\_pubkey | string | The locking code for this transaction output | | | address | string | The on chain address representation for this transaction output | | | address\_type | string (case insensitive) | The address derivation type of the address for this transaction output | | **BitcoinTxLocktime** | amount | int | The amount represented in this transaction's locktime | | | type | string | The type of locktime represented (either 'Seconds' or 'Blocks') | ## Activity Breakdown | Resource Type | Action | Activity Type | | ------------------------------ | ------ | -------------------------------------------------: | | **ORGANIZATION** | CREATE | ACTIVITY\_TYPE\_CREATE\_SUB\_ORGANIZATION\_V7 | | | DELETE | ACTIVITY\_TYPE\_DELETE\_ORGANIZATION | | | DELETE | ACTIVITY\_TYPE\_DELETE\_SUB\_ORGANIZATION | | **INVITATION** | CREATE | ACTIVITY\_TYPE\_CREATE\_INVITATIONS | | | DELETE | ACTIVITY\_TYPE\_DELETE\_INVITATION | | **POLICY** | CREATE | ACTIVITY\_TYPE\_CREATE\_POLICY\_V3 | | | CREATE | ACTIVITY\_TYPE\_CREATE\_POLICIES | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_POLICY\_V2 | | | DELETE | ACTIVITY\_TYPE\_DELETE\_POLICY | | **SMART\_CONTRACT\_INTERFACE** | CREATE | ACTIVITY\_TYPE\_CREATE\_SMART\_CONTRACT\_INTERFACE | | | DELETE | ACTIVITY\_TYPE\_DELETE\_SMART\_CONTRACT\_INTERFACE | | **WALLET** | CREATE | ACTIVITY\_TYPE\_CREATE\_WALLET | | | CREATE | ACTIVITY\_TYPE\_CREATE\_WALLET\_ACCOUNTS | | | EXPORT | ACTIVITY\_TYPE\_EXPORT\_WALLET | | | EXPORT | ACTIVITY\_TYPE\_EXPORT\_WALLET\_ACCOUNT | | | IMPORT | ACTIVITY\_TYPE\_INIT\_IMPORT\_WALLET | | | IMPORT | ACTIVITY\_TYPE\_IMPORT\_WALLET | | | DELETE | ACTIVITY\_TYPE\_DELETE\_WALLETS | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_WALLET | | | DELETE | ACTIVITY\_TYPE\_DELETE\_WALLET\_ACCOUNTS | | **PRIVATE\_KEY** | CREATE | ACTIVITY\_TYPE\_CREATE\_PRIVATE\_KEYS\_V2 | | | CREATE | ACTIVITY\_TYPE\_CREATE\_PRIVATE\_KEY\_TAG | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_PRIVATE\_KEY\_TAG | | | DELETE | ACTIVITY\_TYPE\_DISABLE\_PRIVATE\_KEY | | | DELETE | ACTIVITY\_TYPE\_DELETE\_PRIVATE\_KEY\_TAGS | | | DELETE | ACTIVITY\_TYPE\_DELETE\_PRIVATE\_KEYS | | | EXPORT | ACTIVITY\_TYPE\_EXPORT\_PRIVATE\_KEY | | | IMPORT | ACTIVITY\_TYPE\_INIT\_IMPORT\_PRIVATE\_KEY | | | IMPORT | ACTIVITY\_TYPE\_IMPORT\_PRIVATE\_KEY | | | SIGN | ACTIVITY\_TYPE\_SIGN\_RAW\_PAYLOAD\_V2 | | | SIGN | ACTIVITY\_TYPE\_SIGN\_RAW\_PAYLOADS | | | SIGN | ACTIVITY\_TYPE\_SIGN\_TRANSACTION\_V2 | | | SIGN | ACTIVITY\_TYPE\_ETH\_SEND\_TRANSACTION | | | SIGN | ACTIVITY\_TYPE\_SOL\_SEND\_TRANSACTION | | **USER** | CREATE | ACTIVITY\_TYPE\_CREATE\_USERS\_V3 | | | CREATE | ACTIVITY\_TYPE\_CREATE\_USER\_TAG | | | CREATE | ACTIVITY\_TYPE\_CREATE\_API\_ONLY\_USERS | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_USER | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_USER\_NAME | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_USER\_EMAIL | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_USER\_PHONE\_NUMBER | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_USER\_TAG | | | DELETE | ACTIVITY\_TYPE\_DELETE\_USERS | | | DELETE | ACTIVITY\_TYPE\_DELETE\_USER\_TAGS | | **CREDENTIAL** | CREATE | ACTIVITY\_TYPE\_CREATE\_API\_KEYS\_V2 | | | CREATE | ACTIVITY\_TYPE\_CREATE\_AUTHENTICATORS\_V2 | | | DELETE | ACTIVITY\_TYPE\_DELETE\_API\_KEYS | | | DELETE | ACTIVITY\_TYPE\_DELETE\_AUTHENTICATORS | | | CREATE | ACTIVITY\_TYPE\_CREATE\_OAUTH\_PROVIDERS | | | DELETE | ACTIVITY\_TYPE\_DELETE\_OAUTH\_PROVIDERS | | **PAYMENT\_METHOD** | UPDATE | ACTIVITY\_TYPE\_SET\_PAYMENT\_METHOD\_V2 | | | DELETE | ACTIVITY\_TYPE\_DELETE\_PAYMENT\_METHOD | | **SUBSCRIPTION** | CREATE | ACTIVITY\_TYPE\_ACTIVATE\_BILLING\_TIER | | **CONFIG** | UPDATE | ACTIVITY\_TYPE\_UPDATE\_ALLOWED\_ORIGINS | | \*\***RECOVERY** | CREATE | ACTIVITY\_TYPE\_INIT\_USER\_EMAIL\_RECOVERY\_V2 | | **AUTH** | CREATE | ACTIVITY\_TYPE\_EMAIL\_AUTH\_V3 | | | CREATE | ACTIVITY\_TYPE\_INIT\_OTP\_AUTH\_V3 | | | CREATE | ACTIVITY\_TYPE\_OTP\_AUTH | | | CREATE | ACTIVITY\_TYPE\_OAUTH | | | CREATE | ACTIVITY\_TYPE\_OAUTH\_LOGIN | | | CREATE | ACTIVITY\_TYPE\_OTP\_LOGIN | | | CREATE | ACTIVITY\_TYPE\_STAMP\_LOGIN | | | CREATE | ACTIVITY\_TYPE\_CREATE\_READ\_WRITE\_SESSION\_V2 | | | CREATE | ACTIVITY\_TYPE\_CREATE\_OAUTH2\_CREDENTIAL | | | DELETE | ACTIVITY\_TYPE\_DELETE\_OAUTH2\_CREDENTIAL | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_OAUTH2\_CREDENTIAL | | | CREATE | ACTIVITY\_TYPE\_OAUTH2\_AUTHENTICATE | | **OTP** | CREATE | ACTIVITY\_TYPE\_INIT\_OTP\_V2 | | | VERIFY | ACTIVITY\_TYPE\_VERIFY\_OTP | | **AUTH\_PROXY** | CREATE | ACTIVITY\_TYPE\_ENABLE\_AUTH\_PROXY | | | DELETE | ACTIVITY\_TYPE\_DISABLE\_AUTH\_PROXY | | | UPDATE | ACTIVITY\_TYPE\_UPDATE\_AUTH\_PROXY\_CONFIG | \*\* Legacy features, deprecated in the latest SDKs. ## Appendix ### Policy evaluation Note that our policy engine does not short circuit during evaluation. In practice, this means that if any clause within the `condition` field of a policy results in an error, the evaluated `outcome` for that policy will be an error. In such cases, consider breaking up complex policies into separate policies. For example, suppose you're looking to construct a policy with the condition \`wallet.id == '\' || private\_key.id == '\'. This condition will *always* error out during evaluation, because only one of the two clauses can ever be valid: an activity cannot target both a wallet and private key. That means if you're trying to, say, sign with a private key, then the wallet clause will fail (because a wallet isn't being passed into the policy evaluation). Conversely, if you're trying to sign with a wallet, the private key clause will fail for the same reason. ### Root quorum activities There are a select few activities that are not governed by policies, but rather by an organization's [root quorum](/concepts/users/root-quorum). These activities are: `ACTIVITY_TYPE_UPDATE_ROOT_QUORUM`, `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`. For example, if a policy is added that allows a specific non-root user to perform `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` activities, these requests will still fail as they are subject specifically to root quorum. ### Ethereum Our Ethereum policy language (accessible via `eth.tx`) allows for the granular governance of signing Ethereum (EVM-compatible) transactions. Our policy engine exposes a [fairly standard set of properties](https://ethereum.org/en/developers/docs/transactions/#typed-transaction-envelope) belonging to a transaction. See the [Ethereum policy examples](/concepts/policies/examples/ethereum) for sample scenarios. The policy engine's `int` type is limited to 128 bits (i128). Ethereum smart contracts support signed integers up to 256 bits (`int256`), but values exceeding the 128-bit signed range cannot be used in policy conditions. #### EIP-712 Our policy engine supports EIP-712 typed data signing (accessible via `eth.eip_712`). When defining policies for EIP-712 messages, please ensure that all hex-encoded strings (e.g. addresses, function selectors, bytes) are **lowercase**. The policy engine expects lowercase hex strings to conform to Ethereum's standard convention. Using uppercase hex strings may result in errors or policy rejection. Note that EIP-712 messages passed in as transactions will be normalized to lowercase. ### Solana Similarly, our Solana policy language (accessible via `solana.tx`) allows for control over signing Solana transactions. Note that there are some fundamental differences between the architecture of the two types of transactions, hence the resulting differences in policy structure. Notably, within our policy engine, a Solana transaction contains a list of Transfers, currently corresponding to native SOL transfers. Each transfer within a transaction is considered a separate entity. Each entity represents only top-level transfers that directly invoke supported System Program transfer instructions and do not include transfers performed indirectly inside other programs, or via unsupported System Program instructions. Similarly, the policy engine exposes `solana.tx.spl_transfers`, which contains only top-level SPL transfers using the supported Token and Token-2022 instructions `Transfer`, `TransferChecked`, and `TransferCheckedWithFee`. SPL transfers performed indirectly inside other programs or via unsupported Token and Token-2022 instructions are not detected and do not appear in this list. Here are some approaches you might take to govern transfers: * *All* transfers need to match the policy condition. Useful for allowlists ([example](/concepts/policies/examples/solana#allow-solana-transactions-that-include-a-transfer-to-only-one-specific-recipient)) * *Just one* transfer needs to match the policy condition. Useful for blocklists ([example](/concepts/policies/examples/solana#deny-all-solana-transactions-transferring-to-an-undesired-address)) * Only match if there is a *single* transfer in the transaction, *and* that transfer meets the criteria ([example](/concepts/policies/examples/solana#allow-solana-transactions-that-have-exactly-one-transfer,-to-one-specific-recipient)). This is the most secure approach, and thus most restrictive. #### Account Address Lookups Solana transactions can reference onchain address lookup tables for account addresses. Turnkey surfaces any account address pulled from a lookup table as the literal string `ADDRESS_TABLE_LOOKUP` in Solana address fields (`account_keys`, instruction accounts, `transfers`, and `spl_transfers`). The `solana.tx.address_table_lookups` array indicates when lookups are present, but the specific addresses are not resolved. If you rely on allowlists or denylists of addresses, add a guard for this placeholder (for example, require `solana.tx.address_table_lookups.count == 0` before comparing addresses, or explicitly deny when `ADDRESS_TABLE_LOOKUP` appears with something like `solana.tx.transfers.any(t, t.to == 'ADDRESS_TABLE_LOOKUP')`) so that dynamic lookups cannot bypass or unexpectedly fail your policy. See the [address table lookup examples](/concepts/policies/examples/solana#deny-all-address-table-lookups) for examples on how to enforce this. #### Program address lookups Turnkey rejects Solana transactions where program addresses are resolved via address lookup tables. Program IDs must be statically defined in the transaction to enable static analysis of instructions without requiring on-chain data lookups. If your transaction references a program via an address table lookup, the signing request will fail. Account addresses (non-program) can still be dynamically resolved via lookup tables as described above. See the [Solana policy examples](/concepts/policies/examples/solana) for sample scenarios. ### Tron Our Tron policy language (accessible via `tron.tx`) allows for policy control over signing Tron transactions. Our policy language supports the standard fields in a Tron transaction: [https://developers.tron.network/docs/tron-protocol-transaction](https://developers.tron.network/docs/tron-protocol-transaction). To reference a Contract within a Transaction you should use `tron.tx.contract[0].field_name` in your policy where field\_name is some field of the contract used in your transaction. While Tron only currently supports 1 contract per transaction this could change in the future, and were ready for it if it does! The policy engine currently supports the following Tron contract types: * TransferContract (TRX transfers) * TriggerSmartContract (Smart contract, including, but not limited to TRC-20, invocations) * DelegateResourceContract * UnDelegateResourceContract * FreezeBalanceV2Contract * UnfreezeBalanceV2Contract * AccountPermissionUpdateContract See the [Tron policy examples](/concepts/policies/examples/tron) for sample scenarios. ### Bitcoin Our Bitcoin policy language (accessible via `bitcoin.tx`) allows for policy control over signing Bitcoin transactions. NOTE: While our `SIGN TRANSACTION` endpoint takes in a Partially Signed Bitcoin Transaction (PSBT) as required for signing context -- our policy language supports only the standard fields inside a Bitcoin transaction: [https://learnmeabitcoin.com/technical/transaction/#structure](https://learnmeabitcoin.com/technical/transaction/#structure) For further reference on how Turnkey handles Bitcoin transactions in our policy-enabled transaction signing flow, check out this section in our [Bitcoin Network Support](/networks/bitcoin#policy-enabled-bitcoin-transaction-signing) page. See the [Bitcoin policy examples](/concepts/policies/examples/bitcoin) for sample Bitcoin policies. # Policy overview Source: https://docs.turnkey.com/concepts/policies/overview Our policy engine is the foundation for flexible controls and permissions within your organization. This page provides an overview of how to author policies. ## Policy structure Our policies are defined using **JSON**. The `effect` determines if an activity should be allowed or denied based on the evaluation of the `consensus` and `condition` fields. `consensus` and `condition` are composed of ergonomic expressions written in our [policy language](/concepts/policies/language) that must evaluate to a `bool`. `consensus` determines which user(s) may take an action (e.g. a given user ID). `condition` determines the conditions under which the policy applies (e.g. signing with a specific wallet). These fields can be used alone or together. #### See below for an example policy that allows a single user to send transactions to a single address ```json theme={"system"} { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '4b894565-fa11-42fc-b813-5bf4ea3d53f9')", "condition": "eth.tx.to == ''" } ``` ## Policy evaluation All policies defined within an Organization are evaluated on each request. The image below describes how an activity outcome is determined when resolving multiple policies. The rule follows the below steps: If a quorum of root users takes the action, the final outcome is `OUTCOME_ALLOW` Else if any applicable policy has `EFFECT_DENY`, the final outcome is `OUTCOME_DENY`. This is also referred to as "explicit deny." Else if at least one applicable policy has `EFFECT_ALLOW`, then the final outcome is `OUTCOME_ALLOW` Else the final outcome is `OUTCOME_DENY`. This is also referred to as "implicit deny." In cases of conflicts, `EFFECT_DENY` always wins. Stated differently: policy overview Almost all actions on Turnkey are implicitly denied by default. There are a few exceptions, however: * The Root Quorum bypasses any policies. * All users have implicit GET (read) permissions in their own Organization and any associated Sub-Organizations. * All users have implicit permission to change their own credentials, unless a policy explicitly allows or denies those actions. * All users have implicit permission to approve an activity if they were included in consensus (i.e., a user specified as part of the consensus required to approve a SIGN\_TRANSACTION activity does not need separate, explicit permission to sign transactions). To learn more about our Policies, checkout our Policy Language [here](/concepts/policies/language). # Policy quickstart Source: https://docs.turnkey.com/concepts/policies/quickstart This guide will help you add an additional user to your Turnkey organization and set permissions for that user through Policies. Specifically, we will create an API-only user with permissions to sign transactions to an allowlisted address. This assumes that you previously completed the [Sign a transaction](/getting-started/quickstart) guide, and thus have already set up: * Your Turnkey organization * An API key for the Root User * A Wallet with an Ethereum account ## Create your new users New users in your Turnkey organization can be created by navigating to the "Users" tab and clicking "Add User". Screen Shot 2023-02-17 at 9.42.29 AM.png In the create user flow, you have the option to grant API key or web access to your new user. For this example, we're going to create an API-only user. Screen Shot 2023-02-21 at 6.17.11 PM.png Under access types, select "API key". Enter the user name "Policy Test". This will be an API-only user, and therefore an email is not required. Click continue and create a new API key to associate with the user using the following command: ```bash theme={"system"} turnkey generate api-key --organization $ORGANIZATION_ID --key-name policy_test ``` This will create 2 files, "policy\_test.public" and "policy\_test.private". Copy the contents of the ".public" file and paste it into "API public key". Finish the create user flow and authenticate. Your new user will appear in the Users table. Note down the user ID as you will use it in the next step. ## Create policies for your new users. Next we will create a policy to grant permissions to the new user. Navigate to the "Policies" tab and click on "Add new policy". Screen Shot 2023-05-10 at 1.29.00 PM.png Choose a name and note to describe your new policy. Next, enter the following policy, making sure to replace `` with an Ethereum address of your choosing and `` with the user ID of your recently created API user. ```json theme={"system"} { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", "condition": "eth.tx.to == ''" } ``` ## Test your policies Generate sample transactions using our [transaction tool](https://build.tx.xyz). **You'll want to create two transactions**: one transaction to the address you selected in your whitelist policy above, and one to any other address. Next, try signing these two different transactions by replacing `` in the code snippet below. As a reminder, this guide assumes you've completed the [Quickstart](/getting-started/quickstart) guide, and have set `$ORGANIZATION_ID` as an environment variable. ```json theme={"system"} turnkey request --path /public/v1/submit/sign_transaction --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", "organizationId": "'"$ORGANIZATION_ID"'", "parameters": { "signWith": "", "type": "TRANSACTION_TYPE_ETHEREUM", "unsignedTransaction": "" } }' --key-name policy_test ``` You'll see that the activity to allowlisted address comes back as `COMPLETED`, while the activity to the non-allowlisted address comes back as `FAILED`. You've successfully set your first policy! ## Extra credit * Try out some of our [policy examples](/concepts/policies/examples) * Check out the [policy overview](/concepts/policies/overview) * Learn how to author policies with our [policy language](/concepts/policies/overview) # Smart contract interfaces — ABIs & IDLs Source: https://docs.turnkey.com/concepts/policies/smart-contract-interfaces This page provides an overview of the Policy Engine's support for parsing calls to Smart Contracts on Ethereum and Programs on Solana by uploading the JSON respresentation of the respective ABI (Ethereum) or IDL (Solana) ## Using ABIs and IDLs to control transaction signing With the introduction of Turnkey's smart contract interface functionality, our policy engine includes enhanced support for uploading Ethereum ABIs and Solana IDLs, empowering your organization to build more sophisticated and context-aware policies. By parsing transaction call data through these standardized interfaces, the policy engine can accurately interpret and enforce rules based on the specific function calls, arguments, and data structures used in smart contract interactions. This enables granular control over wallet operations, such as restricting access to certain contract methods and validating transaction parameters—across both Ethereum and Solana ecosystems. The following guide will walk you through uploading a specific ABI or IDL, and then crafting a policy that targets specific contract call arguments. For an example usage flow, please navigate to the [Usage Walkthrough](#usage-walkthrough) section. ### Ethereum #### ABI Format Ethereum ABIs are represented in JSON format as an array of objects, each describing a function, constructor, event, or error. Each object contains specific fields that fully describe the callable interface or event signature. See [ABI documentation reference](https://docs.ethers.org/v5/api/utils/abi/formats/) for more. **Example ABI** ```json theme={"system"} [ { "type": "function", "name": "transfer", "inputs": [ { "name": "_to", "type": "address" }, { "name": "_amount", "type": "uint256" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "event", "name": "Transfer", "inputs": [ { "name": "from", "type": "address", "indexed": true }, { "name": "to", "type": "address", "indexed": true }, { "name": "value", "type": "uint256", "indexed": false } ], "anonymous": false } ] ``` #### Policy Formats For Ethereum, if an ABI corresponding to a contract has been uploaded, then ABI related policies for transactions calling that contract will be available under the following namespaces: * **function\_name**: This field contains the string representation of the name of the function as defined in the ABI * **function\_signature**: This field contains the bytes making up the function signature * **contract\_call\_args**: This field contains all the arguments in a mapping of arg name to argument **NOTE:** The contract\_call\_args field, at the first level, uses a `MapKey` access pattern. All arguments are named and are accessed using the syntax as such: ```json theme={"system"} { "condition": "eth.tx.contract_call_args['arg_name'] == 1" } ``` ### Solana For Turnkey's Solana IDL support, we accept IDLs formatted according to [Anchor's IDL language](https://www.anchor-lang.com/docs) standardization. While other standards do exist, most commonly used IDLs that aren't Solana's own native IDLs, adhere to the Anchor IDL format, and there exist tools like [native-to-anchor](https://github.com/acheroncrypto/native-to-anchor) which can help create anchor formatted IDLs for native solana programs. #### Turnkey Formatting requirements **NOTE**: this is just included for reference and troubleshooting, most Anchor IDLs should work straight out of the box. Also, some older formats of IDLs are supported (such as using the optional boolean `signer` instead of `isSigner`, or the optional boolean `writable` instead of `isMut`) – the format detailed below is the most widely used format, for reference. **Instructions Array** *The instructions array is a list of objects, each defining an instruction callable by the program.* * **instructions** (array of objects) * **name** (string): Name of the instruction. * **discriminator** (optional): Unique identifier for the instruction (optional). * **accounts** (array of objects): List of accounts required by the instruction. * **isMut** (boolean): Whether the account is mutable. * **isSigner** (boolean): Whether the account is a signer. * **isOptional** (boolean): Whether the account is optional. * **name** (string): Name of the account. * **args** (array of objects): Arguments required by the instruction. * **name** (string): Name of the argument. * **type** (IdlType enum): Data type of the argument. **Types Array** *The types array defines custom data structures used by the program.* * **types** (array of objects) * **name** (string): Name of the custom type. * **type** (object) * **kind** (string enum): The kind of type (e.g., "struct"). * **fields** (array of objects): Fields within the type. * **name** (string): Name of the field. * **type** (IdlType enum): Data type of the field. **NOTE:** discriminators are optional because anchor has a default method of generating the discriminators deterministically from the instruction names. If your uploaded IDL does not include instruction discriminators, we will internally generate them as per this standard. See [Anchor Discriminator Reference](https://www.anchor-lang.com/docs/basics/idl#discriminators) for more. **NOTE:** The `types` key must be present in all uploaded IDLs, even for programs that do not define custom types. If your program's IDL does not include a `types` array, add an empty array (`"types": []`) before uploading. **Example IDL** ```json theme={"system"} { "instructions": [ { "name": "initialize", "accounts": [ { "name": "authority", "isMut": false, "isSigner": true, "isOptional": false } ], "args": [ { "name": "amount", "type": "u64" } ] } ], "types": [ { "name": "MyStruct", "type": { "kind": "struct", "fields": [ { "name": "value", "type": "u64" } ] } } ] } ``` **Supported Arg Types** Solana IDLs support various different types of arguments to instructions. The following argument types are supported for Solana IDL parsing and call data parsing. **IdlType** * **Fixed arrays:** Array\ * **Booleans:** Bool * **Byte strings:** Bytes * **Float types:** F32, F64 * **Signed Integer Types:** I8, I16, I32, I64, I128 * **Unsigned Integer Types:** U8, U16, U32, U64, U128 * **Solana Addresses:** PublicKey * **Vectors:** Vec\ * **Strings:** String * **Optional Types:** Option\ * **Custom Defined Types:** DefinedType The most notable here are **Defined Types.** Defined types in IDLs refer to custom types—such as structs and enums—that are created by the Solana program developer and used as argument types in instructions or as fields in accounts. The following defined types are currently supported: * Enum * Struct * Alias **Where to get IDLs from** Solana IDL JSON objects, as formatted for use with Turnkey, can be obtained by the following methods: * **Explorer Links** * Solscan: * [Example Solscan Link to Program IDL (Jupiter)](https://solscan.io/account/JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4#anchorProgramIdl) * [Example Solana.Explorer Link to Program IDL (Jupiter)](https://explorer.solana.com/address/JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4/anchor-program) * [Anchor CLI:](https://www.anchor-lang.com/docs/references/cli) * Using the command: `anchor idl ` #### Policy Formats On the Solana side, if an IDL corresponding to a program has been uploaded, then IDL related policies for instructions calling that program will be available in each instruction under the `parsed_instruction_data` namespace. The subfields will be as follows: * **instruction\_name:** Name of the instruction that is being called in call data * **discriminator:** the bytes at the beginning of the instruction call data that signifies which instruction is being called * **named\_accounts:** a mapping of account names (as defined in the IDL) to the actual accounts that were entered to this instruction * **program\_call\_args:** all program arguments required by this instruction call **Note:** The program\_call\_args field, at the first level, uses a `MapKey` access pattern. All arguments are named and are accessed using the syntax as such: ```json theme={"system"} { "condition": "solana.tx.instructions[0].parsed_instruction_data.program_call_args['arg_name'] == 1" } ``` **Example Usage** Let's say that the IDL for Jupiter has been uploaded, as found [here](https://explorer.solana.com/address/JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4/anchor-program) Here's an example policy related to its `route` instruction: ```json theme={"system"} { "effect": "EFFECT_ALLOW", "condition": "solana.tx.instructions.any(i, i.program_key == 'JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4' && i.parsed_instruction_data.instruction_name == 'route' && i.parsed_instruction_data.program_call_args['in_amount'] == 995500000)" } ``` ### Usage Walkthrough Let's walk through an example flow of how to explicitly reference smart contract arguments in policies by uploading the ABI for the smart contract which you will be invoking in your transactions. Let's take the Wrapped ETH (WETH) smart contract as an example. Its ABI can be found [here](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code), and we've included the JSON down below: ```json theme={"system"} [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"guy","type":"address"},{"name":"wad","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"src","type":"address"},{"indexed":true,"name":"guy","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"src","type":"address"},{"indexed":true,"name":"dst","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"dst","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"src","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Withdrawal","type":"event"}] ``` We'll first navigate to the Security tab of your [Turnkey dashboard](https://app.turnkey.com/dashboard/welcome): dashboard welcome You'll then see a section on Smart Contract Interfaces: smart contract interfaces Upon clicking the Create interface button, you can enter in your Smart Contract Interface details: create interface empty Finally, you can confirm the details: NOTE: It's important to make sure that the `Address` section of the smart contract interface creation is populated with the correct Address. It is case insensitive with Ethereum, but case sensitive with Solana. create interface review For the purposes of this guide, we'll be targeting the `transfer` function call. It has two arguments: `wad` (uint256) and `dst` (address), corresponding to the amount and destination, respectively. We can now next construct a policy like the following: ```json theme={"system"} { "effect": "EFFECT_ALLOW", "condition": "eth.tx.contract_call_args['wad'] < 1000000000000000000 && eth.tx.contract_call_args['dst'] == '0x08d2b0a37F869FF76BACB5Bab3278E26ab7067B7'" } ``` In plain English, this policy requires that the transaction has a wad of less than 1 ETH, and that the `dst` is a specific address (our testnet warchest). We can create this policy via the same Security tab: create policy After entering the policy details, we can review and approve the activity: create policy review In addition to contract call arguments, you can also explicitly specify the function name and function signature corresponding to a transaction. Given we're currently using a `transfer` call, we can enforce it within a policy via the following: ```json theme={"system"} { "effect": "EFFECT_ALLOW", "condition": "eth.tx.function_name == 'transfer' && eth.tx.function_signature == '0xa9059cbb'" } ``` Note that the `0x` prefix is necessary when writing a policy against function signatures. Generally, you can find function signatures on an explorer like Etherscan. In this case, the function signature for WETH's `transfer` can be found [here](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#writeContract). Note that these two operations, creating a new Smart Contract Interface and a Policy, can be performed programmatically as well. Here's are two respective sample snippets that use our [`@turnkey/sdk-server`](https://www.npmjs.com/package/@turnkey/sdk-server) package: ```ts theme={"system"} // Create Smart Contract Interface import { Turnkey as TurnkeySDKServer } from "@turnkey/sdk-server"; ... const turnkeyClient = new TurnkeySDKServer({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const abi = []; // your ABI here const { smartContractInterfaceId } = await turnkeyClient.apiClient().createSmartContractInterface({ label: "WETH mainnet", notes: "For WETH mainnet transfers", type: "SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM", smartContractAddress: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", smartContractInterface: JSON.stringify(abi), }); ``` ```ts theme={"system"} // Create Policy import { Turnkey as TurnkeySDKServer } from "@turnkey/sdk-server"; ... const turnkeyClient = new TurnkeySDKServer({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.ORGANIZATION_ID!, }); const { policyId } = await turnkeyClient.apiClient().createPolicy({ policyName: "Limit WETH transfers", condition: "eth.tx.contract_call_args['wad'] < 1000000000000000000 && eth.tx.contract_call_args['dst'] == '0x08d2b0a37F869FF76BACB5Bab3278E26ab7067B7'", effect: "EFFECT_ALLOW", notes: "Specify WETH amount and destination", }); ``` **References** * [Native to Anchor](https://github.com/acheroncrypto/native-to-anchor): Tool that creates Anchor IDLs for native solana programs * [Anchor Framework Github (Solana Foundation)](https://github.com/solana-foundation/anchor/tree/master?tab=readme-ov-file): Github reference for Anchor **FAQ:** * Q: Is there a size limit on ABIs or IDLs? * A: Yes, we enforce a limit of 400kb. If your ABI/IDL exceeds that, we recommend minifying the JSON string (to get rid of whitespaces or extra characters). This can be done programmatically via a command similar to `JSON.stringify()`, or a webtool like [https://codebeautify.org/jsonminifier](https://codebeautify.org/jsonminifier) . # Resource limits Source: https://docs.turnkey.com/concepts/resource-limits Learn more about how to structure your implementation to avoid resource limits. **Turnkey is scalable to millions of users and millions of transactions.**\ \ However, we have limits on the number of resources within a **single organization** to avoid performance slowdowns and overly complex permission models. You can scale your organizational resources beyond these limits via sub-organizations. **You can create an unlimited number of sub-organizations within a single organization.**\ \ Currently, the resource limits within a single organization are as follows: | Resource | Maximum parent org allowance | Maximum sub-org allowance | | :----------------------------- | :--------------------------: | :-----------------------: | | Sub-Organizations | unlimited | 0 | | HD Wallet Accounts | unlimited | unlimited | | HD Wallets | 100 | 100 | | Private keys | 1,000 | 1,000 | | Users | 100 | 100 | | Policies | 100 | 100 | | Invitations | 100 | 100 | | Tags | 100 | 10 | | Authenticators per user | 10 | 10 | | API keys per user (long-lived) | 10 | 10 | | API keys per user (expiring) | 10 | 10 | | OAuth providers per user | 10 | 10 | Note that if you create an expiring API key that would exceed the limit above, Turnkey automatically deletes one of your existing keys using the following priority: 1. Expired API keys are deleted first 2. If no expired keys exist, the oldest unexpired key is deleted If you are approaching any of these limits in your implementation and require support, reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)). # Sub-organizations Source: https://docs.turnkey.com/concepts/sub-organizations Using Turnkey's flexible infrastructure, you can programmatically create and manage sub-organizations for your end-users. Sub-organizations aren't subject to size limits: you can create as many sub-organizations as needed. The parent organization has **read-only** visibility into all of its sub-organizations, and activities performed in sub-organizations roll up to the parent for billing purposes. We envision sub-organizations being very useful to model your end-users if you're a business using Turnkey for key management. Let's explore how. ## Creating sub-organizations Creating a new sub-organization is an activity performed by the parent organization. The activity itself takes the following attributes as inputs: * organization name * a list of root users * a root quorum threshold * \[optional] a wallet (note: in versions prior to V4, this was a private key) Root users can be programmatic or human, with one or many credentials attached. ## Using sub-organizations [Sub-Organizations as Wallets](/embedded-wallets/sub-organizations-as-wallets) explains how you might want to use this primitive as a way to model end-user controlled wallets, or custodial wallets. If you have another use-case in mind, or questions/feedback on this page, reach out to [welcome@turnkey.com](mailto:welcome@turnkey.com)! ## Deleting sub-organizations To delete a sub-organization, you can use the [delete sub-organization activity](/api-reference/organizations/delete-sub-organization). Before proceeding, ensure that all private keys and wallets within the sub-organization have been exported to prevent any loss of funds. Alternatively, you can set the `deleteWithoutExport` parameter to `true` to bypass this requirement. By default, the `deleteWithoutExport` parameter is set to `false`. This activity must be initiated by a root user in the sub-organization that is to be deleted. A parent org cannot delete a sub-organization without its participation. # Transaction Management Source: https://docs.turnkey.com/concepts/transaction-management Learn about Turnkey's gas sponsorship, transaction construction, broadcast, nonce management and monitoring capabilities. # Overview Traditionally, sending blockchain transactions onchain has been painful: * You need to fund wallets with native gas tokens, creating onboarding friction * Network congestion and gas spikes can cause transactions to stall or get dropped altogether Turnkey reduces this to a couple of API calls. We handle gassing and our battle-tested broadcast logic ensures inclusion even under adverse network conditions. You and your users never touch gas tokens or deal with stuck transactions. **Chain Support:** * **Base** - eip155:8453 * **Polygon** - eip155:137 * **Ethereum** - eip155:1 > Interested in another chain? Reach out to us! ## Concepts ### Gas sponsorship (aka gas abstraction, gasless transactions, fee abstraction) A single endpoint lets you toggle between standard EIP-1559 transactions and sponsored transactions. EIP-1559 is the modern Ethereum fee model where transactions specify a base fee (determined by network congestion) and a priority fee (a tip to validators for faster inclusion). With sponsorship enabled, your users never need to hold native tokens to pay these fees—Turnkey covers them. Set `sponsor: true` to enable sponsorship. ### Construction and Broadcast A successful EVM transaction requires several components: * **Transaction construction**: assembling the payload (recipient, value, calldata) * **Nonce, gas and tip fee**: setting the correct nonce to order transactions, estimating gas usage and tip fees to ensure inclusion even during network congestion * **Signature**: cryptographically signing the transaction with the sender's private key * **Broadcast**: submitting the signed transaction to the network and monitoring for inclusion Turnkey handles all of this for you. Whether or not you use sponsorship, you pass through minimal payloads that define the contents of your transaction and we take care of construction, signing, and broadcast. We auto-fill any fields you omit. This endpoint supports arbitrary EVM transactions, not just simple sends. You can interact with smart contracts, deploy contracts, or execute any valid EVM operation. ### Transaction status and enriched transaction errors After you send a transaction, Turnkey monitors its status until it fails or gets included in a block. For transactions that experience reversion errors, Turnkey runs a transaction simulation to produce structured execution traces and decode common revert reasons. The result: actionable error messages that tell you exactly what went wrong, so you can debug and fix issues quickly instead of parsing opaque hex data. ### **Transaction Statuses** | **Status** | **Description** | | ------------ | --------------------------------------------------------------------------------------------------------------------------------- | | INITIALIZED | Turnkey has constructed and signed the transaction, and prepared gas sponsorship, but the transaction has not yet been broadcast. | | BROADCASTING | Turnkey is actively broadcasting the sponsored transaction to the network and awaiting inclusion. | | INCLUDED | The sponsored transaction has been included in a block. | | FAILED | The sponsored transaction could not be included on-chain and will not be retried automatically. | ### **Ethereum Smart Contract Transaction Errors** | **Status** | **Description** | | :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | | UNKNOWN | The transaction reverted during on-chain execution or simulation, but the revert reason could not be decoded (e.g. missing ABI or unverified contract). | | NATIVE | The transaction reverted due to a built-in Solidity error, such as `require()`, `assert()`, or a plain `revert()`. | | CUSTOM | The transaction reverted due to a contract-defined custom error declared using Solidity’s `error` keyword. | **Note:** Turnkey application-level errors (e.g. signing failures, policy rejections) are not classified under these error types and are instead surfaced via `Error.Message`. ### Spend limits Turnkey provides tools to manage your gas sponsorship budget. You configure USD gas limits at two levels: across all orgs and per sub-org. This gives you control over both total spend and per-user spend. You can set limit values and time windows through the dashboard. You can query current gas usage and limits through our endpoints. Turnkey provides paymaster (gas sponsorship) and transaction broadcasting services only. In high-fee or congested network conditions, delays or non-inclusion may occur. It is the developer's responsability to ensure appropriate spend limits are in place. ### Policy engine You can write policies against both sponsored and non-sponsored transactions using the normal `eth.tx` namespace in Turnkey's policy DSL. This means you can seamlessly switch between sponsored and non-sponsored transactions and still use the same policies. *Note:* Turnkey sets all gas-related fields to 0 for sponsored transactions. ### Billing Turnkey passes gas costs through to you and includes them as a line item at the end of the month. You pay based on the USD value of gas at time of broadcast; Turnkey internalizes the inventory risk of gas token price changes. Our battle-tested gas estimation aims to be cost efficient while ensuring quick transaction inclusion. ### Advanced #### Gas sponsorship smart contracts We could not find a satisfactory setup for gas sponsorship contracts that were both fast and safe, so we made our own. The contracts are open source and you can check them out on [github](https://github.com/tkhq/gas-station). Based on our benchmarks, these are the most efficient gas sponsorship contracts on the market. They achieve this through optimized logic, calldata encoding, and using assembly extensively, which reduces gas overhead per sponsored transaction. The result: lower costs for you and faster execution for your users. #### Security Some gas sponsorship setups by other providers are subject to replay attacks. If a malicious actor compromises the provider infrastructure, they can replay the gas sponsorship request multiple times with different nonces to create multiple transactions from a single request. Concretely, this means if Bob signs a request to send Alice 1 ETH, a malicious actor could replay that request many times, draining all of Bob's ETH. At Turnkey, we never cut corners on security: we perform transaction construction in enclaves, and as long as the request includes the relevant nonce, only one transaction can be created from it. Since the user's authenticator signs requests and the enclave verifies signatures, a malicious actor cannot modify or replay the request. This is inline with Turnkey's core system design principal: everything can be compromised outside of the enclaves and funds will still be safe. By default, our SDKs include a special gas station nonce for sponsored transaction requests. ### RPCs Turnkey's send transaction and transaction status endpoints eliminate the need for third-party RPC providers. You save costs and reduce latency because we holistically incorporate internal data and minimize calls. ## Next Steps For implementation guides, see: * [Sending Sponsored Transactions (React)](/embedded-wallets/code-examples/sending-sponsored-transactions) - Using `@turnkey/react-wallet-kit` * [Sending Sponsored Transactions](/signing-automation/code-examples/sending-sponsored-transactions) - Using `@turnkey/core` directly # Credentials Source: https://docs.turnkey.com/concepts/users/credentials Credentials represent ways for Users to authenticate to Turnkey. All Turnkey Credentials are held by you, the end-user. Turnkey only keeps **public keys**. At the moment, Turnkey supports 2 types of Credentials: * Authenticators * API Keys Note that every Turnkey user needs at least one long-lived credential (a passkey, or non-expiring API key). This is to prevent users from getting locked out of their accounts. The exception is if the user belongs to a suborg, and [Email Auth](/authentication/email) is enabled for that sub-organization. ### Authenticators Turnkey uses [Webauthn](https://www.w3.org/TR/webauthn-2/) for authentication into its dashboard (no passwords!). Authenticators on Turnkey represent a Webauthn device registered on Turnkey. When logging into Turnkey, you'll be prompted for a signature with a registered device. This signature is then verified to grant dashboard access. To avoid repeated signatures, Turnkey's dashboard uses session cookies for read traffic. However, all write actions require an authenticator signature. ### API Keys Turnkey API requests are authenticated with API key signatures. When you generate an API key (either through our CLI or through our dashboard), you generate a P-256 key pair. Turnkey keeps the public key, and you hold the private key. Requests made via SDK or CLI use the private API key to sign requests. Turnkey's public API expects all requests (e.g. to get data or to submit activities) to be signed. See our [API reference](/api-reference/api-keys/create-api-keys) for how to programmatically create API keys. # Introduction to users Source: https://docs.turnkey.com/concepts/users/introduction Turnkey users are resources within organizations or sub-organizations that can submit activities to Turnkey via a valid credential (e.g., API key, passkey). These requests can be made either by making direct API calls or through the Turnkey Dashboard. Users must have at least one valid credential (one of API key, passkey), with upper limits on credentials defined here in our [resource limits](/concepts/resource-limits). Users can also have associated “tags” which are logical groupings that can be referenced in policies. Users can only submit activities within their given organization — they cannot take action across organizations. A User's attributes are: * UUID: a globally unique ID (e.g. `fc6372d1-723d-4f7e-8554-dc3a212e4aec`), used as a unique identifier for a User in the context of Policies or User Tags, or Quorums. * Name and email * Authenticators: a list of authenticators (see below for information) * API key: a list of API keys (see below for information) * User tags: a list of User Tag UUIDs A **user belongs to one organization**, and one organization can have many (**up to 100**) users. If you need to create more users, consider using Sub-Organizations. # Root Quorum Source: https://docs.turnkey.com/concepts/users/root-quorum When you create a Turnkey organization, your user is created and will default to being the sole member of the root quorum. Because of the wide scope of permissions, it is important to take care when using any users in the root quorum. The following offers a technical overview and some best practices. ## Technical overview The root quorum is a group of users who can execute any action and bypass the policy engine. The root quorum is defined by * `userIds`: the Ids of users who compose the quorum set * `threshold`: the number of quorum members required to execute an action as root Actions approved by the root quorum do not go through the policy engine; thus it is impossible to limit root quorum actions with any policies. The reason the root must be able to bypass the policy engine is that it is the only way for an organization to unbrick itself if it sets overly restrictive policies that do not allow it to update itself. We can refer to a root quorum configuration as `threshold / userIds.length`. So a quorum with a threshold of 2 and set size of 5 can be referred to as `2 / 5`. ### Defaults When you create an organization, the root quorum will default to being your user and a threshold of 1. ### Updating the root quorum Only the current root quorum can approve updates to the quorum. It is not possible to add editing permissions to the root quorum through policies. Both the website and public APIs expose the ability to update the root quorum. ## Best practices ### Limit tasks you perform with the root quorum The root quorum should only be used in cases where it is absolutely necessary. In particular, the root quorum should primarily be used to unblock an organization in the event of incorrect policies or lockout. For example, if you accidentally set overly-restrictive policies that prevent users from taking any action, the root quorum can be used to delete the relevant policies. ### Create scoped users for day-to-day actions Ensure that you have scoped policies for day-to-day actions that you expect to complete. For example, you may have an API user with permissions to only create sub-organizations. You can read more about creating policies in our [Policy Overview](/concepts/policies/overview). ### Using root users with policies We generally recommend creating non-root users for day-to-day operations and granting them narrowly scoped permissions via policies. However, root users can also be granted the ability to act without quorum approval for specific actions. By defining an explicit policy, you can allow an individual root user to perform certain activities without requiring approvals from the other root users, even if the organization’s root quorum threshold would normally require it. In other words, even if your organization enforces a root quorum with a threshold greater than 1 (for example, 2 / 3), a policy can allow a specific root user to independently perform the activity covered by that policy, while all other activities continue to require quorum approval. ### Configuration considerations There are primarily two factors to consider when setting the root quorum * how hard is it to get locked out of root? I.E. how many authenticators need to be lost/destroyed so the threshold cannot be met. * how many authenticators need to be compromised for an attacker to take root actions? For example, if a quorum is configured as 2/5, then * if 4 users lost all their authenticators, no root actions could be taken (including updating the quorum itself). * if 2 different users authenticators are compromised, an attacker could steal all the organizations funds. **Example Setups** The below examples are provided as a convenience only. It is up to you to ensure that the root quorum setup you design is appropriate for your particular circumstances in order to secure your organization and minimize the risk of lockout of root functionality. Failure to properly configure your root quorum setup could result in complete loss of funds. *High Value Organization* Special users should be created that are only used for root actions. Those users' authenticators should be stored in geographically distributed locations that have personal access controls, are natural disaster resistant, and have redundancy in case of hardware failure. These would only be used in the case of a disaster. For day to day admin operations, admin policies that use consensus can be put in place. These can be a set of finely scoped policies. *Low Value, End-User Directed Organization* The end-user and the business both have one user in the organization. The root quorum would be configured as a 1/2, which includes the business and end-users' Users. This allows the business support channel to unbrick the user if they lose access to their account or otherwise add overly restrictive policies. ### Monitor for unintended use Monitor your account for any unexpected activities coming from the root users. If you see an unexpected activity, you should remove any compromised authenticators or API keys. # Wallets Source: https://docs.turnkey.com/concepts/wallets A [hierarchical deterministic (HD) wallet](https://learnmeabitcoin.com/technical/hd-wallets) is a collection of cryptographic private/public key pairs that share a common seed. A wallet is used to generate accounts. ```json theme={"system"} { "walletId": "eb98ae4c-07eb-4117-9b2d-8a453c0e1e64", "walletName": "default" } ``` #### Configuration Wallet seeds are generated with a default mnemonic length of 12 words. The [BIP-39 specification](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) supports mnemonic lengths of 12, 15, 18, 21, and 24 words. To enhance your Wallet's security, you may consider opting for a longer mnemonic length. This optional `mnemonicLength` field can be set when creating a Wallet. It's important to note that once the Wallet seed is generated, the mnemonic is permanent and cannot be altered. ## Accounts An account contains the directions for deriving a cryptographic key pair and corresponding address from a Wallet. In practice, this looks like: * The Wallet seed and Account curve are used to create a root key pair * The Account path format and path are used to derive an extended key pair from the root key pair * The Account address format is used to derive the address from the extended public key ```json theme={"system"} { "address": "0x7aAE6F67798D1Ea0b8bFB5b64231B2f12049DB5e", "addressFormat": "ADDRESS_FORMAT_ETHEREUM", "curve": "CURVE_SECP256K1", "path": "m/44'/60'/0'/0/0", "pathFormat": "PATH_FORMAT_BIP32", "walletId": "eb98ae4c-07eb-4117-9b2d-8a453c0e1e64" } ``` **The account address is used to sign with the underlying extended private key.** #### HD wallet default paths HD wallets use standardized derivation paths to generate multiple accounts from a single seed. These paths follow a specific structure that allows for consistent address generation across different wallet implementations. Here are common default paths for some of the ecosystems supported by Turnkey: * Ethereum: `m/44'/60'/0'/0/0` * Cosmos: `m/44'/118'/0'/0/0` * Solana: `m/44'/501'/0'/0'` For a complete list of coin types and possible HD paths, refer to the [SLIP-0044 specification](https://github.com/satoshilabs/slips/blob/master/slip-0044.md). #### Address formats and curves See below for specific address formats that you can currently derive on Turnkey: | Type | Address Format | Curve | Default HD Path | | -------- | ----------------------------------------- | ---------------- | ------------------ | | n/a | ADDRESS\_FORMAT\_COMPRESSED | CURVE\_SECP256K1 | m/0'/0 | | n/a | ADDRESS\_FORMAT\_COMPRESSED | CURVE\_ED25519 | m/0'/0 | | n/a | ADDRESS\_FORMAT\_UNCOMPRESSED | CURVE\_SECP256K1 | m/0'/0 | | Ethereum | ADDRESS\_FORMAT\_ETHEREUM | CURVE\_SECP256K1 | m/44'/60'/0'/0/0 | | Cosmos | ADDRESS\_FORMAT\_COSMOS | CURVE\_SECP256K1 | m/44'/118'/0'/0/0 | | Solana | ADDRESS\_FORMAT\_SOLANA | CURVE\_ED25519 | m/44'/501'/0'/0 | | Tron | ADDRESS\_FORMAT\_TRON | CURVE\_SECP256K1 | m/44'/195'/0'/0/0 | | Sui | ADDRESS\_FORMAT\_SUI | CURVE\_ED25519 | m/44'/784'/0'/0/0 | | Aptos | ADDRESS\_FORMAT\_APTOS | CURVE\_ED25519 | m/44'/637'/0'/0'/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2PKH | CURVE\_SECP256K1 | m/44'/0'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2SH | CURVE\_SECP256K1 | m/49'/0'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2WPKH | CURVE\_SECP256K1 | m/84'/0'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2WSH | CURVE\_SECP256K1 | m/48'/0'/0'/2'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2TR | CURVE\_SECP256K1 | m/86'/0'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2PKH | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2SH | CURVE\_SECP256K1 | m/49'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2WPKH | CURVE\_SECP256K1 | m/84'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2WSH | CURVE\_SECP256K1 | m/48'/1'/0'/2'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2TR | CURVE\_SECP256K1 | m/86'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2PKH | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2SH | CURVE\_SECP256K1 | m/49'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2WPKH | CURVE\_SECP256K1 | m/84'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2WSH | CURVE\_SECP256K1 | m/48'/1'/0'/2'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2TR | CURVE\_SECP256K1 | m/86'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2PKH | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2SH | CURVE\_SECP256K1 | m/49'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2WPKH | CURVE\_SECP256K1 | m/84'/1'/0'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2WSH | CURVE\_SECP256K1 | m/48'/1'/0'/2'/0/0 | | Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2TR | CURVE\_SECP256K1 | m/86'/1'/0'/0/0 | | Sei | ADDRESS\_FORMAT\_SEI | CURVE\_ED25519 | m/44'/118'/0'/0/0 | | Stellar | ADDRESS\_FORMAT\_XLM | CURVE\_ED25519 | m/44'/148'/0'/0'/0 | | Dogecoin | ADDRESS\_FORMAT\_DOGE\_MAINNET | CURVE\_SECP256K1 | m/44'/3'/0'/0/0 | | Dogecoin | ADDRESS\_FORMAT\_DOGE\_TESTNET | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | | TON | ADDRESS\_FORMAT\_TON\_V3R2 | CURVE\_ED25519 | m/44'/607'/0'/0/0 | | TON | ADDRESS\_FORMAT\_TON\_V4R2 | CURVE\_ED25519 | m/44'/607'/0'/0/0 | | XRP | ADDRESS\_FORMAT\_XRP | CURVE\_SECP256K1 | m/44'/144'/0'/0/0 | | FLARE | ADDRESS\_FORMAT\_XRP | CURVE\_SECP256K1 | m/44'/144'/0'/0/0 | #### Where can I learn more? In addition to the guide mentioned above on [HD Wallets](https://learnmeabitcoin.com/technical/hd-wallets), there is also a page specifically on [Derivation Paths](https://learnmeabitcoin.com/technical/derivation-paths). #### What if I don't see the address format for my network? You can use `ADDRESS_FORMAT_COMPRESSED` to generate a public key which can be used to sign with (only sign raw payloads supported). #### What is the difference between sign transaction and sign raw payload ? [SignRawPayload](https://docs.turnkey.com/api-reference/activities/sign-raw-payload): network-agnostic, curve-based signing of messages. [SignTransaction](https://docs.turnkey.com/api-reference/activities/sign-transaction): network-specific transaction signing, including [transaction parsing](https://docs.turnkey.com/networks/overview#:~:text=Tier%204%3A%20Transaction%20parsing%20and%20policy%20creation) and compatibility with our policy engine. #### What if I don't see the curve for my network? Contact us at [hello@turnkey.com](mailto:hello@turnkey.com). ## Delete wallets To delete wallets you can call the [delete wallets activity](/api-reference/wallets/delete-wallets). Before deleting a wallet it must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. Note that this activity must be initiated by the wallet owner. ## Private keys Turnkey also supports raw private keys, but we recommend using Wallets since they offer several advantages: * Wallets can be used across various cryptographic curves * Wallets can generate millions of addresses for various digital assets * Wallets can be represented by a checksummed, mnemonic phrase making them easier to backup and recover ## Export keys Exporting on Turnkey enables you or your end users to export a copy of a Wallet or Private Key from our system at any time. While most Turnkey users opt to keep Wallets within Turnkey's secure infrastructure, the export functionality means you are never locked into Turnkey, and gives you the freedom to design your own backup processes as you see fit. Check out our [Export Wallet guide](/wallets/export-wallets) to allow your users to securely export their wallets. ## Import keys Importing on Turnkey enables you or your end users to import a Wallet or Private Key to our system. Check out our [Import Wallet guide](/wallets/import-wallets) to allow your users to securely import their wallets. ## Delete keys To delete private keys you can call the [delete private keys activity](/api-reference/private-keys/delete-private-keys). Before deleting a private key it must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. Note that this activity must be initiated by the private key owner. # Use Turnkey wallets with 0x Source: https://docs.turnkey.com/cookbook/0x ## Overview [0x](https://0x.org) is a swap platform that allows users to swap various tokens on different chains. In this guide, we’ll walk through how to use **Turnkey** wallets to sign transactions that interact with 0x, adding an allowance with the [Allowance Holder Contract](https://0x.org/docs/introduction/0x-cheat-sheet#allowanceholder-recommended) and swapping ETH and USDC. We'll demonstrate this using the [`with-0x`](https://github.com/tkhq/sdk/tree/main/examples/with-0x) example, which integrates **Turnkey**, **Ethereum**, and **0x** for EVM swaps. *** ## Getting started Before you begin, make sure you’ve followed the [Turnkey Quickstart guide](/getting-started/quickstart).\ You should have: * A Turnkey **organization** and **Auth Proxy Config ID** * Once you generate an account with the example, the account funded with **ETH** You’ll also need your **0X API key** (see the [Breeze Developer Portal](https://dashboard.0x.org/)). *** ## Install dependencies ```bash theme={"system"} npm install @turnkey/react-wallet-kit @turnkey/viem viem wagmi ``` ## Setting up the Turnkey wallet We’ll use the @turnkey/react-wallet-kit package to authenticate and load a Turnkey wallet in the browser. ```tsx theme={"system"} "use client"; import { useTurnkey, WalletAccount } from "@turnkey/react-wallet-kit"; import { createAccount } from "@turnkey/viem"; export default function SwapPage() { const { httpClient, session, fetchWalletAccounts, wallets } = useTurnkey(); const [viemWalletClient, setViemWalletClient] = useState(undefined); // obtain a users turnkey wallets const walletAccountResponse = await fetchWalletAccounts({ wallet: wallets[0], }); // create a viem account with the turnkey wallet const turnkeyViemAccount = await createAccount({ client: httpClient!, organizationId: walletAccountResponse[0].organizationId, signWith: walletAccountResponse[0].address, ethereumAddress: walletAccountResponse[0].address, }); const viemWalletClient = createWalletClient({ account: turnkeyAccount as Account, chain: mainnet, transport: http(MAINNET_RPC_PROVIDER), }) // Render your login/logout and account selector UI here } ``` ## Setting up 0x We’ll make calls to the 0x API to retrieve soft prices and firm quotes for the swap transaction. GetPrice is used for a price estimate, where GetQuote signifies to the opposite party that you are committing to the swap and they should reserve these funds. ```tsx theme={"system"} "use server"; export interface PriceParams { chainId: string; sellToken: string; buyToken: string; sellAmount: string; taker: string; } export async function getPrice(priceParams: PriceParams) { const params = new URLSearchParams({ chainId: priceParams.chainId, sellToken: priceParams.sellToken, buyToken: priceParams.buyToken, sellAmount: priceParams.sellAmount, taker: priceParams.taker, }); const headers = { "0x-api-key": process.env.ZEROX_API_KEY!, // Get your live API key from the 0x Dashboard (https://dashboard.0x.org/apps) "0x-version": "v2", }; const priceResponse = await fetch( "https://api.0x.org/swap/allowance-holder/price?" + params.toString(), { headers, }, ); const response = await priceResponse.json(); return response; } // Quotes and Prices use the same parameters export async function getQuote(quoteParams: PriceParams) { const params = new URLSearchParams({ chainId: quoteParams.chainId, sellToken: quoteParams.sellToken, buyToken: quoteParams.buyToken, sellAmount: quoteParams.sellAmount, taker: quoteParams.taker, }); const headers = { "0x-api-key": process.env.ZEROX_API_KEY!, // Get your live API key from the 0x Dashboard (https://dashboard.0x.org/apps) "0x-version": "v2", }; const quoteResponse = await fetch( "https://api.0x.org/swap/allowance-holder/quote?" + params.toString(), { headers, }, ); const response = await quoteResponse.json(); return response; } ``` ## Creating a Swap after receiving a quote ```tsx theme={"system"} import { parseEther } from "viem"; import { mainnet } from "viem/chains"; const ETH_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; const USDC_MAINNET_TOKEN_ADDRESS = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"; async function handleSwap() { const quoteParams: PriceParams = { chainId: mainnet.id.toString(), sellToken: ETH_TOKEN_ADDRESS, // the token address of the sending token buyToken: USDC_MAINNET_TOKEN_ADDRESS, // the token address of the asset to receive sellAmount: parseEther(fromAmount).toString() // the amount of ETH in human readable form 1.0 == 1 ETH taker: address, // the receiving address of the swap }; const getQuoteResponse = await getQuote(quoteParams); const sendTransactionResponse = await viemWalletClient?.sendTransaction({ to: getQuoteResponse?.transaction.to, data: getQuoteResponse?.transaction.data, // value is only used when the sending token is ETH value: getQuoteResponse?.transaction.value ? BigInt(getQuoteResponse.transaction.value) : undefined, account: turnkeyViemAccount!, // initialized in "Setting up Turnkey Wallet" chain: mainnet, }); } ``` ## Setting Allowances You will need to set an allowance to swap ERC-20 tokens that are not ETH. 0x uses an [Allowance Holder Contract](https://0x.org/docs/introduction/0x-cheat-sheet#allowanceholder-recommended) to achieve this. This code snippet shows how to check and set the allowance for an address for USDC. ```tsx theme={"system"} "use client"; import { createPublicClient, erc20Abi, maxUint256, parseUnits } from "viem"; import { mainnet } from "viem/chains"; const USDC_MAINNET_TOKEN_ADDRESS = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"; // ETH MAINNET USDC token contract address const MAINNET_0X_ALLOWANCE_HOLDER_ADDRESS = "0x0000000000001fF3684f28c67538d4D072C22734"; // 0x Allowance Holder contract address const address = ""; // this should be the address sending the USDC to swap const fromAmount = "" // 1 == 1 USDC const viemPublicClient = createPublicClient({ chain: mainnet, transport: http(MAINNET_RPC_PROVIDER), }); // get the current allowance const currentAllowance = await viemPublicClient?.readContract({ address: USDC_MAINNET_TOKEN_ADDRESS, abi: erc20Abi, functionName: "allowance", args: [address, MAINNET_0X_ALLOWANCE_HOLDER_ADDRESS], }); // check if allowance is greater than the requested swap amount if (currentAllowance < parseUnits(fromAmount, 6)) { // update allowance if its too little const approveAllowanceHash = await viemWalletClient?.writeContract({ address: USDC_MAINNET_TOKEN_ADDRESS, abi: erc20Abi, functionName: "approve", args: [MAINNET_0X_ALLOWANCE_HOLDER_ADDRESS, maxUint256], //setting the allowance to max int, but can set it to parseUnits(fromAmount, 6) to approve exactly the desired amount for this transaction chain: mainnet, account: turnkeyViemAccount!, // initialized in "Setting up Turnkey Wallet" }); // wait for the approval to be successful const receipt = await viemPublicClient!.waitForTransactionReceipt({ hash: approveAllowanceHash!, }); } ``` ## Summary ✅ You’ve now learned how to: * Authenticate with Turnkey via @turnkey/react-wallet-kit * Set allowances on ERC-20 tokens * Interact with 0x to retrieve quotes and swap EVM tokens # Use Turnkey wallets with Aave Source: https://docs.turnkey.com/cookbook/aave ## Overview Aave V3 is a decentralized liquidity protocol where users can supply assets to earn yield and withdraw them at any time. In this guide, we’ll walk through using Turnkey to sign common Aave transactions on Base Mainnet with USDC: approving the Aave Pool to spend USDC, supplying USDC, reading the resulting aUSDC balance, and withdrawing USDC back to the wallet. We’ll also demonstrate Turnkey’s policy engine by restricting signing operations to the specific Aave Pool and USDC contracts on Base. A working example can be found [here](https://github.com/tkhq/sdk/tree/main/examples/with-aave). ## Getting started The first step is to set up your Turnkey organization and account. By following the [Quickstart guide](/getting-started/quickstart), you should have: * A root user with a public/private API key pair within the Turnkey parent organization * An organization ID The next step is to create another non-root user within the organization with a different API key and exclude it from the root quorum. If you would like to remove a root user from root quorum, you can do this from the Turnkey [dashboard](https://app.turnkey.com/dashboard/security/updateRootQuorum) or [API](https://docs.turnkey.com/api-reference/activities/update-root-quorum). Here's a simple [script](https://github.com/tkhq/sdk/blob/main/examples/kitchen-sink/src/sdk-server/updateRootQuorum.ts) that shows how to update the root quorum using @turnkey/sdk-server. Finally, make sure you have a wallet with an Ethereum account created within this organization and have it funded with some ETH and USDC on Base Mainnet. ## Setting up the policy for the non-root user Now we’ll use a non-root Turnkey user to sign Aave transactions, while ensuring it can only interact with the USDC token and the Aave Pool contracts on Base mainnet. We'll define a new API client that would use the organization root user to create the required policy: ```tsx theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; import { AaveV3Base } from "@bgd-labs/aave-address-book"; const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY!, apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY!, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID!, }).apiClient(); const userId = ""; // Pull addresses from Aave Address Book (Base) const USDC_ADDRESS = AaveV3Base.ASSETS.USDC.UNDERLYING; const AAVE_POOL = AaveV3Base.POOL; const policyName = "Allow API key user to only sign txs to Aave Pool and USDC"; const effect = "EFFECT_ALLOW"; const consensus = `approvers.any(user, user.id == '${userId}')`; const condition = `eth.tx.to in ['${USDC_ADDRESS}', '${AAVE_POOL}']`; const notes = ""; const { policyId } = await turnkeyClient.createPolicy({ policyName, condition, consensus, effect, notes, }); ``` ## Set up the Turnkey signer We'll be using `@turnkey/viem` to create a Turnkey custom signer which implements the signing APIs expected by the `viem` client. Notice that the Turnkey API client is going to use the non-root user API key now as using a root user will bypass the policy engine evaluation. ```tsx theme={"system"} import { base } from "viem/chains"; import { createAccount } from "@turnkey/viem"; import { Turnkey as TurnkeyServerSDK } from "@turnkey/sdk-server"; import { parseAbi, erc20Abi, parseUnits, createWalletClient, http, createPublicClient, type Account, } from "viem"; const turnkeyClient = new TurnkeyServerSDK({ apiBaseUrl: process.env.TURNKEY_BASE_URL!, apiPrivateKey: process.env.NONROOT_API_PRIVATE_KEY!, apiPublicKey: process.env.NONROOT_API_PUBLIC_KEY!, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID!, }); const turnkeyAccount = await createAccount({ client: turnkeyClient.apiClient(), organizationId: process.env.TURNKEY_ORGANIZATION_ID!, signWith: process.env.SIGN_WITH!, }); const client = createWalletClient({ account: turnkeyAccount as Account, chain: base, transport: http( `https://base-mainnet.infura.io/v3/${process.env.INFURA_API_KEY!}`, ), }); // Use the standard viem client for non-signing operations const publicClient = createPublicClient({ transport: http( `https://base-mainnet.infura.io/v3/${process.env.INFURA_API_KEY!}`, ), chain: base, }); ``` ## Approve the Aave Pool contract to spend USDC ```tsx theme={"system"} import { AaveV3Base } from "@bgd-labs/aave-address-book"; // Pull addresses from Aave Address Book (Base) const USDC_ADDRESS = AaveV3Base.ASSETS.USDC.UNDERLYING; const AAVE_POOL = AaveV3Base.POOL; // Approve Pool to spend 10 USDC const { request: approveReq } = await publicClient.simulateContract({ address: USDC_ADDRESS as `0x${string}`, abi: erc20Abi, functionName: "approve", args: [AAVE_POOL as `0x${string}`, parseUnits("10", 6)], // USDC has 6 decimals account: walletClient.account, }); const approveHash = await walletClient.writeContract(approveReq); const receiptApprove = await publicClient.waitForTransactionReceipt({ hash: approveHash, }); console.log("Approve transaction:", `https://basescan.org/tx/${approveHash}`, receiptApprove.status); ``` ## Deposit USDC into Aave Pool ```tsx theme={"system"} // Supply 0.5 USDC const poolAbi = parseAbi([ "function supply(address asset,uint256 amount,address onBehalfOf,uint16 referralCode)", ]); const { request: supplyReq } = await publicClient.simulateContract({ address: AAVE_POOL as `0x${string}`, abi: poolAbi, functionName: "supply", args: [ USDC_ADDRESS, parseUnits("0.5", 6), (walletClient.account as Account).address, 0, ], account: walletClient.account as Account, }); // The USDC transfer path & proxy layers sometimes make estimateGas under-shoot // Adding a buffer to avoid occasional out-of-gas errors const gas = await publicClient.estimateContractGas({ address: AAVE_POOL as `0x${string}`, abi: poolAbi, functionName: "supply", args: [ USDC_ADDRESS, parseUnits("0.5", 6), (walletClient.account as Account).address, 0, ], account: walletClient.account as Account, }); const gasWithBuffer = (gas * 130n) / 100n; const supplyHash = await walletClient.writeContract({ ...supplyReq, gas: gasWithBuffer, }); const receiptSupply = await publicClient.waitForTransactionReceipt({ hash: supplyHash, }); console.log("Supply transaction:", `https://basescan.org/tx/${supplyHash}`, receiptSupply.status); ``` ## Read the aUSDC balance When you supply USDC into Aave, you receive aUSDC (an ERC-20 “receipt” token), aUSDC.balanceOf(user) already shows your live underlying balance (principal + interest), because it’s auto-scaled by Aave’s liquidity index. ```tsx theme={"system"} // Pull aUSDC address from Aave Address Book (Base) const aUSDC = AaveV3Base.ASSETS.USDC.A_TOKEN; // Read aUSDC balance which tracks your supplied principal + interest const erc20ReadAbi = parseAbi([ "function balanceOf(address) view returns (uint256)", "function decimals() view returns (uint8)", ]); const [decimals, rawBal] = await Promise.all([ publicClient.readContract({ address: aUSDC as `0x${string}`, abi: erc20ReadAbi, functionName: "decimals", }), publicClient.readContract({ address: aUSDC as `0x${string}`, abi: erc20ReadAbi, functionName: "balanceOf", args: [(walletClient.account as Account).address], }), ]); console.log("aUSDC balance:", formatUnits(rawBal, Number(decimals))); ``` ## Withdraw USDC from the Aave Pool On withdraw, Aave burns your aUSDC and sends you back USDC: ```tsx theme={"system"} // Pull addresses from Aave Address Book (Base) const USDC_ADDRESS = AaveV3Base.ASSETS.USDC.UNDERLYING; const AAVE_POOL = AaveV3Base.POOL; const poolReadWriteAbi = parseAbi([ "function withdraw(address asset,uint256 amount,address to) returns (uint256)", ]); // withdraw 0.1 USDC const { request: withdrawReq } = await publicClient.simulateContract({ address: AAVE_POOL as `0x${string}`, abi: poolReadWriteAbi, functionName: "withdraw", args: [ USDC_ADDRESS, parseUnits("0.1", 6), (walletClient.account as Account).address, ], account: walletClient.account as Account, }); // the USDC transfer path & proxy layers sometimes make estimateGas under-shoot // adding a buffer to avoid occasional out-of-gas errors const gas = await publicClient.estimateContractGas({ address: AAVE_POOL as `0x${string}`, abi: poolReadWriteAbi, functionName: "withdraw", args: [ USDC_ADDRESS, parseUnits("0.1", 6), (walletClient.account as Account).address, ], account: walletClient.account as Account, }); const gasWithBuffer = (gas * 130n) / 100n; const withdrawHash = await walletClient.writeContract({ ...withdrawReq, gas: gasWithBuffer, }); const receiptWithdraw = await publicClient.waitForTransactionReceipt({ hash: withdrawHash, }); console.log("Withdraw transaction:", `https://basescan.org/tx/${withdrawHash}`, receiptWithdraw.status); ``` # Use Turnkey wallets with Breeze Source: https://docs.turnkey.com/cookbook/breeze ## Overview [Breeze](https://breeze.baby) is a Solana-based yield platform that allows users to deposit and withdraw assets from managed yield funds via smart contracts and APIs.\ In this guide, we’ll walk through how to use **Turnkey** wallets to sign transactions that interact with Breeze funds, including deposits, withdrawals, and balance queries. We'll demonstrate this using the [`with-breeze`](https://github.com/tkhq/sdk/tree/main/examples/with-breeze) example, which integrates **Turnkey**, **Solana**, and **Breeze** for staking deposits/withdrawals. *** ## Getting started Before you begin, make sure you’ve followed the [Turnkey Quickstart guide](/getting-started/quickstart).\ You should have * A Turnkey **organization** and **Auth Proxy Config ID** * An account funded with **USDC** on **SOL** You’ll also need your **Breeze API key** (see the [Breeze Developer Portal](https://docs.breeze.baby)) and your fund ID. *** ## Install dependencies ```bash theme={"system"} npm install @turnkey/react-wallet-kit @turnkey/solana @breezebaby/breeze-sdk @solana/web3.js ``` ## Setting up the Turnkey wallet We’ll use the @turnkey/react-wallet-kit package to authenticate and load a Turnkey wallet in the browser. ```tsx theme={"system"} "use client"; import { useTurnkey, WalletAccount } from "@turnkey/react-wallet-kit"; import { TurnkeySigner } from "@turnkey/solana"; import { VersionedTransaction, PublicKey, Connection } from "@solana/web3.js"; const connection = new Connection("https://solana-rpc.publicnode.com", "confirmed"); export default function BreezePage() { const { wallets, httpClient, handleLogin, logout, session } = useTurnkey(); const [activeWalletAccount, setActiveWalletAccount] = useState(null); const signer = activeWalletAccount ? new TurnkeySigner({ organizationId: activeWalletAccount.organizationId, client: httpClient!, }) : null; // Render your login/logout and account selector UI here } ``` ## Setting up the Breeze client We’ll use the Breeze SDK to interact with Breeze funds. Create a helper file actions/breeze.ts: ```tsx theme={"system"} "use server"; import { BreezeSDK } from "@breezebaby/breeze-sdk"; const breeze = new BreezeSDK({ apiKey: process.env.BREEZE_API_KEY!, baseUrl: "https://api.breeze.baby", timeout: 30000, }); export async function createDepositTx({ payerKey, userKey, fundId, amount, mint, }: { payerKey: string; userKey: string; fundId: string; amount: number; mint: string; }) { return breeze.createDepositTransaction({ payerKey, userKey, fundId, amount, mint, }); } export async function createWithdrawTx({ payerKey, userKey, fundId, amount, }: { payerKey: string; userKey: string; fundId: string; amount: number; }) { return breeze.createWithdrawTransaction({ payerKey, userKey, fundId, amount, }); } export async function getUserData(userId: string) { const [balances, yieldInfo] = await Promise.all([ breeze.getUserBalances({ userId }), breeze.getYieldInfo({ userId }), ]); return { balances, yieldInfo }; } ``` ## Depositing into a Breeze fund Here’s how you can use your Turnkey signer to submit a deposit transaction. ```tsx theme={"system"} "use client"; import { useTurnkey, WalletAccount } from "@turnkey/react-wallet-kit"; import { TurnkeySigner } from "@turnkey/solana"; import { Connection, VersionedTransaction, PublicKey } from "@solana/web3.js"; import { createDepositTx } from "../actions/breeze"; const connection = new Connection("https://solana-rpc.publicnode.com", "confirmed"); export default function DepositButton({ fundId, mint, amount, }: { fundId: string; mint: string; amount: number; }) { const { httpClient, wallets } = useTurnkey(); const [activeWalletAccount, setActiveWalletAccount] = useState(null); const signer = activeWalletAccount ? new TurnkeySigner({ organizationId: activeWalletAccount.organizationId, client: httpClient!, }) : null; async function handleDeposit() { if (!signer || !activeWalletAccount) return; const txData = await createDepositTx({ payerKey: activeWalletAccount.address, userKey: activeWalletAccount.address, fundId, amount, mint, }); const tx = VersionedTransaction.deserialize( Buffer.from(txData.transaction, "base64"), ); await signer.signTransaction(tx); const sig = await connection.sendTransaction(tx); console.log("Deposit transaction:", `https://solscan.io/tx/${sig}`); } return ( ); } ``` ## Withdrawing from a Breeze fund Withdrawals follow the same pattern using createWithdrawTx. ```tsx theme={"system"} async function handleWithdraw() { if (!signer || !activeWalletAccount) return; const txData = await createWithdrawTx({ payerKey: activeWalletAccount.address, userKey: activeWalletAccount.address, fundId, amount, }); const tx = VersionedTransaction.deserialize( Buffer.from(txData.transaction, "base64"), ); await signer.signTransaction(tx); const sig = await connection.sendTransaction(tx); console.log("Withdraw transaction:", `https://solscan.io/tx/${sig}`); } ``` ## Checking balances and yield info ```tsx theme={"system"} import { getUserData } from "../actions/breeze"; async function handleCheckData(userId: string) { const { balances, yieldInfo } = await getUserData(userId); console.log("Balances:", balances); console.log("Yield Info:", yieldInfo); } ``` ## Summary ✅ You’ve now learned how to: * Authenticate with Turnkey via @turnkey/react-wallet-kit * Use a TurnkeySigner to sign Solana transactions * Interact with the Breeze API for deposits, withdrawals, and yield queries # Use Turnkey wallets with Jupiter Source: https://docs.turnkey.com/cookbook/jupiter ## Overview [Jupiter](https://station.jup.ag/) is Solana’s leading liquidity aggregator, enabling users to execute optimal token swaps across multiple DEXs through its [Ultra API](https://station.jup.ag/docs/apis/ultra-api). This cookbook shows how to integrate **Turnkey** wallets with **Jupiter Ultra Swap** using the [`with-jupiter`](https://github.com/tkhq/sdk/tree/main/examples/with-jupiter) example.\ You’ll learn how to authenticate with Turnkey, load a wallet, and use it to create, sign, and send Solana swap transactions directly through the Jupiter API. *** ## Getting started Before you begin, make sure you’ve followed the [Turnkey Quickstart guide](/getting-started/quickstart).\ You should have: * A Turnkey **organization** and **Auth Proxy Config ID** * An account funded with **SOL** and optionally **USDC** You’ll also need: * Access to the **Jupiter API** (Ultra API) * Access to a Solana RPC Provider (e.g., `https://solana-rpc.publicnode.com`) *** ## Install dependencies ```bash theme={"system"} npm install @turnkey/react-wallet-kit @turnkey/solana @solana/web3.js ``` ## Setting up the Turnkey wallet We’ll use the @turnkey/react-wallet-kit package to authenticate and manage a wallet session. ```tsx theme={"system"} "use client"; import { useEffect, useState } from "react"; import { useTurnkey, WalletAccount } from "@turnkey/react-wallet-kit"; import { TurnkeySigner } from "@turnkey/solana"; import { Connection, PublicKey, VersionedTransaction } from "@solana/web3.js"; const connection = new Connection("https://solana-rpc.publicnode.com", "confirmed"); const USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; const SOL_MINT = "So11111111111111111111111111111111111111112"; function LoginButton({ onClick }: { onClick: () => void }) { return ( ); } function LogoutButton({ onClick }: { onClick: () => void }) { return ( ); } export default function JupiterSwapPage() { const { wallets, httpClient, handleLogin, logout } = useTurnkey(); const [activeWalletAccount, setActiveWalletAccount] = useState(null); const [status, setStatus] = useState(""); const signer = activeWalletAccount ? new TurnkeySigner({ organizationId: activeWalletAccount.organizationId, client: httpClient!, }) : null; return (
{!activeWalletAccount ? ( ) : ( )}
{status}
); } ``` ## Fetching a swap quote from Jupiter Ultra You can query Jupiter’s Ultra API for a swap quote between two tokens. ```tsx theme={"system"} export async function getUltraQuote({ inputMint, outputMint, amount, userPublicKey, }: { inputMint: string; outputMint: string; amount: number; userPublicKey: string; }) { const response = await fetch("https://lite-api.jup.ag/ultra/v1/quote", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ inputMint, outputMint, amount, userPublicKey, swapMode: "ExactIn", }), }); if (!response.ok) throw new Error("Failed to fetch quote"); return response.json(); } ``` ## Creating and executing a swap transaction Once you’ve selected a quote, you can request a transaction from Jupiter and sign it using your Turnkey signer. ```tsx theme={"system"} export async function createUltraOrder({ inputMint, outputMint, amount, userPublicKey, }: { inputMint: string; outputMint: string; amount: number; userPublicKey: string; }) { const response = await fetch("https://lite-api.jup.ag/ultra/v1/swap", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userPublicKey, inputMint, outputMint, amount, computeUnitPriceMicroLamports: 1, }), }); if (!response.ok) throw new Error("Failed to create swap transaction"); return response.json(); } export async function executeUltraOrder({ encodedTx, signer, connection, }: { encodedTx: string; signer: TurnkeySigner; connection: Connection; }) { const transaction = VersionedTransaction.deserialize( Buffer.from(encodedTx, "base64"), ); await signer.signTransaction(transaction); const txSig = await connection.sendTransaction(transaction); return txSig; } ``` ## Putting it all together Here’s an example component that performs a USDC → SOL swap. ```tsx theme={"system"} "use client"; import { useEffect, useState } from "react"; import { useTurnkey, WalletAccount } from "@turnkey/react-wallet-kit"; import { TurnkeySigner } from "@turnkey/solana"; import { Connection, VersionedTransaction } from "@solana/web3.js"; import { createUltraOrder, executeUltraOrder, getUltraQuote } from "../actions/jupiter"; const connection = new Connection("https://solana-rpc.publicnode.com", "confirmed"); const USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; const SOL_MINT = "So11111111111111111111111111111111111111112"; export default function JupiterSwap() { const { wallets, httpClient, handleLogin, logout } = useTurnkey(); const [activeWalletAccount, setActiveWalletAccount] = useState(null); const [status, setStatus] = useState(""); const signer = activeWalletAccount ? new TurnkeySigner({ organizationId: activeWalletAccount.organizationId, client: httpClient!, }) : null; async function handleSwap() { if (!signer || !activeWalletAccount) return; setStatus("Fetching quote..."); const quote = await getUltraQuote({ inputMint: USDC_MINT, outputMint: SOL_MINT, amount: 1000000, // 1 USDC (6 decimals) userPublicKey: activeWalletAccount.address, }); setStatus("Creating swap transaction..."); const { swapTransaction } = await createUltraOrder({ inputMint: USDC_MINT, outputMint: SOL_MINT, amount: 1000000, userPublicKey: activeWalletAccount.address, }); setStatus("Signing and sending..."); const txSig = await executeUltraOrder({ encodedTx: swapTransaction, signer, connection, }); setStatus(`Swap sent! View on Solscan: https://solscan.io/tx/${txSig}`); } return (
{status}
); } ``` ## Checking balances You can fetch a user’s token balances directly from the Jupiter Ultra API. ```tsx theme={"system"} const balancesResponse = await fetch( `https://lite-api.jup.ag/ultra/v1/balances/${activeWalletAccount?.address}`, ).then((res) => res.json()); console.log("User balances:", JSON.stringify(balancesResponse, null, 2)); ``` ## Summary ✅ You’ve now learned how to: * Authenticate a user with Turnkey * Use a TurnkeySigner to sign Solana transactions * Interact with Jupiter Ultra API for token swaps * Retrieve balances and verify swap transactions on Solscan # Use Turnkey wallets with Li.Fi Source: https://docs.turnkey.com/cookbook/lifi ## Overview [Li.Fi](https://li.fi) is a bridging platform that allows users to swap various tokens on different chains. In this guide, we'll walk through how to use **Turnkey** wallets to sign transactions that interact with Li.Fi and bridging between ETH and SOL. We'll demonstrate this using the [`with-lifi`](https://github.com/tkhq/sdk/tree/main/examples/with-lifi) example, which integrates **Turnkey**, **Ethereum**, **Solana**, and **LiFi**. *** ## Getting started Before you begin, make sure you’ve followed the [Turnkey Quickstart guide](/getting-started/quickstart).\ You should have: * A Turnkey **organization** and **Auth Proxy Config ID** * Once you generate an account with the example, the account funded with **ETH** Its not required, but it will be helpful to have a Li.Fi API key, it will prevent you from being rate limited (see the [Li.Fi Partner Portal](https://portal.li.fi/login/)). *** ## Install dependencies ```bash theme={"system"} npm install @turnkey/react-wallet-kit @turnkey/viem @turnkey/solana viem wagmi @solana/web3.js ``` ## Setting up the Turnkey wallet We’ll use the @turnkey/react-wallet-kit package to authenticate and load a Turnkey wallet in the browser. ```tsx theme={"system"} "use client"; import { useTurnkey, WalletAccount } from "@turnkey/react-wallet-kit"; import { TurnkeySigner } from "@turnkey/solana"; import { createAccount } from "@turnkey/viem"; import { createWalletClient } from "viem"; // public providers, you might want to use a dedicated provider like alchemy or infura in production const ETH_MAINNET_RPC_PROVIDER = "https://ethereum-rpc.publicnode.com"; const SOL_MAINNET_RPC_PROVIDER = "https://solana-rpc.publicnode.com"; export default function SwapPage() { const { httpClient, session, fetchWalletAccounts, wallets } = useTurnkey(); const [viemWalletClient, setViemWalletClient] = useState(undefined); // obtain a users turnkey wallets const walletAccountResponse = await fetchWalletAccounts({ wallet: wallets[0], }); // create a viem account with the turnkey wallet const turnkeyViemAccount = await createAccount({ client: httpClient!, organizationId: walletAccountResponse[0].organizationId, signWith: walletAccountResponse[0].address, ethereumAddress: walletAccountResponse[0].address, }); // create a viem wallet client to sign EVM transactions const viemWalletClient = createWalletClient({ account: turnkeyAccount as Account, chain: mainnet, transport: http(MAINNET_RPC_PROVIDER), }) // create a solana signer to sign SOL transactions const turnkeySolSigner = new TurnkeySigner({ organizationId: walletAccountResponse[0].organizationId, client: httpClient!, }); // Render your login/logout and account selector UI here } ``` ## Setting up Li.Fi We’ll make calls to the Li.Fi API to retrieve quotes for the bridge transaction. GetQuote is used for a price estimate and also responds with a transactionRequest which needs to be signed and broadcasted. GetStatus is used to retrieve the status and other information of the bridge transaction. ```tsx theme={"system"} "use server"; export interface QuoteParams { fromChain: string; toChain: string; fromToken: string; toToken: string; fromAmount: string; fromAddress: string; toAddress: string; } export interface StatusParams { txHash: string; } export async function getQuote(quoteParams: QuoteParams) { const params = new URLSearchParams({ fromChain: quoteParams.fromChain, toChain: quoteParams.toChain, fromToken: quoteParams.fromToken, toToken: quoteParams.toToken, fromAmount: quoteParams.fromAmount, fromAddress: quoteParams.fromAddress, toAddress: quoteParams.toAddress, }); const quoteResponse = await fetch( "https://li.quest/v1/quote?" + params.toString(), process.env.LIFI_API_KEY ? { headers: { "x-lifi-api-key": process.env.LIFI_API_KEY } } : {}, // Get your live API key from the Li.Fi Partner Portal https://portal.li.fi/login ); const response = await quoteResponse.json(); return response; } export async function getStatus(statusParams: StatusParams) { const params = new URLSearchParams({ txHash: statusParams.txHash, }); const statusResponse = await fetch( "https://li.quest/v1/status?" + params.toString(), process.env.LIFI_API_KEY ? { headers: { "x-lifi-api-key": process.env.LIFI_API_KEY } } : {}, // Get your live API key from the Li.Fi Partner Portal https://portal.li.fi/login ); const response = await statusResponse.json(); return response; } ``` ## Creating a EVM -> SVM swap ```tsx theme={"system"} import { parseEther } from "viem"; import { mainnet } from "viem/chains"; async function handleEVMSwap() { const quoteParams: QuoteParams = { fromChain: "ETH", // view the full list of chains here: https://docs.li.fi/introduction/chains toChain: "SOL", fromToken: "ETH", // view all available tokens for a chain here: https://docs.li.fi/api-reference/fetch-all-known-tokens toToken: "SOL", fromAmount: parseEther(value).toString(), // where value is a human-readable amount of ETH 1.0 == 1 ETH fromAddress: ethAddress, // the sending ETH address toAddress: solAddress, // the SOL address where the bridged SOL should be sent to }; const getPriceResponse = await getQuote(quoteParams); // build, sign, and broadcast the transaction const sendTransactionResponse = await viemWalletClient?.sendTransaction({ to: getPriceResponse.transactionRequest.to, value: getPriceResponse.transactionRequest.value, data: getPriceResponse.transactionRequest.data, chain: mainnet, account: turnkeyViemAccount!, }); } ``` ## Creating a SVM -> EVM swap You will need to set an allowance to swap ERC-20 tokens that are not ETH. 0x uses an [Allowance Holder Contract](https://0x.org/docs/introduction/0x-cheat-sheet#allowanceholder-recommended) to achieve this. This code snippet shows how to check and set the allowance for an address for USDC. ```tsx theme={"system"} "use client"; import { Connection, LAMPORTS_PER_SOL, VersionedTransaction } from "@solana/web3.js"; function solToLamports(sol: string | number): number { return Math.floor(Number(sol) * LAMPORTS_PER_SOL); } async function handleSVMSwap() { // get an initial price to display to the user const quoteParams: QuoteParams = { fromChain: "SOL", // view the full list of chains here: https://docs.li.fi/introduction/chains toChain: "ETH", fromToken: "SOL", // view all available tokens for a chain here: https://docs.li.fi/api-reference/fetch-all-known-tokens toToken: "ETH", fromAmount: solToLamports(value).toString(), // where value is a human-readable amount of SOL 1.0 == 1 SOL fromAddress: solAddress, // the sending SOL address toAddress: ethAddress, // the ETH address where the bridged ETH should be sent to }; const getPriceResponse = await getQuote(quoteParams); // construct the SOL transaction to send for the bridge const txBuffer = Buffer.from(getPriceResponse.transactionRequest.data, "base64"); const hexTransaction = VersionedTransaction.deserialize( new Uint8Array(txBuffer), ); await turnkeySolanaSigner?.addSignature(hexTransaction, solAddress!); // sign and broadcast the transaction const connection = new Connection(SOL_MAINNET_RPC_PROVIDER); const signature = await connection.sendTransaction(hexTransaction, { skipPreflight: true, }); } ``` ## Check the status of a bridge After a transaction has been sent to create a bridge transaction you can check the status of receiving the asset on the other side with this Li.Fi API endpoint: [https://docs.li.fi/api-reference/check-the-status-of-a-cross-chain-transfer](https://docs.li.fi/api-reference/check-the-status-of-a-cross-chain-transfer). This can be used to show different states in your application. ```tsx theme={"system"} "use client"; import { Connection, LAMPORTS_PER_SOL, VersionedTransaction } from "@solana/web3.js"; async function getStatus() { let statusParams: StatusParams = { txHash, // this should be the txHash of the sending transaction "sendTransactionResponse" in the EVM -> SVM bridge example or "signature" in the SVM -> EVM bridge example }; // poll the status of the transaction while (true) { const getStatusResponse = await getStatus(statusParams); // check if the status us "DONE" if (getStatusResponse.status == "DONE") { if (fromToken === "ETH") { console.log("SOL Receiving Transaction:" + getStatusResponse.receiving.txHash); } else if (fromToken === "SOL") { console.log("ETH Receiving Transaction:" + getStatusResponse.receiving.txHash); } break; } // sleep for 2 seconds before re-checking the status of the bridge await new Promise((resolve) => setTimeout(resolve, 2000)); } } ``` ## Summary ✅ You’ve now learned how to: * Authenticate with Turnkey via @turnkey/react-wallet-kit * Create EVM -> SVM swaps with Li.Fi * Create SVM -> EVM swaps with Li.Fi * Check the status of your Li.Fi bridge transaction # Use Turnkey wallets with Morpho Source: https://docs.turnkey.com/cookbook/morpho ## Overview [Morpho Vaults](https://docs.morpho.org/build/earn/getting-started) are smart contracts that allow users to deposit assets into yield-generating vaults built on top of Morpho's lending protocol. We'll walk through the steps of using Turnkey to sign some common transactions to Morpho's Steakhouse USDC Vault on Base Mainnet. The flow is also going to show Turnkey's policy engine in action by restricting the signing operations only to the specific Morpho contracts. The working example can be found [here](https://github.com/tkhq/sdk/tree/main/examples/with-morpho). ## Getting started The first step is to set up your Turnkey organization and account. By following the [Quickstart guide](/getting-started/quickstart), you should have: * A root user with a public/private API key pair within the Turnkey parent organization * An organization ID The next step is to create another user within the organization with a different API key and remove it from the root quorum. You can do this from the Turnkey [dashboard](https://app.turnkey.com/dashboard/security/updateRootQuorum) or [API](https://docs.turnkey.com/api-reference/activities/update-root-quorum). Here's a simple [script](https://github.com/tkhq/sdk/blob/main/examples/kitchen-sink/src/sdk-server/updateRootQuorum.ts) that shows how to update the root quorum using @turnkey/sdk-server. Finally, make sure you have a wallet with an Ethereum account created within this organization and have it funded with some ETH and USDC on Base Mainnet. ## Setting up the policy for the non-root user Now, we want to use the non-root user for signing transactions to Morpho and restrict it to only be able to interact with the USDC and Morpho vault smart contracts. We'll define a new API client that would use the organization root user to create the required policy: ```tsx theme={"system"} const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY!, apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY!, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID!, }).apiClient(); const userId = ''; const MORPHO_VAULT_ADDRESS = 0xbeeF010f9cb27031ad51e3333f9aF9C6B1228183; const USDC_ADDRESS = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913; const policyName = "Allow API key user to only call the MORPHO_VAULT_ADDRESS and USDC_ADDRESS"; const effect = "EFFECT_ALLOW"; const consensus = `approvers.any(user, user.id == '${userId}')`; const condition = `eth.tx.to in ['USDC_ADDRESS', 'MORPHO_VAULT_ADDRESS']`; const notes = ""; const { policyId } = await turnkeyClient.createPolicy({ policyName, condition, consensus, effect, notes, }); ``` ## Set up the Turnkey signer We'll be using `@turnkey/viem` to create a Turnkey custom signer which implements the signing APIs expected by the `viem` client. Notice that the Turnkey API client is going to use the non-root user API key now as using a root user will bypass the policy engine evaluation. ```tsx theme={"system"} import { base } from "viem/chains"; import { createAccount } from "@turnkey/viem"; import { Turnkey as TurnkeyServerSDK } from "@turnkey/sdk-server"; import { createWalletClient, http, type Account, erc20Abi, createPublicClient, parseAbi, parseUnits, } from "viem"; const turnkeyClient = new TurnkeyServerSDK({ apiBaseUrl: process.env.TURNKEY_BASE_URL!, apiPrivateKey: process.env.NONROOT_API_PRIVATE_KEY!, apiPublicKey: process.env.NONROOT_API_PUBLIC_KEY!, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID!, }); const turnkeyAccount = await createAccount({ client: turnkeyClient.apiClient(), organizationId: process.env.TURNKEY_ORGANIZATION_ID!, signWith: process.env.SIGN_WITH!, }); const client = createWalletClient({ account: turnkeyAccount as Account, chain: base, transport: http( `https://base-mainnet.infura.io/v3/${process.env.INFURA_API_KEY!}`, ), }); // Use the standard viem client for non-signing operations const publicClient = createPublicClient({ transport: http( `https://base-mainnet.infura.io/v3/${process.env.INFURA_API_KEY!}`, ), chain: base, }); ``` ## Approve the vault to spend USDC and deposit USDC into the vault ```tsx theme={"system"} // Approve the vault to spend for 10 USDC, use maxUint256 if you want the max token approval const { request: approveReq } = await publicClient.simulateContract({ abi: erc20Abi, address: USDC_ADDRESS as `0x${string}`, functionName: "approve", chain: base, args: [MORPHO_VAULT_ADDRESS as `0x${string}`, parseUnits("10", 6)], account: client.account, }); const approveHash = await client.writeContract(approveReq); console.log("Approve transaction:", `https://basescan.org/tx/${approveHash}`); // Deposit USDC into vault const vaultAbi = parseAbi([ "function deposit(uint256 assets, address receiver) external returns (uint256 shares)", ]); const { request: depositReq } = await publicClient.simulateContract({ abi: vaultAbi, address: MORPHO_VAULT_ADDRESS as `0x${string}`, functionName: "deposit", args: [parseUnits("0.5", 6), (turnkeyAccount as Account).address], account: turnkeyAccount as Account, }); const depositHash = await client.writeContract(depositReq); console.log("Deposit transaction:", `https://basescan.org/tx/${depositHash}`); ``` ## Check user share balance and vault data In order to see how much the user can withdraw we can call the `balanceOf` function if the Vault contract. ```tsx theme={"system"} const balanceAbi = parseAbi([ "function balanceOf(address account) external view returns (uint256)", "function decimals() external view returns (uint8)", ]); const decimals = await publicClient.readContract({ address: MORPHO_VAULT_ADDRESS as `0x${string}`, abi: balanceAbi, functionName: "decimals", }); const rawBalance = await publicClient.readContract({ address: MORPHO_VAULT_ADDRESS as `0x${string}`, abi: balanceAbi, functionName: "balanceOf", args: [turnkeyAccount.address], }); // Format to human-readable const readableBalance = formatUnits(rawBalance, decimals); console.log(`User vault balance: ${readableBalance} shares`); ``` You can also call the Morpho GraphQL API and fetch the vault live data: ```tsx theme={"system"} const query = ` query { vaultByAddress( address: "${MORPHO_VAULT_ADDRESS}" chainId: ${BASE_CHAIN_ID} ) { state { sharePriceUsd apy } asset { priceUsd } } } `; const response = await fetch("https://api.morpho.org/graphql", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query }), }); const json = await response.json(); console.log("Vault data:", JSON.stringify(json.data, null, 2)); ``` ## Withdraw from the vault or redeem the whole amount Call the `withdraw` function if you want a specific amount: ```tsx theme={"system"} const withdrawAbi = parseAbi([ "function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)", ]); const { request: withdrawReq } = await publicClient.simulateContract({ abi: withdrawAbi, address: MORPHO_VAULT_ADDRESS as `0x${string}`, functionName: "withdraw", args: [ parseUnits("0.1", 6), (turnkeyAccount as Account).address, (turnkeyAccount as Account).address, ], account: turnkeyAccount as Account, }); const withdrawHash = await client.writeContract(withdrawReq); console.log("Withdraw transaction:", `https://basescan.org/tx/${withdrawHash}`); ``` Or `redeem` for the full shares amount: ```tsx theme={"system"} const balanceAbi = parseAbi([ "function balanceOf(address account) external view returns (uint256)", ]); const rawBalance = await publicClient.readContract({ address: MORPHO_VAULT_ADDRESS as `0x${string}`, abi: balanceAbi, functionName: "balanceOf", args: [turnkeyAccount.address], }); // Redeem all user shares const redeemAbi = parseAbi([ "function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets)", ]); const { request: redeemReq } = await publicClient.simulateContract({ abi: redeemAbi, address: MORPHO_VAULT_ADDRESS as `0x${string}`, functionName: "redeem", args: [ rawBalance, (turnkeyAccount as Account).address, (turnkeyAccount as Account).address, ], account: turnkeyAccount as Account, }); const redeemHash = await client.writeContract(redeemReq); console.log("redeem tx:", `https://basescan.org/tx/${redeemHash}`); ``` # Polymarket Builders with Turnkey Source: https://docs.turnkey.com/cookbook/polymarket-builders ## Overview Polymarket's Builders program allows apps and order routers to generate and share revenue on the trades they helped create. Learn more about the program [here](https://docs.polymarket.com/developers/builders/builder-intro). ## What does the Turnkey Safe Builder Example do? [This open-source demo](https://github.com/Polymarket/turnkey-safe-builder-example) allows users to log-in and make wallets, then use Polymarket's [CLOB](https://github.com/Polymarket/clob-client) and [Builder Relayer](https://github.com/Polymarket/builder-relayer-client) clients for gasless trading with Builder-program order attribution. * Authenticate users via Turnkey email login for web2-style onboarding * Provision an EOA wallet automatically via Turnkey's embedded wallets * Deploy a Gnosis Safe Proxy Wallet using the builder-relayer-client * Obtain User API Credentials from the CLOB client * Set token approvals for CTF Contract, CTF Exchange, Neg Risk Exchange, and Neg Risk Adapter * Place orders via CLOB client with builder attribution using remote signing ## Getting started Before running this demo, you need: 1. **Builder API Credentials** from Polymarket * Visit `polymarket.com/settings?tab=builder` to obtain your Builder credentials * You'll need: `API_KEY`, `SECRET`, and `PASSPHRASE` 2. **Polygon RPC URL** * Any Polygon mainnet RPC (Alchemy, Infura, or public RPC) 3. **Turnkey Organization** * Sign up at [turnkey.com](https://turnkey.com/) and create an organization * Get your **Organization ID** and **Auth Proxy Config ID** from the Turnkey Dashboard ## Install dependencies **Installation** ```bash theme={"system"} git clone https://github.com/Polymarket/turnkey-safe-builder-example.git npm install ``` **Environment Setup** Populate `.env.local`: ```bash theme={"system"} # Polygon RPC endpoint NEXT_PUBLIC_POLYGON_RPC_URL=your_RPC_URL # Turnkey credentials (from turnkey.com dashboard) NEXT_PUBLIC_TURNKEY_ORGANIZATION_ID=your_organization_id NEXT_PUBLIC_TURNKEY_AUTH_PROXY_CONFIG_ID=your_auth_proxy_config_id # Builder credentials (from polymarket.com/settings?tab=builder) POLYMARKET_BUILDER_API_KEY=your_builder_api_key POLYMARKET_BUILDER_SECRET=your_builder_secret POLYMARKET_BUILDER_PASSPHRASE=your_builder_passphrase ``` **Run Development Server** ```bash theme={"system"} npm run dev ``` Open [http://localhost:3000](http://localhost:3000) ## Turnkey Authentication Files: `providers/WalletProvider.tsx`, `providers/WalletContext.tsx` Users authenticate via Turnkey's React Wallet Kit, which handles email login and automatically provisions a non-custodial EOA embedded wallet. No browser extension required. ```typescript theme={"system"} import { TurnkeyProvider, useTurnkey, AuthState } from "@turnkey/react-wallet-kit"; import { createWalletClient, http } from "viem"; import { createAccount } from "@turnkey/viem"; import { polygon } from "viem/chains"; // Wrap your app with TurnkeyProvider {children} // Usage in components: const { handleLogin, logout, authState, wallets, httpClient, session } = useTurnkey(); const authenticated = authState === AuthState.Authenticated; handleLogin(); // Opens Turnkey auth modal // Find embedded wallet and Ethereum account const wallet = wallets.find((w) => w.source === "embedded"); const account = wallet?.accounts?.find((acc) => acc.address?.startsWith("0x")); const eoaAddress = account?.address as `0x${string}`; // Create Turnkey-powered viem account using @turnkey/viem const turnkeyAccount = await createAccount({ client: httpClient, organizationId: session.organizationId, signWith: eoaAddress, ethereumAddress: eoaAddress, }); // Create viem wallet client const walletClient = createWalletClient({ account: turnkeyAccount, chain: polygon, transport: http(POLYGON_RPC_URL), }); ``` ## Builder Config with Remote Signing File `app/api/polymarket/sign/route.ts` Builder credentials are stored server-side and accessed via a remote signing endpoint. This keeps your builder credentials secure while enabling order attribution or relay authentication. **Why remote signing?** * Builder credentials never exposed to client * Secure HMAC signature generation * Required for builder order attribution (with ClobClient) or authentication (RelayClient) ```typescript theme={"system"} // Server-side API route import { BuilderApiKeyCreds, buildHmacSignature, } from "@polymarket/builder-signing-sdk"; const BUILDER_CREDENTIALS: BuilderApiKeyCreds = { key: process.env.POLYMARKET_BUILDER_API_KEY!, secret: process.env.POLYMARKET_BUILDER_SECRET!, passphrase: process.env.POLYMARKET_BUILDER_PASSPHRASE!, }; export async function POST(request: NextRequest) { const { method, path, body } = await request.json(); const sigTimestamp = Date.now().toString(); const signature = buildHmacSignature( BUILDER_CREDENTIALS.secret, parseInt(sigTimestamp), method, path, body ); return NextResponse.json({ POLY_BUILDER_SIGNATURE: signature, POLY_BUILDER_TIMESTAMP: sigTimestamp, POLY_BUILDER_API_KEY: BUILDER_CREDENTIALS.key, POLY_BUILDER_PASSPHRASE: BUILDER_CREDENTIALS.passphrase, }); } ``` ## Safe Deployment File: `hooks/useSafeDeployment.ts` The Safe address is deterministically derived from the user's Turnkey EOA, then deployed if it doesn't exist. **Important:** * Safe address is **deterministic** - same EOA always gets same Safe address * Safe is the "funder" address that holds USDC.e and outcome tokens * One-time deployment per EOA on user's first login * Turnkey handles the signature request ```typescript theme={"system"} import { deriveSafe } from "@polymarket/builder-relayer-client/dist/builder/derive"; import { getContractConfig } from "@polymarket/builder-relayer-client/dist/config"; // Step 1: Derive Safe address (deterministic) const config = getContractConfig(137); // Polygon const safeAddress = deriveSafe(eoaAddress, config.SafeContracts.SafeFactory); // Step 2: Check if Safe is deployed const deployed = await relayClient.getDeployed(safeAddress); // Step 3: Deploy Safe if needed (Turnkey handles signature) if (!deployed) { const response = await relayClient.deploy(); const result = await response.wait(); console.log("Safe deployed at:", result.proxyAddress); } ``` ## Token Approvals Files: `hooks/useTokenApprovals.ts`, `utils/approvals.ts` Before trading, the Safe must approve **multiple contracts** to spend USDC.e and manage outcome tokens. This involves setting approvals for both **ERC-20 (USDC.e)** and **ERC-1155 (outcome tokens)**. **Key Points:** * Uses **batch execution** via `relayClient.execute()` for gas efficiency * Sets **unlimited approvals** (MaxUint256) for ERC-20 tokens * Sets **operator approvals** for ERC-1155 outcome tokens * One-time setup per Safe (persists across sessions) * User signs once to approve all transactions (Turnkey handles signature) * Gasless for the user #### Required Approvals **USDC.e (ERC-20) Approvals:** * CTF Contract: `0x4d97dcd97ec945f40cf65f87097ace5ea0476045` * CTF Exchange: `0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E` * Neg Risk CTF Exchange: `0xC5d563A36AE78145C45a50134d48A1215220f80a` * Neg Risk Adapter: `0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296` **Outcome Token (ERC-1155) Approvals:** * CTF Exchange: `0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E` * Neg Risk CTF Exchange: `0xC5d563A36AE78145C45a50134d48A1215220f80a` * Neg Risk Adapter: `0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296` #### Implementation ```typescript theme={"system"} import { createAllApprovalTxs, checkAllApprovals } from "@/utils/approvals"; // Step 1: Check existing approvals const approvalStatus = await checkAllApprovals(safeAddress); if (approvalStatus.allApproved) { console.log("All approvals already set"); // Skip approval step } else { // Step 2: Create approval transactions const approvalTxs = createAllApprovalTxs(); // Returns array of SafeTransaction objects // Step 3: Execute all approvals in a single batch const response = await relayClient.execute( approvalTxs, "Set all token approvals for trading" ); await response.wait(); console.log("All approvals set successfully"); } ``` #### Approval Transaction Structure Each approval transaction is a `SafeTransaction`: ```typescript theme={"system"} // ERC-20 approval (USDC.e) { to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', // USDC.e address operation: OperationType.Call, data: erc20Interface.encodeFunctionData('approve', [ spenderAddress, MAX_UINT256 // Unlimited approval ]), value: '0' } // ERC-1155 approval (outcome tokens) { to: '0x4d97dcd97ec945f40cf65f87097ace5ea0476045', // CTF Contract address operation: OperationType.Call, data: erc1155Interface.encodeFunctionData('setApprovalForAll', [ operatorAddress, true // Enable operator ]), value: '0' } ``` #### Why Multiple Approvals? Polymarket's trading system uses different contracts for different market types: * **CTF Contract**: Manages outcome tokens (ERC-1155) * **CTF Exchange**: Standard binary markets * **Neg Risk CTF Exchange**: Negative risk markets (mutually exclusive outcomes) * **Neg Risk Adapter**: Converts between neg risk and standard markets Setting all approvals upfront ensures: * Users can trade in any market type * One-time setup (approvals persist across sessions) * Gasless execution via RelayClient * Single user signature for all approvals #### Checking Approvals Before setting approvals, the app checks onchain state: ```typescript theme={"system"} // Check USDC.e approval const allowance = await publicClient.readContract({ address: USDC_E_ADDRESS, abi: ERC20_ABI, functionName: "allowance", args: [safeAddress, spenderAddress], }); const isApproved = allowance >= threshold; // 1000000000000 (1M USDC.e) // Check outcome token approval const isApprovedForAll = await publicClient.readContract({ address: CTF_CONTRACT_ADDRESS, abi: ERC1155_ABI, functionName: "isApprovedForAll", args: [safeAddress, operatorAddress], }); ``` ## Placing Orders File: `hooks/useClobOrder.ts` With the authenticated ClobClient, you can place orders with builder attribution. **Key Points:** * Orders are signed by the user's Turnkey EOA (via `TurnkeyEthersSigner._signTypedData`) * Executed from the Safe address (funder) * Builder attribution is automatic via builderConfig * Gasless execution (no gas fees for users) ```typescript theme={"system"} // Create order const order = { tokenID: "0x...", // Outcome token address price: 0.65, // Price in decimal (65 cents) size: 10, // Number of shares side: "BUY", // or 'SELL' feeRateBps: 0, expiration: 0, // 0 = Good-til-Cancel taker: "0x0000000000000000000000000000000000000000", }; // Submit order (Turnkey handles signature via TurnkeyEthersSigner) const response = await clobClient.createAndPostOrder( order, { negRisk: false }, // Market-specific flag OrderType.GTC ); console.log("Order ID:", response.orderID); ``` **Cancel Order:** ```typescript theme={"system"} await clobClient.cancelOrder({ orderID: "order_id_here" }); ``` ## Conclusion With this integration you can: * Onboard users easily, with a variety of sign-in methods. * Scale with ease. * Create and manage Polymarket orders with order attribution Be sure to see the even more detailed [README](https://github.com/Polymarket/turnkey-safe-builder-example/blob/main/README.md) for more implementation details. # Building on Yield.xyz with Turnkey Source: https://docs.turnkey.com/cookbook/yieldxyz ## Overview [Yield.xyz](https://yield.xyz/) is the ultimate yield infrastructure for Web3, providing one unified API for every yield across 75+ networks. Instead of building and maintaining your own vaults or integrating directly with individual DeFi protocols like Morpho, Aave, or Lido, you can integrate Yield.xyz once and unlock 1,000+ standardized opportunities across staking, lending, and DeFivaults. Yield.xyz’s API is self-custodial by design: it constructs ready-to-sign transactions for yield actions but leaves execution and signing entirely in your control. You fetch opportunities and action flows from Yield.xyz, and have Turnkey sign and broadcast them under your policy-controlled keys. ### Why Yield.xyz instead direct protocol integrations? * **No protocol maintenance** – skip deploying/managing your own vaults or building dozens of one-off integrations. * **Unified API** – discover, enter, exit, manage, and track positions across 75+ chains and 1,500+ yields with one interface. * **Web2 Style UX** — full abstraction of Web3 complexity via Optimized Allocator Vaults (OAVs) which automatically offramp and reinvest any incentive token issued by any protocol. Additional features include charging of deposit, management, and/or performance fees, as well as modules for e.g. cross chain routing. * **Pre-configured OAVs** – instantly offer access to 10–20 standardized and pre-configured Optimized Allocator Vaults (“grab-off-the-shelf”) across popular assets. * **Custom OAVs** – request dedicated OAVs for specific strategies or branded products. * **Monetization** – ability to layer on additional user-level fees per OAV as well as revenue sharing from validators on all staking integrations * *Note: Yield.xyz enforces a minimum 10% fee* * *Note: the validator revenue share is applicable only to PVN members (>30 of the largest validator service providers)* * **Security & control** – Turnkey enforces transaction policies so client keys can only interact with the exact vaults/tokens you allow. By combining Yield.xyz and Turnkey, you deliver a production-ready yield experience in your app with minimal effort: your users can discover, deposit, track, manage, and withdraw – all signed securely with Turnkey. The working example can be found [here](https://github.com/tkhq/sdk/tree/main/examples/with-yield-xyz). *** ## Getting started Follow the [Turnkey Quickstart](https://docs.turnkey.com/getting-started/quickstart) to set up: * **Organization ID** – logical grouping of resources( e.g. users, wallets, policies). * **Root quorum user** – a root user with an API key pair. * **[Non-Root User](https://docs.turnkey.com/concepts/overview#users)** – a secondary user (with its own API key) outside the root quorum. * **Wallet** – hierarchical deterministic (HD) wallet having at least an Ethereum wallet account. * **Turnkey Client & Signer** – initialize a Turnkey client (`TurnkeyClient`) with your API key pair and connect a signer (`TurnkeySigner`) from `@turnkey/ethers` to your RPC provider. After creating a non-root user with a different API key, the next step is to remove it from the root quorum. You can do this from the Turnkey [dashboard](https://app.turnkey.com/dashboard/security/updateRootQuorum) or [API](https://docs.turnkey.com/api-reference/activities/update-root-quorum). Here’s a simple [script](https://github.com/tkhq/sdk/blob/main/examples/kitchen-sink/src/sdk-server/updateRootQuorum.ts) that shows how to update the root quorum using `@turnkey/sdk-server`. Also, make sure you have a wallet with an Ethereum account created within this organization and have it funded with some ETH and USDC on Base Mainnet. Follow the [Yield Project Setup](https://docs.yield.xyz/docs/creating-an-api-key) to create: * **Yield API KEY** – to make authenticated requests to the Yield.xyz API. Once configured, you’ll be able to: 1. **Discover** available yields with `GET /v1/yields`. 2. **Act** on them with `POST /v1/actions/{enter|exit|manage}`. 3. **Track** balances and status with `GET /v1/yields/{id}/balances`  *** ## Setting up the policies for the non-root user Now, we want to use the non-root user for signing transactions to Yield.xyz and restrict it to only be able to interact with the USDC and Yield vault smart contracts. We'll define a new API client that uses the organization’s root user to create the required policies.\ Each policy uses the `eth.tx.data` field to identify which smart contract function is being called. The first four bytes of this field represent the function selector. For the `approve` function, the selector is `0x095ea7b3`; for `deposit` it is `0x6e553f65`; and for `withdraw`, it’s `0xba087652`. This allows the policies to precisely restrict the non-root user to only those permitted contract calls. ```tsx theme={"system"} import { Turnkey } from "@turnkey/sdk-server"; import * as dotenv from "dotenv"; import * as path from "path"; // Load environment variables from `.env.local` dotenv.config({ path: path.resolve(process.cwd(), ".env.local") }); async function main() { const turnkeyClient = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY!, apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY!, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID!, }).apiClient(); // The id of the non-root user that you'll be using to sign the Yield related transactions const userId = process.env.NONROOT_USER_ID!; //approval policy const approvalPolicy = { policyName: "Allow API key user to call the approve function on the USDC_ADDRESS", effect: "EFFECT_ALLOW" as const, consensus: `approvers.any(user, user.id == '${userId}')`, condition: `eth.tx.to == '${process.env.USDC_ADDRESS}' && eth.tx.data[0..10] == '0x095ea7b3'`, notes: "", }; const { policyId: approvalPolicyId } = await turnkeyClient.createPolicy(approvalPolicy); console.log( [ `Created approval policy:`, `- Name: ${approvalPolicy.policyName}`, `- Policy ID: ${approvalPolicyId}`, `- Effect: ${approvalPolicy.effect}`, `- Consensus: ${approvalPolicy.consensus}`, `- Condition: ${approvalPolicy.condition}`, ``, ].join("\n"), ); //deposit policy const depositPolicy = { policyName: "Allow API key user to call the deposit function on the gtUSDCf_VAULT_ADDRESS", effect: "EFFECT_ALLOW" as const, consensus: `approvers.any(user, user.id == '${userId}')`, condition: `eth.tx.to == '${process.env.gtUSDCf_VAULT_ADDRESS}' && eth.tx.data[0..10] == '0x6e553f65'`, notes: "", }; const { policyId: depositPolicyId } = await turnkeyClient.createPolicy(depositPolicy); console.log( [ `Created deposit policy:`, `- Name: ${depositPolicy.policyName}`, `- Policy ID: ${depositPolicyId}`, `- Effect: ${depositPolicy.effect}`, `- Consensus: ${depositPolicy.consensus}`, `- Condition: ${depositPolicy.condition}`, ``, ].join("\n"), ); //withdraw policy const withdrawPolicy = { policyName: "Allow API key user to call the withdraw function on the gtUSDCf_VAULT_ADDRESS", effect: "EFFECT_ALLOW" as const, consensus: `approvers.any(user, user.id == '${userId}')`, condition: `eth.tx.to == '${process.env.gtUSDCf_VAULT_ADDRESS}' && eth.tx.data[0..10] == '0xba087652'`, notes: "", }; const { policyId: withdrawPolicyId } = await turnkeyClient.createPolicy(withdrawPolicy); console.log( [ `Created withdraw policy:`, `- Name: ${withdrawPolicy.policyName}`, `- Policy ID: ${withdrawPolicyId}`, `- Effect: ${withdrawPolicy.effect}`, `- Consensus: ${withdrawPolicy.consensus}`, `- Condition: ${withdrawPolicy.condition}`, ``, ].join("\n"), ); } main().catch((error) => { console.error(error); process.exit(1); }); ``` *** ## Discover a yield (with metadata) Discovery is just a read to the Yield.xyz API — Turnkey doesn’t change this step. You’ll typically do it server-side (to keep your Yield API key secret), then surface the results to your app where you’ll later enter using your Turnkey signer. **Example: USDC yields on Base** ```tsx theme={"system"} const res = await fetch( 'https://api.yield.xyz/v1/yields?network=base&token=USDC&limit=10', { headers: { 'X-API-KEY': process.env.YIELD_API_KEY! } } ); const result = (await res.json()) as any; const items = result.items // pick one yield const selected = items[0]; const YIELD_ID = selected.id; // metadata is included in the object const apy = selected.rewardRate; const token = selected.token; const metadata = selected.metadata; ``` *** ## Exemplary Yields To simplify integration, Yield.xyz provides a set of **ready-to-use yields** across both **Stablecoins**/**DeFi** and **staking** — designed to offer clean UX, consistent APIs, and monetization support. These yields are already live and have seen significant adoption across our clients. *** **Stablecoin/DeFi Yields** The Stablecoin/DeFi yields provided here are wrapped using **Optimized Allocator Vaults (OAVs)**, which automatically handle: * Incentive off-ramping & reinvestment * Asset wrapping (where applicable) * Fee charging (performance, management, deposit) This makes OAVs unique: they **enable fee capture for partners while simultaneously simplifying the user experience**, ensuring yield products feel as seamless as mainstream fintech offerings. We’ve deployed two sets of OAVs with pre-configured fees — available via API Keys: * 10% fee OAVs: `4bea9274-7cef-4e43-995b-f35147469ede` * 20% fee OAVs: `e35de2d4-93e2-4cf8-b016-b0838fec1f20` For reference, the expanded list of yields most popular among existing clients (already wrapped into OAVs) can be found **[here](https://docs.yield.xyz/docs/off-the-shelf-oavs#/).** | Yield ID | Yield Name | Protocol | Monetization | | --------------------------------------------------------------------------- | --------------------- | -------- | ----------------------------------------------- | | arbitrum-usdc-gtusdcc-0x7e97fa6893871A2751B5fE961978DCCb2c201E65-4626-vault | Gauntlet USDC Core | Morpho | Available deposit, performance, management fees | | ethereum-usds-susds-0xa3931d71877c0e7a3148cb7eb4463524fec27fbd-4626-vault | USDS Sky Savings Rate | Sky | Available deposit, performance, management fees | | ethereum-usdc-fusdc-0x9Fb7b4477576Fe5B32be4C1843aFB1e55F251B33-4626-vault | Fluid USDC Vault | Fluid | Available deposit, performance, management fees | | base-usdc-smusdc-0x616a4e1db48e22028f6bbf20444cd3b8e3273738-4626-vault | Seamless USDC Vault | Morpho | Available deposit, performance, management fees | | base-usdc-aave-v3-lending | USDC Aave Lending | Aave | Available deposit, performance, management fees | **Staking Yields** These staking yields are accessible via Yield.xyz, which: * Enables delegations to any active validator * Supports **validator revenue sharing** (50–85% of validator fees) with preferred validators * Standardizes interactions across networks (undelegation, cooldowns, reward tracking) | Yield ID | Network | Exemplary Validator | Validator Address | Monetization | | ---------------------------------------- | ----------- | ------------------- | ---------------------------------------------------- | ------------------------------ | | solana-sol-native-multivalidator-staking | Solana | Meria | H2tJNyMHnRF6ahCQLQ1sSycM4FGchymuzyYzUqKEuydk | Deposit fees and revenue share | | tron-trx-native-staking | Tron | Luganodes | TGyrSc9ZmTdbYziuk1SKEmdtCdETafewJ9 | Revenue share | | bsc-bnb-native-staking | Binance | Figment | 0x477cB5d87144b2a6d93f72e32f5E01a459260D68 | Revenue share | | ethereum-eth-everstake-staking | Ethereum | Everstake | N/A | Revenue share | | ethereum-eth-figment-staking | Ethereum | Figment | N/A | Revenue share | | hyperevm-hype-native-staking | Hyperliquid | Meria | 0x950f8dd5e5030e1fa6ad2cdc4295809d185925d0 | Revenue share | | cosmos-atom-native-staking | Cosmos | Chorus One | cosmosvaloper15urq2dtp9qce4fyc85m6upwm9xul3049e02707 | Deposit fees and revenue share | The full list of staking yields can be found [in the Yield.xyz docs](https://docs.yield.xyz/docs/staking-yields#/). **Full Yield List** For the full list of live yields (DeFi + staking), you can: → View the [Yield.xyz Dashboard](https://yields-dashboard.yield.xyz/) → Query via the [Yield API](https://docs.yield.xyz/reference/yieldscontroller_getyield) as showcased in the above “Discover a yield” section. *** ## Enter the yield (deposit via Yield.xyz) First, we’ll call the Yield.xyz `POST /v1/actions/enter` endpoint to get the transactions required to enter the Morpho USDC vault on Base. We need to specify the yield ID for this vault, the amount to deposit, and our wallet address. For example, Yield.xyz’s identifier for Morpho’s Base USDC vault might be `"base-usdc-gtusdcf-0x236919f11ff9ea9550a4287696c2fc9e18e6e890-4626-vault"`(you can discover yield IDs via the Yield.xyz API or docs). We’ll deposit 0.5 USDC in this example. The code below calls the Yield.xyz API (using a fetch request; you could also use Yield.xyz’s [SDK](https://www.npmjs.com/package/@stakekit/api-hooks)) and retrieves the transactions. It then uses the non-root Turnkey user to sign and send each transaction in sequence: ```tsx theme={"system"} import * as path from "path"; import * as dotenv from "dotenv"; import { ethers } from "ethers"; import { TurnkeySigner } from "@turnkey/ethers"; import { Turnkey as TurnkeyServerSDK } from "@turnkey/sdk-server"; // Load environment variables from `.env.local` dotenv.config({ path: path.resolve(process.cwd(), ".env.local") }); async function main() { // Initialize the Turnkey client const turnkeyClient = new TurnkeyServerSDK({ apiBaseUrl: "https://api.turnkey.com", apiPublicKey: process.env.NONROOT_API_PUBLIC_KEY!, apiPrivateKey: process.env.NONROOT_API_PRIVATE_KEY!, defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID!, }); // Initialize the Turnkey Signer const turnkeySigner = new TurnkeySigner({ client: turnkeyClient.apiClient(), organizationId: process.env.TURNKEY_ORGANIZATION_ID!, signWith: process.env.SIGN_WITH!, }); const provider = new ethers.JsonRpcProvider(process.env.RPC_URL!); const connectedSigner = turnkeySigner.connect(provider); // Prepare entry via Yield.xyz const depositAmount = "0.5"; const enterPayload = { yieldId: process.env.YIELD_ID!, // e.g."base-usdc-gtusdcf-0x236919f11ff9ea9550a4287696c2fc9e18e6e890-4626-vault" address: process.env.SIGN_WITH!, arguments: { amount: depositAmount }, }; const enterRes = await fetch("https://api.yield.xyz/v1/actions/enter", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": process.env.YIELD_API_KEY!, }, body: JSON.stringify(enterPayload), }); const action = await enterRes.json(); console.log("Yield API response:", JSON.stringify(action, null, 2)); // Sign and broadcast each transaction step for (const tx of action.transactions) { const unsignedTx = JSON.parse(tx.unsignedTransaction); const sent = await connectedSigner.sendTransaction({ to: unsignedTx.to, data: unsignedTx.data, value: unsignedTx.value ?? "0x0", chainId: unsignedTx.chainId, }); console.log("Broadcasted tx:", sent.hash); await sent.wait(); //waiting for the approve transaction to be mined } } main().catch((err) => { console.error("Error running Yield deposit example:", err); process.exit(1); }); ``` In the above flow, the first transaction is an ERC-20 approval allowing the vault contract to spend 0.5 USDC on our behalf, and the second is the actual deposit into the vault. Yield.xyz figured out these steps for us – we didn’t have to manually craft the token `approve` or vault `deposit` call (no need to find contract ABIs or addresses ourselves). After executing these, our USDC is now deposited and earning yield in the vault. ## Check user balance After depositing, we can query the Yield.xyz API to confirm our position and even fetch the current yield stats. Yield.xyz provides a portfolio endpoint to get a unified view of a user’s balances in any yield. ```tsx theme={"system"} const balanceRes = await fetch( `https://api.yield.xyz/v1/yields/${yieldId}/balances`, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": process.env.YIELD_API_KEY!, }, body: JSON.stringify({ address: turnkeyAccount.address }), } ); const balances = await balanceRes.json(); console.log("Vault balances:", JSON.stringify(balances, null, 2)); ``` The response will include the amount of USDC we have active in the vault (and any pending yield or rewards). For instance, it might show an active balance of \~0.5 USDC, and possibly any claimable rewards if applicable, all in one payload. Yield.xyz normalizes these outputs across all yields, so even if we were querying a staking position or another DeFi protocol, the format would be consistent. ## Exit the yield (withdraw funds) Yield.xyz’s `POST /v1/actions/exit` endpoint returns the transaction data required to perform a withdrawal. Similar to the enter action, you specify the yield ID, your wallet address, and the withdrawal amount. ```tsx theme={"system"} const exitPayload = { yieldId: process.env.YIELD_ID! , address: process.env.SIGN_WITH!, arguments: { amount: "0.1" }, }; const exitRes = await fetch("https://api.yield.xyz/v1/actions/exit", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": process.env.YIELD_API_KEY!, }, body: JSON.stringify(exitPayload), }); const exitAction = await exitRes.json(); for (const tx of exitAction.transactions) { const unsignedTx = JSON.parse(tx.unsignedTransaction); const sent = await connectedSigner.sendTransaction({ to: unsignedTx.to, data: unsignedTx.data, value: unsignedTx.value ?? '0x0', chainId: unsignedTx.chainId }); console.log("Withdraw tx:", sent.hash); } ``` In the first step, we requested to withdraw 0.1 USDC. Yield.xyz returned the appropriate transaction (a call to the vault’s `withdraw` function under the hood). We sent it with our Turnkey signer, and once mined, \~0.1 USDC would be back in our wallet. *** ## Monetization Monetization of yield interactions is possible on multiple levels depending on the yield type: * **Staking.** * **Deposit Fees**: Leverage **FeeWrapper contracts** (EVM) and **atomic fee transfer mechanisms** (non-EVM) to deduct a percentage of the deposit and transfer it to the recipient in the same transaction. * **Revenue Share:** [Yield.xyz](http://yield.xyz/) has agreements with 30+ validator service providers, entitling clients to a portion of validator revenues (typically 50%–85%). * [Validator revenue share overview](https://www.notion.so/2695318e934e80cea8b1ccb00ac835c0?pvs=21) * **DeFi.** * **Revenue Share:** Some major protocols and curators provide revenue share on deposits via the [Yield.xyz](http://yield.xyz/) API. * [DeFi revenue share overview](https://www.notion.so/25b5318e934e803eab5cccfc941a6ba8?pvs=21) * **User-Facing Fees via OAVs:** * **Optimized Allocator Vaults (OAVs)** allow deposit, performance, and management fees to be configured at the user level. * **Performance Fees:** Charged on realized profits. * **Management Fees:** Flat annualized rate applied on AUM. * **Deposit Fees:** Automatically deducted at the time of deposit. You can identify which monetization options apply to a given yield in the yield metadata, specifically the `possibleFeeTakingMechanisms` object → [API Reference](https://docs.yield.xyz/reference/yieldscontroller_getyield#/) ### **Web2 UX via OAVs** Beyond monetization, **OAVs deliver a Web2-grade experience for Web3 yields.** * **Automatic Off-Ramping & Reinvestment:** Incentive tokens are automatically off-ramped into the deposit asset and reinvested, ensuring users earn pure yield in their deposit token. * **Automatic Wrapping/Swapping:** Complex asset flows are handled automatically, reducing friction and mirroring the simplicity of Web2 fintech apps. * **Unified UX:** End-users interact only with their deposit asset — no juggling of dozens of reward tokens, no manual reinvestments. This makes OAVs unique: they **enable fee capture for partners while simultaneously simplifying the user experience**, ensuring yield products feel as seamless as mainstream fintech offerings.For reference, the yields most popular among existing clients (already wrapped into OAVs) can be found [\*\*here](https://docs.google.com/spreadsheets/d/1_GphMivV3ebN4-SHlviYx9eyweceI7ple6KmpAajcMY/edit?gid=524025543#gid=524025543).\*\* We’ve deployed two sets of OAVs with pre-configured fees — available via API Keys: * 10% fee OAVs: `4bea9274-7cef-4e43-995b-f35147469ede` * 20% fee OAVs: `e35de2d4-93e2-4cf8-b016-b0838fec1f20` *** ## **Conclusion** With this integration you can: * **Discover** yield opportunities across 70+ networks. * **Enter** and **Exit** with standardized transactions. * **Track** balances and rewards. * Use Turnkey’s **policy engine** to ensure signing operations can only interact with the intended smart contracts. All transactions are constructed by Yield.xyz for the selected yield opportunities and signed with Turnkey — no need to write custom contract logic or manage ABIs. Partners can start with baseline access to public validator delegation and curated OAVs, then request custom OAVs with client-specific fee structures (in addition to the minimum 10% platform fee). This lets you go to market with yield in days, not months — with more revenue, less engineering overhead, and stronger security guarantees than building and maintaining protocol integrations yourself. # Errors Source: https://docs.turnkey.com/developer-reference/api-overview/errors Error codes, messages, and troubleshooting guide for the Turnkey API. An error returned by the Turnkey API might look something like this: ```bash theme={"system"} Turnkey error 3: organization mismatch: request is targeting organization ("USER SUB ORG"), but voters are in organization ("OUR MAIN ORG") (Details: [{"@type":"type.googleapis.com/errors.v1.TurnkeyErrorDetail","turnkeyErrorCode":"ORGANIZATION_MISMATCH"}]) ``` Within this error message there are a few different parts that are worth breaking down. First the GRPC Error code: ```bash theme={"system"} Turnkey error 3: ``` This GRPC error wraps what we call a Turnkey Error which looks something like: ```bash theme={"system"} organization mismatch: request is targeting organization ("USER SUB ORG"), but voters are in organization ("OUR MAIN ORG") ``` And when available, a `turnkeyErrorCode` in the Details section: ```bash theme={"system"} (Details: [{"@type":"type.googleapis.com/errors.v1.TurnkeyErrorDetail","turnkeyErrorCode":"ORGANIZATION_MISMATCH"}]) ``` ## Error Handling Best Practices What matters most for error handling is the **Turnkey Error**: the human-readable message and `turnkeyErrorCode` (when available). You should **not** perform error handling based on the GRPC code - these are used internally and will eventually be removed. More on that [here](#grpc-error-codes). **Understanding TurnkeyErrorCodes:** These codes represent **categories** of errors, not specific messages. For example, `SIGNATURE_INVALID` may appear with messages like "could not verify WebAuthn signature" or "could not verify api key signature". Use the `turnkeyErrorCode` to identify the error category programmatically, and use the human-readable message for specific details. ### Available TurnkeyErrorCodes The following error codes may be returned in error details: | Code | Description | | :------------------------------- | :---------------------------------------------------------------------------------------------------------------- | | `UNSPECIFIED` | Error code not specified | | `INTERNAL` | Internal server error | | `ORGANIZATION_NOT_FOUND` | The specified organization could not be found | | `API_OPERATIONS_DISABLED` | Global API access is temporarily disabled | | `SIGNING_QUOTA_EXCEEDED` | Organization has exceeded its signing quota and cannot execute activities | | `REQUEST_NOT_AUTHORIZED` | Request is not authorized - may occur when accessing resources outside permissions or beyond session restrictions | | `PUBLIC_KEY_NOT_FOUND` | Public key could not be found in the organization or its parent | | `RATE_LIMIT_EXCEEDED` | Organization has been rate limited and cannot execute activities | | `SIGNATURE_MISSING` | Required authentication signature is missing from the request | | `SIGNATURE_INVALID` | Could not verify API key or WebAuthn signature | | `CREDENTIAL_NOT_FOUND` | Credential or WebAuthn authenticator not found in organization or its parent | | `CREDENTIAL_CONFLICT` | Multiple sub-organizations are associated with this credential, creating ambiguous authentication | | `API_KEY_EXPIRED` | The API key has expired and can no longer be used | | `REQUEST_INVALID` | Request contains invalid or missing required parameters | | `FORBIDDEN` | User does not have permission to view or access this organization | | `UNAUTHENTICATED` | Authentication failed - request lacks valid authentication credentials | | `UNSUPPORTED_TRANSACTION_TYPE` | Transaction type is not supported (supported: Ethereum, Solana, Tron, Bitcoin, Tempo) | | `INVALID_TRANSACTION` | Transaction structure is invalid (e.g., too many addresses in Solana transaction) | | `INVALID_OIDC_TOKEN` | OIDC token is invalid or missing required claims (aud, sub, iss) | | `INVALID_ORGANIZATION_ID` | Organization ID is invalid or malformed (must be a valid UUID) | | `OAUTH2_CREDENTIAL_NOT_FOUND` | The specified OAuth 2.0 credential could not be found | | `OAUTH2_PROVIDER_NOT_FOUND` | The specified OAuth 2.0 provider could not be found | | `INVALID_OAUTH2_PROVIDER` | OAuth 2.0 provider configuration is invalid or misconfigured | | `OAUTH2_PROVIDER_NOT_CONFIGURED` | OAuth 2.0 provider has not been configured for this organization | | `INVALID_ACTIVITY_CALLER` | This activity cannot be called by sub-organizations | | `WALLET_ACCOUNT_NOT_EXPORTED` | Wallet account has not been exported and cannot be deleted without export | | `INVALID_TIME` | Time range is invalid or results in excessive intervals | | `RPC_CALL_ERROR` | RPC provider communication error | | `INVALID_EMAIL` | Email address is invalid - check format, domain, and TLD (Top-Level Domain) | | `INVALID_FQDN` | Email domain could not be reached or verified | | `OAUTH_PROVIDER_ALREADY_EXISTS` | OAuth provider with same audience, subject, and issuer already exists | | `EMAIL_SENDING_DISABLED` | Email sending functionality is currently disabled | Not all errors currently include a `turnkeyErrorCode`, though we aim to include one in all customer-facing errors. If you encounter an error where you would expect a `turnkeyErrorCode` but don't see one, please contact Turnkey support. ## Detailed Error Messages The below table enumerates common errors across different actions that can be taken using the API. It contains GRPC codes, HTTP codes, and error messages. More on GRPC error codes [below](#grpc-error-codes). Click on the message to view detailed explanation of possible causes and troubleshooting tips for that specific error. | GRPC Code | HTTP Code | Message | | :---------------- | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | InvalidArgument | 400 | [malformed organization ID provided](#malformed-organization-id-provided) | | InvalidArgument | 400 | [bad request body](#bad-request-body) | | InvalidArgument | 400 | [failed to load organizations](#failed-to-load-organizations) | | InvalidArgument | 400 | [policy label must be unique](#policy-label-must-be-unique) | | InvalidArgument | 400 | [invalid policy consensus](#invalid-policy-consensus) | | InvalidArgument | 400 | [invalid policy condition](#invalid-policy-condition) | | InvalidArgument | 400 | [quorum threshold must be non-zero integer](#quorum-threshold-must-be-non-zero-integer) | | InvalidArgument | 400 | [quorum users missing](#quorum-users-missing) | | InvalidArgument | 400 | [invalid api key expiration](#invalid-api-key-expiration) | | InvalidArgument | 400 | [missing parameter: user authenticator attestation](#missing-parameter-user-authenticator-attestation) | | InvalidArgument | 400 | [invalid authenticator attestation](#invalid-authenticator-attestation) | | InvalidArgument | 400 | [missing parameter: user authenticator attestation auth data](#missing-parameter-user-authenticator-attestation-auth-data) | | InvalidArgument | 400 | [missing wallet params](#missing-wallet-params) | | InvalidArgument | 400 | [invalid path format](#invalid-path-format) | | InvalidArgument | 400 | [invalid path](#invalid-path) | | InvalidArgument | 400 | [invalid address format](#invalid-address-format) | | InvalidArgument | 400 | [invalid curve](#invalid-curve) | | InvalidArgument | 400 | [curve required](#curve-required) | | InvalidArgument | 400 | [invalid payload encoding](#invalid-payload-encoding) | | InvalidArgument | 400 | [invalid hash function](#invalid-hash-function) | | InvalidArgument | 400 | [invalid magic link template](#invalid-magic-link-template) | | InvalidArgument | 400 | [failed to get email template contents](#failed-to-get-email-template-contents) | | InvalidArgument | 400 | [failed to unmarshal template variables](#failed-to-unmarshal-template-variables) | | InvalidArgument | 400 | [organization mismatch](#organization-mismatch) | | InvalidArgument | 400 | [invalid wallet account UUID](#invalid-wallet-account-uuid) | | InvalidArgument | 400 | [wallet account not part of your organization](#wallet-account-not-part-of-your-organization) | | InvalidArgument | 400 | [wallet account has not been exported](#wallet-account-has-not-been-exported) | | InvalidArgument | 400 | [invalid OIDC token](#invalid-oidc-token) | | InvalidArgument | 400 | [invalid email address](#invalid-email-address) | | InvalidArgument | 400 | [could not reach email](#could-not-reach-email) | | InvalidArgument | 400 | [auth\_code must be set](#oauth2-parameter-errors) | | InvalidArgument | 400 | [code\_verifier must be set](#oauth2-parameter-errors) | | InvalidArgument | 400 | [oauth2\_credential\_id must be set](#oauth2-parameter-errors) | | InvalidArgument | 400 | [redirect\_uri must be set](#oauth2-parameter-errors) | | InvalidArgument | 400 | [client\_id must be set](#oauth2-parameter-errors) | | Unauthenticated | 401 | [no valid authentication signature found for request](#no-valid-authentication-signature-found-for-request) | | Unauthenticated | 401 | [could not find public key in organization](#could-not-find-public-key-in-organization) | | Unauthenticated | 401 | [failed while looking up public key in parent organization](#failed-while-looking-up-public-key-in-parent-organization) | | Unauthenticated | 401 | [could not find public key in organization or its parent organization](#could-not-find-public-key-in-organization-or-its-parent-organization) | | Unauthenticated | 401 | [could not verify WebAuthN signature](#could-not-verify-webauthn-signature) | | Unauthenticated | 401 | [credential ID could not be found in organization or its parent organization](#credential-id-could-not-be-found-in-organization-or-its-parent-organization) | | Unauthenticated | 401 | [public key could not be found in organization or its parent organization](#public-key-could-not-be-found-in-organization-or-its-parent-organization) | | Unauthenticated | 401 | [more than one suborg associated with a credential ID](#more-than-one-suborg-associated-with-a-credential-id) | | Unauthenticated | 401 | [more than one suborg associated with a public key](#more-than-one-suborg-associated-with-a-public-key) | | Unauthenticated | 401 | [could not verify api key signature](#could-not-verify-api-key-signature) | | Unauthenticated | 401 | [expired api key](#expired-api-key) | | Unauthenticated | 401 | [malformed activity stamp](#malformed-activity-stamp) | | Unauthenticated | 401 | [could not extract webauthn stamp](#could-not-extract-webauthn-stamp) | | Unauthenticated | 401 | [could not extract api key stamp](#could-not-extract-api-key-stamp) | | Unauthenticated | 401 | [cannot authenticate public API activity request without a stamp (X-Stamp/X-Stamp-Webauthn header)](#cannot-authenticate-public-api-activity-request-without-a-stamp-x-stampx-stamp-webauthn-header) | | PermissionDenied | 403 | [request not authorized](#request-not-authorized) | | PermissionDenied | 403 | [api operations disabled](#api-operations-disabled) | | PermissionDenied | 403 | [authentication failed](#authentication-failed) | | NotFound | 404 | [webauthn authenticator not found in organization](#webauthn-authenticator-not-found-in-organization) | | NotFound | 404 | [webauthn authenticator not found in organization or parent organization](#webauthn-authenticator-not-found-in-organization-or-parent-organization) | | NotFound | 404 | [no organization found with the given ID](#no-organization-found-with-the-given-id) | | NotFound | 404 | [No activity found with fingerprint. Consensus activities must target an existing activity by fingerprint](#no-activity-found-with-fingerprint-consensus-activities-must-target-an-existing-activity-by-fingerprint) | | ResourceExhausted | 429 | [user has exceeded maximum authenticators](#user-has-exceeded-maximum-authenticators) | | ResourceExhausted | 429 | [user has exceeded maximum long-lived api keys](#user-has-exceeded-maximum-long-lived-api-keys) | | ResourceExhausted | 429 | [user has exceeded maximum short-lived api keys](#user-has-exceeded-maximum-short-lived-api-keys) | | ResourceExhausted | 429 | [this organization cannot execute activities because it is over its allotted quota. Please reach out to the Turnkey team (help@turnkey.com) for more information.](#this-organization-cannot-execute-activities-because-it-is-over-its-allotted-quota-please-reach-out-to-the-turnkey-team-helpturnkeycom-for-more-information) | | ResourceExhausted | 429 | [this sub-organization cannot execute activities because its parent is over its allotted quota. Please reach out to the Turnkey team (help@turnkey.com) for more information.](#this-sub-organization-cannot-execute-activities-because-its-parent-is-over-its-allotted-quota-please-reach-out-to-the-turnkey-team-helpturnkeycom-for-more-information) | | ResourceExhausted | 429 | [this organization cannot execute activities because it has been rate limited. Please reach out to the Turnkey team (help@turnkey.com) for more information.](#this-organization-cannot-execute-activities-because-it-has-been-rate-limited-please-reach-out-to-the-turnkey-team-helpturnkeycom-for-more-information) | | ResourceExhausted | 429 | [this sub-organization cannot execute activities because its parent has been rate limited. Please reach out to the Turnkey team (help@turnkey.com) for more information.](#this-sub-organization-cannot-execute-activities-because-its-parent-has-been-rate-limited-please-reach-out-to-the-turnkey-team-helpturnkeycom-for-more-information) | | Internal | 500 | [internal server error](#internal-server-error) | ## GRPC Error Codes Turnkey uses GRPC internally to communicate with our internal services whenever an API request is made. Due to this some errors will be wrapped with GRPC error messages. These error codes are listed below for your convenience, however these will not remain in Turnkey error messages forever and you should **not** do error handling based on these codes as these could be removed at any time. In the following example `Turnkey error 3:` represents a grpc error (error code 3, INVALID\_ARGUMENT) wrapping a Turnkey error. Example ```bash theme={"system"} Turnkey error 3: organization mismatch: request is targeting organization ("USER SUB ORG"), but voters are in organization ("OUR MAIN ORG") ``` ### GRPC Status Codes Reference | Code | Number | Description | | -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | OK | 0 | Not an error; returned on success. | | CANCELLED | 1 | The operation was cancelled, typically by the caller. | | UNKNOWN | 2 | Unknown error. For example, this error may be returned when a `Status` value received from another address space belongs to an error space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error. | | INVALID\_ARGUMENT | 3 | The client specified an invalid argument. Note that this differs from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). | | DEADLINE\_EXCEEDED | 4 | The deadline expired before the operation could complete. For operations that change the state of the system, this error may be returned even if the operation has completed successfully. For example, a successful response from a server could have been delayed long | | NOT\_FOUND | 5 | Some requested entity (e.g., file or directory) was not found. Note to server developers: if a request is denied for an entire class of users, such as gradual feature rollout or undocumented allowlist, `NOT_FOUND` may be used. If a request is denied for some users within a class of users, such as user-based access control, `PERMISSION_DENIED` must be used. | | ALREADY\_EXISTS | 6 | The entity that a client attempted to create (e.g., file or directory) already exists. | | PERMISSION\_DENIED | 7 | The caller does not have permission to execute the specified operation. `PERMISSION_DENIED` must not be used for rejections caused by exhausting some resource (use `RESOURCE_EXHAUSTED` instead for those errors). `PERMISSION_DENIED` must not be used if the caller can not be identified (use `UNAUTHENTICATED` instead for those errors). This error code does not imply the request is valid or the requested entity exists or satisfies other pre-conditions. | | RESOURCE\_EXHAUSTED | 8 | Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space. | | FAILED\_PRECONDITION | 9 | The operation was rejected because the system is not in a state required for the operation's execution. For example, the directory to be deleted is non-empty, an rmdir operation is applied to a non-directory, etc. Service implementors can use the following guidelines to decide between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: (a) Use `UNAVAILABLE` if the client can retry just the failing call. (b) Use `ABORTED` if the client should retry at a higher level (e.g., when a client-specified test-and-set fails, indicating the client should restart a read-modify-write sequence). (c) Use `FAILED_PRECONDITION` if the client should not retry until the system state has been explicitly fixed. E.g., if an "rmdir" fails because the directory is non-empty, `FAILED_PRECONDITION` should be returned since the client should not retry unless the files are deleted from the directory. | | ABORTED | 10 | The operation was aborted, typically due to a concurrency issue such as a sequencer check failure or transaction abort. See the guidelines above for deciding between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`. | | OUT\_OF\_RANGE | 11 | The operation was attempted past the valid range. E.g., seeking or reading past end-of-file. Unlike `INVALID_ARGUMENT`, this error indicates a problem that may be fixed if the system state changes. For example, a 32-bit file system will generate `INVALID_ARGUMENT` if asked to read at an offset that is not in the range \[0,2^32-1], but it will generate `OUT_OF_RANGE` if asked to read from an offset past the current file size. There is a fair bit of overlap between `FAILED_PRECONDITION` and `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific error) when it applies so that callers who are iterating through a space can easily look for an `OUT_OF_RANGE` error to detect when they are done. | | UNIMPLEMENTED | 12 | The operation is not implemented or is not supported/enabled in this service. | | INTERNAL | 13 | Internal errors. This means that some invariants expected by the underlying system have been broken. This error code is reserved for serious errors. | | UNAVAILABLE | 14 | The service is currently unavailable. This is most likely a transient condition, which can be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations. | | DATA\_LOSS | 15 | Unrecoverable data loss or corruption. | | UNAUTHENTICATED | 16 | The request does not have valid authentication credentials for the operation. | Source: [https://grpc.io/docs/guides/status-codes/](https://grpc.io/docs/guides/status-codes/) ## Troubleshooting ### no organization found with the given ID Common causes: * An unknown organization ID was passed in a request made to the Turnkey API Troubleshooting tips: * Confirm that you are using the proper Organization ID. All Turnkey resources are identified with a UUID, so confirm you are not passing a different resource's UUID as the organization ID in your request. ### malformed organization ID provided Common causes: * An improperly formatted organization ID UUID was passed in a request made to the Turnkey API Troubleshooting tips: * Confirm the the UUID conforms to the UUID standard `XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` ### bad request body Common causes: * A malformed request body was passed in a request made to the Turnky API Troubleshooting tips: * A typical activity request has the `type`, `timestampMS`, and `organizationId` parameters at the top level and then a `parameters` parameter with more specific parameters based on the request type. For example a CREATE\_WALLET activity request body might look something like this: ```json theme={"system"} { "type": "ACTIVITY_TYPE_CREATE_WALLET", "timestampMs": "", "organizationId": "string", "parameters": { "walletName": "string", "accounts": [ { "curve": "CURVE_SECP256K1", "pathFormat": "PATH_FORMAT_BIP32", "path": "string", "addressFormat": "ADDRESS_FORMAT_UNCOMPRESSED" } ], "mnemonicLength": 0 } } ``` * A get resource request body might look slightly different with less fields. An example of a GET\_WALLET request body looks something like this: ```json theme={"system"} { "organizationId": "string", "walletId": "string" } ``` ### api operations disabled Common causes: * Turnkey has disabled API operations globally. Troubleshooting tips: * This situation will only happen in the most extreme case and should not be something you need to worry about. ### this organization cannot execute activities because it is over its allotted quota. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: * You have exceeded your monthly signing quota. The first 25 signatures a month are free for "free" users. * You have reached a resource limit on a particular resource. You can find out about our resource limits [here](/concepts/resource-limits). Troubleshooting tips: * If you need to increase your signature limit take a look at our [pricing page](https://www.turnkey.com/pricing) and contact us at [help@turnkey.com](mailto:help@turnkey.com)! * Resource limits are imposed globally and cannot be increased, speak with our team at [help@turnkey.com](mailto:help@turnkey.com) to understand how to better integrate Turnkey with your system to utilize Turnkey to its highest potential. ### this sub-organization cannot execute activities because its parent is over its allotted quota. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: * You have exceeded your monthly signing quota. The first 25 signatures a month are free for "free" users. * You have reached a resource limit on a particular resource. You can find out about our resource limits [here](/concepts/resource-limits). Troubleshooting tips: * If you need to increase your signature limit take a look at our [pricing page](https://www.turnkey.com/pricing) and contact us at [help@turnkey.com](mailto:help@turnkey.com)! * Resource limits are imposed globally and cannot be increased, speak with our team at [help@turnkey.com](mailto:help@turnkey.com) to understand how to better integrate Turnkey with your system to utilize Turnkey to its highest potential. ### this organization cannot execute activities because it has been rate limited. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: * You have exceeded your rate limit. We need to maintain a per-customer rate limit to ensure that the service we provide to all of our customers service can be exceptional. Troubleshooting tips: * If you are interested in increasing your rate limit reach out to us at [help@turnkey.com](mailto:help@turnkey.com)! ### this sub-organization cannot execute activities because its parent has been rate limited. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: * You have exceeded your rate limit. We need to maintain a per-customer rate limit to ensure that the service we provide to all of our customers service can be exceptional. Troubleshooting tips: * If you are interested in increasing your rate limit reach out to us at [help@turnkey.com](mailto:help@turnkey.com)! ### request not authorized Common causes: * A user that created a request is not allowed to complete the action that was requested. * For example a parent-organization trying to create a wallet within a sub-organization that does not have a delegated access API key. Troubleshooting tips: * Confirm that you are using the correct credentials for the request you are making. * Confirm that all necessary [policies](/concepts/policies/overview) are in place so that the action that is requested can be performed. ### no valid authentication signature found for request Common causes: * No signature, or [stamp](/developer-reference/api-overview/stamps), is attached to a request. All requests made to Turnkey's api must be stamped so that Turnkey can authenticate and authorize the user who performed the request. Troubleshooting tips: * Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some information about stamps, what they are, and how they are created. * At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### could not find public key in organization Common causes: * The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticators to the organization you are targeting. * Ensure that you are targeting the proper organization. ### failed while looking up public key in parent organization Common causes: * The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticators to the organization you are targeting. * Ensure that you are targeting the proper organization. ### could not find public key in organization or its parent organization Common causes: * The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticators to the organization you are targeting. * Ensure that you are targeting the proper organization. ### could not verify WebAuthN signature Common causes: * The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. Again this means the request is formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticators to the organization you are targeting. * Ensure that you are targeting the proper organization. ### credential ID could not be found in organization or its parent organization Common causes: * Turnkey cannot translate a public key obtained from a stamp that was created with a WebAuthn authenticator to a parent organization or one of its corresponding sub-organizations that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticators to the organization you are targeting. * Ensure that you are targeting the proper organization. ### public key could not be found in organization or its parent organization Common causes: * Turnkey cannot translate a public key obtained from a stamp to a parent organization or one of its corresponding sub-organizations that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticators to the organization you are targeting. * Ensure that you are targeting the proper organization. ### more than one suborg associated with a credential ID Common causes: * This error occurs for requests like [whoami](/api-reference/sessions/who-am-i). In particular this request tries to go backwards from the stamp to the public key then to a corresponding sub-orgnaization under a parent organization. If there are multiple sub-organizations with the same public key corresponding to an authenticator it is unknown who is initiating that particular request without more context. Troubleshooting tips: * Inlcude the sub-organization ID in the whoami request body. * Avoid including the same authenticator in multiple sub-organizations ### more than one suborg associated with a public key Common causes: * This error occurs for requests like [whoami](/api-reference/sessions/who-am-i). In particular this request tries to go backwards from the stamp to the public key then to a corresponding sub-orgnaization under a parent organization. If there are multiple sub-organizations with the same public key it is unknown who is initiating that particular request without more context. Troubleshooting tips: * Inlcude the sub-organization ID in the whoami request body. * Avoid including the same authenticator in multiple sub-organizations ### could not verify api key signature Common causes: * The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the api-key used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper api-keys to the organization you are targeting. * Ensure that you are targeting the proper organization. ### expired api key Common causes: * The API key used for the request has expired Troubleshooting tips: * Create a new API key to use for the request * Create an API key that doesn't expire ### malformed activity stamp Common causes: * The stamp attached to a request is not formatted properly. Troubleshooting tips: * Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some information about stamps, what they are, and how they are created. * At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### could not extract webauthn stamp Common causes: * A stamp is not attached to a request. Troubleshooting tips: * Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some information about stamps, what they are, and how they are created. * At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### could not extract api key stamp Common causes: * A stamp is not attached to a request. Troubleshooting tips: * Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some information about stamps, what they are, and how they are created. * At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### cannot authenticate public API activity request without a stamp (X-Stamp/X-Stamp-Webauthn header) Common causes: * A stamp is not attached to a request. Troubleshooting tips: * Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some information about stamps, what they are, and how they are created. * At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### webauthn authenticator not found in organization Common causes: * The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the webauthn authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticator to the organization you are targeting. * Ensure that you are targeting the proper organization. ### webauthn authenticator not found in organization or parent organization Common causes: * The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the webauthn authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: * Ensure that you have added the proper authenticator to the organization you are targeting. * Ensure that you are targeting the proper organization. ### invalid payload encoding Common causes: * This error is specific to the [sign\_raw\_payload](/api-reference/signing/sign-raw-payload) endpoint. A valid encoding needs to be passed so that Turnkey can properly sign the requested message. Troubleshooting tips: * Use a valid encoding scheme from the following: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8` ### invalid hash function Common causes: * This error is specific to the [sign\_raw\_payload](/api-reference/signing/sign-raw-payload) endpoint. A valid hash function needs to be passed so that Turnkey can properly hash and sign the requested message. Troubleshooting tips: * Use a valid hash function scheme from the following: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` * More information about `HASH_FUNCTION_NO_OP` [here](/faq#what-does-hash_function_no_op-mean) * More information about `HASH_FUNCTION_NOT_APPLICABLE` [here](/faq#what-is-hash_function_not_applicable-and-how-does-it-differ-from-hash_function_no_op) ### invalid magic link template Common causes: * The email template provided for specific activities is invalid. Troubleshooting tips: * Read more about [bespoke email templates](/embedded-wallets/sub-organization-auth#bespoke-email-templates) * Reach out to Turnkey at [help@turnkey.com](mailto:help@turnkey.com)! ### failed to get email template contents Common causes: * There was an error getting the email template for an associated activity Troubleshooting tips: * Reach out to Turnkey at [help@turnkey.com](mailto:help@turnkey.com)! ### failed to unmarshal template variables Common causes: * There are invalid template variables used in your email template. Troubleshooting tips: * Read more about [bespoke email templates](/embedded-wallets/sub-organization-auth#bespoke-email-templates) * Reach out to Turnkey at [help@turnkey.com](mailto:help@turnkey.com)! ### authentication failed Common causes: * Turnkey was unable to authenticate the user based on the stamp provided. Troubleshooting tips: * Ensure that all proper authenticators and api-keys have been added to the organization. * Read more about how to create a stamp for a request [here](/developer-reference/api-overview/stamps) ### failed to load organizations Common causes: * A request is targeting an unknown organization ID. Troubleshooting tips: * Ensure that the passed organization ID in the request is valid. ### policy label must be unique Common causes: * A new policy that is to be created shares the same name as a different policy. Policy names must be unique, and names in general must be unique per resource, so that they can be properly identified. Troubleshooting tips: * Change the label/name that will be used for the new policy. * Delete the old policy. * Update the old policy to have a new name. ### invalid policy consensus Common causes: * An invalid consensus expression is passed. Troubleshooting tips: * Read more about policy structure [here](/concepts/policies/overview#policy-structure) ### invalid policy condition Common causes: * An invalid condition expression is passed. Troubleshooting tips: * Read more about policy structure [here](/concepts/policies/overview#policy-structure) ### quorum threshold must be non-zero integer Common causes: * Quorum is the required amount of approvals by [root quorum members](/concepts/users/root-quorum) needed for an action to take place within an organization. Troubleshooting tips: * When creating a sub-organization or updating the root quroum amount, use a non-zero positive integer. ### quorum users missing Common causes: * A user marked as part of the root quorum is missing from the set of users within an organization. This is a validation error that can occur when trying to delete a user that is part of the root quorum. Troubleshooting tips: * Before deleting the user, remove them from the root quroum using [Update Root Quorum](/api-reference/organizations/update-root-quorum) ### invalid api key expiration Common causes: * An invalid expiration time was passed in for an api key's expiration time parameter when using [Create API Key](/api-reference/api-keys/create-api-keys) Troubleshooting tips: * The `expirationSeconds` parameter is passed as string of seconds of how long the key should last. Any non-positive non-integer string will be considered invalid. ### missing parameter: user authenticator attestation Common causes: * An attestation parameter is not passed when performing a request regarding an authenticator. For example [Create Authenticators](/api-reference/authenticators/create-authenticators) Troubleshooting tips: * The attestation generated by the authenticator includes a new key pair, the challenge, and device metadata that is signed, read more about attestations [here](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Attestation_and_Assertion). * An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example ### invalid authenticator attestation Common causes: * An attestation parameter is not valid when performing a request regarding an authenticator. For example [Create Authenticators](/api-reference/authenticators/create-authenticators) Troubleshooting tips: * The attestation generated by the authenticator includes a new key pair, the challenge, and device metadata that is signed, read more about attestations [here](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Attestation_and_Assertion). * An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example ### missing parameter: user authenticator attestation auth data Common causes: * The attestation auth data parameter is not valid when performing a request regarding an authenticator. For example [Create Authenticators](/api-reference/authenticators/create-authenticators). This parameter is obtained as part of the attestation object. Troubleshooting tips: * An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example ### user has exceeded maximum authenticators Common causes: * Turnkey allows up to 10 authenticators per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Troubleshooting Tips: * Delete any unnecessary authenticators attached to a user. * Create a new user within the same organization and attach the authenicator to that user. ### user has exceeded maximum long-lived api keys Common causes: * Turnkey allows up to 10 long-lived api keys per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Troubleshooting Tips: * Delete any unnecessary long-lived API keys attached to a user. * Create a new user within the same organization and attach the API key to that user. ### user has exceeded maximum short-lived api keys Common causes: * Turnkey allows up to 10 short-lived api keys per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Short-lived API keys will automatically be deleted from an organization when they are expired. Troubleshooting Tips: * Delete any unnecessary short-lived API keys attached to a user. * Create a new user within the same organization and attach the API key to that user. ### missing wallet params Common causes: * Some wallet/wallet account parameters have been omitted when creating a sub-organization Troubleshooting tips: * Include all of the required parameters when creating a wallet during sub-organization creation. More info on the parameters [here](/api-reference/organizations/create-sub-organization). ### invalid path format Common causes: * This error occurs when an invalid path format parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: * For now the path format must be: `PATH_FORMAT_BIP32`. ### invalid path Common causes: * An invalid path parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Paths cannot be reused within the same HD wallet. Troubleshooting tips: * The path is a string that is used to derive a new account within an HD wallet. A list of default paths per address format can be found [here](/concepts/wallets#hd-wallet-default-paths) * Paths cannot be reused within the same HD wallet. ### invalid address format Common causes: * An invalid address format parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: * Turnkey offers a wide range of support for many ecosystems. A list of valid address formats can be found in the table [here](/concepts/wallets#address-formats-and-curves). * More about Turnkey and general ecosystem support can be found [here](/networks/overview). ### invalid curve Common causes: * An invalid curve parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: * Before ecosystem level integrations Turnkey offers support on a curve level. This makes us extendable to any ecosystem that is based on a curve we support. A list of valid curve parameters can be found in the table [here](/concepts/wallets#address-formats-and-curves). * More about Turnkey and general ecosystem support can be found [here](/networks/overview). ### curve required Common causes: * The curve parameter is not passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: * Before ecosystem level integrations Turnkey offers support on a curve level. This makes us extendable to any ecosystem that is based on a curve we support. A list of valid curve parameters can be found in the table [here](/concepts/wallets#address-formats-and-curves). * More about Turnkey and general ecosystem support can be found [here](/networks/overview). ### failed to parse transaction Common causes: * The unsignedTransaction payload cannot be decoded by the policy engine, it might have not been serlialized properly. Troubleshooting tips: * Try to decode the payload independently and see if it returns the expected result. * We've noticed that for EIP1559 transaction types, the go-ethereum [MarshalBinary()](https://pkg.go.dev/github.com/ethereum/go-ethereum/core/types#Transaction.MarshalBinary) function will include the R, S, V values which should not be present within the serialized payload. Try to reconstruct the RLP payload manually without the R, S, V values, see the example below: ```go theme={"system"} package main import ( "encoding/hex" "fmt" "log" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" ) func main() { to := common.HexToAddress("0x...") txData := &types.DynamicFeeTx{ ChainID: big.NewInt(1), Nonce: 0, GasTipCap: big.NewInt(12344), GasFeeCap: big.NewInt(10010000000), Gas: 100000, To: &to, Value: big.NewInt(1), Data: hexDecode(""), AccessList: types.AccessList{}, // Optional } // RLP-encode only the fields included in the unsigned tx unsignedRLP := encodeUnsignedDynamicFeeTx(txData) // Prepend EIP-1559 type byte (0x02) serializedUnsigned := append([]byte{types.DynamicFeeTxType}, unsignedRLP...) fmt.Printf("Unsigned serialized tx: 0x%x\n", serializedUnsigned) } func encodeUnsignedDynamicFeeTx(tx *types.DynamicFeeTx) []byte { rlpInput := []interface{}{ tx.ChainID, tx.Nonce, tx.GasTipCap, tx.GasFeeCap, tx.Gas, tx.To, tx.Value, tx.Data, tx.AccessList, } out, err := rlp.EncodeToBytes(rlpInput) if err != nil { log.Fatalf("failed to encode RLP: %v", err) } return out } func hexDecode(input string) []byte { b, err := hex.DecodeString(input) if err != nil { log.Fatal(err) } return b } ``` ### No activity found with fingerprint. Consensus activities must target an existing activity by fingerprint Common causes: * This error occurs during the [Approve/Reject Activity](/api-reference/consensus/approve-activity) activity. The fingerprint parameter must be a fingerprint of a valid activity. Troubleshooting tips: * Confirm that a valid fingerprint of an activity that requires approval or rejection is passed as part of this activity. ### internal server error Common causes: * This error is thrown for a variety of internal server errors that are not due to user error. These activities will have an error id passed with them like: `internal server error (9fbfda54-7141-4192-ae72-8bac3512149a)` that can be used for troubleshooting. Troubleshooting tips: * Retry the activity. This could be a fluke case and the following activity could pass without failure. * If you think there is problem or if your service is degraded, please reach out to Turnkey [help@turnkey.com](mailto:help@turnkey.com) and provide the error id in the error message. ### organization mismatch Common causes: * The request is targeting one organization (e.g., a sub-organization), but the users signing/approving the request belong to a different organization (e.g., the parent organization) Troubleshooting tips: * Ensure the `organizationId` in your request matches the organization where your signing users are located ### invalid wallet account UUID Common causes: * A malformed or invalid UUID was provided for a wallet account ID Troubleshooting tips: * Verify the wallet account ID is a valid UUID in the format `XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` ### wallet account not part of your organization Common causes: * Attempting to delete or modify a wallet account that belongs to a different organization * Using a wallet account ID from another organization Troubleshooting tips: * Verify the wallet account ID belongs to your organization * Check that you're using the correct organization ID in your request ### wallet account has not been exported Common causes: * Attempting to delete a wallet account that has not been exported * The `deleteWithoutExport` parameter is not set to `true` when trying to delete an unexported wallet account Troubleshooting tips: * Export the wallet account before deleting it using the export wallet account activity * Set `deleteWithoutExport` to `true` in your delete request if you want to delete without exporting (use with caution) ### invalid OIDC token Common causes: * The OIDC token format is invalid (not a valid JWT with 3 parts) * Required claims are missing from the OIDC token (`aud`, `sub`, or `iss`) * The token structure doesn't match the expected format Troubleshooting tips: * Verify the OIDC token is a valid JWT with three parts separated by periods (header.payload.signature) * Ensure the token includes all required claims: * `aud` (audience): The intended recipient of the token * `sub` (subject): The user identifier * `iss` (issuer): The identity provider that issued the token * Check that your OIDC provider is correctly configured to include these claims ### invalid email address Common causes: * Email address format is invalid Troubleshooting tips: * Verify the email address follows the standard format: `user@domain.com` * Remove any extra spaces or invalid characters from the email address ### could not reach email Common causes: * The email domain cannot be reached or verified * Invalid MX (Mail Exchange) records for the email domain * The email provider's servers are unreachable or non-existent * The domain doesn't have proper DNS configuration Troubleshooting tips: * Verify the email domain is a valid, active domain * Check that the email provider's MX records are properly configured * Try using an email address from a well-known provider (Gmail, Outlook, etc.) to test * If you believe this is in error, please contact Turnkey # Introduction Source: https://docs.turnkey.com/developer-reference/api-overview/intro Turnkey's API is a remote procedure call (RPC) API. ## RPC/HTTP We chose RPC-over-HTTP for convenience and ease-of-use. Most of our users should be able to integrate with our API without a major re-architecture of their existing systems. Many client libraries are available to make requests to a RPC/HTTP API, across many languages. Turnkey will provide SDKs for the most popular programming languages. For other languages, a RPC/HTTP API ensures there is an easy integration path available via raw http clients. ## POST-only If you look at the [API reference](/api-reference/overview) you'll notice that all API calls to Turnkey are HTTP POST requests. Requests contain a POST body and a header with a digital signature over the POST body. We call this digital signature a [Stamp](/developer-reference/api-overview/stamps). Requests must be stamped by registered user credentials and verified by Turnkey's secure enclaves before they are processed. This ensures cryptographic integrity end-to-end which eliminates the ability for any party to modify a user's request. ### Queries and Submissions Turnkey's API is divided into 2 broad categories: queries and submissions. * Queries are read requests (e.g. `get_users`, `list_users`) * Submissions are requests to execute a workload (e.g. `create_policy`, `sign_transaction`, `delete_user`) ## Dive Deeper * Creating your first [Stamp](/developer-reference/api-overview/stamps) * Fetching data with [Queries](/developer-reference/api-overview/queries) * Executing workloads with [Submissions](/developer-reference/api-overview/submissions) # Queries Source: https://docs.turnkey.com/developer-reference/api-overview/queries Queries are read requests to Turnkey's API. Query URL paths are prefixed with `/public/v1/query`. Queries are not subject to enforcement of the policy engine. All users within an organization can read any data within the organization. Additionally, parent organizations have the ability to query data for all of their sub-organizations. # Stamps Source: https://docs.turnkey.com/developer-reference/api-overview/stamps Every request made to Turnkey must include a signature over the POST body attached as a HTTP header. Our secure enclave applications use this signature to verify the integrity and authenticity of the request. ### API Keys To create a valid, API key stamped request follow these steps: Sign the JSON-encoded POST body with your API key to produce a `signature` (DER-encoded) Hex encode the `signature` Create a JSON-encoded stamp: * `publicKey`: the public key of API key, note that only P-256 keys (API\_KEY\_CURVE\_P256) are currently supported * `signature`: the signature produced by the API key * `scheme`: `SIGNATURE_SCHEME_TK_API_P256` Base64URL encode the stamp Attach the encoded string to your request as a `X-Stamp` header Submit the stamped request to Turnkey's API ### WebAuthn To create a valid, Webauthn authenticator stamped request follow these steps: Compute the webauthn challenge by hashing the POST body bytes (JSON encoded) with SHA256. For example, if the POST body is `{"organization_id": "1234", "type": "ACTIVITY_TYPE_CREATE_API_KEYS", "params": {"for": "example"}`, the webauthn challenge is the string `7e8b4653fc7e51dc119cea031942f4693b4742ceca4dda269b925802b38b2147` Include the challenge amongst WebAuthn signing options. Refer to the existing stamper implementations in the [following section](#stampers)) for examples * Note that if you need to pass the challenge as bytes, you'll need to utf8-encode the challenge string (in JS, the challenge bytes will be `TextEncoder().encode("7e8b4653fc7e51dc119cea031942f4693b4742ceca4dda269b925802b38b2147")`) * Additional note for React Native contexts: the resulting string should then additionally be base64-encoded. See [implementation](https://github.com/tkhq/sdk/blob/b52db566e79a65eec8d8e7066053d6a3ac5f3943/packages/react-native-passkey-stamper/src/util.ts#L5-L10) Create a JSON-encoded stamp: * `credentialId`: the id of the webauthn authenticator * `authenticatorData`: the authenticator data produced by Webauthn assertion * `clientDataJson`: the client data produced by the Webauthn assertion * `signature`: the signature produced by the Webauthn assertion Attach the JSON-encoded stamp to your request as a `X-Stamp-Webauthn` header * Header names are case-insensitive (so `X-Stamp-Webauthn` and `X-Stamp-WebAuthn` are considered equivalent) * Unlike API key stamps, the format is just JSON; no base64URL encoding necessary! For example: `X-Stamp-Webauthn: {"authenticatorData":"UaQZ...","clientDataJson":"eyJ0...","credentialId":"Grf...","signature":"MEQ..."}` Submit the stamped request to Turnkey's API. If you would like your client request to be proxied through a backend, refer to the patterns mentioned [here](/authentication/passkeys/integration#proxying-signed-requests). An example application that uses this pattern can be found at wallet.tx.xyz (code [here](https://github.com/tkhq/demo-embedded-wallet/)) ### Stampers Our [JS SDK](https://github.com/tkhq/sdk) and [CLI](https://github.com/tkhq/tkcli) abstract request stamping for you. If you choose to use an independent client, you will need to implement this yourself. For reference, check out our implementations: Our CLI has a `--no-post` option to generate stamps without sending anything over the network. This is a useful tool should you have trouble with debugging stamping-related logic. A sample command might look something like: ```json theme={"system"} turnkey request --no-post --host api.turnkey.com --path /api/v1/sign --body '{"payload": "hello from TKHQ"}' { "curlCommand": "curl -X POST -d'{\"payload\": \"hello from TKHQ\"}' -H'X-Stamp: eyJwdWJsaWNLZXkiOiIwMzI3YTUwMDMyZTZmMDYzMWQ1NjA1YjZhZGEzMmI3NzkwNzRmMzQ2ZTgxYjY4ZTEyODAxNjQwZjFjOWVlMDNkYWUiLCJzaWduYXR1cmUiOiIzMDQ0MDIyMDM2MjNkZWZkNjE4ZWIzZTIxOTk3MDQ5NjQwN2ViZTkyNDQ3MzE3ZGFkNzVlNDEyYmQ0YTYyNjdjM2I1ZTIyMjMwMjIwMjQ1Yjc0MDg0OGE3MmQwOGI2MGQ2Yzg0ZjMzOTczN2I2M2RiM2JjYmFkYjNiZDBkY2IxYmZiODY1NzE1ZDhiNSIsInNjaGVtZSI6IlNJR05BVFVSRV9TQ0hFTUVfVEtfQVBJX1AyNTYifQ' -v 'https://api.turnkey.com/api/v1/sign'", "message": "{\"payload\": \"hello from TKHQ\"}", "stamp": "eyJwdWJsaWNLZXkiOiIwMzI3YTUwMDMyZTZmMDYzMWQ1NjA1YjZhZGEzMmI3NzkwNzRmMzQ2ZTgxYjY4ZTEyODAxNjQwZjFjOWVlMDNkYWUiLCJzaWduYXR1cmUiOiIzMDQ0MDIyMDM2MjNkZWZkNjE4ZWIzZTIxOTk3MDQ5NjQwN2ViZTkyNDQ3MzE3ZGFkNzVlNDEyYmQ0YTYyNjdjM2I1ZTIyMjMwMjIwMjQ1Yjc0MDg0OGE3MmQwOGI2MGQ2Yzg0ZjMzOTczN2I2M2RiM2JjYmFkYjNiZDBkY2IxYmZiODY1NzE1ZDhiNSIsInNjaGVtZSI6IlNJR05BVFVSRV9TQ0hFTUVfVEtfQVBJX1AyNTYifQ" } ``` # Submissions Source: https://docs.turnkey.com/developer-reference/api-overview/submissions Submissions are requests to securely execute a workload. Submission URL paths are prefixed with `/public/v1/submit`. Submissions requests, if valid, produce an `Activity`. ### Activities Activities typically create, modify, or utilize a resource within Turnkey and are subject to consensus or condition enforcement via the policy engine. Activities are executed optimistically synchronous. This means that if we can process the request synchronously, we will. Otherwise, we'll fallback to asynchronous processing. Your services or applications should account for this by checking the response for the activity state: * If `activity.status == ACTIVITY_STATUS_COMPLETED`, `activity.result` field will be populated with a successful response. * If `activity.status == ACTIVITY_STATUS_FAILED`, `activity.failure` field will be populated with a failure reason. * If `activity.status == ACTIVITY_STATUS_CONSENSUS_NEEDED`, additional signatures (votes) are required to process the request. * If `activity.status == ACTIVITY_STATUS_PENDING`, the request is processing asynchronously. Activities do not expire but approvals (votes) do. When an activity is submitted, the requester’s submission counts as the first approval, which starts a 24-hour window. If consensus is not reached within that window, existing approvals expire and must be re-submitted while the activity remains in `ACTIVITY_STATUS_CONSENSUS_NEEDED`. You can get activity status updates by: * Re-submitting the request. See the notes on idempotency below. * Polling `get_activity` with the `activity.id` ### Idempotency The submission API is idempotent. For each request, the POST body is hashed into a fingerprint. Any two requests with the same fingerprint are considered the same request. If you resubmit the request, you'll get the same activity. If you want a new activity, you should modify the request timestamp `timestampMs` to produce a new fingerprint. # Using LLMs Source: https://docs.turnkey.com/developer-reference/using-llms ### Using AI to integrate Turnkey Turnkey documentation is now AI-enhanced. Whether you're using ChatGPT, Claude, or a custom LLM integration, we've made it easy to feed Turnkey docs directly into your models—and even easier to surface relevant answers programmatically or in your dev tools. #### LLM Feed Files To help LLMs stay current on how Turnkey works, we expose two continuously updated files for ingestion: * [`llms.txt`](https://docs.turnkey.com/llms.txt) - A concise, high-signal list of top-level docs pages, great for smaller models or quick context building. * [`llms-full.txt`](https://docs.turnkey.com/llms-full.txt) - A more exhaustive listing that includes nearly all pages, ideal for full-context indexing. You can regularly ingest these URLs into your custom GPTs or other LLM apps to ensure Turnkey-specific questions are grounded in accurate technical detail. ### Connecting to the Turnkey MCP server Connect to the Turnkey MCP server to search our documentation. This will enable you to perform contextual searches without leaving your development environment. To use the Turnkey MCP server with Claude: 1. Navigate to the [Connectors](https://claude.ai/settings/connectors) page in the Claude settings. 2. Select **Add custom connector**. 3. Add the Turnkey MCP server: * Name: `Turnkey` * URL: `https://docs.turnkey.com/mcp` 4. Select **Add**. 1. When using Claude, select the attachments button (the plus icon). 2. Select the Turnkey MCP server. 3. Ask Claude a question about Mintlify. See the [Model Context Protocol documentation](https://modelcontextprotocol.io/docs/tutorials/use-remote-mcp-server#connecting-to-a-remote-mcp-server) for more details. To use the Turnkey MCP server with Claude Code, run the following command: ```bash theme={null} theme={"system"} claude mcp add --transport http Mintlify https://docs.turnkey.com/mcp ``` Test the connection by running: ```bash theme={null} theme={"system"} claude mcp list ``` See the [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code/mcp#installing-mcp-servers) for more details. Install in Cursor To connect the Turnkey MCP server to Cursor, click the **Install in Cursor** button. Or to manually connect the MCP server, follow these steps: 1. Use Command + Shift + P (Ctrl + Shift + P on Windows) to open the command palette. 2. Search for "Open MCP settings". 3. Select **Add custom MCP**. This will open the `mcp.json` file. In `mcp.json`, add: ```json theme={null} theme={"system"} { "mcpServers": { "Mintlify": { "url": "https://docs.turnkey.com/mcp" } } } ``` In Cursor's chat, ask "What tools do you have available?" Cursor should show the Turnkey MCP server as an available tool. See [Installing MCP servers](https://docs.cursor.com/en/context/mcp#installing-mcp-servers) in the Cursor documentation for more details. Install in VS Code To connect the Turnkey MCP server to VS Code, click the **Install in VS Code** button. Or to manually connect the MCP server, create a `.vscode/mcp.json` file and add: ```json theme={null} theme={"system"} { "servers": { "Mintlify": { "type": "http", "url": "https://docs.turnkey.com/mcp" } } } ``` See the [VS Code documentation](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for more details. #### Chat With Our Docs (Contextual Deep Links) We've enabled Mintlify's `contextual` feature across Turnkey's docs: * You can copy any Turnkey docs page as Markdown for reuse or embedding. * Even better: you can launch a chat session with Claude or ChatGPT preloaded with that specific page's context. This is perfect for troubleshooting, code generation, or just diving deeper into a topic with AI assistance. # Activity Webhooks Source: https://docs.turnkey.com/developer-reference/webhooks Webhooks provide a powerful mechanism to receive real-time notifications about activity requests in your Turnkey organization. Additionally, you'll be able to receive all activity requests for both the parent organization and all its child organizations. This functionality can be enabled via the organization feature capabilities of our platform, as detailed in the section on [organization features](/concepts/organizations#features). This guide is designed to walk you through the process of setting up webhooks, from environment preparation to verification of successful event capturing. ## Prerequisites Before diving into webhook configuration, ensure you have completed the necessary preliminary steps outlined in our [Quickstart Guide](/getting-started/quickstart#create-your-turnkey-organization). This guide will assist you in setting up a new organization and installing the Turnkey CLI. Note: We'll create a new API Key for testing webhooks below. ## Environment Setup Begin by setting the necessary environment variables: ```bash theme={"system"} ORGANIZATION_ID=KEY_NAME=webhook-test ``` ### API Key Generation Generate a new API key using the Turnkey CLI with the following command: ```bash theme={"system"} turnkey generate api-key --organization $ORGANIZATION_ID --key-name $KEY_NAME ``` ### Ngrok Installation and Setup Ngrok is a handy tool that allows you to expose your local server to the internet. Follow these steps to set it up: Download Ngrok from [their website](https://ngrok.com/download). Follow the provided instructions to install Ngrok and configure your auth token. ### Local Server Setup Open a new terminal window and set up a local server to listen for incoming webhook events: ```bash theme={"system"} nc -l 8000 ``` ### Ngrok Tunneling In another terminal, initiate Ngrok to forward HTTP requests to your local server: ```bash theme={"system"} ngrok http 8000 ``` Here's an output of the above command: ```bash theme={"system"} Session Status online Account Satoshi Nakamoto (Plan: Free) Update update available (version 3.7.0, Ctrl-U to update) Version 3.6.0 Region United States (us) Latency 22ms Web Interface http://127.0.0.1:4041 Forwarding https://04b2-121-74-183-35.ngrok-free.app -> http://localhost:8000 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00 ``` Save the ngrok URL as an environment variable: ```bash theme={"system"} WEBHOOK_URL=https://04•••35.ngrok-free.app # Replace with the URL provided by ngrok ``` ### Verifying Ngrok Setup To ensure Ngrok is correctly forwarding requests, perform a test using curl: ```bash theme={"system"} curl -X POST $WEBHOOK_URL -d "{}" ``` Example output: ```bash theme={"system"} POST / HTTP/1.1 Host:04b2-121-74-183-35.ngrok-free.app User-Agent: curl/8.4.0 Content-Length: 2 Accept: */* Content-Type: application/x-www-form-urlencoded X-Forwarded-For: 195.88.127.47 X-Forwarded-Host: 04b2-121-74-183-35.ngrok-free.app X-Forwarded-Proto: https Accept-Encoding: gzip {} ``` After executing this command, you should see the request appear in the terminal where `nc` is running. Terminate the `nc` session by pressing CTRL+C and restart it by rerunning the `nc` command. ## Configuring the Webhook URL Set your webhook URL using the Turnkey CLI with the following command: ```bash theme={"system"} turnkey request --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", "organizationId": "'"$ORGANIZATION_ID"'", "parameters": { "name": "FEATURE_NAME_WEBHOOK", "value": "'"$WEBHOOK_URL"'" } }' --key-name=$KEY_NAME ``` ### Testing Your Webhook Assuming the previous request executed successfully it's time to test out your webhook! In order to verify that your webhook is correctly configured and receiving data, we can simply execute the previous turnkey request command again which creates a new activity request that will be captured by your webhook. Monitor the terminal with `nc` running to observe the incoming webhook data. ## Conclusion By following these steps, you should now have a functioning webhook setup that captures all activity requests for your organization and its sub-organizations. If you encounter any issues or have feedback about this feature, reach out on [slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-3aemp2g38-zIh4V~3vNpbX5PsSmkKxcQ)! # Add an Additional Passkey Source: https://docs.turnkey.com/embedded-wallets/code-examples/add-credential This guide demonstrates how to add a new credential (specifically, a passkey) to an existing wallet using the Turnkey SDK. > ⚠️ **This example is outdated !**
> Head over to [SDK Reference](https://docs.turnkey.com/generated-docs/formatted/react-wallet-kit/client-context-type-add-passkey) for the updated packages. ### Initialize the Passkey Client Begin by initializing the Turnkey SDK by passing in a config object containing: * `rpId`: The [Relying Party](https://developer.mozilla.org/en-US/docs/Glossary/Relying_party) Identifier, which is the effective domain of your application. * `apiBaseUrl`: The base URL of the Turnkey API: `https://api.turnkey.com` * `defaultOrganizationId`: Your parent organization ID, which you can find in the [Turnkey dashboard](https://app.turnkey.com/dashboard). The `rpId` is used in WebAuthn to uniquely identify the server that the passkey is associated with. The `rpId` is typically the effective domain of the web application, which is the domain portion of the URL without any subdomains. For example, if your application is hosted at `app.example.com`, the `rpId` would typically be `example.com`. This ensures that credentials are scoped to the correct domain and cannot be used by other domains, enhancing security. First, wrap your application with the `TurnkeyProvider` in your `app/layout.tsx` file: ```ts app/layout.tsx theme={"system"} import { TurnkeyProvider } from "@turnkey/sdk-react"; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( {children} ); } ``` Then, create a new file `app/add-passkey.tsx` where we'll implement the passkey functionality: ```tsx app/add-passkey.tsx theme={"system"} "use client"; import { useState } from "react"; import { useTurnkey } from "@turnkey/sdk-react"; export default function AddPasskey() { const { passkeyClient } = useTurnkey(); // We'll add more functionality here in the following steps return
{/* We'll add UI elements here */}
; } ```
Create a new file `src/add-passkey.ts`: ```ts src/add-passkey.ts theme={"system"} import { Turnkey } from "@turnkey/sdk-browser"; // Initialize the Turnkey SDK with your organization credentials const turnkey = new Turnkey({ rpId: process.env.TURNKEY_RP_ID, // Your relying party ID apiBaseUrl: process.env.TURNKEY_API_BASE_URL, // Turnkey API base URL defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, // Your parent organization ID }); // Initialize the Passkey Client const passkeyClient = turnkey.passkeyClient(); // We'll add more functionality here in the following steps ```
### Authenticate the User Now that that the Passkey Client is initialized, we'll call the `login` function which will prompt the user to authenticate with their passkey. Additionally, this function will set the current user in local storage upon successful authentication, which will be used later when creating an additional authenticator. The user object which gets stored in local storage is defined as follows: ``` export interface User { userId: string; username: string; organization: SubOrganization; readOnlySession?: ReadOnlySession; } ``` ```tsx app/add-passkey.tsx theme={"system"} // ... previous code export default function AddPasskey() { // We'll need the base Turnkey client to get the current user const { passkeyClient, turnkey } = useTurnkey(); // ... previous code const getUser = async () => { // Get the current user from local storage, // we'll need the `userId` to create the authenticator in the next step const user = await turnkey?.getCurrentUser(); if (user) { console.log("User retrieved successfully"); } // return the user to be used in the next step return user; }; return (
); } ```
```ts src/add-passkey.ts theme={"system"} // ... previous code const login = async () => { const response = await passkeyClient.login(); if (response.organizationId) { console.log("User authenticated successfully"); } else { console.log("User authentication failed"); } }; ```
### Get the current user Before creating a new passkey, we'll get the current user. This function will retrieve the user from local storage, which was set after calling the `login` function. We'll need the `userId` to create the authenticator in the final step. ```ts app/add-passkey.tsx theme={"system"} // ... previous code export default function AddPasskey() { // We'll need the base Turnkey client to get the current user const { passkeyClient, turnkey } = useTurnkey(); // ... previous code const getUser = async () => { // Get the current user from local storage, // we'll need the `userId` to create the authenticator in the next step const user = await turnkey?.getCurrentUser(); if (user) { console.log("User retrieved successfully"); } // return the user to be used in the next step return user; }; return (
); } ```
```ts src/add-passkey.ts theme={"system"} // ... previous code const getCurrentUser = async () => { // Get the current user from local storage, // we'll need the `userId` to create the authenticator in the next step const user = await turnkey?.getCurrentUser(); if (user) { console.log("User retrieved successfully"); } // return the user to be used in the next step return user; }; ```
### Create User Passkey Now that you have authenticated the user, you can call the `createUserPasskey` function to create a new user passkey credential. Calling this method will prompt the user to create a passkey, which will be securely stored by their browser. This credential will be associated with the user's account and used for future authentication. Once the credential is created, we'll use it in the next step to create a new authenticator for the user. The credential includes an encoded challenge and attestation. The encoded challenge ensures the request is fresh and legitimate, while the attestation verifies the authenticity of the device creating the credential. For more information on how passkeys work, including details on the challenge and attestation objects, you can refer to the [Passkeys Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API#passkeys). ```tsx app/add-passkey.tsx theme={"system"} // ... previous code export default function AddPasskey() { const { passkeyClient } = useTurnkey(); // ... previous code // We'll pass the user object returned from `getUser` to this function const createNewPasskey = async (user: User) => { const credential = await passkeyClient?.createUserPasskey({ publicKey: { // This is the name of the passkey that will be displayed to the user rp: { name: "Wallet Passkey", }, user: { // We can use the username as the name and display name name: user.username, displayName: user.username, }, }, }); // we'll use this credential in the next step to create a new authenticator return credential; }; return (/* ... */); } ``` ```ts src/add-passkey.ts theme={"system"} // ... previous code // We'll pass the user object returned from `getUser` to this function const createNewPasskey = async (user: User) => { const credential = await passkeyClient?.createUserPasskey({ publicKey: { // This is the name of the passkey that will be displayed to the user rp: { name: "Wallet Passkey", }, user: { // We can use the username as the name and display name name: user.username, displayName: user.username, }, }, }); // we'll use this credential in the next step to create a new authenticator return credential; }; ``` ### Add the credential to the wallet Now that you have created a new user passkey credential, we'll use this credential to create a new passkey authenticator for the user. We'll need the userId to create the authenticator, so we'll get the current user first. This value comes from local storage which was set in the previous step when the user successfully authenticated via the `login` function. ```tsx app/add-passkey.tsx theme={"system"} // ... previous code export default function AddPasskey() { const { passkeyClient, turnkey } = useTurnkey(); // ... previous code const addPasskey = async () => { const user = await getUser(); const credential = await createNewPasskey(user); const authenticatorsResponse = await passkeyClient.createAuthenticators({ authenticators: [ { authenticatorName: "New Passkey Authenticator", challenge: credential.encodedChallenge, attestation: credential.attestation, }, ], userId: user.userId, }); // Check if the authenticator was created successfully if (authenticatorsResponse?.activity.id) { console.log("Authenticator created successfully"); } }; return (
{/* Add a button to add the passkey to the wallet */}
); } ``` ```tsx app/add-passkey.tsx theme={"system"} "use client"; import { useState } from "react"; import { useTurnkey } from "@turnkey/sdk-react"; export default function AddPasskey() { const { passkeyClient, turnkey } = useTurnkey(); const login = async () => { const response = await passkeyClient?.login(); if (response.organizationId) { console.log("User authenticated successfully"); } else { console.log("User authentication failed"); } }; const getUser = async () => { const user = await turnkey?.getCurrentUser(); if (user) { console.log("User retrieved successfully"); } return user; }; const createNewPasskey = async (user: User) => { const credential = await passkeyClient?.createUserPasskey({ publicKey: { rp: { name: "Wallet Passkey", }, user: { name: user.username, displayName: user.username, }, }, }); return credential; }; const addPasskey = async () => { const user = await getUser(); const credential = await createNewPasskey(user); const authenticatorsResponse = await passkeyClient.createAuthenticators({ authenticators: [ { authenticatorName: "New Passkey Authenticator", challenge: credential.encodedChallenge, attestation: credential.attestation, }, ], userId: user.userId, }); if (authenticatorsResponse?.activity.id) { console.log("Authenticator created successfully"); } }; return (
); } ```
```ts src/add-passkey.ts theme={"system"} // ... previous code const addPasskey = async () => { const user = await getUser(); const credential = await createNewPasskey(user); // Check if the credential was created successfully if (!credential) { console.log("Credential not created"); return; } const authenticatorsResponse = await passkeyClient.createAuthenticators({ authenticators: [ { authenticatorName: "New Passkey Authenticator", challenge: credential.encodedChallenge, attestation: credential.attestation, }, ], userId: user.userId, }); // Check if the authenticator was created successfully if (authenticatorsResponse?.activity.id) { console.log("Authenticator created successfully"); } }; ```
### Optional: Read/Write Sessions In some cases, you may want to create a read/write session for the user to reduce the number of passkey prompts. This session can be used instead of the passkey to sign requests to Turnkey's API to improve the user experience. In the this tutorial we used the passkey to authenticate the request to create a new authenticator. The result is that the user will be prompted 3 times: 1. To login 2. To create the new passkey 3. To authenticate the request to create a new authenticator By creating a read/write session, we can reduce the number of passkey prompts to 2: 1. To login and create a session 2. To authenticate the request to create a new authenticator To create a read/write session, we simply replace `passkeyClient.login()` with `passkeyClient.loginWithReadwriteSession()`: ```ts src/add-passkey.ts theme={"system"} // ... previous code const login = async () => { const response = await passkeyClient.loginWithReadwriteSession(); // ... previous code }; ``` Assuming the login is successful, a read/write session object will be stored in local storage. We'll use the stored session in conjunction with the iframe client to authenticate the create authenticator request. We'll use the active client returned from the `useTurnkey` hook which will be initialized with the read/write session. The rest of the code remains the same. ```tsx app/add-passkey.tsx theme={"system"} // ... previous code export default function AddPasskey() { const { getActiveClient, turnkey } = useTurnkey(); // ... previous code const addPasskey = async () => { const user = await getUser(); const credential = await createNewPasskey(user); // Get the active client which returns the iframe client initialized with the read/write session const activeClient = await getActiveClient(); // Since we're using the read/write session this won't prompt the user const authenticatorsResponse = await activeClient.createAuthenticators({ // ... }); // ... rest of the code remains the same }; return (/* ... */); } ``` ##### 1. Initialize the iframe client We'll create a new function to initialize the iframe client and inject the read/write session. ```ts src/add-passkey.ts theme={"system"} // ... previous code const getIframeClient = async () => { const iframeContainerId = "turnkey-auth-container-id"; const authIframeClient = await turnkey.iframeClient( document.getElementById(iframeContainerId), ); const readWriteSession = await turnkey?.getReadWriteSession(); if (readWriteSession) { const injected = await authIframeClient?.injectCredentialBundle( readWriteSession.authBundle, ); } return authIframeClient; }; ``` When using the TypeScript SDK, you'll need to ensure that the HTML element exists somewhere in the rendered DOM. ```
``` ##### 2. Update the `addPasskey` function We'll update the `addPasskey` function to use the iframe client to authenticate the request to create a new authenticator. ```ts src/add-passkey.ts theme={"system"} // ... previous code const addPasskey = async () => { // ... previous code const iframeClient = await getIframeClient(); const authenticatorsResponse = await iframeClient.createAuthenticators({ // ... }); // ... rest of the code remains the same }; ``` ## Conclusion In this guide, we've walked through the process of adding a new credential to an existing wallet using the Turnkey SDK. By following these steps, you can improve the usability of your application by allowing users to create multiple authentication methods. This flexibility enables users to add a hardware security device like a Yubikey, or a native passkey via providers like iCloud keychain or 1Password, enhancing their overall experience with your application. For a complete example, check out our [demo embedded wallet](https://github.com/tkhq/demo-embedded-wallet/blob/main/src/components/add-passkey.tsx). # Authenticate a User with Email Source: https://docs.turnkey.com/embedded-wallets/code-examples/authenticate-user-email > ⚠️ **This example is outdated !**
> Head over to [SDK Reference](https://docs.turnkey.com/sdks/react/auth) for the updated packages. ```JavaScript theme={"system"} import { Turnkey } from "@turnkey/sdk-browser"; const turnkey = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, }); ``` Note that the iframe client must be initialized with the dom element where the iframe will be injected. If you are using the [react-sdk](/sdks/react) you can import the `iframeClient` from the `useTurnkey()` hook without this step and the iframe dom element will be managed for you. Note that the `iframeClient` must be initialized before calling `emailAuth` because you need the `iframePublicKey` as a parameter to the `emailAuth` call. ```JavaScript theme={"system"} import { Turnkey, TurnkeySDKBrowserConfig } from "@turnkey/sdk-browser"; const turnkeyConfig: TurnkeySDKBrowserConfig = {...}; const turnkey = new Turnkey(turnkeyConfig); const iframeContainerId = "turnkey-auth-iframe-container-id"; // ensure the HTML element exists somewhere in the rendered DOM
const iframeClient = await turnkey.iframeClient(document.getElementById(iframeContainerId)) ``` ```JavaScript theme={"system"} await turnkey.serverSign( "emailAuth", [{ email: , targetPublicKey: iframeClient.iframePublicKey, organizationId: }] ) ``` If you need to lookup the user `subOrganizationId` by email, you can call the `getSubOrgIds` method with the `filterType` parameter set to `"EMAIL"` ```JavaScript theme={"system"} const subOrgIds = await turnkey.serverSign( "getSubOrgIds", [{ filterType: "EMAIL", filterValue: }] ) const userSubOrganizationId = subOrgIds.organizationIds[0]; ``` ```JavaScript theme={"system"} const authenticationResponse = await iframeClient.injectCredentialBundle(credentialBundle); if (authenticationResponse) { // user is authenticated and can perform actions from the `iframeClient` await iframeClient.login(); navigate("/authenticated-route"); } else { // credential bundle does not match emailed credential navigate("/not-authenticated-route"); } ``` ```JavaScript theme={"system"} const currentUserSession = await turnkey.currentUserSession(); const walletsResponse = await currentUserSession.getWallets(); const walletName = walletsResponse.wallets[0].walletName; ``` ```JavaScript theme={"system"} import { DEFAULT_ETHEREUM_ACCOUNTS } from "@turnkey/sdk-browser"; const newWalletResponse = await iframeClient.createWallet({ walletName: "New Wallet for User", accounts: DEFAULT_ETHEREUM_ACCOUNTS, }); ``` # Authenticate a User with a Passkey Credential Source: https://docs.turnkey.com/embedded-wallets/code-examples/authenticate-user-passkey > ⚠️ **This example is outdated !**
> Head over to [SDK Reference](https://docs.turnkey.com/sdks/react/sub-organization-customization) for the updated packages. ```tsx theme={"system"} import { Turnkey } from "@turnkey/sdk-browser"; const turnkey = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, }); const passkeyClient = turnkey.passkeyClient(); ``` ```tsx theme={"system"} const response = await passkeyClient.login(); if (response.organizationId) { navigate("/authenticated-route"); } else { navigate("/not-authenticated-route"); } ``` ```tsx theme={"system"} const currentUserSession = await turnkey.currentUserSession(); const walletsResponse = await currentUserSession.getWallets(); const walletName = walletsResponse.wallets[0].walletName; ``` This will always prompt a user to confirm the action with their passkey credential ```tsx theme={"system"} import { DEFAULT_ETHEREUM_ACCOUNTS } from "@turnkey/sdk-browser"; const newWalletResponse = await passkeyClient.createWallet({ walletName: "New Wallet for User", accounts: DEFAULT_ETHEREUM_ACCOUNTS, }); ``` # Client-side Signing Source: https://docs.turnkey.com/embedded-wallets/code-examples/client-side-signing This guide covers how to set up client-side signing using Turnkey's `@turnkey/iframe-stamper` package and the `export-and-sign` iframe. This architecture enables secure transaction and message signing directly in the browser without exposing private keys to your application code. Note that mishandling of exported private keys introduces inherent risks; please proceed with caution. ## Overview Client-side signing allows you to: * Export private keys from Turnkey to a secure iframe * Sign transactions and messages directly in the browser via iframe * Maintain multiple keys simultaneously for signing operations * Keep private keys isolated from your application's JavaScript context ### Architecture ```mermaid theme={"system"} flowchart TB subgraph app["Your Application"] subgraph frontend["Frontend"] stamper["IframeStamper"] end subgraph exporter["Backend (API Routes) or Frontend"] sdk["Turnkey SDK
(exportWalletAccount)"] end stamper <--> sdk end subgraph iframe["export-and-sign Iframe"] embedded["Embedded Key
(P-256 ECDH)
localStorage"] inmemory["In-Memory Private Keys
{ address → key, keypair }
(memory only)"] end stamper <-->|"MessageChannel"| iframe ``` ### Security Model 1. **Iframe Isolation**: Private keys never touch your application's JavaScript context 2. **HPKE Encryption**: Export bundles are encrypted end-to-end using RFC 9180 3. **Enclave Verification**: All bundles are signed by Turnkey's secure enclave 4. **Sandboxed Iframe**: The iframe runs with `allow-scripts allow-same-origin` sandbox restrictions 5. **Organization Validation**: Bundles are validated against your organization ID ## Prerequisites * Node.js v20+ * A Turnkey organization with API credentials * Wallet accounts to export (Solana addresses for signing support) * `@turnkey/iframe-stamper >= 2.7.0` ## Installation ```bash theme={"system"} npm install @turnkey/iframe-stamper @turnkey/sdk-server ``` ## Environment Variables ```bash theme={"system"} # .env.local NEXT_PUBLIC_ORGANIZATION_ID= NEXT_PUBLIC_BASE_URL=https://api.turnkey.com NEXT_PUBLIC_EXPORT_SIGN_IFRAME_URL=https://export-and-sign.turnkey.com # Server-side only (never expose to client) # Not necessary if user performs export using a session directly via frontend API_PUBLIC_KEY= API_PRIVATE_KEY= ``` ## Sample Implementation Note: the following is for a NextJS application with a separate frontend and backend. The foundations should be applicable for other configurations. ### Step 1: Initialize the IframeStamper Create a component that initializes the iframe and manages its lifecycle. ```typescript theme={"system"} import { IframeStamper } from "@turnkey/iframe-stamper"; import { useEffect, useState } from "react"; const IFRAME_CONTAINER_ID = "turnkey-iframe-container"; const IFRAME_ELEMENT_ID = "turnkey-iframe"; function SigningComponent() { const [iframeStamper, setIframeStamper] = useState( null ); useEffect(() => { const stamper = new IframeStamper({ iframeUrl: process.env.NEXT_PUBLIC_EXPORT_SIGN_IFRAME_URL!, iframeContainer: document.getElementById(IFRAME_CONTAINER_ID), iframeElementId: IFRAME_ELEMENT_ID, }); return () => { stamper.clear(); }; }, []); return (
{/* Iframe will be inserted here */}
); } ``` For an example in context, we highly recommend taking a look at the [wallet-export-sign example app](https://github.com/tkhq/sdk/blob/0af0303ca4714cf65f5177cdb05f824877713d2a/examples/wallet-export-sign/src/components/Export.tsx#L62-L107). ### Step 2: Create the Export Caller (Backend or Client-side) The export call can be made from a backend API route or a trusted client-side environment. The example below shows a server-side API route; if you call from the client, avoid exposing key material. ```typescript theme={"system"} // pages/api/exportWalletAccount.ts import type { NextApiRequest, NextApiResponse } from "next"; import { Turnkey } from "@turnkey/sdk-server"; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { const { walletAccountAddress, targetPublicKey } = req.body; const turnkeyClient = new Turnkey({ apiBaseUrl: process.env.NEXT_PUBLIC_BASE_URL!, apiPublicKey: process.env.API_PUBLIC_KEY!, apiPrivateKey: process.env.API_PRIVATE_KEY!, defaultOrganizationId: process.env.NEXT_PUBLIC_ORGANIZATION_ID!, }); const { address, exportBundle } = await turnkeyClient .apiClient() .exportWalletAccount({ organizationId: process.env.NEXT_PUBLIC_ORGANIZATION_ID!, address: walletAccountAddress, targetPublicKey: targetPublicKey, }); res.status(200).json({ address, exportBundle }); } ``` ### Step 3: Export a Private Key to the Iframe ```typescript theme={"system"} import { KeyFormat } from "@turnkey/iframe-stamper"; import axios from "axios"; async function exportKeyToIframe( iframeStamper: IframeStamper, walletAccountAddress: string, organizationId: string ) { // Step 3a: Get or initialize the embedded key let embeddedKey = await iframeStamper.getEmbeddedPublicKey(); if (!embeddedKey) { embeddedKey = await iframeStamper.initEmbeddedKey(); } // Step 3b: Request export bundle from your export caller const response = await axios.post("/api/exportWalletAccount", { walletAccountAddress, targetPublicKey: embeddedKey, }); // Step 3c: Inject the bundle into the iframe const injected = await iframeStamper.injectKeyExportBundle( response.data.exportBundle, organizationId, KeyFormat.Hexadecimal, // or KeyFormat.Solana for Solana-formatted keys walletAccountAddress // Required for multi-key support ); if (!injected) { throw new Error("Failed to inject export bundle"); } // The key is now stored in-memory within the iframe // The embedded key remains available for additional exports } ``` ### Step 4: Sign Messages ```typescript theme={"system"} import { MessageType } from "@turnkey/iframe-stamper"; async function signMessage( iframeStamper: IframeStamper, message: string, walletAccountAddress: string ): Promise { const signature = await iframeStamper.signMessage( { message, type: MessageType.Solana, }, walletAccountAddress // Required when multiple keys are loaded ); return signature; // Returns hex-encoded signature } ``` ### Step 5: Sign Transactions ```typescript theme={"system"} import { TransactionType } from "@turnkey/iframe-stamper"; async function signTransaction( iframeStamper: IframeStamper, serializedTransaction: string, // Hex-encoded transaction bytes walletAccountAddress: string ): Promise { const signedTransaction = await iframeStamper.signTransaction( { transaction: serializedTransaction, type: TransactionType.Solana, }, walletAccountAddress ); return signedTransaction; // Returns hex-encoded signed transaction } ``` ## Multi-Key Support One of the key capabilities of client-side signing is the ability to load and manage multiple private keys simultaneously within the iframe. ### Loading Multiple Keys Since the embedded key persists across bundle injections, you can export multiple keys using the same embedded key (as long as it hasn't expired): ```typescript theme={"system"} async function loadMultipleKeys( iframeStamper: IframeStamper, addresses: string[], organizationId: string ) { // Get or initialize the embedded key once let embeddedKey = await iframeStamper.getEmbeddedPublicKey(); if (!embeddedKey) { embeddedKey = await iframeStamper.initEmbeddedKey(); } for (const address of addresses) { const response = await axios.post("/api/exportWalletAccount", { walletAccountAddress: address, targetPublicKey: embeddedKey, // Same embedded key for all exports }); await iframeStamper.injectKeyExportBundle( response.data.exportBundle, organizationId, KeyFormat.Hexadecimal, address // Each key is stored by its address ); } } ``` ### Signing with Different Keys ```typescript theme={"system"} // Sign with the first address const sig1 = await iframeStamper.signMessage( { message: "Hello", type: MessageType.Solana }, "address1..." ); // Sign with the second address const sig2 = await iframeStamper.signMessage( { message: "World", type: MessageType.Solana }, "address2..." ); ``` ### Clearing Keys ```typescript theme={"system"} // Clear a specific key await iframeStamper.clearEmbeddedPrivateKey("address1..."); // Clear all keys (no address parameter) await iframeStamper.clearEmbeddedPrivateKey(); ``` ## Key Lifecycle and Expiration Understanding the key lifecycle is important for building reliable applications. ### Embedded Key (P-256 ECDH) * **Storage**: localStorage within the iframe * **TTL**: 48 hours (default) * **Purpose**: Decrypt incoming export bundles via HPKE * **Behavior**: Persists across bundle injections - the same embedded key can decrypt multiple export bundles until it expires or is explicitly cleared ### In-Memory Private Keys * **Storage**: JavaScript memory only (never persisted) * **TTL**: 24 hours * **Purpose**: Sign messages and transactions * **Behavior**: Lost on page reload, cleared on expiration ### Handling Expiration ```typescript theme={"system"} // Re-export flow when keys expire or page reloads async function ensureKeyLoaded( iframeStamper: IframeStamper, address: string, organizationId: string ) { try { // Attempt to sign a test message await iframeStamper.signMessage( { message: "test", type: MessageType.Solana }, address ); } catch (error) { // Key not found or expired - re-export await exportKeyToIframe(iframeStamper, address, organizationId); } } ``` ## Key Formats | Format | Description | Use Case | | ----------------------- | ------------------------------------------------ | ------------------------------ | | `KeyFormat.Solana` | Base58-encoded 64-byte format (private + public) | Phantom, Solflare, Solana keys | | `KeyFormat.Hexadecimal` | 64 hexadecimal digits (32 bytes) | Non-Solana | ## Complete Example Here's a complete React component demonstrating the full flow: ```typescript theme={"system"} import { IframeStamper, KeyFormat, MessageType, TransactionType, } from "@turnkey/iframe-stamper"; import { useEffect, useState } from "react"; import axios from "axios"; const IFRAME_CONTAINER_ID = "turnkey-iframe-container"; const IFRAME_ELEMENT_ID = "turnkey-iframe"; interface Props { organizationId: string; walletAccountAddress: string; } export function ClientSideSigner({ organizationId, walletAccountAddress, }: Props) { const [iframeStamper, setIframeStamper] = useState( null ); const [isKeyLoaded, setIsKeyLoaded] = useState(false); const [message, setMessage] = useState("Hello, Turnkey!"); const [signature, setSignature] = useState(""); // Initialize iframe useEffect(() => { const stamper = new IframeStamper({ iframeUrl: process.env.NEXT_PUBLIC_EXPORT_SIGN_IFRAME_URL!, iframeContainer: document.getElementById(IFRAME_CONTAINER_ID), iframeElementId: IFRAME_ELEMENT_ID, }); stamper .init() .then(() => setIframeStamper(stamper)) .catch(console.error); return () => stamper.clear(); }, []); // Export key to iframe const exportKey = async () => { if (!iframeStamper) return; let embeddedKey = await iframeStamper.getEmbeddedPublicKey(); if (!embeddedKey) { embeddedKey = await iframeStamper.initEmbeddedKey(); } const response = await axios.post("/api/exportWalletAccount", { walletAccountAddress, targetPublicKey: embeddedKey, }); await iframeStamper.injectKeyExportBundle( response.data.exportBundle, organizationId, KeyFormat.Hexadecimal, walletAccountAddress ); setIsKeyLoaded(true); }; // Sign message const handleSignMessage = async () => { if (!iframeStamper || !isKeyLoaded) return; const sig = await iframeStamper.signMessage( { message, type: MessageType.Solana }, walletAccountAddress ); setSignature(sig); }; return (
{!isKeyLoaded ? ( ) : (