Docs

Needpaper

Papertrade removed the orderbook. Needpaper removes the LP. Every position is written by a bonded seller who won a 30-second auction on the haircut and escrowed 10x the margin before the open.

1000x long BTC, 1 hour, 0.1 USDC→margin into the escrow→30 s auction on the haircut→winner locks 10x cover→open at Pyth→close: buyer, expiry or bust
One paper, from the sentence to the close.

The mechanism

Papertrade lets you trade against the house: one LP, built from users' losses, takes the other side of every trade and pays winners from a queue when it runs short. Needpaper lets you be the house, and it has no LP: the other side of each position is a seller who bid for it and put the money up front.

You say what you want: "1000x long BTC, 1 hour, 0.1 USDC". Your margin goes into the escrow. For 30 seconds sellers bid the haircut down, the share of your gain they keep if you win: 4%, then 3%, then 2.2%. The lowest bid wins, but only from a seller whose USDC bond holds 10x your margin free; that cover is locked before the position opens, so the largest gain you can make is already in escrow and no payout queue can form. With no bid, your margin comes back in full.

Every figure

AssetsBTC, ETH and SOL against USD, long or short.
Leverage1 to 1000x.
Margin0.01 to 5 USDC per paper while the market is young. The position is a slug: fixed margin, no top-up.
Duration5 minutes to 24 hours.
Max haircutThe highest share of your gain you accept, 4% unless you say otherwise.
Auction30 seconds from the post; lowest haircut wins; ties go to the earlier bid.
Cover10x the margin, locked from the winner's USDC bond at the open. The gain is capped at the cover.
Bustentry - entry x (1/leverage - 0.05%) for a long, + for a short. At 1000x that is a 0.05% move; at 100x, 0.95%.
WinThe haircut stays with the seller; 1% of the net gain goes to Need, split 60% clean-fill pool, 25% origin, 15% reserve; the rest and your margin come back to you.
LossThe lost margin goes to the seller minus 2%; the 2% buys $NEED through Jupiter and goes to you.
ChecksThe keeper reads Pyth every 10 seconds for every open paper.

Price, bust and close

bust: -0.95%, the whole 1 USDC to the seller+10% move: gain capped at the 10 USDC coverPnL USDCmove
100x long, 1 USDC of margin. The line is the PnL before the haircut and the fee.

Prices come from Pyth through Hermes: the BTC/USD, ETH/USD and SOL/USD feeds. At the open the keeper reads the latest price and writes the feed id, the price, its exponent and its publish time into the open record; that price is the entry. A paper closes in one of three ways, each at the Pyth price of that moment, written into the close record the same way:

  • you close it: your wallet signs a close request (a zero USDC transfer into the escrow with your memo; Need pays the fee);
  • it reaches its duration;
  • the price crosses the bust price on one of the 10-second checks: the full margin goes to the seller, minus the 2% that buys you $NEED.

Settlement

Everything is paid from the escrow in the same transaction as the close record. With M the margin, L the leverage, h the winning haircut and C = 10 M the cover:

win: G = min(M x L x move, C) H = G x h // stays with the seller fee = 1% x (G - H) // 60% pool, 25% origin, 15% reserve you <- M + (G - H) - fee ; seller's bond -= G - H loss: Lo = min(M x L x |move|, M) // a bust is Lo = M r = 2% x Lo // USDC -> $NEED through Jupiter -> you you <- M - Lo ; seller's bond += Lo - r

Example: 0.1 USDC at 100x long, written at 2.2%, closed after a 0.5% rise. G = 0.05, H = 0.0011, the fee is 0.000489 USDC (0.000293 to the pool, 0.000122 to the origin, 0.000074 to the reserve), and you receive 0.148411 USDC. The same paper after a 0.3% fall: Lo = 0.03, 0.0006 USDC buys $NEED for you, the seller's bond gains 0.0294 and you get 0.07 back. Before $NEED trades, the 2% is paid in USDC and the record says so.

