Skip to content

feat: add Passkey APIs to Authentication API reference#1373

Open
tomauth0 wants to merge 4 commits into
auth0:mainfrom
tomauth0:passkey-api-on-authn
Open

feat: add Passkey APIs to Authentication API reference#1373
tomauth0 wants to merge 4 commits into
auth0:mainfrom
tomauth0:passkey-api-on-authn

Conversation

@tomauth0

Copy link
Copy Markdown
Contributor

Description

Adds reference documentation for the new Passkey APIs (POST /passkey/challenge
and POST /passkey/register) under the Authentication API, in support of the
Embedded Capabilities GA relaunch (Passkey APIs going GA — covers native iOS,
native Android, and web).

What's in this PR:

  • main/docs/api/authentication/passkey/challenge.mdx — documents
    POST /passkey/challenge. Covers the request body (client_id,
    client_secret, realm, organization), prerequisites (custom domain,
    first-party + OIDC-conformant client, passkey grant enabled), and the
    WebAuthn PublicKeyCredentialRequestOptions returned in
    authn_params_public_key alongside the auth_session value used in the
    subsequent token exchange.
  • main/docs/api/authentication/passkey/register.mdx — documents
    POST /passkey/register. Covers user_profile signup attributes and
    validation rules, user_metadata constraints (max 10 fields, reserved
    field-name blocklist), and the WebAuthn PublicKeyCredentialCreationOptions
    returned (rp, user, pubKeyCredParams, authenticatorSelection).
  • main/config/navigation/generated/authentication.en.json — adds a new
    "Passkeys" group between "Passwordless" and "Device Authorization" that
    links to both new pages.

Testing

  • Run mint dev from main/ and confirm:
    • The "Passkeys" group appears in the Authentication API navigation between
      "Passwordless" and "Device Authorization".
    • Both /passkey/challenge and /passkey/register pages render with
      parameter, response field, and status code tables.
    • Internal links to Passkeys, Configure Passkey Policy, and Custom Domains
      resolve.

Checklist

  • I've read and followed CONTRIBUTING.md.
  • I've tested the site build for this change locally.
  • I've made appropriate docs updates for any code or config changes.
  • I've coordinated with the Product Docs and/or Docs Management team about non-trivial changes.

tomauth0 and others added 2 commits June 11, 2026 11:30
Add the missing main/docs/api/authentication/passkey/register.mdx that should
have been part of the previous commit, and remove
main/docs/authenticate/login/embedded-login/use-cases/enrollment.mdx, which
was committed by mistake and is out of scope for this PR.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@tomauth0 tomauth0 requested a review from a team as a code owner June 11, 2026 11:36
tomauth0 and others added 2 commits June 11, 2026 12:51
# Conflicts:
#	main/config/navigation/generated/authentication.en.json
Remove the manually-edited authentication.en.json from this PR. The Passkey
API pages are added as content-only; navigation will be handled separately
through the OAS-generated nav pipeline.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@@ -0,0 +1,79 @@
---
title: "Start a Passkey Challenge"
description: "Request a passkey challenge so a user can authenticate to your native or web application using a previously registered passkey."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
description: "Request a passkey challenge so a user can authenticate to your native or web application using a previously registered passkey."
description: "Request a passkey challenge for users to authenticate to your Native or Web application using an existing, registered passkey."


`POST /passkey/challenge`

Request a passkey challenge so a user can authenticate to your native or web application using a previously registered passkey. The endpoint returns the WebAuthn parameters your client uses to invoke the platform authenticator, along with an `auth_session` value that you exchange for tokens at `/oauth/token` using the passkey grant.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Request a passkey challenge so a user can authenticate to your native or web application using a previously registered passkey. The endpoint returns the WebAuthn parameters your client uses to invoke the platform authenticator, along with an `auth_session` value that you exchange for tokens at `/oauth/token` using the passkey grant.
Request a passkey challenge so a user can authenticate to your Native or Web application using a previously registered passkey. The endpoint returns the WebAuthn parameters your application uses to invoke the platform authenticator, and an `auth_session` value you exchange for tokens at `/oauth/token` using the passkey grant.


Request a passkey challenge so a user can authenticate to your native or web application using a previously registered passkey. The endpoint returns the WebAuthn parameters your client uses to invoke the platform authenticator, along with an `auth_session` value that you exchange for tokens at `/oauth/token` using the passkey grant.

