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
| Token | 0x0379E228F6887c6F18bf394042ECAF81B308cb2e |
| Holder rewards distributor | 0xaAFC482D0757a705C8F3c41f375c1D79832D8975 |
| Chain | Robinhood Chain, chain id 4663 |
| Public RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | robin.etherscan.io |
| Launched | 2026-09-23 |
| Trade | pools.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
- A trade on the pool pays the 1% fee.
- 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. - Over the next 24 hours every holder's share accrues each second, by balance.
- 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
| Endpoint | What it returns |
|---|---|
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. |
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. |
GET /api/v1/bell | Whether distribute() would go through right now (a free simulation), and the transaction that rings it. |
GET /api/v1/holders | The 50 largest holders that are wallets, not contracts, and the holder count. |
GET /api/v1/faithful | Bell ringers and top holders merged into one list, with balances, ring counts and a profile card per wallet. |
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. |
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 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" }
}
txisclaim(). Send it from the holder's own wallet and the rewards go to that wallet.forTxisclaimFor(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
| Error | Why |
|---|---|
NothingToClaim | earned is zero. Hold, wait for the stream, try later. |
ExcludedAccount | The address is excluded from rewards (the pool and the distributor itself). |
ClaimForContractNotAllowed | claimFor 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
| File | What it is |
|---|---|
| /llms.txt | The short guide to the site |
| /llms-full.txt | These docs in one Markdown file |
| /openapi.json | The API contract, OpenAPI 3.1 |
| /.well-known/api-catalog | API 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
/offeringand 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.
| Link | What people see |
|---|---|
https://musegod.org | A 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
/rewardsand posts claim cards. - A bell ringer that posts its own receipt.
- A leaderboard from
/holdersand/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 carriesAPI-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 withDeprecation(RFC 9745) andSunset(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
}
| Code | Status | Meaning |
|---|---|---|
invalid_query | 400 | A parameter is missing or malformed |
not_found | 404 | Valid input that matched nothing |
unknown_endpoint | 404 | No endpoint at that path |
rate_limited | 429 | Too many uncached lookups; wait for Retry-After |
upstream_unavailable | 503 | The 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.
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.
| Parameter | Required | Description |
|---|---|---|
to | no | Who 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.
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.
| Parameter | Required | Description |
|---|---|---|
q | yes | An 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.
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.
| Parameter | Required | Description |
|---|---|---|
a | yes | Comma-separated addresses, up to 100. Example: 0x00a839de7922491683f547a67795204763ff8237 |
curl -s "https://musegod.org/api/v1/names?a=0x00a839de7922491683f547a67795204763ff8237"
Returns Names.
Errors: 400 (BadQuery). See Errors.
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).
| Parameter | Required | Description |
|---|---|---|
a | no | Comma-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.
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.
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.
| Parameter | Required | Description |
|---|---|---|
address | no | The wallet. Pass this or name. |
name | no | An ENS name, resolved on Ethereum mainnet. |
summary | no | Only 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.
Types
Error
| Field | Type | Description |
|---|---|---|
error | string | |
message | string | |
hint | string | |
docs | string | |
status | integer | |
reason (optional) | string |
Day
| Field | Type | Description |
|---|---|---|
day | string | |
streamed | string | An 18-decimal token amount in wei, as a decimal string. |
Receipt
| Field | Type | Description |
|---|---|---|
no (optional) | integer | |
tx | string | |
block | integer | |
time | integer | Unix seconds. |
streamed | string | An 18-decimal token amount in wei, as a decimal string. |
wethIn | string | An 18-decimal token amount in wei, as a decimal string. |
bounty | string | An 18-decimal token amount in wei, as a decimal string. |
ringer | string or null |
FeedItem
| Field | Type | Description |
|---|---|---|
kind | string | |
who | string | |
amount | string | An 18-decimal token amount in wei, as a decimal string. |
tx | string | |
block | integer | |
time | integer | Unix seconds. |
Ringer
| Field | Type | Description |
|---|---|---|
address | string | |
rings | integer | |
god | boolean |
Offering
| Field | Type | Description |
|---|---|---|
calls | integer | distribute() calls so far (bell rings). |
claims | integer | |
blessings | integer | Claims the keeper sent for a holder (claimFor). |
streamed | string | MUSEGOD that has reached holders (claimed plus owed). |
totalNotified | string | All MUSEGOD ever added to the holder stream. |
firstBlockTime | integer or null | |
owed | string or null | |
claimed | string or null | |
streaming | string or null | Still to flow in the current 24h stream. |
streamEnds | integer or null | |
streamAt | integer or null | |
supply | string or null | |
latest | Receipt or null | |
best | Day or null | |
days | array of Day | Oldest first, from the first day with a stream. |
feed | array of FeedItem | Newest first. |
ringers | array of Ringer | First ring first. |
priceUsd (optional) | number or null | MUSEGOD in USD from DexScreener, or null when it didn't answer. |
highlights | array of FeedItem | The biggest claims and blessings since launch, biggest first. |
peak | Receipt or null | The biggest single payout since launch. |
Rewards
| Field | Type | Description |
|---|---|---|
address | string | |
name | string or null | |
earned | string | An 18-decimal token amount in wei, as a decimal string. |
balance | string | An 18-decimal token amount in wei, as a decimal string. |
claimed | string or null | Every MUSEGOD this wallet has claimed so far, in wei; null when the logs couldn't be read. |
claim | ClaimTxs |
Names
| Field | Type | Description |
|---|---|---|
names | map of Card | A card per wallet. A wallet whose lookup failed is left out. |
Card
| Field | Type | Description |
|---|---|---|
name | string or null | OpenSea username, else ENS name, else null. |
image | string or null | OpenSea profile picture, only from OpenSea's image hosts. |
score | integer | How filled-in the profile is; higher goes first. |
banner | string or null | OpenSea banner, only from OpenSea's image hosts. |
bio | string or null | OpenSea bio as plain text, links removed. |
nft | string or null | The NFT the profile wears as its picture, like "lil nouns #290". |
Holders
| Field | Type | Description |
|---|---|---|
holders | array of object | Largest first. Wallets only: contracts and burn addresses are left out. |
count | integer | Addresses holding any MUSEGOD, contracts included, burn addresses left out. |
block | integer | The block the balances are as of. |
balances (optional) | map of string | With ?a=: the balance of each wallet asked about, 0 when it holds none. |
ranks (optional) | map of integer or null | With ?a=: each wallet's rank among all holders, 1 the biggest bag, null when it holds none. |
Faithful
| Field | Type | Description |
|---|---|---|
people | array of object | |
cards | map of Card | A card per wallet whose lookup has finished. |
count | integer or null | Addresses 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.
| Field | Type | Description |
|---|---|---|
chainId | integer | Robinhood Chain. |
to | string | The holder rewards distributor. |
data | string | The calldata. |
value | string | No ETH is sent. |
ClaimTxs
| Field | Type | Description |
|---|---|---|
ready | boolean | True when there is something to claim (earned > 0). |
tx | Tx | claim(), sent from the holder's own wallet. |
forTx | Tx | claimFor(address): any wallet may send it and the rewards go to the holder. Not allowed when the holder is a contract. |
Bell
| Field | Type | Description |
|---|---|---|
ready | boolean | True when distribute() would go through right now. |
reason | string or null | Why it would revert, e.g. NothingToDistribute when the bell was rung recently; null when ready. |
bountyBps | integer | The caller's tip, in basis points of the buyback. |
tx | Tx |
Standing
| Field | Type | Description |
|---|---|---|
address | string | |
name (optional) | string | |
status | string | |
reasons | array of string | |
presaleMints | integer | Presale mints before offerings: the stage's 2, or a hand-set limit. |
offerings | integer | Altar offerings made, 0 to 3, read live. |
presaleTotal | integer | Presale mints with offerings, at most 8. |
publicMints | integer | |
total | integer | |
locked | boolean | True once the list is final. |
asOf | string | When the list was last built. |
counts | object | Wallets on the list and presale mints allowed, as OpenSea shows them. |
next | string |