Sellers bond USDC (and $NEED, the existing seller bond). A seller that disappears after winning cannot hold up a close, because its cover is already in the escrow and the keeper settles from it.

The house actors

So the live site always has a counterparty for small paper, the house seller quotes a haircut from the realised volatility of the last 60 Hermes prices of the asset, between 1.5% and 4%, bids within 5 seconds of a post, and writes at most 2 USDC of cover at a time. It does not bid over your max haircut or past its cover. The house trader posts one paper an hour (100x, 10 minutes, 0.05 USDC, random side and asset) so the board moves. Both carry the house tag on the board.

The records

Each step is a Memo signed by the keeper key, read back with getSignaturesForAddress on that key, like every other Need record. Amounts are µUSDC; prices are Pyth mantissas with their exponent.

bid1 paper.post {"id":7,"buyer":"7xKX…","side":"long","asset":"BTC","leverage":1000,"margin":"100000", "duration":3600,"maxHaircutBps":400,"closeAt":1791660400,"deposit":"<sig>","origin":""} bid1 paper.bid {"id":7,"seller":"9vQm…","haircutBps":220,"validUntil":1791660520,"nonce":"…","signature":"<ed25519>"} bid1 paper.open {"id":7,"seller":"9vQm…","haircutBps":220,"cover":"1000000","feed":"e62df6c8…415b43", "entry":"10012345000000","expo":-8,"publishTime":1791660401,"bust":"10007338827500","expiresAt":1791664001} bid1 paper.close {"id":7,"exit":"10017350000000","publishTime":1791663100,"reason":"buyer","pnl":"49988", "haircut":"1099","fee":"488","pool":"292","origin":"122","reserve":"74","toBuyer":"148401","sellerDelta":"-48889", "rebate":"0","needOut":"0","rebateIn":"none","swap":null} bid1 paper.lapse {"id":8,"why":"no bid with the cover"}

A bid is signed over sha256("bid-paper" ‖ keeper ‖ paperId u64 ‖ seller ‖ haircutBps u32 ‖ validUntil i64 ‖ nonce u64), the way offers on intents are signed. The keeper records the winning bid and up to two runners-up in the open transaction.

Write paper with the SDK

import { Need, keypairAccount } from "https://paperneed.app/sdk/need.mjs"; const need = new Need({ account: keypairAccount(secret) }); // post paper: a sentence or the fields const { paperId } = await need.paper("1000x long BTC, 1 hour, 0.1 USDC"); await need.paper({ side: "short", asset: "ETH", leverage: 100, margin: 0.2, duration: 900, maxHaircut: 3 }); await need.closePaper(paperId); // close now, at the Pyth price // write paper: bond USDC first, then bid on auctions (2.2% = 220 bps) const { auctions } = await need.papers(); for (const p of auctions) await need.writePaper(p.id, 220);

writePaper binds you if it wins: 10x the margin is locked from your USDC bond at the open. The board and every book are plain JSON at /api/v1/paper and /api/v1/paper/:id.

MCP and x402

The MCP server has a post_paper tool: give it a sentence or the fields and a buyer address, sign the transaction it returns, and call it again with signed. Without the SDK, one x402 call does the same: POST /api/v1/paper with the sentence and the buyer answers 402 with the margin as the USDC requirement and the paper transaction to sign; send it back in X-PAYMENT and the answer carries the paper id.

POST /api/v1/paper { "text": "1000x long BTC, 1 hour, 0.1 USDC", "buyer": "7xKX…q3Vd" } ← 402 Payment Required scheme exact · USDC · solana · maxAmountRequired 100000 extra.transaction the paper deposit, fee paid by Need POST /api/v1/paper X-PAYMENT: eyJ4NDAy… ← 200 { "paperId": 7, "watch": "https://paperneed.app/paper#p7" }
Stores used to advertise to people. Now they bid for agents.
© 2026, Need
Terms | Privacy
MCP · SDK · x402 · 2026