Security model
It reads the chain. It never touches your funds.
Unstuck explains transactions from public chain data. It holds no keys, signs nothing, keeps no custody and takes no payments. When something can be fixed, the fix is a set of settings you apply in your own wallet.
What Unstuck never does
-
Never holds keys
No private keys, no seed phrases, no custody. Unstuck never asks for them. If a message asks for yours in Unstuck’s name, it isn’t from Unstuck.
-
Never signs
Unstuck has no key that can sign for you or your agent. Signing in is one message from your wallet, not a transaction, so it can’t move anything.
-
Never moves funds
It only reads public chain data, so it can’t reach your balance. There are no payments in the beta: no top-ups, no balances, nothing to approve.
Fixes
A fix is a suggestion. You apply it in your wallet.
Unstuck describes a fix as settings: a slippage limit, a compute limit, how much SOL is missing, which token account to use. Nothing happens until you make the change yourself.
| Fix | What Unstuck sends | Who acts | Safe |
|---|---|---|---|
retry |
The new setting: a fresh quote, a higher slippage limit (slippage_bps), a refreshed route, a higher compute limit, or just a fresh blockhash when the transaction expired. |
You, in your wallet or app | true |
add_sol |
How much SOL the wallet is short, like sol: 0.01. |
You add it yourself, from wherever you choose | true |
use_token_account |
Which mint the right token account is for. | You, after checking which account to use | false |
none |
Nothing to do automatically. The answer explains what happened. | Nobody | false |
What fix.safe meanstrue for a retry with a stated setting and for adding a little SOL to the same wallet. false when the fix needs a person’s judgement, like which token account to use, and when there is nothing to fix.
For agentsUnstuck returns parameters, never a transaction. Your agent builds the transaction and signs it with its own key, applies a fix only when fix.safe is true and within its mandate, and retries at most twice.
Sign-in
One message, kept in your browser
The app uses Sign in with Solana: your wallet signs one message that says it can’t move funds. The signature stays in this browser tab’s session storage. The beta doesn’t send it to a server and keeps no accounts; closing the tab ends the session.
- No email, no password, no transaction to approve.
- The lookups you run in the app are listed in that same tab only.
- The landing page and the API need no sign-in at all.
Threat model
What could go wrong, and what stops it
| If | What happens |
|---|---|
| Someone poses as Unstuck | Unstuck never asks for keys, seed phrases or a transaction to sign. Its only official account is @unstuck_sol on X. |
| Unstuck’s servers are breached | There is nothing there that moves money: no keys, no custody, no power to sign and no accounts. The functions only read public chain data. |
| An answer is wrong | A fix is only a suggestion, and nothing happens until you make the change in your own wallet. Agents apply a fix only when fix.safe is true, and retry at most twice. |
| Text in a token or a memo tries to steer the answer | Answers are built from a fixed decode table and the numbers on chain, not from text inside the transaction. Token symbols are cut to 12 plain characters; program logs come back as plain text and are never followed as instructions. |
| Someone hammers the API | Roughly 30 explain lookups a minute per IP address, and answers are cached for 5 minutes. Over the limit, the API answers 429 with Retry-After. |
Logs
What is kept
Beta: we keep request logs for 30 days; no accounts, no personal data.
- Keys and seed phrases are never asked for, so they are never stored.
- The public error catalog holds public error strings only: no signatures, wallets or messages.
- Signatures, wallet addresses and balances are public on chain. Unstuck reads the same data any explorer shows.
Limits
Limits that stop scraping, not people
Everything is free during the beta, so there are no free-tier counters to protect.
| Where | Limit | Counted per |
|---|---|---|
/api/explain |
Roughly 30 a minute; answers cached for 5 minutes | IP address |
/api/errors |
No limit; cached for an hour | n/a |
- Over the limit, the API answers
429 Too Many Requestswith aRetry-Afterheader.
Payments
No payments in the beta
Nothing is charged: no top-ups, no balances, no x402 payments and no API keys. There is nothing to approve. Paid plans open later.
Found a security problem?
DM us on X, and please keep the details out of public posts until we’ve replied.