Skip to content

Mini apps in Nimiq Pay: what they are and how they work

Last updated Written by the ImpactZero validator team

In short

Mini apps are web applications that open inside Nimiq Pay and can ask your wallet for things: your addresses, a signature, a payment. The wallet keeps custody of the keys throughout, and every sensitive request surfaces as a native dialog the mini app cannot bypass. The SDK exposes exactly ten wallet methods, and nothing else.

What a mini app is

A mini app is a website. That is the least exciting and most useful way to start, because everything surprising about the model is a consequence of it.

Nimiq's documentation describes mini apps as web applications that run inside the Nimiq Pay app, in what it calls a specialised web browser embedded within Nimiq Pay. Your app loads, the user stays inside Nimiq Pay, and while it is open it can ask the wallet for things it could never ask for in an ordinary browser tab: your addresses, a signature, a payment sent from your account.

So the question that matters is not what a mini app can display. It is what a mini app can cause. The rest of this page is about that boundary, and it is checkable rather than reassuring, because the SDK that draws it is published and we read it.

The wallet keeps custody, and that is enforced

The documentation states the custody model in three parts. A mini app runs in a sandbox with no direct access to private keys. The Nimiq Pay app mediates all wallet operations. Keys never leave the wallet. On top of that sits the rule that does the real work: every sensitive action requires explicit user approval through native dialogs that mini apps cannot bypass, with viewing accounts, signing messages and sending payments named as examples.

The request lifecycle the documentation sets out has five steps, and the shape is the point:

  1. The mini app calls a method on the provider.
  2. The injected provider forwards the message to the host app.
  3. Nimiq Pay validates it and shows a confirmation dialog where one is needed.
  4. Nimiq Pay executes the operation, if it was approved.
  5. The result travels back to the mini app.

Step three is the whole security model. The dialog is drawn by Nimiq Pay, not by the mini app, which means the address, the amount and the recipient you are looking at are reported by the component holding the key rather than by the page that wants the signature. A mini app can lie about anything in its own interface and still cannot change one character of what that dialog says. This is the same separation Keyguard enforces in the browser, described in Nimiq Pay explained, rebuilt for a phone.

The ten methods, which is the whole list

"Sandboxed" is a word that reassures without informing, so here is the concrete version. In @nimiq/mini-app-sdk version 0.1.0, which this site carries as a dependency and which we read on 14 September 2026, the Nimiq provider carries a fixed set called WALLET_METHODS. It holds exactly ten names.

Method What it asks the wallet to do
listAccounts Return the addresses in the wallet
sign Sign a message, text or hex
sendBasicTransaction Send NIM to a recipient, with an optional fee and validity start height
sendBasicTransactionWithData The same, carrying a data field
sendNewStakerTransaction Create a staker, delegating to a validator address
sendStakeTransaction Add stake to an existing staker
sendSetActiveStakeTransaction Set the active stake balance
sendUpdateStakerTransaction Change delegation to a different validator
sendRetireStakeTransaction Retire an amount of stake
sendRemoveStakeTransaction Remove retired stake from the staking contract

Amounts in those calls are in Luna, the smallest unit, at 100,000 Luna to one NIM, which is the same convention the rest of the protocol uses. Six of the ten are the staking lifecycle, which is a fair summary of what Nimiq expects mini apps to be for.

The generic escape hatch is the interesting part. The SDK also exposes a request() call that takes any method name, and its behaviour is the enforcement: if the name is one of the ten, it goes to the wallet. If it is not, it goes to a Nimiq RPC node whose URL the mini app configured itself, and if no URL was configured it throws with an error saying so. A mini app cannot invent a wallet instruction and have Nimiq Pay honour it. It can ask for one of ten things, and the wallet still puts a dialog in front of the sensitive ones.

Alongside those, the SDK offers a handful of calls that touch no key at all: isConsensusEstablished and getBlockNumber for chain state, getHostLanguage so a mini app can match the language you picked in Nimiq Pay, and requestDeviceIdentifier, which we come back to below.

