UmbixDocumentation
API v0 · live on Robinhood Chain

Umbix docs: one checked plan per trade.

Umbix turns a request to trade a Robinhood Chain stock token into a list of unsigned steps, dry-runs that list from your wallet against the latest block, and returns a verdict your code can act on. This page covers every field, every rule and every limit.

01Your appTrade intent and wallet address
02UmbixResolve, quote, build, simulate
03Your walletRead, sign, broadcast
What is live today

Public plans on Robinhood Chain mainnet, routed through Uniswap v3, simulated with eth_simulateV1. The plan latch is written and tested but not deployed; stealth and shielded settlement are not part of this build.

The model

A trade idea in, a signable plan out.

Your app sends intent: what to trade, how much, from which wallet. The planner resolves the asset, prices it, picks a route, builds the steps, simulates them and judges the result. The planner holds no key, keeps no funds and has no endpoint that accepts a signature.

Quickstart

Your first plan in three moves.

Buy NVDA with 500 USDG from your wallet. The answer holds unsigned steps only; nothing is sent until your wallet signs.

Send the request

No key and no package: one POST with a JSON body from any HTTP client.

Read the verdict

Stop on block, show the warnings on warn, carry on with allow.

Sign in order

Send each step from the same wallet and wait for its receipt before the next.

Terminal
curl -s https://umbix.xyz/api/trades/plan \
  -H 'content-type: application/json' \
  -d '{"side":"buy","symbol":"NVDA","quote":"USDG",
       "amountIn":"500","wallet":"0xYourWallet"}'
plan.ts
const reply = await fetch("https://umbix.xyz/api/trades/plan", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    side: "buy", symbol: "NVDA", quote: "USDG",
    amountIn: "500", wallet: account,
  }),
});
const plan: PlanAnswer = await reply.json();
if (plan.verdict === "block") throw new Error(plan.reasons[0].message);
sign.ts
// Your app owns the wallet client; the planner never sees a key.
for (const step of plan.transactions) {
  const hash = await wallet.sendTransaction({
    to: step.to, data: step.data, value: BigInt(step.value),
  });
  await publicClient.waitForTransactionReceipt({ hash });
}
Your wallet makes the final call.

The planner hands back a plan and its evidence. The wallet shows it, signs it and broadcasts it. A simulation reads one block and cannot promise a future fill.

Access

No keys, open limits.

The routes need no account and no API key. Base path: /api on this site, CORS open for POST /api/trades/plan.

Base URL
curl -s https://umbix.xyz/api/assets/NVDA
POST /api/trades/plan

About 12 plans a minute per network (an IPv4 address or an IPv6 /64). Over that: HTTP 429 with retry-after.

GET /api/assets

Cached for a few seconds and safe to poll for a price board.

body size

Up to 2 KB per request; larger bodies get HTTP 413.

Nothing secret is ever requested.

No private key, no recovery phrase and no sign-in signature. Anything that asks for one in Umbix's name is not Umbix.

Testing safely

Try the decision path without spending.

There is no separate test network to sign up for. Three ways to see real answers without moving funds:

Leave out the wallet

You get the live quote and a WALLET_REQUIRED block, which shows routing and pricing without simulation.

Use a watch address

Pass any address as wallet. The simulation runs from it, so you see what would happen for that balance, and nothing can be signed.

Stop before signing

The playground walks through the steps one by one; closing the wallet prompt ends the trade with nothing sent.

Tokens and prices

Confirm the share before touching a pool.

A ticker is accepted only when it is on the planner's list of official stock tokens and the token's runtime code still embeds Robinhood's stock-token beacon.

Official contract

Beacon 0xe10b6f6b275de231345c20d14ab812db62151b00 in the token's code. Look-alikes with the same symbol are refused.

Trading state

Read from paused() and tokenPaused() before any route is searched.

Reference value

Chainlink price per share × uiMultiplier / 1e18. The multiplier rises with dividends. ETH uses the ETH/USD feed 0x78F3556b67E17Df817D51Ef5a990cDaF09E8d3A9.

Routing

