Getting Started
The Magic class is the entry-point to the Magic SDK. It must be instantiated with a Magic publishable key.Installation
To use Magic in your application, install themagic-sdk
dependency.
NOTEIf you’re integrating with OAuth, additional dependencies are needed. You’ll find the installation instructions in its dedicated section within this documentation.
Constructor
Magic()
Configure and construct your Magic SDK instance.
Parameter | Type | Definition |
apiKey | String | Your publishable API key retrieved from the Magic Dashboard. |
options.locale? | String | Customize the language of Magic’s modal, email and confirmation screen. See Localization for more. |
options.testMode? | Boolean | Enable testMode to assert the desired behavior through the email address you provide to loginWithMagicLink without having to go through the auth flow. |
options.network? | String | Object | (String): A representation of the connected Ethereum network (mainnet or goerli). (Object): A custom Ethereum Node configuration with the following shape: rpcUrl (String): A URL pointing to your custom Ethereum Node. chainId? (Number): Some Node infrastructures require you to pass an explicit chain ID. If you are aware that your Node requires this configuration, pass it here as an integer. |
options.endpoint? | String | A URL pointing to the Magic <iframe> application. |
options.deferPreload? | Boolean | An optional flag to delay the loading of the Magic Iframe’s static assets until an SDK function is explicitly invoked. Set this to true if latency bottlenecks are a concern. |
options.useStorageCache? | Boolean | An optional flag to allow the usage of the local storage as cache. Currently it is only used for faster calls to isLoggedIn . When set to true , the magic.user.onUserLoggedOut event listener needs to be used. |
Initialization
JavaScript
Global Methods
Global methods and properties are accessible on the Magic SDK instance itself.preload
Starts downloading the static assets required to render the Magic iframe context.
NOTEAs of magic-sdk version 21.0.0, the SDK constructor will preload the iframe’s static assets by default, unless the
deferPreload
flag is passed into the constructor options. See Release NotesJavaScript
Auth Module
The Auth Module and it’s members are accessible on the Magic SDK instance by theauth
property.
loginWithEmailOTP
Authenticate a user passwordlessly using an email one-time code sent to the specified user’s email address.
Arguments
email
(String): The user email to log in withlifespan?
(Number): Set the lifespan of the resolved Decentralize ID token. Defaults to 900s (15 mins)showUI?
(Boolean): Iftrue
, show an out-of-the-box UI to accept the OTP from user. Defaults totrue
deviceCheckUI?
(Boolean): The default value istrue
. It shows Magic branded UI securing sign-ins from new devices. If set tofalse
, the UI will remain hidden. However, this false value only takes effect when you have also setshowUI: false
. If you enable Device Verification in the Magic dashboard and are passingshowUI: false
you must also explicitly passdeviceCheckUI: false
[email protected]
Returns
PromiEvent<string | null>
: The promise resolves upon authentication request success and rejects with a specific error code if the request fails. The resolved value is a Decentralized ID token with a default 15-minute lifespan.
JavaScript
showUI: false
to this login method. Here’s a short example to illustrate listening for and emitting events during the login flow:
JavaScript
Event Name | Definition |
email-otp-sent | Dispatched when the OTP email has been successfully sent from the Magic server. |
verify-email-otp | Emit along with the OTP to verify the code from user. |
invalid-email-otp | Dispatched when the OTP sent fails verification. |
cancel | Emit to cancel the login request. |
Event Name | Definition |
device-needs-approval | Dispatched when the device is unrecognized and requires user approval |
device-verification-email-sent | Dispatched when the device verification email is sent |
device-approved | Dispatched when the user has approved the unrecongized device |
device-verification-link-expired | Dispatched when the email verification email has expired |
device-retry | Emit to restart the device registration flow |
JavaScript
loginWithSMS
Authenticate a user passwordlessly using a one-time code sent to the specified phone number.
List of Currently Blocked Country Codes
Arguments
phoneNumber
(String): E.164 formatted phone numberlifespan?
(Number): Set the lifespan of the resolved Decentralize ID token. Defaults to 900s (15 mins)
PromiEvent<string | null>
: The promise resolves upon authentication request success and rejects with a specific error code if the request fails. The resolved value is a Decentralized ID token with a default 15-minute lifespan.
JavaScript
JavaScript
updateEmailWithUI
Initiates the update email flow that allows a user to change their email address.
Arguments
-
email
(String): The new email to update to -
showUI?
(Boolean): Iftrue
, shows an out-of-the-box pending UI which includes instructions on which step of the confirmation process the user is on. Dismisses automatically when the process is complete
PromiEvent<boolean>
: The promise resolves with a true boolean value if update email is successful and rejects with a specific error code if the request fails
JavaScript
showUI: false
to this method. The white-label flow is only supported in Magic SDK v22.0.0 and above. Here’s a short example to illustrate listening for and emitting events during the flow:
JavaScript
JavaScript
Wallet Module
The Wallet Module and it’s members are accessible on the Magic SDK instance by thewallet
property.
The Wallet Module is currently only compatible with Ethereum, Polygon, Base, Arbitrum, Optimism, and Flow (no NFTs).
connectWithUI
Renders a simple login form UI to collect the user’s email address and authenticate them passwordlessly using a one-time passcode (OTP) sent to their email address they input.
Arguments
- None
- A
promiEvent
which returns anString[]
when resolved: An array of user accounts that are connected, with the first element being the current public address of the user. You can read more on PromiEvents here.
JavaScript
showUI
Displays the fully navigable wallet to the user that adheres to the toggled configurations on your developer dashboard’s Widget UI tab. This is only supported for users who login with email or Google. User must be signed in for this method to return or else it will throw an error.
Arguments
- None
Promise
which resolves when the user closes the window
.on()
handler to catch the disconnect
event emitted when the user logs out from the wallet widget.
Example
JavaScript
showAddress
Displays an iframe with the current user’s wallet address in a QR Code.
Arguments
- None
Promise
which resolves when the user closes the window
JavaScript
showBalances
Displays an iframe that displays the user’s token balances from the currently connected network.
Arguments
- None
Promise
which resolves when the user closes the window
JavaScript
showNFTs
Displays an iframe that shows the user’s NFTs in both an aggregated and detailed individual view. Supported only on Ethereum and Polygon. Ensure this is enabled in your developer dashboard via the ‘Widget UI’ tab.
Arguments
- None
Promise
which resolves when the user closes the window
JavaScript
showSendTokensUI
Displays an iframe with UI to help the user transfer tokens from their account to another address.
Arguments
- None
Promise
which resolves when the user closes the window
JavaScript
showOnRamp
Displays an iframe modal with various on ramp providers for the user to purchase crypto from directly to their wallet.
To use the fiat onramp, you will need to contact us to KYB with the payment provider prior to use. Once approved, ensure this toggle is enabled in your developer dashboard via the ‘Widget UI’ tab.
Arguments
- None
Promise
which resolves when the user closes the window
JavaScript
User Module
The User Module and it’s members are accessible on the Magic SDK instance by theuser
property.
getIdToken
Generates a Decentralized Id Token which acts as a proof of authentication to resource servers.
Arguments
lifespan?
(Number): Will set the lifespan of the generated token. Defaults to 900s (15 mins)
PromiEvent<string>
: Base64-encoded string representation of a JSON tuple representing[proof, claim]
JavaScript
generateIdToken
Generates a Decentralized ID token with optional serialized data.
Arguments
lifespan?
(Number): Will set the lifespan of the generated token. Defaults to 900s (15 mins)attachment?
(String): Will set a signature of serialized data in the generated token. Defaults to"none"
PromiEvent<string>
: Base64-encoded string representation of a JSON tuple representing[proof, claim]
JavaScript
getInfo
Retrieves information for the authenticated user.
Arguments
- None
PromiEvent<string>
:issuer
(String): The Decentralized ID of the user. In server-side use-cases, we recommend this value to be used as the user ID in your own tables.email
(String): Email address of the authenticated userphoneNumber
(String): The phone number of the authenticated userpublicAddress
(String): The authenticated user’s public address (a.k.a.: public key)isMfaEnabled
(Boolean): Whether or not multi-factor authentication is enabled for the userrecoveryFactors
(Array): Any recovery methods that have been enabled (ex.[{ type: 'phone_number', value: '+99999999' }]
)
JavaScript
isLoggedIn
Checks if a user is currently logged in to the Magic SDK.
Arguments
- None
PromiEvent<boolean>
JavaScript
logout
Logs out the currently authenticated Magic user
Arguments
- None
PromiEvent<boolean>
JavaScript
showSettings
Displays an iframe with the current user’s settings. Allows for users to update their email address, enable multi-factor authentication, and add a recovery factor.
Access to MFA and account
recovery require paid add-ons.
page?
(String): Optional argument to deeplink to a specific page ('mfa' | 'update-email' | 'recovery'
)
Promise
which resolves when the user closes the window
JavaScript
page
(String):'recovery'
showUI
(Boolean):false
Promise
which resolves when the user closes the window
JavaScript
recoverAccount
A user can recover their email account if they’ve setup a phone number as a recovery factor. Calling this method will display a modal for the user to submit the sent SMS OTP.
Access to account recovery require
paid add-ons.
Arguments
email
(String): The email address (primary auth factor) of the user
PromiEvent<boolean>
: The promise resolves with a true boolean value if the recovery is successful and rejects if the request fails
JavaScript
enableMFA
Displays an iframe deep linked to the beginning of the enable MFA flow. This is the same as calling showSettings({ page: 'mfa' })
Access to MFA require paid add-ons. Available as of
magic-sdk v28.11.0
showUI?
(Boolean): Iftrue
, show an out-of-the-box UI to take user through flow to enable MFA. Defaults totrue
Promise
which resolves when the user closes the window
JavaScript
Event Name | Definition |
mfa-secret-generated | Dispatched when the user starts the enable MFA process. |
invalid-mfa-otp | Dispatched when the MFA TOTP submitted by user is invalid. |
mfa-recovery-codes | Dispatched when the MFA TOTP submitted by user is valid. |
verify-mfa-code | Emit to submit MFA TOTP submitted by user. |
cancel-mfa-setup | Emit to cancel the MFA enable flow. |
disableMFA
Displays an iframe deep linked to the beginning of the disable MFA flow. This method assumes MFA has been enabled for the logged in user. This cannot be achieved by calling showSettings()
.
Access to MFA require paid add-ons. Available
as of magic-sdk v28.11.0
Arguments
showUI?
(Boolean): Iftrue
, show an out-of-the-box UI to take user through flow to disable MFA. Defaults totrue
Promise
which resolves when the user closes the window
JavaScript
Event Name | Definition |
mfa-code-requested | Dispatched when the user starts the disable MFA process. |
invalid-mfa-otp | Dispatched when the MFA TOTP submitted by user is invalid. |
invalid-recovery-code | Dispatched when the Recovery Code submitted by user is invalid. |
verify-mfa-code | Emit to submit MFA TOTP submitted by user. |
lost-device | Emit to submit Recovery Code submitted by user. |
cancel-mfa-disable | Emit to cancel the MFA disable flow. |
revealPrivateKey
Displays an iframe revealing the current user’s private key. Allows for users to take their private key to another wallet. Neither Magic nor the developer can see this key; only the end user can.
Arguments
- None
Promise
which resolves when the user closes the window
JavaScript
onUserLoggedOut
When the useStorageCache is enabled, there might be situations where the isLoggedIn function returns true despite the user being logged out. In such instances, an event will be emitted after a few milliseconds, providing an opportunity to manage the user’s logged-out state, such as when a session expires.
Only necessary with when the
useStorageCache
option is set to true
.callback
((isLoggedOut: boolean) => void
): The callback function when the event is emitted
- A
function
that can be called to unsubscribe from the event
JavaScript
OAuth Module
The OAuth Module and it’s members are accessible on the Magic SDK instance by theoauth2
property.
To use the OAuth Module in your application, install @magic-ext/oauth2
along with magic-sdk
.
loginWithRedirect
Starts the OAuth 2.0 login flow.
Arguments
provider
(String): The OAuth provider being used for loginredirectURI
(String): A URL a user is sent to after they successfully log inscope?
(Array): Defines the specific permissions an application requests from a user
- None
Name | Argument | Example |
'google' | Google demo | |
'facebook' | Facebook demo | |
'twitter' | Twitter demo | |
Apple | 'apple' | Apple demo |
Discord | 'discord' | Discord demo |
GitHub | 'github' | Github demo |
'linkedin' | LinkedIn demo | |
Bitbucket | 'bitbucket' | Bitbucket demo |
GitLab | 'gitlab' | GitLab demo |
Twitch | 'twitch' | Twitch demo |
Microsoft | 'microsoft' | Microsoft demo |
JavaScript
getRedirectResult
Returns the final OAuth 2.0 result.
Arguments
lifespan?
(Number): Set the lifespan of the resolved Decentralize ID token. Defaults to 900s (15 mins)
PromiEvent<object>
:-
magic
(Object): Information about the authenticated Magic user. Comprised ofidToken
anduserMetadata
. oauth
(Object): Information about the authenticated OAuth user. Comprised ofaccessToken
,provider
,scope
,userHandle
, anduserInfo
.
-
JavaScript
Response and Error Handling
There are three types of error class to be aware of when working with Magic’s client-side JavaScript SDK:SDKError
: Raised by the SDK to indicate missing parameters, communicate deprecation notices, or other internal issues. A notable example would be a MISSING_API_KEY error, which informs the required API key parameter was missing from new Magic(…).RPCError
: Errors associated with specific method calls to the Magic<iframe>
context. These methods are formatted as JSON RPC 2.0 payloads, so they return error codes as integers. This type of error is raised by methods likeAuthModule.loginWithMagicLink
.ExtensionError
: Errors associated with method calls to Magic SDK Extensions. Extensions are an upcoming/experimental feature of Magic SDK. More information will be available once Extensions are officially released.
SDKError
The SDKError
class is exposed for instanceof
operations.
JavaScript
SDKError
instances expose the code
field which may be used to deterministically identify the error. Additionally, an enumeration of error codes is exposed for convenience and readability:
JavaScript
Error Codes
Enum Key | Description |
MissingApiKey | Indicates the required Magic API key is missing or invalid. |
ModalNotReady | Indicates the Magic iframe context is not ready to receive events. This error should be rare and usually indicates an environmental issue or improper async/await usage. |
MalformedResponse | Indicates the response received from the Magic iframe context is malformed. We all make mistakes (even us), but this should still be a rare exception. If you encounter this, please be aware of phishing! |
InvalidArgument | Raised if an SDK method receives an invalid argument. Generally, TypeScript saves us all from simple bugs, but there are validation edge cases it cannot solve—this error type will keep you informed! |
ExtensionNotInitialized | Indicates an extension method was invoked before the Magic SDK instance was initialized. Make sure to access extension methods only from the Magic SDK instance to avoid this error. |
IncompatibleExtension | Indicates that incompatible extensions were detected during the initialization of the Magic SDK. The error message specifies the incompatible extensions and their compatibility requirements based on the current Magic SDK version and platform environment. |
RPCError
The RPCError
class is exposed for instanceof
operations:
JavaScript
RPCError
instances expose the code
field which may be used to deterministically identify the error. Additionally, an enumeration of error codes is exposed for convenience and readability:
JavaScript
Magic Error Codes
Code | Enum Key | Description |
-10003 | UserAlreadyLoggedIn | A user is already logged in. If a new user should replace the existing user, make sure to call logout before proceeding. |
-10004 | UpdateEmailFailed | An update email request was unsuccessful, either due to an invalid email being supplied or the user canceled the action. |
-10005 | UserRequestEditEmail | The user has stopped the login request because they want to edit the provided email. |
-10010 | InactiveRecipient | The recipient account is currently inactive. The user should verify and activate their account to resolve this issue. |
-10011 | AccessDeniedToUser | User access is denied. The user lacks the necessary permissions or credentials to perform the requested action. |
-10015 | RedirectLoginComplete | The redirect login process has been successfully completed. |
Standard JSON RPC 2.0 Error Codes
Code | Enum Key | Description |
-32700 | ParseError | Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text. |
-32600 | InvalidRequest | The JSON sent is not a valid Request object. |
-32601 | MethodNotFound | The method does not exist / is not available. |
-32602 | InvalidParams | Invalid method parameter(s). |
-32603 | InternalError | Internal JSON-RPC error. These can manifest as different generic issues (i.e.: attempting to access a protected endpoint before the user is logged in). |
ExtensionError
The ExtensionError
class is exposed for instanceof
operations:
JavaScript
ExtensionError
instances expose the code
field which may be used to deterministically identify the error. Magic SDK does not export a global enumeration of Extension error codes. Instead, Extension authors are responsible for exposing and documenting error codes relevant to the Extension’s use-case.
PromiEvents
Magic SDK provides a flexible interface for handling methods which encompass multiple “stages” of an action.Promises
returned by Magic SDK resolve when a flow has reached finality, but certain methods also contain life-cycle events that dispatch throughout. We refer to this interface as a **PromiEvent**
. There is prior art to inspire this approach in Ethereum’s Web3 standard.
**PromiEvent**
is a portmanteau of Promise
and EventEmitter
. Browser and React Native SDK methods return this object type, which is a native JavaScript Promise
overloaded with EventEmitter
methods. This value can be awaited
in modern async/await
code, or you may register event listeners to handle method-specific life-cycle hooks. Each PromiEvent
contains the following default event types:
**"done"**
: Called when thePromise
resolves. This is equivalent toPromise.then
.**"error"**
: Called if thePromise
rejects. This is equivalent toPromise.catch
.**"settled"**
: Called when thePromise
either resolves or rejects. This is equivalent toPromise.finally
.
JavaScript
EVM RPC Methods
Magic supports the following EVM RPC Methods that can be called through a web3 provider library such asethers.js
.
Note: starting from [email protected]
, eth_accounts
will return an empty array if no user is logged in, instead of prompting the login form. To prompt the login form, use connectWithUI()
.
eth_accounts
get_balance
eth_estimateGas
eth_gasPrice
eth_sendTransaction
personal_sign
eth_signTypedData_v3
eth_signTypedData_v4
Examples
Re-authenticate Users
A user’s Magic SDK session persists up to 7 days by default, so re-authentication is usually friction-less. Note: the session length is customizable by the developer through the Magic dashboard. Before re-authenticating a user, install the Magic Client SDK.JavaScript