MUSEGOD/docs

the docs.

Claim your rewards onchain, ring the bell, and build on MUSEGOD with the API. No keys, no sign-up.

Overview

MUSEGOD is a memecoin on Robinhood Chain with a plush god at its heart. Every trade carries a 1% fee. 90% of it is streamed to holders, shared by how much each one holds, over 24 hours each time someone rings the bell. The other 10% goes to pools.fun. There is no fee wallet and no team cut.

You don't sign up or stake anything to earn. Holding the token is enough: the distributor tracks every transfer, and rewards pile up until you claim them. They never expire, because the distributor has no owner, no setters and no sweep.

Key facts

Token0x0379E228F6887c6F18bf394042ECAF81B308cb2e
Holder rewards distributor0xaAFC482D0757a705C8F3c41f375c1D79832D8975
ChainRobinhood Chain, chain id 4663
Public RPChttps://rpc.mainnet.chain.robinhood.com
Explorerrobin.etherscan.io
Launched2026-09-23
Tradepools.fun (SushiSwap v3 pools on Robinhood Chain)
The god on X@musegod_rh

The token address above is the only one. Anything else using the name is not MUSEGOD.

How the fees flow

  1. A trade on the pool pays the 1% fee.
  2. Someone rings the bell: a call to distribute() on the distributor. It pulls the fees, buys MUSEGOD back with the WETH side, and starts a new 24 hour stream to holders. Whoever rings gets a tip of 0.5% of the buyback. Trades through pools.fun ring it too.
  3. Over the next 24 hours every holder's share accrues each second, by balance.
  4. A holder claims whenever they like. The god's keeper also claims for loyal holders from time to time (a blessing), so rewards land in their wallet unasked.

What's next

The Muses: 999 plush NFTs, 27 of them Ascended one of ones. Each muse will carry its SOUL.md, name and traits onchain through ERC-8048, readable by any agent in one call, and each will be registered as an ERC-8004 agent bound to the NFT, so whoever holds the muse controls its agent. Mints and resale royalties will buy and burn MUSEGOD. Not minted yet.

Quickstart

The API is public, read-only JSON at https://musegod.org/api/v1. No keys, no sign-up, open CORS. Amounts are 18-decimal token amounts in wei, as decimal strings.

# What the god has paid holders so far
curl -s https://musegod.org/api/v1/offering

# A wallet's unclaimed rewards, and the transactions that claim them
curl -s "https://musegod.org/api/v1/rewards?q=ralxz.eth"

# Can the bell be rung right now?
curl -s https://musegod.org/api/v1/bell

In JavaScript:

const r = await fetch('https://musegod.org/api/v1/rewards?q=ralxz.eth').then((r) => r.json())
console.log(`${Number(BigInt(r.earned) / 10n ** 16n) / 100} MUSEGOD waiting`)

Endpoints

EndpointWhat it returns
GET /api/v1/offeringEverything the home page shows about payouts: MUSEGOD streamed to holders so far, the current 24h stream, the biggest and latest distribute() receipts, daily totals, the biggest claims, bell ringers and the latest onchain events.
GET /api/v1/rewardsA wallet's unclaimed MUSEGOD (earned), its balance and all it has claimed so far, by address or .eth name, with the transactions that claim it, ready to sign.
GET /api/v1/bellWhether distribute() would go through right now (a free simulation), and the transaction that rings it.
GET /api/v1/holdersThe 50 largest holders that are wallets, not contracts, and the holder count.
GET /api/v1/faithfulBell ringers and top holders merged into one list, with balances, ring counts and a profile card per wallet.
GET /api/v1/namesFor each wallet: its OpenSea username or ENS name, picture, banner, bio, the NFT it wears as a PFP and a profile score.
GET /api/v1/standingOne wallet's standing for the MUSEGOD Muses presale: whether it is on the list (before Wednesday's lock) or chosen (after), why, its presale mints, Altar offerings made (read live, up to 3), and its total with public.

The OpenAPI 3.1 spec is the contract for all of them.

Claim your rewards

