Skip to content

Commit 573b869

Browse files
committed
docs: allow multiple passkey credentials
Summary: - Update auth credential OpenAPI source to describe one EMAIL_OTP credential and multiple distinct PASSKEY credentials. - Update PASSKEY_CREDENTIAL_ALREADY_EXISTS docs to mean duplicate WebAuthn credentialId rather than one-passkey-per-account. - Update Global Accounts authentication docs to recommend backup credentials including additional passkeys. - Rebuild bundled openapi.yaml and mintlify/openapi.yaml. Test Plan: - make build - make lint - git diff --check
1 parent 36bc92e commit 573b869

5 files changed

Lines changed: 17 additions & 17 deletions

File tree

mintlify/openapi.yaml

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mintlify/snippets/global-accounts/authentication.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Every Global Account action beyond receiving funds must be authorized by a sessi
66
| **`OAUTH`** | Your platform already authenticates the user via OIDC (Google, Apple, your own IdP) and you want Grid to trust the same identity. |
77
| **`EMAIL_OTP`** | Lowest-friction option. Works on any device with email access — no biometric hardware, identity provider, or client SDK required beyond the code entry field. |
88

9-
A single internal account can hold one credential of each type concurrently. Only one `PASSKEY` and one `EMAIL_OTP` per account in v1.
9+
A single internal account can hold one `EMAIL_OTP` credential and multiple distinct `PASSKEY` credentials concurrently. `OAUTH` credentials can be added for each supported provider identity.
1010

1111
## Registration vs. verification
1212

@@ -505,7 +505,7 @@ Same pattern as the first activation: call `/challenge` to send a new OTP, then
505505

506506
## Managing credentials
507507

508-
Every Global Account starts with a single credential — the one used in the <a href="overview#quickstart">quickstart</a>. In production, encourage customers to register a second credential of a different type (e.g., an email OTP alongside a passkey) so the account is recoverable if their primary device is lost. Adding, revoking, and rotating credentials after the first all go through the same **two-step signed-retry** pattern.
508+
Every Global Account starts with a single credential — the one used in the <a href="overview#quickstart">quickstart</a>. In production, encourage customers to register a backup credential, such as another passkey or an email OTP, so the account is recoverable if their primary device is lost. Adding, revoking, and rotating credentials after the first all go through the same **two-step signed-retry** pattern.
509509

510510
### List credentials
511511

@@ -622,7 +622,7 @@ Requires an active session on an *existing* credential on the same account. The
622622
</Steps>
623623

624624
<Note>
625-
Only one credential of each type (`EMAIL_OTP`, `PASSKEY`) is allowed per internal account in v1. Registering a second credential of the same type returns `400 EMAIL_OTP_CREDENTIAL_ALREADY_EXISTS` or `400 PASSKEY_CREDENTIAL_ALREADY_EXISTS`.
625+
Only one `EMAIL_OTP` credential is allowed per internal account. Multiple distinct `PASSKEY` credentials are allowed; registering the same WebAuthn credentialId twice returns `400 PASSKEY_CREDENTIAL_ALREADY_EXISTS`.
626626
</Note>
627627

628628
### Revoke a credential

openapi.yaml

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

openapi/components/schemas/errors/Error400.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ properties:
4848
| UNSUITABLE_DOCUMENT | Document type is not accepted or not supported |
4949
| INCOMPLETE | Document is missing pages or sides |
5050
| EMAIL_OTP_CREDENTIAL_ALREADY_EXISTS | An EMAIL_OTP credential is already registered on the target internal account; only one email OTP credential is supported per internal account at this time |
51-
| PASSKEY_CREDENTIAL_ALREADY_EXISTS | A PASSKEY credential is already registered on the target internal account; only one passkey credential is supported per internal account in v1 |
51+
| PASSKEY_CREDENTIAL_ALREADY_EXISTS | A PASSKEY credential with the same WebAuthn credentialId is already registered on the target internal account |
5252
enum:
5353
- INVALID_INPUT
5454
- MISSING_MANDATORY_USER_INFO

openapi/paths/auth/auth_credentials.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ post:
77
Embedded Wallet internal accounts are initialized with an `EMAIL_OTP`
88
credential tied to the customer email on the account. Use this endpoint
99
to add another credential (`OAUTH` or `PASSKEY`), or to add `EMAIL_OTP`
10-
back after it has been removed. Only one `EMAIL_OTP` credential and one
11-
`PASSKEY` credential are supported per internal account.
10+
back after it has been removed. Only one `EMAIL_OTP` credential is
11+
supported per internal account; multiple distinct `PASSKEY` credentials
12+
may be registered.
1213
1314
1415
Adding a credential requires a signature from an existing verified
@@ -160,11 +161,10 @@ post:
160161
expiresAt: '2026-04-08T15:35:00Z'
161162
'400':
162163
description: >-
163-
Bad request. Returned with `EMAIL_OTP_CREDENTIAL_ALREADY_EXISTS` or
164-
`PASSKEY_CREDENTIAL_ALREADY_EXISTS` when registering a credential type
165-
that already exists on the internal account. Only one email OTP
166-
credential and one passkey credential are supported per internal
167-
account at this time.
164+
Bad request. Returned with `EMAIL_OTP_CREDENTIAL_ALREADY_EXISTS`
165+
when registering an email OTP credential while one already exists, or
166+
`PASSKEY_CREDENTIAL_ALREADY_EXISTS` when registering a passkey whose
167+
WebAuthn credentialId is already attached to the internal account.
168168
content:
169169
application/json:
170170
schema:

0 commit comments

Comments
 (0)