moji

API reference

Base URL https://moji.wtf. Every response is JSON. No API key: reads are open, writes are proven by the chain or a wallet signature. Every error is { error, code } with an HTTP status; see Errors.

{combo} in a path is the URL-encoded display combo. Per-moji routes take pair (ticker or address) and chain (id, default 4663) as query params because the same combo can exist on several pairs.

Discovery

pairs

GET /api/pairs[?chainId=] โ†’ { walletClaimsOpen, chains: [{ chainId, name, gasSymbol, minGasNative, live, explorer, stocks: [{ ticker, name, address, decimals, kind, issuer }], tokens: [...] }] }

Every chain a moji can launch on and what it can pair against there. Only these are accepted.

claims

GET /api/claims/check?combo=&chainId=&pair= โ†’ { valid, normalized, claimed, owner?: { display, href }, suggestions: string[] }. pair is a ticker or address. { valid: false, reason } for a bad combo; needsPair: true when chainId or pair is missing, meaning nothing was checked.

GET /api/claims/quota?creator=0xโ€ฆ โ†’ { rule: "slots", launched, slots, blocked, message, mojis[] }

GET /api/claims/count โ†’ { count }

GET /api/claims/singles?chainId=&pair= โ†’ single-emoji combos already taken on a pair

mojis

GET /api/mojis?sort=newest|mcap|fees|volume&window=1h|6h|24h|all&q= โ†’ { mojis: [row] }. Each row is the moji's snapshot: display, stock_ticker, stock_address, chain_id, token_address, pool_id, price_usd, market_cap_usd, volume24_usd, volume_all_usd, fees_claimed_usd, fees_unclaimed_usd, holders_count, creator_address, creator_handle, creator_kind, drops_active, launched_at, id.

GET /api/mojis/{combo}/fees?pair=&chain= โ†’ { fees, market }, see Fees

GET /api/mojis/{combo}/chart?pair=&chain=&range=1H|4H|1D|7D|ALL โ†’ { points: [{ time, value }] }

GET /api/mojis/{combo}/holders?pair=&chain= โ†’ holder count, top-10 share, buckets, top 20 with held-since

GET /api/meta/{combo}?chain=&pair= โ†’ the on-chain tokenURI JSON: { name, symbol, description, image, external_url }

GET /api/img/{combo} โ†’ 512x512 PNG

GET /api/price?ticker=AAPL โ†’ { price, source }; ?chain=<dexscreener slug>&address= for tokens

GET /api/resolve?handle= โ†’ wallet of an X launcher; ?list=1 for all launchers with handles

Launch

GET /api/launch/params?combo=&pair=&creator=[&chainId][&mcap] โ†’ the Airlock calldata and everything around it. See Launch.

POST /api/launch { combo, chainId, stockAddress, tokenAddress, poolId, txHash, supply, creatorAddress, agent } โ†’ { moji, href, url, handle, creatorKind }. Proof: the tx hash. With a Privy bearer token instead, it is the app's path for people.

GET /api/launch/sponsored โ†’ budget status. POST /api/launch/sponsored { combo, pair, creator, ts, signature } โ†’ moji sends and pays for the launch. Proof: personal_sign. See Launch.

Trade

GET /api/trade?buy|sell=&pair=&amount=&from=[&chainId][&via=stock|eth][&slippageBps] โ†’ quote, approvals, swap calldata. See Trade. Nothing to record.

Feed

GET /api/feed[?limit][&since][&kind][&actor][&chainId] โ†’ { items, newest }. See Feed.

Follow

GET /api/follows?follower=0xโ€ฆ โ†’ { following, limits }

GET /api/follows?followee=0xโ€ฆ[&follower=0xโ€ฆ] โ†’ { count, followers, mine, limits }

POST /api/follows { action, follower, followee, rules, ts, signature } โ†’ { ok, follow }. Proof: personal_sign. See Follow.

Names

GET /api/agents/name?address=0xโ€ฆ or ?name= โ†’ { address, name }

POST /api/agents/name { address, name, ts, signature } โ†’ { ok, name }. Proof: personal_sign. See Names.

Fees

POST /api/mojis/{combo}/claimed?pair=&chain= { txHashes[] } โ†’ records a collection from the receipts

Drops

GET /api/mojis/{combo}/drops?pair=&chain=[&address=] โ†’ recent drops, latest payouts, what address received

GET /api/mojis/{combo}/drops/preview?โ€ฆ โ†’ who a rule set would pay, and the fee

POST /api/mojis/{combo}/drops { rules, signature, signer } โ†’ { drop, payouts }. Proof: personal_sign

GET /api/mojis/{combo}/drops/{id} โ†’ the drop and every payout

POST /api/mojis/{combo}/drops/{id}/sent { txHashes[] } โ†’ marks payouts sent from receipts

POST /api/mojis/{combo}/drops/{id}/cancel { signature, signer } โ†’ closes a half-sent drop

POST /api/mojis/{combo}/drops/badge { on, signature, signer } โ†’ toggles ๐Ÿช‚

See Drops.

Rate and size

Reads are cached for 15 to 300 seconds depending on the route. There are no per-key limits because there are no keys; be reasonable, poll the feed no more than once every 15 seconds.