Rewards sit in the distributor until they are claimed, and they never expire. Claiming is one transaction with no arguments. It costs a little ETH for gas on Robinhood Chain and nothing else.

The easiest way for a person is the rewards check on musegod.org. The rest of this page is for agents, scripts and anyone who wants to do it by hand.

1. See what's waiting

curl -s "https://musegod.org/api/v1/rewards?q=0xYourWallet"

earned is what the wallet can claim now, in wei. claim.ready is true when it's above zero. The same number is onchain as earned(address):

cast call 0xaAFC482D0757a705C8F3c41f375c1D79832D8975 "earned(address)(uint256)" 0xYourWallet --rpc-url https://rpc.mainnet.chain.robinhood.com

2. Send the claim

The answer carries the transaction, ready to sign:

"claim": {
  "ready": true,
  "tx": { "chainId": 4663, "to": "0xaAFC482D0757a705C8F3c41f375c1D79832D8975", "data": "0x4e71d92d", "value": "0" },
  "forTx": { "chainId": 4663, "to": "0xaAFC482D0757a705C8F3c41f375c1D79832D8975", "data": "0xddeae033…", "value": "0" }
}
  • tx is claim(). Send it from the holder's own wallet and the rewards go to that wallet.
  • forTx is claimFor(holder). Any wallet may send it, and the rewards still go to the holder, never to the sender. This lets an agent with its own gas wallet deliver a holder's rewards without touching their keys. It only works when the holder is a wallet, not a contract.

With Foundry:

cast send 0xaAFC482D0757a705C8F3c41f375c1D79832D8975 "claim()" --rpc-url https://rpc.mainnet.chain.robinhood.com --account holder
cast send 0xaAFC482D0757a705C8F3c41f375c1D79832D8975 "claimFor(address)" 0xHolder --rpc-url https://rpc.mainnet.chain.robinhood.com --account agent

With viem:

import { createWalletClient, defineChain, http } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'

const robinhood = defineChain({
  id: 4663,
  name: 'Robinhood Chain',
  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
  rpcUrls: { default: { http: ['https://rpc.mainnet.chain.robinhood.com'] } },
})
const account = privateKeyToAccount(process.env.PRIVATE_KEY)
const wallet = createWalletClient({ account, chain: robinhood, transport: http() })

const r = await fetch(`https://musegod.org/api/v1/rewards?q=${account.address}`).then((r) => r.json())
if (r.claim.ready) {
  const hash = await wallet.sendTransaction({ to: r.claim.tx.to, data: r.claim.tx.data })
  console.log(`claimed: https://musegod.org/c/${hash}`)
}

3. Share it

Every claim gets its own card at https://musegod.org/c/<tx hash>. Post that link and X, Discord and Telegram show the amount on a card. See Share.

When it reverts

ErrorWhy
NothingToClaimearned is zero. Hold, wait for the stream, try later.
ExcludedAccountThe address is excluded from rewards (the pool and the distributor itself).
ClaimForContractNotAllowedclaimFor was sent for a contract. A contract must call claim() itself.

Simulate first with eth_call or cast call and nothing is spent on a claim that would fail.

Ring the bell

Ringing the bell is a call to distribute() on the distributor. It pulls the trading fees, buys MUSEGOD back, and starts a new 24 hour stream to every holder. Anyone can ring it, and whoever does gets a tip of 0.5% of the buyback, paid in MUSEGOD.

Rings show up on the home page's wall of the faithful, ranked by how many times each wallet has rung.

Check before you ring

curl -s https://musegod.org/api/v1/bell

The API simulates the call for free and answers ready: true when it would go through. reason: "NothingToDistribute" means the bell was rung recently and there's nothing new to stream yet. The answer carries the transaction:

{ "ready": true, "reason": null, "bountyBps": 50, "tx": { "chainId": 4663, "to": "0xaAFC482D0757a705C8F3c41f375c1D79832D8975", "data": "0xe4fc6b6d", "value": "0" } }

Pass ?to=0x… to send the tip somewhere other than the sender. That builds distributeFor(address) instead.

Ring it

