enum<string>
required
Enum options:
ACTIVITY_TYPE_OTP_LOGIN_V2string
required
Timestamp (in milliseconds) of the request, used to verify liveness of user requests.
string
required
Unique identifier for a given Organization.
object
required
The parameters object containing the specific intent data for this activity.
Show details
Show details
object
required
clientSignature field
Show details
Show details
boolean
Enable to have your activity generate and return App Proofs, enabling verifiability.
object
required
The activity object containing type, intent, and result
Show activity details
Show activity details
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: <string> (see Authorizations)" \
--data '{
"type": "ACTIVITY_TYPE_OTP_LOGIN_V2",
"timestampMs": "<string> (e.g. 1746736509954)",
"organizationId": "<string> (Your Organization ID)",
"parameters": {
"verificationToken": "<string>",
"publicKey": "<string>",
"clientSignature": {
"publicKey": "<string>",
"scheme": "<CLIENT_SIGNATURE_SCHEME_API_P256>",
"message": "<string>",
"signature": "<string>"
},
"expirationSeconds": "<string>",
"invalidateExisting": "<boolean>"
}
}'
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: "<string> (Signed Verification Token containing a unique id, expiry, verification type, contact)",
publicKey: "<string> (Client-side public key generated by the user, used as the session public key upon successful login)",
clientSignature: { // clientSignature field,
publicKey: "<string> (The public component of a cryptographic key pair used to create the signature.)",
scheme: "<CLIENT_SIGNATURE_SCHEME_API_P256>" // scheme field,
message: "<string> (The message that was signed.)",
signature: "<string> (The cryptographic signature over the message.)",
},
expirationSeconds: "<string> (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 sessions
});
{
"activity": {
"id": "<activity-id>",
"status": "ACTIVITY_STATUS_COMPLETED",
"type": "ACTIVITY_TYPE_OTP_LOGIN_V2",
"organizationId": "<organization-id>",
"timestampMs": "<timestamp> (e.g. 1746736509954)",
"result": {
"activity": {
"id": "<string>",
"organizationId": "<string>",
"status": "<string>",
"type": "<string>",
"intent": {
"otpLoginIntentV2": {
"verificationToken": "<string>",
"publicKey": "<string>",
"clientSignature": {
"publicKey": "<string>",
"scheme": "<CLIENT_SIGNATURE_SCHEME_API_P256>",
"message": "<string>",
"signature": "<string>"
},
"expirationSeconds": "<string>",
"invalidateExisting": "<boolean>"
}
},
"result": {
"otpLoginResult": {
"session": "<string>"
}
},
"votes": "<array>",
"fingerprint": "<string>",
"canApprove": "<boolean>",
"canReject": "<boolean>",
"createdAt": "<string>",
"updatedAt": "<string>"
}
}
}
}