Uniswap v3 (factory 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA, quoter 0x33E885Ed0Ec9bF04eCFB19341582aaDCB4c8A9e7), every fee tier (100, 500, 3000, 10000), directly or via USDG 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 or WETH 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73. The best quote wins.

Terminal
curl -s https://umbix.xyz/api/assets/NVDA
Privacy modes

One field, three modes, one live.

The request takes privacy.mode. Confidentiality with auditability, not anonymity. Only public produces steps in this build.

Mode
What it is
Still visible on chain
publiclive
An ordinary swap from your wallet.
The wallet, the token, the size and the pool.
stealthplanned
Settlement to a fresh one-time address.
The settlement itself; the link to the main wallet is not.
shieldedroadmap
Encrypted notes plus a zero-knowledge proof.
That a proof was submitted and checked, the gas payer, the pool size.
The only field that changes
"privacy": { "mode": "public" }

Asking for stealth or shielded returns PRIVACY_MODE_UNAVAILABLE with no steps, rather than a plan that pretends.

Safeguards

Five guards on every public plan.

Each guard covers a different way a trade can go wrong between the ticker and the signature.

01

Beacon check

Only official stock tokens resolve; look-alike contracts never reach a pool.

assets · beacon · paused state
02

Exact approval

Approvals cover the amount spent and nothing more.

approve(router, amountIn)
03

Wallet dry run

Every step is simulated from your address, in order, in one block.

eth_simulateV1 · decoded reverts
04

Plan latch

The latch recomputes the plan hash and settles each plan once. Written and tested, not deployed yet; plans use the router path meanwhile.

UmbixPlanLatch · settle once
05

Fail closed

Missing facts block the plan instead of waving it through.

PAUSE_STATE_UNKNOWN · REFERENCE_UNAVAILABLE
Confidentiality with auditability, not anonymity.

The later privacy modes aim to keep a strategy from every market watcher while the holder can still show what they did to someone entitled to see it.

Trade plans

Route, steps, evidence and verdict in one answer.

A well-formed request always gets a plan, even when the verdict is block.

POST /api/trades/plan
{
  "side": "buy",
  "symbol": "NVDA",
  "quote": "USDG",
  "amountIn": "500",
  "wallet": "0xYourWallet",
  "slippageBps": 50,
  "privacy": { "mode": "public" }
}
FieldTypeMeaning
side"buy" | "sell"Buy spends the quote asset to receive the stock token; sell does the reverse.
symbolstringStock ticker such as NVDA. Checked against the official list and the beacon, never trusted by name.
quote"USDG" | "ETH" | "WETH"What you pay with or receive. Default USDG. ETH is wrapped and unwrapped for you.
amountIndecimal stringExact amount of the asset you spend, such as "500" or "0.25". No exponent, no more decimals than the asset has.
wallet0x addressThe wallet that will sign. Without it you get a quote and a block verdict, because nothing can be simulated.
recipient0x addressWhere the output goes. Default: the wallet. Anything else raises RECIPIENT_OTHER.
slippageBpsintegerHow far the fill may fall short of the quote. Default 50, range 1 to 500. Above 100 warns.
deadlineSecintegerSeconds until the steps stop being valid on chain. Default 600, range 60 to 3600.
privacy.mode"public" | "stealth" | "shielded"Only public is produced in this build; the other two return a block verdict that says so.
Shape of a real answer, trimmed
{
  "verdict": "allow",
  "reasons": [
    { "code": "APPROVAL_NEEDED", "level": "info", ... },
    { "code": "EXECUTOR_ROUTER", "level": "info", ... }
  ],
  "asset":     { "symbol": "NVDA", "canonical": true, "halted": false, ... },
  "reference": { "priceUsd": 217.0, "tokenValueUsd": 217.17, "ageSec": 840 },
  "quote": {
    "venue": "Uniswap v3",
    "route": [ { "fee": 100, ... }, { "fee": 500, ... } ],
    "amountOut": "2.2982", "minOut": "2.2867", "deviationBps": 18
  },
  "transactions": [
    { "step": 1, "kind": "approval", "to": "0x5fc5…", "data": "0x095e…" },
    { "step": 2, "kind": "swap",     "to": "0xCaf6…", "data": "0x5ae4…" }
  ],
  "simulation": { "ran": true, "ok": true, "calls": [ ... ] },
  "deadline": 1792520400
}
Resolution

