Skip to main content
POST
/
public
/
v1
/
submit
/
init_user_email_recovery

Authorizations

X-Stamp
string
required
Cryptographically signed (stamped) request to be passed in as a header. For more info, see here.

Body

type
enum<string>
required
Enum options: ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY
timestampMs
string
required
Timestamp (in milliseconds) of the request, used to verify liveness of user requests.
organizationId
string
required
Unique identifier for a given Organization.
parameters
object
required

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

Response

A successful response returns the following fields:
activity
object
required
The activity object containing type, intent, and result
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: <string> (see Authorizations)" \
  --data '{
    "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY",
    "timestampMs": "<string> (e.g. 1746736509954)",
    "organizationId": "<string> (Your Organization ID)",
    "parameters": {
        "email": "<string>",
        "targetPublicKey": "<string>",
        "expirationSeconds": "<string>",
        "emailCustomization": {
            "appName": "<string>",
            "logoUrl": "<string>",
            "magicLinkTemplate": "<string>",
            "templateVariables": "<string>",
            "templateId": "<string>"
        }
    }
}'
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: "<string> (Email of the user starting recovery)",
  targetPublicKey: "<string> (Client-side public key generated by the user, to which the recovery bundle will be encrypted.)",
  expirationSeconds: "<string> (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: "<string> (The name of the application.)",
    logoUrl: "<string> (A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.)",
    magicLinkTemplate: "<string> (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: "<string> (JSON object containing key/value pairs to be used with custom templates.)",
    templateId: "<string> (Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.)",
  }
});
{
  "activity": {
    "id": "<activity-id>",
    "status": "ACTIVITY_STATUS_COMPLETED",
    "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY",
    "organizationId": "<organization-id>",
    "timestampMs": "<timestamp> (e.g. 1746736509954)",
    "result": {
      "activity": {
        "id": "<string>",
        "organizationId": "<string>",
        "status": "<string>",
        "type": "<string>",
        "intent": {
          "initUserEmailRecoveryIntent": {
            "email": "<string>",
            "targetPublicKey": "<string>",
            "expirationSeconds": "<string>",
            "emailCustomization": {
              "appName": "<string>",
              "logoUrl": "<string>",
              "magicLinkTemplate": "<string>",
              "templateVariables": "<string>",
              "templateId": "<string>"
            }
          }
        },
        "result": {
          "initUserEmailRecoveryResult": {
            "userId": "<string>"
          }
        },
        "votes": "<array>",
        "fingerprint": "<string>",
        "canApprove": "<boolean>",
        "canReject": "<boolean>",
        "createdAt": "<string>",
        "updatedAt": "<string>"
      }
    }
  }
}