What mini apps cannot do

Stated as absences, because absences are what you can actually rely on. Read against the published provider interface on 14 September 2026:

  • There is no method that returns a private key, a seed or recovery words. Not a restricted one. There is no such call in the interface at all, which is a stronger guarantee than a permission that could be granted.
  • There is no method that sends without going through the host. Every transfer is a request to Nimiq Pay, and the documented rule is that sensitive actions get a native dialog the mini app cannot bypass.
  • There is no way to extend the list. Ten names, fixed in the shipped package. Anything else is routed away from the wallet entirely.
  • There is no stable identity for you. The device identifier is scoped to the requesting origin, and the SDK says outright that it identifies the device, not the user, and should not be used for authentication.
  • There is no silent first contact. If the URL is not in the Nimiq Pay mini app list, or has never been opened before, Nimiq Pay shows a warning first.

What a mini app absolutely can do is everything a website can do: show you a false balance, misdescribe what a button does, and hope you approve the dialog without reading it. The dialog is honest. Nothing forces you to read it.

The device identifier, and what it is not

Some mini apps need to remember a device rather than a person: a leaderboard, a save slot, a rate limit. The SDK provides requestDeviceIdentifier for that, and the design is worth understanding because it is the only thing here that looks like tracking.

The first call from a given origin prompts you, showing the reason the mini app supplied. Later calls resolve silently. What comes back is a 64 character hex SHA-256, derived from a host side device ID hashed together with the mini app's own origin, which means two different mini apps receive two unrelated values and cannot line them up. It stays stable across Nimiq Pay reinstalls and across different accounts on the same device, because it is a property of the hardware rather than of you.

That last sentence cuts both ways, and the SDK says so: it identifies the device, not the user, and it should not be used as an identity for authentication. If a mini app treats it as a login, that is a mini app getting it wrong.

How to judge a mini app before you use it

The custody model removes the catastrophic failure. It does not remove the ordinary one, which is approving a transaction that does something other than what you thought. Five questions, in the order they are worth asking:

  1. Who published it, and can you find them? A name, a site, a repository, a track record. Anonymous is not automatically bad and is definitely less checkable.
  2. Is the source public? Open source does not mean audited, but it means the claim and the code can be compared by someone.
  3. Did Nimiq Pay warn you when it opened? That warning means the URL is not in the known list. It is not proof of anything. It is a reason to slow down.
  4. What exactly is it asking you to sign? Read the native dialog, every time. Recipient, amount, and for staking calls the validator address. If the dialog and the app's own description disagree, the dialog is the one telling the truth.
  5. Does the ask match the purpose? A game that wants a message signature is plausible. A leaderboard that wants a transfer is not. Mismatch between what something is and what it wants is the oldest signal there is.

And the rule that overrides all five: no mini app, and no anything, ever needs your recovery words. There is no legitimate reason for a mini app to display a field asking for them, because there is no method in the provider that would use them. The full treatment of backups is in Nimiq backups compared.

Examples, and an honest gap

We would like to point you at a directory. There is not one we can cite. The documentation confirms Nimiq Pay maintains an internal mini app list, since it warns on URLs outside it, but it describes no submission or approval process, and Nimiq's public apps page did not label any of its entries as a mini app when we read it on 14 September 2026. The App Store release notes for version 2.19.0 mention mini apps competition entries, which suggests the set is growing faster than anything documenting it.

So the examples we can name with confidence are our own, which we flag plainly as self interested. NimBooks and Darkfall are both built by us, both open source under MIT, and both run inside Nimiq Pay as well as in an ordinary browser. NimBooks does balances, history, CSV statements and signed proof of payment receipts. Darkfall is a dungeon crawler with a player run trading post where items change hands for NIM, wallet to wallet. They are useful here mainly as proof that the second bullet in the list above is answerable: you can read both of them.

Where this fits