cast send 0xaAFC482D0757a705C8F3c41f375c1D79832D8975 "distribute()" --rpc-url https://rpc.mainnet.chain.robinhood.com --account ringer

Or send the tx from /bell with any wallet. A ring that would revert costs nothing if you simulate it first.

A bot that keeps the faith

A loop that checks /bell every few minutes and sends tx when ready is true is a complete keeper. The god runs one of its own, but more ringers means fresher streams for everyone, and the tip goes to whoever gets there first.

Agents

musegod.org is built to be read and used by agents. Everything here is generated from the same OpenAPI spec the API is tested against, so it stays current.

Files for agents

FileWhat it is
/llms.txtThe short guide to the site
/llms-full.txtThese docs in one Markdown file
/openapi.jsonThe API contract, OpenAPI 3.1
/.well-known/api-catalogAPI catalog (RFC 9727)

Ask for text/markdown and the home page and these docs come back as Markdown:

curl -s -H "Accept: text/markdown" https://musegod.org/docs

The API only reads. The claim and bell endpoints return unsigned transactions, and the agent's own wallet signs and sends them.

Things an agent can do

  • Tell a holder what they have waiting, and hand them the claim transaction.
  • Claim for a holder with claimFor, paying the gas from its own wallet.
  • Keep a bell-ringing loop running and collect the tip.
  • Post a holder's card or a claim card when something happens.
  • Watch payouts with /offering and report the day's totals.

Share

Every page and card on musegod.org unfurls with an image on X, Discord and Telegram. These are the links worth posting.

LinkWhat people see
https://musegod.orgA live card with what holders have been paid so far, redrawn every 5 minutes
https://musegod.org/h/<address>A holder's card: their rank, their bag and what the god has sent them
https://musegod.org/c/<tx hash>A claim's card, with the amount. A claim the god sent for a holder shows as a blessing