asset: the official token, its beacon check, paused state and multiplier.

Price and route

reference and quote: Chainlink value, pools and fee tiers, amountOut, minOut, slippage, and deviationBps against the reference.

Ordered steps

transactions: to, data, value (wei as a decimal string) and chainId. Empty on block.

Simulation

simulation: the eth_simulateV1 run, per step success, gas used and a readable error, plus the simulated output.

Expiry

deadline / expiresAt: Unix time after which the swap step reverts on chain.

The plan latch

UmbixPlanLatch is an immutable contract that settles one plan through the Uniswap v3 router (0xCaf681a66D020601342297493863E78C959E5cb2). It recomputes the plan hash from the call and reverts on any difference, on a second settlement, on a caller other than the payer, after the deadline, or below the minimum output. No owner, no fee, no pause, no upgrade. Not deployed yet.

Verdicts

Every verdict names its rule.

Let your code follow the verdict and the reason codes, never the wording of the messages.

VerdictWhat your app should doSteps
allowEvery rule passed. Show the steps to the wallet.Included
warnThe trade works, but a person or agent should read the warnings first.Included
blockA rule did not pass. Show the reason and stop.None

Thresholds: cost over reference warns from 2% and blocks from 10%. A reference older than 6 hours warns. USDG counts as one dollar for this check.

On-chain visibility

What anyone can still see.

A public plan is an ordinary swap. A watcher of the chain can read all of this:

Your wallet

The address that signs the approval and the swap.

The token and size

Which stock token moved, in which direction, and how much.

The pools

The Uniswap v3 pools and fee tiers the route used.

Gas

Who paid for each transaction and how much.

The planner stores nothing.

Each answer is computed from chain state when it is asked for. Rate limits keep a short-lived counter per network and nothing else.

API routes

A small surface with plain answers.

Every route answers JSON. Amounts are exact decimal strings; raw integer amounts are strings too.

POST/api/trades/planResolve, quote, build, simulate and judge one trade.
GET/api/assetsEvery official stock token with value, multiplier and trading state.
GET/api/assets/{symbol}One ticker resolved, or 404 when it is not an official token.
GET/api/chainChain head, gas price, ETH/USD and the latch status.
GET/api/plans/{planId}Planned: fetch a stored plan before it expires.
POST/api/simulatePlanned: dry-run an ordered list of unsigned calls you built.
Stable shape

Fields are added, never renamed, within v0. Errors carry a code, an HTTP status and a sentence.

From TypeScript

One fetch, no package to install.

There is no SDK. A dozen lines of fetch give you the whole API:

plan.ts
const reply = await fetch("https://umbix.xyz/api/trades/plan", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    side: "buy", symbol: "NVDA", quote: "USDG",
    amountIn: "500", wallet: account,
  }),
});
const plan: PlanAnswer = await reply.json();
if (plan.verdict === "block") throw new Error(plan.reasons[0].message);
Typed answers

Copy the PlanAnswer shape from the response example; every field is documented above.

Retries

Retry on HTTP 429 after the retry-after seconds, and on CHAIN_UNAVAILABLE.

Exact amounts

Keep amounts as strings end to end; never round-trip them through floating point.

Wallet boundary

Send steps unchanged, in order, from the wallet named in the request.

Agents

Let an agent propose, never sign.

An AI agent can call the endpoint like any client and reason over the reason codes. Keep the wallet outside the agent.

Terminal
curl -s https://umbix.xyz/api/trades/plan \
  -H 'content-type: application/json' \
  -d '{"side":"sell","symbol":"TSLA","quote":"ETH",
       "amountIn":"0.25","wallet":"0xYourWallet",
       "slippageBps":75,"deadlineSec":300}'