Mini apps are the least understood part of Nimiq Pay and the part most likely to change, so treat the version numbers on this page as the thing to re-check rather than the thing to quote. The app they run inside is covered in Nimiq Pay explained, and everything else we have written is on the Learn hub.

Questions people ask

What is a mini app in Nimiq Pay?
A web application that runs inside the Nimiq Pay app rather than in your normal browser, with a channel to the wallet. Nimiq describes it as a specialised web browser embedded within Nimiq Pay: your app loads, and it can request wallet operations while the user stays inside Nimiq Pay. It is an ordinary website in every other respect.
Can a mini app steal my keys or spend my NIM?
No, by construction. The documentation states that a mini app runs in a sandbox with no direct access to private keys, that Nimiq Pay mediates every wallet operation, and that keys never leave the wallet. The SDK exposes no method that returns a key or a seed. Every sensitive action requires explicit approval through a native dialog mini apps cannot bypass.
What can a mini app actually ask for?
In version 0.1.0 of the SDK, ten wallet methods: listing accounts, signing a message, two forms of basic NIM transfer, and six staking operations covering creating a staker, adding stake, setting active stake, changing delegation, retiring and removing. Plus read only chain state, the host language, and a pseudonymous device identifier you have to approve.
How do I know a mini app is legitimate?
Read the confirmation dialog, not the mini app. The dialog is drawn by Nimiq Pay, so the address, the amount and the recipient in it come from the trusted layer rather than from the page asking. Beyond that: who published it, whether the source is public, and whether what it asks you to sign matches what it claims to be doing.
Does Nimiq check mini apps before they run?
Nimiq Pay keeps a list of known mini apps. The documentation states that if a URL is not in the Nimiq Pay mini app list, or has never been accessed before, Nimiq Pay shows a warning before proceeding. That is a caution rather than a review process, and the documentation we read on 14 September 2026 describes no submission or approval flow.
What networks can a mini app use?
Nimiq natively through the injected provider, plus EVM chains through the standard window.ethereum interface: Ethereum mainnet, Polygon, Arbitrum One, Optimism, Base, BNB Smart Chain and the Sepolia testnet, per the documentation read on 14 September 2026. ERC-20 tokens on those chains, including USDT on Polygon, are reached the same way.
Can a mini app track me across other mini apps?
Not through the identifier the SDK provides. It is a 64 character hex SHA-256 derived from a host side device ID hashed with the requesting mini app origin, so two mini apps get different values and cannot correlate them. The SDK is explicit that it identifies the device rather than the user, and should not be used as an authentication identity.

Sources

  • Nimiq Developer Center, Mini apps, mini apps as web applications running inside Nimiq Pay, the request lifecycle, a sandbox with no direct access to private keys, keys never leaving the wallet, native confirmation dialogs that mini apps cannot bypass, the supported network list, and the warning shown for URLs outside the Nimiq Pay mini app list, read 14 September 2026
  • @nimiq/mini-app-sdk 0.1.0, README, init() waiting for the host to inject window.nimiq, getHostLanguage() for the host locale, and requestDeviceIdentifier() returning a 64 character hex SHA-256 scoped to the mini app origin, stable across reinstalls, identifying the device rather than the user. Read from the package in this site's own dependencies on 14 September 2026
  • @nimiq/mini-app-sdk 0.1.0, provider definitions, NimiqProvider.WALLET_METHODS as a set of exactly ten method names, the typed helpers listAccounts, sign, isConsensusEstablished, getBlockNumber and the transaction senders, values denominated in Luna at 1 NIM to 100,000 Luna, and request() falling through to a self configured RPC URL for anything not in the set. Read 14 September 2026
  • Nimiq Pay on the App Store, "Discover Mini Apps that bring new services and experiences directly into Nimiq Pay", and a version 2.19.0 release note referring to mini apps competition entries, read 14 September 2026
  • Nimiq, Apps, Nimiq's public list of ecosystem applications, which on 14 September 2026 did not label any entry as a mini app, so it is not usable as a mini app directory