MooChedda API
Standard REST endpoints with JSON request/response. Integrate digital asset payments into any stack — Node, Python, PHP, Ruby, Go — without proprietary SDKs or libraries.
No SDK, just HTTP
Every operation is a plain JSON REST call. Any HTTP client works — fetch, axios, curl, requests, Guzzle.
Client-side signing
Transactions are signed locally before sending. Your private key never leaves your device or server.
Self-custody wallets
secp256k1 keypairs. You own the private key — MooChedda cannot freeze or access your funds.
Base URL
All API requests go to the following base URL. All request and response bodies are application/json.
https://v1.moochedda.com:3002
// Example: full request URL const BASE ='https://v1.moochedda.com:3002' ;const res =await fetch(` );${BASE} /balance/${address} `
Authentication
MooChedda uses cryptographic signatures rather than API keys. For write operations (transfers, marketplace actions), you sign the payload client-side with your secp256k1 private key and send the signature with the request. The server verifies the signature against your public wallet address — your private key never leaves your device.
fromAddress, toAddress, amount, tokenSymbol, timestamp.timestamp and signature in the JSON body. The private key stays local — always.Errors
All errors return a JSON body with an error string and an HTTP status code.
| Status | Meaning |
|---|---|
| 400 | Bad request — missing or invalid fields |
| 401 | Unauthorized — invalid ECDSA signature |
| 404 | Resource not found |
| 500 | Server error |
// Error response shape {"error" :"Invalid signature" }
Quick Start — MooCheddaSDK
Drop-in JavaScript client for the MooChedda exchange. One file, zero build step, works in browser and Node.js.
// ── Browser ────────────────────────────────────────── <script src="https://exchange.moochedda.com/moochedda-sdk.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/elliptic/6.5.4/elliptic.min.js"></script>const client =new MooCheddaSDK({ apiUrl:'https://exchange.moochedda.com' , walletAddress:'04abc...' ,// your 130-char public key privateKey:'7e2c...' // 64-char hex — never expose in public code });
// ── Node.js ─────────────────────────────────────────── // npm install elliptic node-fetch import MooCheddaSDKfrom './moochedda-sdk.js' ;const client =new MooCheddaSDK({ apiUrl:'https://exchange.moochedda.com' , walletAddress: process.env.WALLET_ADDRESS, privateKey: process.env.WALLET_PRIVATE_KEY });
// ── Market data (no auth required) ─────────────────── const markets =await client.getMarkets();const price =await client.getPrice('CHEDDA' ,'USDC' );const book =await client.getOrderBook('CHEDDA' ,'USDC' );const trades =await client.getTrades('CHEDDA' ,'USDC' ,20 );const candles =await client.getCandles('CHEDDA' ,'USDC' ,'1h' ,100 );
// ── Place orders (auth required) ───────────────────── // Limit buy: 500 CHEDDA at 1.20 USDC each, Good Till Cancelled const buyOrder =await client.buy({ base:'CHEDDA' , quote:'USDC' , amount:500 , price:1.20 , tif:'gtc' });// Market sell: sell 100 CHEDDA at best price immediately const sellOrder =await client.sell({ base:'CHEDDA' , quote:'USDC' , amount:100 // no price = market order });// IOC sell: fill what's possible right now, cancel the rest const iocOrder =await client.sell({ base:'CHEDDA' , quote:'USDC' , amount:200 , price:1.15 , tif:'ioc' });
// ── Manage orders ──────────────────────────────────── const openOrders =await client.getOpenOrders();await client.cancelOrder(openOrders[0 ].orderId);await client.cancelAllOrders('CHEDDA' ,'USDC' );// cancel all on this pair
// ── Account ────────────────────────────────────────── const balances =await client.getBalance();// { CHEDDA: 1000, USDC: 500, ... } await client.transfer('04xyz...' ,50 ,'USDC' );
// ── Real-time WebSocket ────────────────────────────── const unsubscribe = client.subscribe(snapshot => { console.log('Markets:' , snapshot.markets); console.log('Prices:' , snapshot.prices); });// Later: unsubscribe(); client.disconnect();
Method Reference
| Method | Auth | Description |
|---|---|---|
| getMarkets() | — | All trading pairs with 24h stats |
| getTicker(base, quote) | — | 24h ticker for a pair |
| getPrice(base, quote) | — | Current last price |
| getOrderBook(base, quote, levels?) | — | Bids and asks depth |
| getTrades(base, quote, limit?) | — | Recent executed trades |
| getCandles(base, quote, tf?, limit?) | — | OHLCV candlestick data |
| getPrices() | — | All token prices from oracle |
| getToken(symbol) | — | Token metadata and supply |
| getBalance(address?) | — | Token balances for a wallet |
| getOpenOrders(address?) | — | Active orders for a wallet |
| getOrderHistory(address?) | — | Full order history |
| buy({ base, quote, amount, price?, tif? }) | ✓ | Place a buy order |
| sell({ base, quote, amount, price?, tif? }) | ✓ | Place a sell order |
| cancelOrder(orderId) | ✓ | Cancel a specific order |
| cancelAllOrders(base?, quote?) | ✓ | Cancel all open orders |
| transfer(toAddress, amount, symbol) | ✓ | Send tokens to another wallet |
| subscribe(callback) | — | WebSocket real-time snapshots |
| disconnect() | — | Close WebSocket connection |
Wallets & Balances
Every user or merchant needs a wallet. Wallets are secp256k1 keypairs — the address is the uncompressed 130-char hex public key. Keep the private key and mnemonic offline; they cannot be recovered from the server.
Create Wallet
POST /wallet/createGenerate a new secp256k1 keypair. Returns the wallet address (public key), private key, and a BIP39 12-word mnemonic. Store both the private key and mnemonic securely — neither can be recovered from the server.
| Field | Type | Required | Description |
|---|---|---|---|
| label | string | Optional | Human-readable label stored with the wallet |
// Request const res =await fetch('https://v1.moochedda.com:3002/wallet/create' , { method:'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ label:'my-wallet' }) });const { address, privateKey, mnemonic } =await res.json();// Response {"address" :"04a3f9c2..." ,// 130-char uncompressed secp256k1 public key "privateKey" :"7e2c1b3d..." ,// 64-char hex — never transmit this "mnemonic" :"word1 word2 ... word12" }
Import Wallet from Mnemonic
POST /wallet/recoverRestore a wallet from a BIP39 mnemonic phrase. Returns the wallet address so you can verify before proceeding. The server does not store the mnemonic.
| Field | Type | Required | Description |
|---|---|---|---|
| mnemonic | string | Required | Space-separated 12-word BIP39 mnemonic |
const res =await fetch('https://v1.moochedda.com:3002/wallet/recover' , { method:'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ mnemonic:'word1 word2 ... word12' }) });const { address, privateKey } =await res.json();// Response {"address" :"04a3f9c2..." ,"privateKey" :"7e2c1b3d..." }
Get Balance
GET /balance/:addressReturns all token balances for a wallet address as a key-value map. No authentication required — balances are public.
const res =await fetch(`https://v1.moochedda.com:3002/balance/ );${address} `const { balances } =await res.json();// Response {"balances" : {"USDC" :500.00 ,"CHEDDA" :1000 } }
Signing Transactions
All write payment operations require a client-side ECDSA signature. Use the helper below in any browser or Node.js environment. The elliptic library is available via CDN or npm.
npm install elliptic — or load from CDN for browser use.
// Signing helper — works in browser (Web Crypto) and Node.js // privateKeyHex: 64-char hex private key // fields: the exact fields and values sent in the request body async function signPayload (privateKeyHex, ...parts) {// 1. Hash the concatenated field values with SHA-256 const raw = parts.map(p => String(p)).join('' );const buf =await crypto.subtle.digest('SHA-256' ,new TextEncoder().encode(raw));const hashHex = Array.from(new Uint8Array(buf)) .map(b => b.toString(16 ).padStart(2 ,'0' )).join('' );// 2. ECDSA sign with secp256k1 const ec =new elliptic.ec('secp256k1' );const key = ec.keyFromPrivate(privateKeyHex,'hex' );const sig = key.sign(hashHex);return sig.toDER('hex' );// DER-encoded hex string }// Usage for a token transfer const timestamp = Date.now();const signature =await signPayload ( myPrivateKey, fromAddress, toAddress, amount, tokenSymbol, timestamp );
Token Transfer
POST /token/transferTransfer tokens from one wallet to another. Sign the transaction client-side — only the signature travels to the server, never the private key. The server verifies the ECDSA signature against the sender's public address before executing. 0% fee, instant settlement.
| Field | Type | Required | Description |
|---|---|---|---|
| fromAddress | string | Required | Sender's wallet address (public key) |
| toAddress | string | Required | Recipient's wallet address |
| amount | number | Required | Token amount to send |
| tokenSymbol | string | Required | Token symbol e.g. USDC, CHEDDA |
| timestamp | number | Required | Unix ms timestamp used when signing — must match signed payload exactly |
| signature | string | Required | DER hex ECDSA signature over fromAddress + toAddress + amount + tokenSymbol + timestamp |
// Step 1 — sign locally (private key never leaves the device) const timestamp = Date.now();const signature =await signPayload ( myPrivateKey, fromAddress, toAddress, amount, tokenSymbol, timestamp );// Step 2 — send only the signed payload const res =await fetch('https://v1.moochedda.com:3002/token/transfer' , { method:'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ fromAddress:'04a3f9...' , toAddress:'04b7c2...' , amount:100 , tokenSymbol:'USDC' , timestamp, signature }) });// Response — 0% fee, instant {"success" :true ,"message" :"Token transfer confirmed!" ,"transaction" : {"from" :"04a3f9..." ,"to" :"04b7c2..." ,"amount" :100 ,"token" :"USDC" ,"timestamp" :1710000000000 } }
Create Invoice
POST /invoice/createGenerate a payment invoice with line items, optional tax, and accepted tokens. Returns an invoiceId and a hosted payment URL to redirect the customer to. No authentication required — invoices are public payment requests.
| Field | Type | Required | Description |
|---|---|---|---|
| merchantAddress | string | Required | Merchant's wallet address — funds go directly here |
| merchantName | string | Optional | Display name shown on the payment page |
| items | array | Required | Array of { name, price, quantity } line items |
| taxRate | number | Optional | Tax rate as a decimal e.g. 0.08 for 8% |
| acceptedTokens | string[] | Optional | Accepted token symbols. Defaults to ["USDC"] |
| preferredToken | string | Optional | Pre-selected token on the payment page |
| expiresIn | number | Optional | Expiry in seconds (default: 3600) |
const res =await fetch('https://v1.moochedda.com:3002/invoice/create' , { method:'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ merchantAddress:'04a3f9...' , merchantName:'Acme Store' , items: [ { name:'Widget Pro' , price:49.99 , quantity:2 }, { name:'Shipping' , price:5.00 , quantity:1 } ], taxRate:0.08 , acceptedTokens: ['USDC' ,'CHEDDA' ], preferredToken:'USDC' , expiresIn:3600 }) });const { invoiceId, paymentUrl, total } =await res.json();// Redirect the customer to pay: window.location.href = paymentUrl;// Response {"invoiceId" :"inv_9x2kq..." ,"paymentUrl" :"https://v1.moochedda.com/pay/inv_9x2kq..." ,"total" :112.47 ,"status" :"pending" ,"expiresAt" :1710003600000 }
Pay Invoice
POST /invoice/:id/payPay an existing invoice directly via the API. The payer signs the transaction client-side. This is an alternative to redirecting the customer to the hosted payment page.
| Field | Type | Required | Description |
|---|---|---|---|
| fromAddress | string | Required | Payer's wallet address |
| tokenSymbol | string | Optional | Token to pay with — must be in invoice's acceptedTokens. Defaults to first accepted token. |
| timestamp | number | Required | Unix ms timestamp used when signing |
| signature | string | Required | DER hex ECDSA signature over fromAddress + merchantAddress + amount + tokenSymbol + timestamp |
const invoiceId ='inv_9x2kq...' ;// Fetch invoice to get amount and merchantAddress const invoice =await (await fetch(`https://v1.moochedda.com:3002/invoice/ )).json();${invoiceId} `const timestamp = Date.now();const signature =await signPayload ( myPrivateKey, fromAddress, invoice.merchantAddress, invoice.total, tokenSymbol, timestamp );const res =await fetch(`https://v1.moochedda.com:3002/invoice/ , { method:${invoiceId} /pay`'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ fromAddress, tokenSymbol:'USDC' , timestamp, signature }) });// Response {"success" :true ,"invoiceId" :"inv_9x2kq..." ,"paidAt" :1710000000000 ,"paidBy" :"04a3f9..." ,"amount" :112.47 ,"token" :"USDC" }
Invoice Status
GET /invoice/:id/statusPoll this endpoint after the customer returns from the hosted payment page to confirm on-chain finality before fulfilling an order. No authentication required.
const res =await fetch(`https://v1.moochedda.com:3002/invoice/ );${invoiceId} /status`const data =await res.json();// Possible status values: // "pending" — waiting for payment // "paid" — confirmed on-chain // "expired" — invoice timed out if (data.status ==='paid' ) {fulfillOrder (data.paidBy, data.paidAt); }// Response {"invoiceId" :"inv_9x2kq..." ,"status" :"paid" ,"paidBy" :"04a3f9..." ,"paidAt" :1710000000000 ,"amount" :112.47 ,"token" :"USDC" }
Funding Wallets
Users fund their wallets by depositing USD via ACH or wire transfer. The deposit is credited as USDC at 1:1 — no conversion fee. The wallet address must be included as the memo/reference on the bank transfer.
Bank Deposit Instructions
GET /usdc/deposit/instructionsReturns ACH and wire bank details to display to users who want to fund their wallet with USDC. Deposits arrive at 0% fee, credited 1:1 USD. The user must include their wallet address as the memo/reference.
const { wire, ach } =await (await fetch('https://v1.moochedda.com:3002/usdc/deposit/instructions' ) ).json();// Response — same shape for wire and ach {"wire" : {"bankName" :"Wells Fargo Bank, N.A." ,"beneficiary" :"MooChedda Inc." ,"routingABA" :"125009548" ,"accountNumber" :"••••3456" ,"swiftCode" :"WFBIUS6S" ,"processingTime" :"Same day or next business day" ,"fee" :"0%" ,"memo" :"Your wallet address (required)" },"ach" : {"bankName" :"Wells Fargo Bank, N.A." ,"routingABA" :"125009548" ,"accountNumber" :"••••3456" ,"processingTime" :"1–2 business days" ,"fee" :"0%" ,"memo" :"Your wallet address (required)" } }
Merchant Authentication
Merchant write endpoints (register, update, products, staff) require a session established via a challenge–response ECDSA flow. No passwords — ownership is proved by signing a server-issued challenge with your wallet's private key.
/merchant/auth/challenge. The server returns a one-time nonce and a canonical message string to sign.message string (not a hash — sign the raw UTF-8 bytes) with your secp256k1 private key. DER-encode the result as hex.nonce and signature to /merchant/auth/verify. On success the server sets an mc_session cookie. Include it (automatically via browser, or manually via Cookie header in server-to-server calls) on all subsequent merchant requests.POST /merchant/auth/logout to invalidate a session early.
Get Auth Challenge
POST /merchant/auth/challengeIssues a one-time challenge for a wallet address. The returned message is the exact string you must sign — do not hash it first.
| Field | Type | Required | Description |
|---|---|---|---|
| address | string | Required | Merchant wallet address (public key) |
| purpose | string | Optional | Defaults to "merchant-portal" |
const res =await fetch('https://v1.moochedda.com:3002/merchant/auth/challenge' , { method:'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ address:'04a3f9...' }) });const { challenge } =await res.json();// challenge.message — sign this string // challenge.nonce — include in /verify // Response {"challenge" : {"address" :"04a3f9..." ,"nonce" :"a1b2c3d4..." ,"message" :"Sign in to MooChedda merchant portal\n..." ,"issuedAt" :"2026-01-01T00:00:00.000Z" ,"expiresAt" :"2026-01-01T00:05:00.000Z" } }
Verify & Login
POST /merchant/auth/verifySubmits the signed challenge. On success the server sets an mc_session cookie that authenticates all subsequent merchant write requests.
| Field | Type | Required | Description |
|---|---|---|---|
| address | string | Required | Merchant wallet address |
| nonce | string | Required | The nonce returned by /merchant/auth/challenge |
| signature | string | Required | DER hex ECDSA signature over the raw message string (sign UTF-8 bytes, not a pre-hash) |
| purpose | string | Optional | Must match the value used in /merchant/auth/challenge |
// Sign the raw message bytes (not a hash) const msgBytes =new TextEncoder().encode(challenge.message);const hashBuf =await crypto.subtle.digest('SHA-256' , msgBytes);const hashHex = Array.from(new Uint8Array(hashBuf)) .map(b => b.toString(16 ).padStart(2 ,'0' )).join('' );const ec =new elliptic.ec('secp256k1' );const key = ec.keyFromPrivate(myPrivateKey,'hex' );const signature = key.sign(hashHex).toDER('hex' );const res =await fetch('https://v1.moochedda.com:3002/merchant/auth/verify' , { method:'POST' , headers: {'Content-Type' :'application/json' }, credentials:'include' ,// stores the mc_session cookie body: JSON.stringify({ address:'04a3f9...' , nonce: challenge.nonce, signature }) });// Response — mc_session cookie is set automatically {"success" :true ,"address" :"04a3f9..." ,"expiresAt" :"2026-01-01T01:00:00.000Z" }
Create Merchant
POST /merchant/registerCreates a new merchant profile linked to the authenticated wallet address. If a profile already exists for that address this call acts as an update. Requires an active mc_session cookie.
| Field | Type | Required | Description |
|---|---|---|---|
| address | string | Required | Merchant wallet address — must match the authenticated session |
| name | string | Optional | Store display name (defaults to "My Store") |
| logo | string | Optional | Logo URL or base64 image string |
const res =await fetch('https://v1.moochedda.com:3002/merchant/register' , { method:'POST' , headers: {'Content-Type' :'application/json' }, credentials:'include' ,// sends mc_session cookie body: JSON.stringify({ address:'04a3f9...' , name:'Acme Store' }) });const { merchant } =await res.json();// Response {"merchant" : {"address" :"04a3f9..." ,"name" :"Acme Store" ,"logo" :null ,"createdAt" :"2026-01-01T00:00:00.000Z" ,"products" : [],"staff" : [] } }
Get Merchant
GET /merchant/:addressReturns a merchant's public profile. No authentication required.
const res =await fetch(`https://v1.moochedda.com:3002/merchant/ );${address} `const { merchant } =await res.json();// Response {"merchant" : {"address" :"04a3f9..." ,"name" :"Acme Store" ,"logo" :null ,"createdAt" :"2026-01-01T00:00:00.000Z" ,"products" : [],"staff" : [] } }
Update Merchant / Upload Logo
PUT /merchant/:addressUpdate a merchant's name and/or logo. The logo field accepts either a URL string or a base64-encoded image (include the data URI prefix, e.g. data:image/png;base64,...). Only the owner's session is accepted. Omit a field to leave it unchanged.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | New store display name |
| logo | string | Optional | Logo URL or base64 data URI e.g. data:image/png;base64,iVBOR.... Pass null to remove. |
// Convert a File object to base64 (browser) function toBase64 (file) {return new Promise((resolve, reject) => {const reader =new FileReader(); reader.onload = () => resolve(reader.result);// data:image/...;base64,... reader.onerror = reject; reader.readAsDataURL(file); }); }const logo =await toBase64 (fileInputElement.files[0 ]);const res =await fetch(`https://v1.moochedda.com:3002/merchant/ , { method:${address} `'PUT' , headers: {'Content-Type' :'application/json' }, credentials:'include' , body: JSON.stringify({ name:'Acme Store' , logo }) });const { merchant } =await res.json();// Response {"merchant" : {"address" :"04a3f9..." ,"name" :"Acme Store" ,"logo" :"data:image/png;base64,iVBOR..." } }
Add Product
POST /merchant/:address/productAdd a product to the merchant's catalogue. Accessible by the owner or any staff member. The product is assigned a unique id and immediately available on the merchant's store page.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Product name |
| price | number | Required | Price in the chosen token |
| token | string | Optional | Token symbol for pricing (default: CHEDDA) |
| desc | string | Optional | Product description |
| photo | string | Optional | Photo URL or base64 data URI |
| emoji | string | Optional | Emoji icon shown in the store (default: 📦) |
const res =await fetch(`https://v1.moochedda.com:3002/merchant/ , { method:${address} /product`'POST' , headers: {'Content-Type' :'application/json' }, credentials:'include' , body: JSON.stringify({ name:'Widget Pro' , price:49.99 , token:'USDC' , desc:'The best widget on the market.' , emoji:'🔧' }) });const { product } =await res.json();// Response {"product" : {"id" :"p_m3k9x2" ,"name" :"Widget Pro" ,"price" :49.99 ,"token" :"USDC" ,"desc" :"The best widget on the market." ,"emoji" :"🔧" ,"photo" :null ,"createdAt" :"2026-01-01T00:00:00.000Z" } }
Minting Tokens
Create and mint a new token on the MooChedda blockchain. The creator's private key is used server-side solely to sign the on-chain mint transaction — the token supply is credited directly to the creator's wallet address.
Mint Token
POST /token/create
Creates a new token and mints the entire totalSupply to the creator wallet in one atomic operation.
The private key is verified to match the creator address before the mint is committed — supply cannot be created by anyone else.
| Field | Type | Required | Description |
|---|---|---|---|
| symbol | string | Required | Ticker symbol e.g. MYTOKEN — must be unique on the platform |
| name | string | Required | Human-readable token name e.g. My Token |
| totalSupply | number | Required | Total number of tokens to mint and credit to the creator |
| creator | string | Required | Wallet address that will receive the minted supply |
| privateKey | string | Required | 64-char hex private key of the creator — used to sign the on-chain mint transaction |
| decimals | number | Optional | Token precision (default: 18) |
| metadata | object | Optional | Arbitrary JSON metadata stored with the token |
// Mint a new token const res =await fetch('https://v1.moochedda.com:3002/token/create' , { method:'POST' , headers: {'Content-Type' :'application/json' }, body: JSON.stringify({ symbol:'MYTOKEN' , name:'My Token' , totalSupply:1000000 , creator:'04a3f9c2...' ,// your wallet address privateKey:'7e2c1b3d...' ,// 64-char hex — use over TLS only decimals:18 , metadata: { description:'My custom token' } }) });const data =await res.json();// Response {"success" :true ,"message" :"Token MYTOKEN created successfully!" ,"token" : {"tokenId" :"a3b9f1..." ,"symbol" :"MYTOKEN" ,"name" :"My Token" ,"totalSupply" :1000000 ,"decimals" :18 ,"creator" :"04a3f9c2..." ,"createdAt" :1710000000000 },"asset" :null }
Transaction History
Retrieve the on-chain transaction history for any wallet address, optionally filtered by token. Results are paginated — default page size is 50, maximum is 100. No authentication required.
Transaction History
GET /transactions/:address/:tokenSymbol?
Returns paginated transactions involving :address as sender, recipient, or creator.
Optionally narrow results to a single token by appending /:tokenSymbol.
Results are sorted newest-first.
| Parameter | Type | Required | Description |
|---|---|---|---|
| address | path | Required | Wallet address to query |
| tokenSymbol | path | Optional | Filter by token symbol e.g. USDC, CHEDDA |
| page | query | Optional | Page number, 1-based (default: 1) |
| limit | query | Optional | Results per page (default: 50, max: 100) |
// All transactions for an address — first page const res =await fetch(`https://v1.moochedda.com:3002/transactions/ );${address} ?page=1&limit=50`const data =await res.json();// Filter by token const res2 =await fetch(`https://v1.moochedda.com:3002/transactions/ );${address} /USDC?page=1&limit=50`// Response {"success" :true ,"transactions" : [ {"type" :"TOKEN_TRANSFER" ,"fromAddress" :"04a3f9..." ,"toAddress" :"04b7c2..." ,"amount" :100 ,"tokenSymbol" :"USDC" ,"timestamp" :1710000000000 ,"signature" :"3045..." } ],"pagination" : {"total" :243 ,"totalPages" :5 ,"page" :1 ,"limit" :50 ,"hasNext" :true ,"hasPrev" :false } }// Iterate all pages async function fetchAllTransactions (address, token ='' ) {const path = token ?`/transactions/ :${address} /${token} ``/transactions/ ;${address} `let page =1 , all = [];do {const { transactions, pagination } =await (await fetch(`https://v1.moochedda.com:3002 ) ).json(); all.push(...transactions);${path} ?page=${page} &limit=100`if (!pagination.hasNext)break ; page++; }while (true );return all; }
Tokens & Prices
Read-only endpoints for token metadata and real-time prices. No authentication required.
List All Tokens
GET /tokensReturns all tokens registered on the platform, including symbol, name, total supply, creator address, and decimals.
const { tokens } =await (await fetch('https://v1.moochedda.com:3002/tokens' ) ).json();// Each token object: {"tokenId" :"a3b9f1..." ,"symbol" :"USDC" ,"name" :"USD Coin" ,"totalSupply" :1000000 ,"decimals" :6 ,"creator" :"04a3f9..." ,"type" :"CURRENCY" ,"createdAt" :1710000000000 }
Token Prices
GET /pricesReturns current prices for all tokens denominated in USDT. Prices update in real time based on on-chain swap activity via the built-in price oracle.
const { prices } =await (await fetch('https://v1.moochedda.com:3002/prices' ) ).json();// Response {"prices" : {"USDC" :1.00 ,"CHEDDA" :0.042 },"updatedAt" :1710000000000 }