The core idea
Instead of your app connecting to the user’s wallet directly, the user generates a short-lived code in their wallet app. Your app uses this code to request actions, and the user approves them in their wallet.The lifecycle
Every action code goes through these stages:1
Generated
User visits actioncode.app and generates a code tied to their wallet.Code is: 8 digits, valid for ~2 minutes, tied to one wallet
2
Shared
User copies the code and shares it with your app — via text input, chat message, or any other method.Your app: Receives the code and calls
client.resolve(code) to verify it3
Attached
Your app attaches an action (transaction or message) to the code.Your app: Calls
client.attachTransaction(code, tx) or client.attachMessage(code, msg)User sees: The pending request appears in actioncode.app4
Approved
User reviews the request in actioncode.app and approves it with their wallet.User wallet: Signs the transaction or message
5
Finalized
Your app receives the signed result.Your app:
observeStatus() returns finalizedSignature or signedMessageStatus flow
Where users get codes
Users generate codes at actioncode.app.1
Open in wallet browser
User opens actioncode.app in their wallet’s built-in browser (Phantom, Solflare, Backpack, etc.)
2
Connect wallet
User connects their wallet to actioncode.app
3
Get code
User taps “Get Code” and receives an 8-digit code
4
Share code
User copies the code and shares it with your app
5
Approve requests
When your app attaches an action, user sees it in actioncode.app and can approve
Why this design?
SDK methods by stage
Example: Sign-in flow
Here’s how you might use Action Codes for wallet-based authentication:Next steps
Quick Start
Get integrated in 5 minutes
SDK Methods
Full API reference
Recipes
Real-world examples
Advanced: Protocol
How the protocol works internally