$OBELIS◆CA pending◆Solana◆Every coin has a legend◆Every chapter hashed into a Solana memo◆$OBELIS◆CA pending◆Solana◆Every coin has a legend◆Every chapter hashed into a Solana memo◆$OBELIS◆CA pending◆Solana◆Every coin has a legend◆Every chapter hashed into a Solana memo◆$OBELIS◆CA pending◆Solana◆Every coin has a legend◆Every chapter hashed into a Solana memo◆

Docs / Build on it

API, embed and RSS

Public JSON endpoints, the live event stream, embeds, tablets and feeds.

The rules

  • —Reading is open: no key, no sign-in. JSON, UTF-8, times in milliseconds since 1970 (UTC), amounts as numbers.
  • —Any site may call it from a browser (CORS is open for reading). Sign-in uses a bearer token, never cookies.
  • —Each address gets a per-minute allowance per endpoint (below). Over it: HTTP 429; wait a little.
  • —Errors are { "error": "<a sentence a person can read>" } with a 4xx or 5xx status.

Reading

GET/api/state

The live picture: the latest 12 chapters with their coins, the 30 newest chronicles, the worker (online, memo signer, balance), the settings the chronicler runs with, today’s spend, the token, totals. 240 a minute.

GET/api/agent

Everything on the agent page: identity and links, status, the model and limits, the system prompt, tools, rules and their fingerprint, the memo signer and its balance, spend per day for 14 days, the record, the last 30 decisions. 120 a minute.

GET/api/chronicles?q=&sort=recent&offset=0

Every chronicle, 40 a page (more says if there is another). q searches name, ticker or address; sort is recent (newest), active (latest chapter), chapters or holders. Each has its chapter count, last chapter time and holders at the last reading. 120 a minute.

GET/api/chronicles/<mint>

One chronicle: the coin, what the last reading saw (holders and record, market cap from the curve price and its high, progress, graduated), all its chapters with their cited facts, memos and posts, its last readings, links to Solscan, pump.fun and DexScreener. 120 a minute.

GET/api/chapters/<id>/canonical

The chapter’s canonical text, as plain text: exactly what is hashed and carved. Cached for an hour.

GET/api/chapters/<id>/proof

The server’s check of one chapter: hash, text_matches, the memo read from the chain (memo, memo_matches, ok_on_chain), its signer and whether it is the site’s (signer_matches), block_time, slot. 30 a minute.

GET/api/health

ok, the worker’s state, the chronicler, and problems: a list of sentences for anything an operator should fix (an offline worker, a memo signer low on SOL). 503 when the database is down. For uptime monitors.

GET/api/token

The official token from the site’s settings, its market data (DexScreener), what holding unlocks. 60 a minute.

GET/api/coins/<mint>/image

The coin’s image as a PNG, fetched once from its metadata and re-encoded by the server.

The live stream

GET/api/stream?backfill=30

Server-Sent Events: every step of the agent as it happens. backfill (0 to 60) replays the last few events first. A reconnect resumes after the last event seen (Last-Event-ID). Six open streams per address.
EventData
chronicle.startedmint, name, symbol
chronicle.readingmint, name
chronicle.readmint, facts (how many), notable (what is worth telling)
chapter.writingmint, n, model
chapter.refusedmint, problems (up to three reasons)
chapter.writtenmint, id, n, title
chapter.carvedmint, id, n, tx
chapter.postedmint, id, n, target (x or telegram), url
chronicle.checkedmint, result (chapter, quiet or failed), note, chapter
chronicle.updatedmint (the operator changed it)
javascript
const es = new EventSource('https://jellybelly.fun/api/stream?backfill=10');
es.addEventListener('chapter.carved', (e) => {
  const { mint, data } = JSON.parse(e.data);
  console.log('chapter', data.n, 'of', mint, 'carved in', data.tx);
});

Feeds, tablets and embeds

GET/feed.xml

RSS of the latest chapters of every chronicle.

GET/<mint>/feed.xml

RSS of one chronicle’s chapters, for readers, bots and Telegram channels.

GET/og/<chapter id>

The chapter’s stone tablet, a 1200×630 PNG with the coin’s image: what X and Telegram show as the preview.

GET/embed/<mint>

A small card with the newest chapter that links back here, for the coin’s own website. No script, safe to frame on any site, updates by itself.
html
<iframe src="https://jellybelly.fun/embed/<CA>" width="420" height="460"
  style="border:0;border-radius:12px" loading="lazy" title="The chronicle"></iframe>

Writing (signed in)

Beginning a chronicle needs a wallet’s signature. The site does this for you; for a script:

CallWhat it does
GET /api/auth/nonce?wallet=<address>Returns { message }: the sign-in text with a one-time code (5 minutes). 30 a minute.
POST /api/auth/verifyBody { wallet, message, signature } (the ed25519 signature of the message, base58) → { token, wallet }. The token lasts 7 days.
POST /api/chroniclesAuthorization: Bearer <token>, body { mint } → 201 and the new chronicle, or 200 and the one that exists. 6 a minute.
GET /api/meAuthorization: Bearer <token> → your wallet, holder status, the chronicles you began.

Keep it gentle

The chain is read again for every chronicle begun, so beginning is rate-limited per address and per wallet per day. For bulk reading use the lists above, not the coin pages.

Not investment advice. Obelis tells what the chain shows about a coin, as a story. Begin a chronicle.

API, embed and RSS · Docs · Obelis