GET /api/assetsList the tokens an agent may name.
GET /api/assets/{symbol}Check one ticker before planning.
POST /api/trades/planAsk for a plan and its verdict.
GET /api/chainCheck the network before acting.

Because a block verdict carries no steps, an agent cannot pass on something the planner refused. Let a person or a wallet policy approve the rest.

Errors

Errors a program can handle.

Malformed requests get HTTP 400 with a code. A well-formed request always gets a plan; problems with the trade itself come back as reason codes.

CodeLevelMeaning
ASSET_NOT_CANONICALblockThe ticker is not one of the official stock tokens, or the token at that address no longer carries Robinhood's stock-token beacon.
ASSET_HALTEDblockThe stock token reports paused trading.
PAUSE_STATE_UNKNOWNblockThe stock token's paused / tokenPaused state could not be read. Missing facts fail closed: no steps are returned.
REFERENCE_UNAVAILABLEblockThe Chainlink reference price or the token multiplier could not be read, so the cost check could not run. Missing facts fail closed: no steps are returned.
PRIVACY_MODE_UNAVAILABLEblockStealth and shielded settlement are not part of this build. Only public plans are produced.
WALLET_REQUIREDblockNo wallet was given, so balances, allowance and simulation could not be checked. The quote is still returned.
RECIPIENT_INVALIDblockThe recipient is not a valid address.
NO_ROUTEblockNo Uniswap v3 pool path with liquidity connects the two assets.
INSUFFICIENT_BALANCEblockThe wallet holds less than the amount it would spend.
PRICE_DEVIATION_HIGHblockThe trade would cost more than the block threshold above the Chainlink reference value.
SIMULATION_FAILEDblockAt least one step reverted when the ordered sequence was simulated against the latest block.
CHAIN_UNAVAILABLEblockThe planner could not read Robinhood Chain right now.
PRICE_DEVIATIONwarnThe trade costs noticeably more than the reference value (fees, spread, thin pool).
REFERENCE_STALEwarnThe reference price is hours old, which usually means the US market is closed. Pool prices can drift meanwhile.
SLIPPAGE_WIDEwarnThe slippage you allowed is wide; a worse fill would still settle.
RECIPIENT_OTHERwarnThe output goes to an address other than the signing wallet.
GAS_BALANCE_LOWwarnThe wallet's ETH may not cover gas for every step.
APPROVAL_NEEDEDinfoThe allowance is short, so the plan starts with an approval for exactly this amount (never unlimited).
EXECUTOR_ROUTERinfoThe plan latch is not deployed yet, so the swap goes straight to the Uniswap v3 router with your minimum output and deadline.
EXECUTOR_LATCHinfoThe swap settles through the plan latch, which refuses any change to the reviewed plan and settles it at most once.

Request errors include INVALID_JSON, INVALID_AMOUNT, INVALID_SIDE and UNKNOWN_FIELD (400) and BODY_TOO_LARGE (413). Going over the rate limit returns HTTP 429 with a retry-after header.

Limits

What the planner will not stretch to.

Each limit is deliberate; most protect you from a plan that looks fine and settles badly.

Two pools at most

Very large trades may find no route or a costly one; the deviation rules will say so.

Exact input only

You fix what you spend; the minimum output follows from the quote and your slippage.

One block of evidence

Simulation reads the latest block. Prices move, so the minimum and the deadline are what protect you on chain.

Market hours

Chainlink stock feeds follow US trading hours; outside them the reference ages and REFERENCE_STALE warns.

Boundary

Confidentiality with auditability, not anonymity.

Umbix is a planning tool. It is not a way to hide funds from anyone with a lawful right to see them, and it will not be described as one.

  • It does not sign, send, custody or hold anything, and never requests a private key or recovery phrase.
  • It does not guarantee a fill: simulation reads one block, the market moves on.
  • It does not give investment advice. Stock tokens track a share's price and carry no shareholder rights.
  • It is not affiliated with Robinhood or Uniswap and only reads their public contracts.
Try it without writing code

The playground calls the same endpoint and lets you sign the steps one at a time.