Let users bring the wallet they already have. No SDK required.

A hosted page you point users at: 600+ EVM and Solana wallets, on web, iOS, Android and Flutter. Redirect back with the address, or go headless to sign messages and transactions. You never hold keys.

Hosted connect page

Web guide ↗

What this page returns

The hosted flow reads the user's public wallet address and hands it back to you - it requests no signature. That proves the user can present an address, not that they control it. To prove control, or to sign a transaction, use the headless engine on iOS, Android or Flutter.

01

Link to the connect page

Open this page in the user's browser (or a webview) with the following query parameters:

redirect_uriURLrequired

Where we send the user back after they connect. Must be an http(s) URL you control. Alias: redirect_url.

noncestringoptional

An opaque value we echo back unchanged so you can correlate the response to the request. If you don't send one, we don't return one.

link to open
1https://connect.dynamicauth.com/
2 ?redirect_uri=https://your-app.com/wallet/callback
3 &nonce=a1b2c3d4e5
02

Receive the result

After a successful connection we redirect the browser to your redirect_uri with these query parameters appended:

addressstringoptional

The connected wallet's public address.

chain"evm" | "solana"optional

Which chain family the address belongs to.

walletNamestringoptional

Display name of the wallet (e.g. MetaMask).

walletImageURLoptional

Icon URL for the wallet (empty for a manually-entered address).

noncestringoptional

The exact nonce you passed in, present only if you sent one.

redirect we send
1https://your-app.com/wallet/callback
2 ?address=0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
3 &chain=evm
4 &walletName=MetaMask
5 &walletImage=https://.../metamask.svg
6 &nonce=a1b2c3d4e5
03

Read it on your callback

On your redirect_uri, read the params off the URL:

callback.ts
1const params = new URLSearchParams(location.search);
2
3const address = params.get("address"); // "0x1a2b…9a0b"
4const chain = params.get("chain"); // "evm" | "solana"
5const nonce = params.get("nonce"); // echoed back, or null
6
7// Verify `nonce` matches the one you issued, then continue.

An address alone proves the user can present it, not that they control it. For proof of ownership, add a sign-in step - or use the headless engine, where the wallet signs. In production, set NEXT_PUBLIC_CONNECT_ALLOWED_REDIRECT_HOSTS to the hosts you accept: an unrestricted redirect_uri is an open redirect.

Connections - Dynamic Demos