Every card is also an image on its own, for posts and embeds: add .jpg (for example https://musegod.org/h/0x00a839de7922491683f547a67795204763ff8237.jpg). The live card is at https://musegod.org/og/live.jpg.

Try yours: https://musegod.org/h/0x00a839de7922491683f547a67795204763ff8237.

Build on it

The API has open CORS, so a page, a bot or a dashboard can use it straight from the browser. A few ideas:

  • A Telegram or Discord bot that answers "what do I have waiting?" with /rewards and posts claim cards.
  • A bell ringer that posts its own receipt.
  • A leaderboard from /holders and /faithful.

If you build something, tell the god at @musegod_rh.

Conventions

Base URL https://musegod.org/api/v1. Every endpoint is a GET that answers JSON, with open CORS and no keys. Amounts are 18-decimal token amounts in wei, as decimal strings. Addresses are 0x hex; lowercase is fine.

Versioning

  • The version is in the path, /api/v1/…, and every API response carries API-Version: 1.
  • The unversioned /api/… paths are aliases of the current version.
  • Within v1, changes are additive only: new fields or endpoints, never a removed or renamed field.
  • A breaking change ships as /api/v2. v1 then answers with Deprecation (RFC 9745) and Sunset (RFC 8594) headers for at least 90 days before it is retired, and the change is listed here.

Errors

Errors are JSON with a stable code, a message for people, a hint for agents and a link to these docs.

{
  "error": "invalid_query",
  "message": "Pass a 0x address or a .eth name as ?q=.",
  "hint": "Check the query parameters against the OpenAPI spec at https://musegod.org/openapi.json.",
  "docs": "https://musegod.org/docs",
  "status": 400
}
CodeStatusMeaning
invalid_query400A parameter is missing or malformed
not_found404Valid input that matched nothing
unknown_endpoint404No endpoint at that path
rate_limited429Too many uncached lookups; wait for Retry-After
upstream_unavailable503The chain or a data source didn't answer; wait for Retry-After

Limits and caching

Answers are cached at the edge for a minute to a day, as each endpoint says, and cached answers have no limit. Lookups that miss the cache are limited per IP (for example 20 a minute for rewards).

Payouts so far

GET /api/v1/offering

Everything the home page shows about payouts: MUSEGOD streamed to holders so far, the current 24h stream, the biggest and latest distribute() receipts, daily totals, the biggest claims, bell ringers and the latest onchain events. Cached 5 minutes.

curl -s "https://musegod.org/api/v1/offering"

Returns Offering.

Errors: 503 (Unavailable). See Errors.

GET

Bell status

GET /api/v1/bell

Whether distribute() would go through right now (a free simulation), and the transaction that rings it. Whoever rings gets a tip of 0.5% of the buyback; with ?to= the tip goes to that address. Cached a minute.

ParameterRequiredDescription
tonoWho gets the tip. Leave it out and the tip goes to whoever sends the transaction.
curl -s "https://musegod.org/api/v1/bell"

Returns Bell.

Errors: 400 (BadQuery), 503 (Unavailable). See Errors.

GET

A wallet's rewards

GET /api/v1/rewards

A wallet's unclaimed MUSEGOD (earned), its balance and all it has claimed so far, by address or .eth name, with the transactions that claim it, ready to sign. Cached 5 minutes per wallet.

ParameterRequiredDescription
qyesAn address or a .eth name. Example: ralxz.eth
curl -s "https://musegod.org/api/v1/rewards?q=ralxz.eth"

Returns Rewards.

Errors: 400 (BadQuery), 404 (NotFound), 429 (RateLimited), 503 (Unavailable). See Errors.

GET

Names and profiles

GET /api/v1/names

For each wallet: its OpenSea username or ENS name, picture, banner, bio, the NFT it wears as a PFP and a profile score. Cached a day per wallet.

ParameterRequiredDescription
ayesComma-separated addresses, up to 100. Example: 0x00a839de7922491683f547a67795204763ff8237
curl -s "https://musegod.org/api/v1/names?a=0x00a839de7922491683f547a67795204763ff8237"

Returns Names.

Errors: 400 (BadQuery). See Errors.

GET

Top holders

GET /api/v1/holders

The 50 largest holders that are wallets, not contracts, and the holder count. With ?a= it adds those wallets' balances and ranks (1 is the biggest bag).

ParameterRequiredDescription
anoComma-separated addresses, up to 100, to get balances for. Example: 0x00a839de7922491683f547a67795204763ff8237
curl -s "https://musegod.org/api/v1/holders?a=0x00a839de7922491683f547a67795204763ff8237"

Returns Holders.

Errors: 503 (Unavailable). See Errors.

GET

The community wall

GET /api/v1/faithful

Bell ringers and top holders merged into one list, with balances, ring counts and a profile card per wallet.

curl -s "https://musegod.org/api/v1/faithful"

Returns Faithful.

Errors: 503 (Unavailable). See Errors.

GET

Presale standing

GET /api/v1/standing

One wallet's standing for the MUSEGOD Muses presale: whether it is on the list (before Wednesday's lock) or chosen (after), why, its presale mints, Altar offerings made (read live, up to 3), and its total with public. The list itself is never returned. Cached a minute per address.

ParameterRequiredDescription
addressnoThe wallet. Pass this or name.
namenoAn ENS name, resolved on Ethereum mainnet.
summarynoOnly the list's totals and how the chosen were chosen: { asOf, locked, counts, groups: [{ id, label, wallets, mints }], communities }. Each wallet counts once, under its first group.
curl -s "https://musegod.org/api/v1/standing"

Returns Standing.

Errors: 400 (BadQuery), 404 (NotFound), 429 (RateLimited), 503 (Unavailable). See Errors.

GET

Types

Error

FieldTypeDescription
errorstring
messagestring
hintstring
docsstring
statusinteger
reason (optional)string

Day

FieldTypeDescription
daystring
streamedstringAn 18-decimal token amount in wei, as a decimal string.

Receipt

FieldTypeDescription
no (optional)integer
txstring
blockinteger
timeintegerUnix seconds.
streamedstringAn 18-decimal token amount in wei, as a decimal string.
wethInstringAn 18-decimal token amount in wei, as a decimal string.
bountystringAn 18-decimal token amount in wei, as a decimal string.
ringerstring or null

FeedItem