This endpoint backs the Passkey APIs for native and web applications and is used in combination with the Auth0 [token exchange for passkey](https://auth0.com/docs/authenticate/database-connections/passkeys) grant type.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This endpoint backs the Passkey APIs for native and web applications and is used in combination with the Auth0 [token exchange for passkey](https://auth0.com/docs/authenticate/database-connections/passkeys) grant type.
This endpoint backs the Passkey APIs for Native and Web applications. Use this endpoint in combination with the Auth0 [token exchange for passkey](https://auth0.com/docs/authenticate/database-connections/passkeys) grant type.


This endpoint backs the Passkey APIs for native and web applications and is used in combination with the Auth0 [token exchange for passkey](https://auth0.com/docs/authenticate/database-connections/passkeys) grant type.

### Remarks

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
### Remarks
## Remarks


### Remarks

- The application's grant types must include `urn:okta:params:oauth:grant-type:webauthn`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- The application's grant types must include `urn:okta:params:oauth:grant-type:webauthn`.
- The application's [grant types](/docs/get-started/applications/application-settings#grant-types) must include: `urn:okta:params:oauth:grant-type:webauthn`.

- The application must be OIDC conformant.
- The request must be made against a [custom domain](https://auth0.com/docs/customize/custom-domains) configured for your tenant. Calls to the default Auth0 domain (`{tenant}.auth0.com`) are rejected.

### Learn More

@avanscoy avanscoy Jun 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Learn more section should be at the end of the article starting on line 81 to be consistent with the rest of Docs.

</ParamField>

<ParamField body="realm" type="string">
Name of the database connection to authenticate against. If omitted, the tenant's default database connection for the application is used.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Name of the database connection to authenticate against. If omitted, the tenant's default database connection for the application is used.
Name of the database connection to authenticate against. If omitted, Auth0 uses your tenant's default database connection for the application.

</ParamField>

<ParamField body="organization" type="string">
ID of the [organization](https://auth0.com/docs/manage-users/organizations) the user is signing in to. Required when the application's `organization_usage` is set to `require`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ID of the [organization](https://auth0.com/docs/manage-users/organizations) the user is signing in to. Required when the application's `organization_usage` is set to `require`.
ID of the [Auth0 Organization](https://auth0.com/docs/manage-users/organizations) to which the user is signing in. Required when the application's `organization_usage` is set to `require`.


## Response

A successful response contains the WebAuthn parameters your client passes to the platform authenticator and an `auth_session` value that ties the subsequent assertion to this challenge.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
A successful response contains the WebAuthn parameters your client passes to the platform authenticator and an `auth_session` value that ties the subsequent assertion to this challenge.
A successful response contains the WebAuthn parameters your application passes to the platform authenticator and an `auth_session` value that ties the subsequent assertion to this challenge.

</ResponseField>

<ResponseField name="rpId" type="string">
Relying Party identifier. Defaults to the tenant custom domain. When the tenant has a custom Relying Party identifier configured, that value is returned instead.

@avanscoy avanscoy Jun 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Relying Party identifier. Defaults to the tenant custom domain. When the tenant has a custom Relying Party identifier configured, that value is returned instead.
[Relying party identifier(RP ID)](/docs/authenticate/database-connections/passkeys#relying-party-id-for-passkeys). Defaults to the tenant custom domain. When the tenant has a custom relying party identifier configured, Auth0 returns the `rp.id` value instead.

@@ -0,0 +1,163 @@
---
title: "Register a New User With a Passkey"
description: "Initiate passkey registration for a new user during sign up. Returns the WebAuthn creation parameters and an auth_session used to complete enrollment."

@avanscoy avanscoy Jun 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
description: "Initiate passkey registration for a new user during sign up. Returns the WebAuthn creation parameters and an auth_session used to complete enrollment."
description: "Initiate passkey registration for a new user during sign up. Returns the WebAuthn creation parameters and the `auth_session` users need to complete enrollment."


`POST /passkey/register`

Initiate passkey registration for a new user during sign up. The endpoint creates a passkey enrollment session, validates the supplied user profile against the database connection's signup attributes, and returns the WebAuthn creation parameters your client passes to the platform authenticator. After the authenticator returns an attestation, you complete enrollment by exchanging the assertion at `/oauth/token` using the passkey grant.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Initiate passkey registration for a new user during sign up. The endpoint creates a passkey enrollment session, validates the supplied user profile against the database connection's signup attributes, and returns the WebAuthn creation parameters your client passes to the platform authenticator. After the authenticator returns an attestation, you complete enrollment by exchanging the assertion at `/oauth/token` using the passkey grant.
Initiate passkey registration for a new user during sign up. The endpoint creates a passkey enrollment session, validates the supplied user profile against the database connection's signup attributes, and returns the WebAuthn creation parameters your application passes to the platform authenticator. After the authenticator returns an attestation, you complete enrollment by exchanging the assertion at `/oauth/token` using the passkey grant.


Initiate passkey registration for a new user during sign up. The endpoint creates a passkey enrollment session, validates the supplied user profile against the database connection's signup attributes, and returns the WebAuthn creation parameters your client passes to the platform authenticator. After the authenticator returns an attestation, you complete enrollment by exchanging the assertion at `/oauth/token` using the passkey grant.

### Remarks

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
### Remarks
## Remarks

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You skipped over H2


### Remarks

- The application's grant types must include `urn:okta:params:oauth:grant-type:webauthn`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- The application's grant types must include `urn:okta:params:oauth:grant-type:webauthn`.
- The application's [grant types](/docs/get-started/applications/application-settings#grant-types) must include: `urn:okta:params:oauth:grant-type:webauthn`.

- `user_profile` must contain every identifier marked `required` for signup on the connection (commonly `email`, `phone_number`, or `username`). Additional identifiers may be `optional`.
- A user is identified as already-existing through any of the configured identifiers; if any submitted identifier resolves to an existing user, the request fails with `invalid_request`.

### Learn More

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move line 19-23 to the end of the article to be consisten with Docs

</ParamField>

<ParamField body="realm" type="string">
Name of the database connection the user is signing up against. If omitted, the tenant's default database connection for the application is used.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Name of the database connection the user is signing up against. If omitted, the tenant's default database connection for the application is used.
Name of the database connection the user is signing up against. If omitted, Auth0 uses your tenant's default database connection for the application.

</ParamField>

<ParamField body="organization" type="string">
ID of the [organization](https://auth0.com/docs/manage-users/organizations) the user is signing up into. Required when the application's `organization_usage` is set to `require`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ID of the [organization](https://auth0.com/docs/manage-users/organizations) the user is signing up into. Required when the application's `organization_usage` is set to `require`.
ID of the [Auth0 Organization](https://auth0.com/docs/manage-users/organizations) to which the user is signing in. Required when the application's `organization_usage` is set to `require`.


<Expandable title="properties">
<ParamField body="email" type="string">
User's email address. Validated against the JSON Schema email format.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
User's email address. Validated against the JSON Schema email format.
User's email address. Validated against the `JSON` schema email format.

</ParamField>

<ParamField body="phone_number" type="string">
User's phone number in E.164 format (1–30 characters, international `+` prefix).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example?

</ParamField>

<ParamField body="username" type="string">
User's username. Validated against the connection's username policy (length and allowed characters).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
User's username. Validated against the connection's username policy (length and allowed characters).
User's username. Validates against the connection's username policy (length and allowed characters).

</ResponseField>

<ResponseField name="rp" type="object">
Relying Party identity.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Relying Party identity.
Relying party identity.


<Expandable title="properties">
<ResponseField name="id" type="string">
Relying Party identifier. Defaults to the tenant custom domain or the configured custom Relying Party identifier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Relying Party identifier. Defaults to the tenant custom domain or the configured custom Relying Party identifier.
Relying party identifier (RP ID). Defaults to the tenant custom domain or the configured custom Relying party identifier.

</ResponseField>

<ResponseField name="name" type="string">
Relying Party display name. Returned identical to `rp.id`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Relying Party display name. Returned identical to `rp.id`.
Relying party display name. Returned identical to `rp.id`.

</ResponseField>

<ResponseField name="user" type="object">
WebAuthn user handle to bind the new credential to.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
WebAuthn user handle to bind the new credential to.
WebAuthn user handle to which you bind the new credential.

</ResponseField>

<ResponseField name="pubKeyCredParams" type="array">
Allowed credential public-key algorithms in preference order. Auth0 returns EdDSA (`-8`), ES256 (`-7`), and RS256 (`-257`).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Allowed credential public-key algorithms in preference order. Auth0 returns EdDSA (`-8`), ES256 (`-7`), and RS256 (`-257`).
Allowed credential [public-key algorithms](/docs/get-started/applications/signing-algorithms) in preference order. Auth0 returns EdDSA (`-8`), ES256 (`-7`), and RS256 (`-257`).

| 400 | Invalid request. Common causes include missing required `user_profile` identifiers, an invalid `user_profile` field, an invalid `user_metadata` field, the user already exists, the application is not configured for passkey authentication, the request was not made against a custom domain, or the application is third-party. |
| 401 | Unauthorized. Invalid client credentials. |
| 404 | The Passkey APIs are not enabled for the tenant. |
| 429 | Too many requests. Per-IP rate limit exceeded. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
| 429 | Too many requests. Per-IP rate limit exceeded. |
| 429 | Too many requests. Per-IP rate limit exceeded. |
## Learn more
- [Passkeys APIs](https://auth0.com/docs/authenticate/database-connections/passkeys/native-passkeys-api)
- [Configure Passkey Policy](https://auth0.com/docs/authenticate/database-connections/passkeys/configure-passkey-policy)
- [Custom Domains](https://auth0.com/docs/customize/custom-domains)

| 400 | Invalid request. Common causes include missing or invalid parameters, the application is not configured for passkey authentication, the request was not made against a custom domain, or the application is third-party. |
| 401 | Unauthorized. Invalid client credentials. |
| 404 | The Passkey APIs are not enabled for the tenant. |
| 429 | Too many requests. Per-IP rate limit exceeded. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
| 429 | Too many requests. Per-IP rate limit exceeded. |
| 429 | Too many requests. Per-IP rate limit exceeded. |
## Learn more
- [Passkeys APIs](https://auth0.com/docs/authenticate/database-connections/passkeys/native-passkeys-api)
- [Configure Passkey Policy](https://auth0.com/docs/authenticate/database-connections/passkeys/configure-passkey-policy)
- [Custom Domains](https://auth0.com/docs/customize/custom-domains)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants