# Backend API Reference
The Passwordless.dev private API is used by your backend to initiate key registrations, verify sign-ins, retrieve keys for end-users, and more.
All requests made to this API require your API private secret in the header for authentication. Requests made to the public API, which are facilitated by methods in the JavaScript client, will instead require your API public key.
# /register/token
# Request
POST
requests made to the /register/token
endpoint create a registration token for a user, which will be used by your frontend to negotiate creation of a WebAuth credential.
The request body must include at least a userId
and username
for example:
- HTTP
- JavaScript
POST https://v4.passwordless.dev/register/token HTTP/1.1
ApiSecret: myapplication:secret:11f8dd7733744f2596f2a28544b5fbc4
Content-Type: application/json
{
"userId": "107fb578-9559-4540-a0e2-f82ad78852f7",
"username": "pjfry@passwordless.dev",
"displayname": "Philip J Fry",
}
The request body may include additional parameters besides those required, all of which are listed here:
Parameter | Description | Example Value |
---|---|---|
userId | Required. A WebAuthn User Handle, which should be generated by your application. This is used to identify your user (could be a database primary key ID or a guid). Max. 64 bytes. Should not contain PII about the user. | "107fb578-9559-4540-a0e2-f82ad78852f7" |
username | Required. A human-palatable identifier for a user account. It is intended only for display, i.e., aiding the user in determining the difference between user accounts with similar displayNames. Used in Browser UI's and never stored on the server | "pjfry@passwordless.dev" |
displayname | A human-palatable name for the account, which should be chosen by the user. Used in Browser UI's and never stored on the server. | "Philip J Fry" |
attestation | WebAuthn attestation conveyance preference. Only "none" (default) is supported. | "none" (default) |
authenticatorType | WebAuthn authenticator attachment modality. Can be "any" (default), "platform" , which triggers client device-specific options Windows Hello, FaceID, or TouchID, or "cross-platform" , which triggers roaming options like security keys. | "any" (default) |
discoverable | If true , creates a client-side Discoverable Credential that allows sign in without needing a username. | true (default) |
userVerification | Allows choosing preference for requiring User Verification (biometrics, pin code etc) when authenticating Can be "preferred" (default), "required" or "discouraged" . | "preferred" |
expiresAt | Timestamp (UTC) when the registration token should expire. By default, current time + 120 seconds. | "3023-08-01T14:43:03Z" |
aliases | A array of aliases for the userId, such as an email or username. Used to initiate a signin on the client side with the signinWithAlias() method. An alias must be unique to the userId. Defaults to an empty array [] . | ["pjfry@passwordless.dev"] |
aliasHashing | Whether aliases should be hashed before being stored. Defaults to true . | true |
# Response
If successful, the /register/token
endpoint will create a registration token returned as json, for example:
{ "token": "register_wWdDh02ItIvnCKT_02ItIvn..." }
This registration token will will be used by your frontend to negotiate creation of a WebAuth credential.
# /signin/verify
# Request
POST
requests made to the /signin
endpoint unpack a verification token, which must be generated by calling a .signinWith*()
method on your frontend (learn more) and included here in the request body, for example:
- HTTP
- JavaScript
POST https://v4.passwordless.dev/signin/verify HTTP/1.1
ApiSecret: myapplication:secret:11f8dd7733744f2596f2a28544b5fbc4
Content-Type: application/json
{
"token": "d5vzCkL_GvpS4VYtoT3..."
}
The Passwordless.dev private API will unpack the verification token to check its legitimacy.
# Response
If successful, the /signin/verify
endpoint will return a success response object, for example:
{
"success": true,
"userId": "123",
"timestamp": "3023-08-01T14:43:03Z",
"rpid": "localhost",
"origin": "http://localhost:3000",
"device": "Firefox, Windows 10",
"country": "SE",
"nickname": "My Work Phone",
"expiresAt": "3023-08-01T14:43:03Z",
"tokenId": "TODO",
"type": "passkey_signin" // or passkey_register
}
Use the .success
value (true
or false
) to determine next actions, i.e. whether to complete the sign-in (learn more).
# /alias
# Request
POST
requests made to the /alias
endpoint add aliases (learn more) to a user, dictated by their userId
, in order to allow sign-in with additional usernames, email addresses, etc.
The request body must include the user's userId
and a complete array of aliases, as pre-existing aliases are overwritten when the POST
request is made, for example:
- HTTP
- JavaScript
POST https://v4.passwordless.dev/alias HTTP/1.1
ApiSecret: myapplication:secret:11f8dd7733744f2596f2a28544b5fbc4
Content-Type: application/json
{ "userId": "107fb578-9559-4540-a0e2-f82ad78852f7", "aliases": ["pjfry@passwordless.dev", "benderrules@passwordless.dev"], "hashing": true }
TIP
By default, "hashing": true
will be turned on to hash aliases before they're stored. Hashed aliases will not be viewable to you in the admin console.
A few rules to take into consideration when allowing users to create aliases:
- An alias must be unique to the specified
userId
. - An alias must be no more than 250 characters.
- A
userID
may have no more than 10 aliases associated with it.
# Response
Alias are never returned in any API responses, and can be hashed to preserve user privacy (see above). If successful, the /alias
endpoint will return an HTTP 200 OK status code.
# /credentials/list
# Request
GET
requests made to the /credentials/list
endpoint list all registered credentials associated with a user, as dictated by their userId
. The request must include the userId
in question, for example:
- HTTP
- JavaScript
GET https://v4.passwordless.dev/credentials/list?userId=107fb578-9559-4540-a0e2-f82ad78852f7 HTTP/1.1
ApiSecret: myapplication:secret:11f8dd7733744f2596f2a28544b5fbc4
# Response
If successful, the /credentials/list
endpoint will return an array of .json
objects where each object represents a registered credential:
[
{
"descriptor": {
"type": "public-key",
"id": "2mgrJ6LPItfxbnVc2UgFPHowNGKaYBm3Pf4so1bsXSk"
},
"publicKey": "pQECAyYgASFYIPi4M0A+ZFeyOHEC9iMe6dVhFnmOZdgac3MRmfqVpZ0AIlggWZ+l6+5rOGckXAsJ8i+mvPm4YuRQYDTHiJhIauagX4Q=",
"userHandle": "YzhhMzJlNWItNDZkMy00ODA4LWFlMTAtMTZkM2UyNmZmNmY5",
"signatureCounter": 0,
"createdAt": "2023-04-21T13:33:50.0764103",
"aaGuid": "adce0002-35bc-c60a-648b-0b25f1f05503",
"lastUsedAt": "2023-04-21T13:33:50.0764103",
"rpid": "myapp.example.com",
"origin": "https://myapp.example.com",
"country": "US",
"device": "Chrome, Mac OS X 10",
"nickname": "Fred's Macbook Pro 2",
"userId": "c8a32e5b-46d3-4808-ae10-16d3e26ff6f9"
},
...
]
Learn more about what these key-value pairs signify.
# /credentials/delete
# Request
POST
requests made to the /credentials/delete
endpoint delete a specific credential associated with a user, as dictated by a credentialId
. The request must include the credentialId
in question, for example:
POST https://v4.passwordless.dev/credentials/delete HTTP/1.1
ApiSecret: myapplication:secret:11f8dd7733744f2596f2a28544b5fbc4
Content-Type: application/json
{
"credentialId":"qgB2ZetBhi0rIcaQK8_HrLQzXXfwKia46_PNjUC2L_w"
}
# Response
If successful, the /credentials/delete
endpoint will return an HTTP 200 OK status code.
# Status codes
The API returns HTTP Status codes for each request.
In case you receive an error, you will also receive a JSON serialized summary of the error in the form of problem details. For more information, see the Errors page.
HTTP Code | Message | Status |
---|---|---|
200 | Everything is OK. | ✅ |
201 | Everything is OK but empty. | ✅ |
400 | Bad request. | 🔴 |
401 | You did not identify yourself. | 🔴 |
409 | Conflict (alias is already in use). | 🔴 |
500 | Something went very wrong on our side. | 🔴 |
← Get Started .NET →