Start passkey registration
/auth/passkey/registration/options
Request Body
Account password. Required when the account has one and no TOTP.
Current code from the authenticator app. Required when the account has TOTP enabled; the password is not accepted in its place.
Response Body
v1 asks for no attestation.
nonenone
residentKey: required because sign-in is usernameless, and userVerification: required so every assertion carries a second factor — which is what lets a passkey login satisfy mfa_required.
truerequiredrequiredbase64url challenge. Single-use, stored server-side for 5 minutes.
KcFagQyHSuG-Ds86-L3A-acvh4G_RfEbZCzPphaw6K4The user's existing credentials, so an authenticator they already enrolled refuses to register a duplicate.
public-keyClient extensions the library asks for. credProps lets the browser report back whether the credential really was created as discoverable.
trueAlways empty — v1 gives the browser no authenticator hints.
Offered algorithms — Ed25519 (-8), ES256 (-7), RS256 (-257).
-7public-keyRelying party. id is the environment's APP_URL host, so a passkey registered on one environment is never offered on another.
app.truto.oneTrutoBrowser-side ceremony timeout in milliseconds.
60000User handle the authenticator groups credentials under. id is the base64url-encoded Truto user id.
Jane DoeMTExMTExMTEtMTExMS00MTExLTgxMTEtMTExMTExMTExMTExjane@acme.comcurl -X POST 'https://api.truto.one/auth/passkey/registration/options' \
-H 'Authorization: Bearer <your_api_token>' \
-H 'Content-Type: application/json' \
-d '{
"totp_code": "your_totp_code",
"password": "your_password"
}'const body = {
"totp_code": "your_totp_code",
"password": "your_password"
};
const response = await fetch('https://api.truto.one/auth/passkey/registration/options', {
method: 'POST',
headers: {
'Authorization': 'Bearer <your_api_token>',
'Content-Type': 'application/json',
},
body: JSON.stringify(body),
});
const data = await response.json();
console.log(data);import requests
url = "https://api.truto.one/auth/passkey/registration/options"
headers = {
"Authorization": "Bearer <your_api_token>",
"Content-Type": "application/json",
}
params = {
}
payload = {
"totp_code": "your_totp_code",
"password": "your_password"
}
response = requests.post(url, headers=headers, params=params, json=payload)
print(response.json())