FieldTypeDescription
kindstring
whostring
amountstringAn 18-decimal token amount in wei, as a decimal string.
txstring
blockinteger
timeintegerUnix seconds.

Ringer

FieldTypeDescription
addressstring
ringsinteger
godboolean

Offering

FieldTypeDescription
callsintegerdistribute() calls so far (bell rings).
claimsinteger
blessingsintegerClaims the keeper sent for a holder (claimFor).
streamedstringMUSEGOD that has reached holders (claimed plus owed).
totalNotifiedstringAll MUSEGOD ever added to the holder stream.
firstBlockTimeinteger or null
owedstring or null
claimedstring or null
streamingstring or nullStill to flow in the current 24h stream.
streamEndsinteger or null
streamAtinteger or null
supplystring or null
latestReceipt or null
bestDay or null
daysarray of DayOldest first, from the first day with a stream.
feedarray of FeedItemNewest first.
ringersarray of RingerFirst ring first.
priceUsd (optional)number or nullMUSEGOD in USD from DexScreener, or null when it didn't answer.
highlightsarray of FeedItemThe biggest claims and blessings since launch, biggest first.
peakReceipt or nullThe biggest single payout since launch.

Rewards

FieldTypeDescription
addressstring
namestring or null
earnedstringAn 18-decimal token amount in wei, as a decimal string.
balancestringAn 18-decimal token amount in wei, as a decimal string.
claimedstring or nullEvery MUSEGOD this wallet has claimed so far, in wei; null when the logs couldn't be read.
claimClaimTxs

Names

FieldTypeDescription
namesmap of CardA card per wallet. A wallet whose lookup failed is left out.

Card

FieldTypeDescription
namestring or nullOpenSea username, else ENS name, else null.
imagestring or nullOpenSea profile picture, only from OpenSea's image hosts.
scoreintegerHow filled-in the profile is; higher goes first.
bannerstring or nullOpenSea banner, only from OpenSea's image hosts.
biostring or nullOpenSea bio as plain text, links removed.
nftstring or nullThe NFT the profile wears as its picture, like "lil nouns #290".

Holders

FieldTypeDescription
holdersarray of objectLargest first. Wallets only: contracts and burn addresses are left out.
countintegerAddresses holding any MUSEGOD, contracts included, burn addresses left out.
blockintegerThe block the balances are as of.
balances (optional)map of stringWith ?a=: the balance of each wallet asked about, 0 when it holds none.
ranks (optional)map of integer or nullWith ?a=: each wallet's rank among all holders, 1 the biggest bag, null when it holds none.

Faithful

FieldTypeDescription
peoplearray of object
cardsmap of CardA card per wallet whose lookup has finished.
countinteger or nullAddresses holding any MUSEGOD, or null when the holder read failed.

Tx

An unsigned transaction to the rewards distributor, ready for any wallet or eth_sendTransaction. Gas is paid in ETH on Robinhood Chain.

FieldTypeDescription
chainIdintegerRobinhood Chain.
tostringThe holder rewards distributor.
datastringThe calldata.
valuestringNo ETH is sent.

ClaimTxs

FieldTypeDescription
readybooleanTrue when there is something to claim (earned > 0).
txTxclaim(), sent from the holder's own wallet.
forTxTxclaimFor(address): any wallet may send it and the rewards go to the holder. Not allowed when the holder is a contract.

Bell

FieldTypeDescription
readybooleanTrue when distribute() would go through right now.
reasonstring or nullWhy it would revert, e.g. NothingToDistribute when the bell was rung recently; null when ready.
bountyBpsintegerThe caller's tip, in basis points of the buyback.
txTx

Standing

FieldTypeDescription
addressstring
name (optional)string
statusstring
reasonsarray of string
presaleMintsintegerPresale mints before offerings: the stage's 2, or a hand-set limit.
offeringsintegerAltar offerings made, 0 to 3, read live.
presaleTotalintegerPresale mints with offerings, at most 8.
publicMintsinteger
totalinteger
lockedbooleanTrue once the list is final.
asOfstringWhen the list was last built.
countsobjectWallets on the list and presale mints allowed, as OpenSea shows them.
nextstring