The reader's API

New here? Start with the developers' page: reading in one line, signing and writing, and the troll box on your own site.

Every route the reader answers, generated from the code (scripts/api-reference.mjs), so this page and the reader cannot disagree: 274 routes in 78 groups. https://api.vulpinenetwork.com and https://fwetch.lol answer the same, open to every website, in JSON; an error is {"error": "what went wrong"} with an HTTP status.

Needs says what a route asks of you. nothing: just ask. a signature: the request carries pub and sig from your identity key, made the way /developers shows. a session: you are signed in on this reader. a curator: for the people who run it.

post 3 · feed 1 · replies 1 · profile 2 · board 20 · chat 11 · assertion 2 · name 6 · handle 7 · tartary 11 · deed 2 · coin 5 · piece 2 · market 18 · classified 2 · poll 9 · tip 2 · pay 2 · sponsor 9 · cache 8 · tod 2 · babel 4 · wiki 6 · gekker 6 · maze 5 · meme 11 · network 2 · health 1 · version 1 · collections 9 · chronovisor 8 · ads 7 · flags 7 · economic 3 · banners 2 · featured 2 · frens 2 · mcp 2 · members 2 · portraits 2 · presence 2 · resolve 2 · tx 2 · wallet 2 · whereami 2 · activity 1 · apps 1 · b 1 · balance 1 · broadcast 1 · content 1 · credits 1 · donate 1 · founders 1 · house 1 · id 1 · index 1 · link 1 · mint 1 · notifications 1 · owned 1 · people 1 · rate 1 · rawtx 1 · session 1 · sigil 1 · snapshot 1 · stream 1 · utxos 1 · verified 1 · welcome 1 · admin 19 · mod 4 · delegates 3 · reconcile 1 · debug 1 · indexer 1 · legacy 2

post

routeneedswhat it does
GET /api/post-no/:board/:nonothing>>412 on /K/ — which post is that? For quote-links.
GET /api/post/:txidnothingOne post by its txid, with its author, flag and counts.
GET /api/posts-by/:addrnothingposts by wallet address — identity is the ADDRESS, not the number

feed

routeneedswhat it does
GET /api/feeda sessionfeed with a small peek of replies under each post

replies

routeneedswhat it does
GET /api/replies-by/:addrnothingreplies written by this member, with the text they were replying to

profile

routeneedswhat it does
GET /api/profile-addr/:addrnothingprofile by address — always resolvable, even before a handle exists. Returns both addresses so the client knows which one to ask about tokens.
GET /api/profile/:handlenothing

board

routeneedswhat it does
GET /api/board/:slug.glbnothingA board's coin as a 3D object.
GET /api/board/:slug.pngnothingThe board coin's art: same generator as the number coins, board design.
GET /api/board/:slug.svgnothingthe board's picture is its deed now, not a coin
GET /api/boardsnothingEvery board that is not hidden.
GET /api/boards/:slugnothingOne board: who holds it, its rules and its look.
GET /api/boards/:slug/availablenothingGekker: is a board's tag free to buy, and for how much
GET /api/boards/:slug/channelsnothingEvery board has its general channel, the room b:SLUG it always had.
POST /api/boards/:slug/channelsa signature
GET /api/boards/:slug/channels/:name/membersa session
POST /api/boards/:slug/channels/accessa signatureThe owner marks a channel private and names who may see it, besides the owner and the moderators. Signed by the owner's identity key.
POST /api/boards/:slug/edita signatureThe owner may rename and describe their board.
POST /api/boards/:slug/flaga signatureA board's membership flag. The owner uploads any image; it is squashed to the flag size (50x35) and becomes a flag that only they can give.
POST /api/boards/:slug/flag/givea signatureGive (or take back) the board's flag. Owner only.
GET /api/boards/:slug/iconnothing
POST /api/boards/:slug/icona signature
GET /api/boards/:slug/membersa sessionWho posts on a board, and who moderates it.
POST /api/boards/:slug/moderatea signature
GET /api/boards/:slug/rolesnothing
POST /api/boards/:slug/settingsa signatureOwner settings: private on/off, members in and out.
POST /api/boards/buya signatureBuy a board: 1 BSV to #1, then the house mints the board coin to you. Curators skip the payment. A board that already has a coin is taken.

chat

routeneedswhat it does
POST /api/chat/:rooma signatureSay something. Signed by the identity key; the signature is stored with the message so anyone can check it later.
POST /api/chat/:room/hidea sessionHide a chat message: jannies, curators, the board's owner.
GET /api/chat/:room/messagesa sessionMessages in a chat room, or a DM room the member is part of.
POST /api/chat/:room/pina signaturePin: the board owner, a curator, or (in a DM) either party. Pinning writes the message to chain — the one part of chat that should outlive us.
POST /api/chat/:room/reacta signature
POST /api/chat/blocka sessionBlock and unblock. Registered before /chat/:room, which would otherwise take "block" for the name of a room.
GET /api/chat/blocksa sessionWho the signed-in member has blocked.
GET /api/chat/dm/:whoa sessionStart a DM: resolve who, and hand back their identity key so the client can encrypt to it.
GET /api/chat/file/:namenothingChat images.
GET /api/chat/roomsnothingThe rooms you can see: every board room you may enter, and your DMs.
GET /api/chat/streamnothing

assertion

routeneedswhat it does
GET /api/assertion/:txidnothing
GET /api/assertionsnothingRecords filed as fwetch-assert, the protocol's escape hatch, by type, author or app.

name

routeneedswhat it does
GET /api/name/:namenothing
GET /api/name/resolve/:namenothingname.resolve is the one every reader and the gateway calls.
GET /api/namesnothingEvery .fox name the indexer knows and where each points.
GET /api/names/for/:addrnothingThe .fox names and handles an address holds.
GET /api/names/owned/:addrnothingname.list_owned — what this wallet holds, for the wallet's own panel.
POST /api/names/reindexa signatureRecovery: a claim's fee is paid to the publisher's address, so the address history is a list of every registration ever made — including any the mempool poll missed while WoC…

handle

routeneedswhat it does
GET /api/handle/:numbernothingWho holds a user number, and the coin that carries it.
GET /api/handles/can-mint/:addressnothingWhether this address may mint a user number, and which number is next.
POST /api/handles/claim-minta signatureClaim a number before minting it yourself.
POST /api/handles/claim-mint/donea signatureThe mint went through (or did not). Either finish the claim or drop it.
GET /api/handles/nextnothing
GET /api/handles/recentnothingThe newest members, for the front page.
GET /api/handles/taken/:numbernothingis a specific handle number already minted? (uniqueness guard before mint)

tartary

routeneedswhat it does
GET /api/tartary/deed/:parcelnothingOne deed as token metadata (name, description, image, attributes) with who holds it now and where its token sits, for any game or world.
GET /api/tartary/deedsnothingWho holds the land: how many parcels are founded, by how many addresses, who holds most, and what was founded last. The question behind it is whether somebody is sweeping.
GET /api/tartary/deeds/allnothingEvery founded deed, a page at a time, for a game that wants the whole land at once: ?after= the last seq you were given, ?limit= up to 1000.
GET /api/tartary/derivationnothingThe derivation itself, published: the constants a renderer must match.
GET /api/tartary/district/:heightnothingdistrict.info — everything about one district, derived.
GET /api/tartary/founded-mapnothingFounded parcels per district over a range, so a map can colour what is bought and what is not without fetching every district's parcels.
GET /api/tartary/founded/:addrnothingWhat this founder holds.
GET /api/tartary/mapnothingThe map: a window of districts. Everything already surveyed comes back at once; a few missing ones are fetched now, the rest by the surveyor.
POST /api/tartary/messagesa signatureWhat this host knows about a handful of transactions.
GET /api/tartary/parcel/:idnothingparcel.owner, plus what stands on it and any live lease.
GET /api/tartary/parcels/:heightnothingThe parcels in one district, read from the block itself.

deed

routeneedswhat it does
GET /api/deed/board/:slug.svgnothingA board's deed, drawn.
GET /api/deed/land/:parcel.svgnothingDrawn on request from what the chain says, so they are true, and served as SVG so a wallet renders them on a 3D card.

coin

routeneedswhat it does
GET /api/coin/:number.glbnothingA user number's coin as a 3D object.
GET /api/coin/:number.pngnothingA user number's coin as a picture.
GET /api/coin/:number/inscribenothingbase64 payloads the client inscribes on-chain when minting a Fwonk
GET /api/coins/status/:addrnothingWhich of a wallet's coins are the real ones.
GET /api/coins/verdictsnothingFor each outpoint: whether it really is the number it claims, an old design, or a duplicate. Ask this before offering to send or burn a coin.

piece

routeneedswhat it does
GET /api/piece/:txidnothingOne piece, by the txid of its inscription: what the profile click shows.
POST /api/pieces/verdictsa signatureWhich of a wallet's pieces are the real thing, judged by the index, the way coins are judged: a deed card is real when it is the card the index holds for that parcel, a name…

market

routeneedswhat it does
GET /api/marketnothingThe market: listings by kind, category, seller, shop or tag.
POST /api/market/checkouta signatureCheckout in dollars: a Stripe Checkout session with the split and a held charge. The order record is written when Stripe says it is paid.
GET /api/market/coin/:numbernothingeverything about one number: who owns it, is it for sale, what has it sold for
GET /api/market/droppednothingListings that never appeared, and why. Ask with ?seller=<address> after listing something that did not show up: the reader always knew the reason and used to keep it to itself.
GET /api/market/feenothingThe network's cut of a sale.
GET /api/market/listing/:txidnothingOne listing in full.
GET /api/market/listingsnothing
GET /api/market/mine/:addressnothingwhat the connected wallet owns and could sell
POST /api/market/offera signaturePresigned offers. The signature a seller produces is what lets a buyer complete the sale alone, so it is stored here and handed out on request.
GET /api/market/offer/:outpointnothingOne offer made on a listing.
GET /api/market/order/:txidnothingOne order and where it has got to.
GET /api/market/orders/:addrnothingA member's orders, bought and sold.
GET /api/market/quote/:txidnothingThe checkout: exactly what to pay, to whom. Build the transaction from this and put the fwetch-order record in it. With escrow, the buyer's key is needed for the script.
GET /api/market/salesnothingWhat has sold lately.
GET /api/market/seller/:addrnothingA seller: what they have sold and what people said.
GET /api/market/shop/:txidnothingA shop and everything in it.
POST /api/market/stripe/onboarda signatureSeller onboarding: one Stripe-hosted page. We keep only the account id.
GET /api/market/stripe/status/:addrnothingWhether a seller can take card payments yet.

classified

routeneedswhat it does
GET /api/classified/:txidnothingOne posting in full.
GET /api/classifiedsnothingCregs List postings, by category, place or search.

poll

routeneedswhat it does
GET /api/poll/:txidnothingOne poll: its question, its answers and the count so far.
GET /api/poll/:txid.csvnothingCSV for the spreadsheet people.
POST /api/poll/:txid/ballota signatureAn encrypted ballot arrives unsigned by any identity — that is the point. The house verifies it exactly as the indexer will, then writes it.
GET /api/poll/:txid/encryptednothingA sealed poll's published hashes, before the reveal.
POST /api/poll/:txid/tokena signatureA token for voting in a sealed poll, so a vote can be counted without being read.
GET /api/poll/:txid/verifynothingVerify one sealed vote yourself: does sha256(choice:salt) match the commitment on chain?
GET /api/pollsnothingOpen polls, newest first.
POST /api/polls/ceremonya signatureBefore posting an encrypted poll: get a ceremony. The public parts go in the post; the private parts stay here against the poll's txid once known.
POST /api/polls/ceremony/binda signatureOnce the poll post exists, bind its ceremony to the txid.

tip

routeneedswhat it does
GET /api/tip/quote/:postnothingTipping a post: exactly what to pay, to whom.
GET /api/tips/:postnothingWho has tipped a post, and how much.

pay

routeneedswhat it does
POST /api/pay/checkouta signatureStripe Checkout: a card payment becomes sats on the member's balance. Needs STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET and FWETCH_SATS_PER_USD.
POST /api/pay/webhooka signatureStripe tells the reader a card payment for credits went through.
routeneedswhat it does
POST /api/sponsor/anona signatureAn anonymous post from somebody with no wallet at all.
POST /api/sponsor/claim-fora signatureA lurker snags a meme for somebody. "claim > user 13 > done." No wallet, no signature: the edition goes to the named member's asset address, the house pays, the recipient is…
POST /api/sponsor/inscribea signature
POST /api/sponsor/minta signatureA number, minted by the house. A member with no wallet cannot pay for a mint, and without a number their name and picture never show: they stay a persona forever, which makes…
POST /api/sponsor/opreturna signature
GET /api/sponsor/statusnothingWhat the house holds, its coin pool, and what it has spent today.
POST /api/sponsor/transfer/finisha signatureThe member's signed transfer, broadcast and paid for by the house.
POST /api/sponsor/transfer/preparea signatureThe house builds a transfer of an ordinal the member owns, for the member to sign.
POST /api/sponsor/uploada signatureA picture on chain, for listings and shops: signed request, bytes as a data URL, the house writes a B file and returns its reference.

cache

routeneedswhat it does
POST /api/cachea signature
POST /api/cache-checkouta signatureSubscribing, and managing a subscription, both act for one cache, so both want its write token: nobody subscribes, or opens the billing of, a cache they cannot write to.
GET /api/cache-plansnothing
POST /api/cache-portala signatureOpens Stripe's own customer portal for the cache's subscriber: changing a card, or cancelling. Wants the cache's write token.
GET /api/cache/:namenothingRead a cache: the whole document with ?key=, one section with &part=, the list of sections with &parts, or the encrypted bytes with no key at all.
GET /api/cache/:name/plannothing
GET /api/cache/:name/satsnothingPaying for Yipnote in satoshis. Each cache gets an address of its own, derived from the house key, so a payment says what it is for by where it lands.
GET /api/cache/:name/versionsnothingEvery version of a cache, newest first.

tod

routeneedswhat it does
GET /api/tod/:namenothingOne tod by the name it claimed, with the inscription to install from.
GET /api/todsnothingThe Den: every tod the indexer has seen, newest first. ?q= searches.

babel

routeneedswhat it does
POST /api/babel/gallery/locatea signatureWhere an image sits in the Library of Babel's gallery.
POST /api/babel/locatea signatureThe coordinate is computed, not stored: the same text gives the same address in a browser, a reader and here.
GET /api/babel/read/:coordinatenothingThe text at a Library coordinate, which is where a Babel page's words actually live.
GET /api/babel/shelf/:prefixnothingWhat else sits on this shelf: the "walk to the next page" query.

wiki

routeneedswhat it does
GET /api/wikinothingThe whole encyclopedia, in one answer. Babel is meant to be read by programs as much as by people: the corpus is already signed, timestamped and public, and a thing that wants…
GET /api/wiki/:subjectnothingA Babel page: its current version, its timeline and what it links to.
GET /api/wiki/edges/:subjectnothingsnapshot.query — the graph as it stood at a moment.
GET /api/wiki/frontiernothingPages other pages link to that nobody has written yet.
GET /api/wiki/snapshot/:tsnothingThe frontier: subjects an edge points at that have no article yet. Visible gaps are the point — they are where the graph funds its own construction.
GET /api/wiki/version/:txidnothingOne version of a page, by its record: what the timeline reads to show an old version's text (its coordinate is the text).

gekker

routeneedswhat it does
GET /api/gekker/joinednothingWhat shows down the left is yours to choose: the servers you joined, and always the ones you own or are a member of. Kept by your session.
POST /api/gekker/joineda session
POST /api/gekker/keysa signaturethe owner hands out a channel's key: envelopes for one epoch, signed
GET /api/gekker/keys/:rooma sessionyour envelopes for a room, by every address linked to your session
GET /api/gekker/pubkey/:addrnothingan address's identity key, which envelopes are sealed to: its own, or that of the identity linked to it
GET /api/gekker/who/:addrnothingTheir user number, name, $handle and picture, looked for across every address linked to them. Public, and cached for a minute.

maze

routeneedswhat it does
GET /api/maze/boardnothing
POST /api/maze/runa signatureA run is how far a player gets without dying.
GET /api/maze/skullsnothingevery player's last fall, newest first, for the maze to lay their skulls
POST /api/maze/treasurea signature
GET /api/maze/treasuresnothingthe Treasure Room: every treasure found, newest first, public

meme

routeneedswhat it does
GET /api/meme/:txidnothingOne entry, with everything known about it: who made it, who put it on chain, and how many times it has been inscribed since.
GET /api/memesnothingSearch the library. Everything is optional, so a bare call is the front shelf.
GET /api/memes/bulknothingRarity for many library entries at once. A feed can show a dozen memes and asking about each separately would be a dozen round trips on every render.
GET /api/memes/claimed/:txid/:addrnothingHas this member already claimed an edition of this meme? One each.
POST /api/memes/discovera signatureFind library entries we have never been told about.
GET /api/memes/dupesnothingDuplicate inscriptions, and the entry each one stands for.
GET /api/memes/held/:addrnothingMemes this member holds: masters they hold, and editions they claimed (only claims inside the supply count).
GET /api/memes/may-post/:txid/:addrnothingMay this address post that meme? Asked by the composer before the post is signed, so nobody pays for a post whose meme will be stripped on arrival.
GET /api/memes/sha/:shanothingIs this image already in the library? Asked by the composer BEFORE it spends anything.
GET /api/memes/shelvesnothingThe Memetic Library's shelves.
GET /api/memes/tagsnothingThe shelves and tags that actually exist, so browsing does not depend on guessing what someone might have typed.

network

routeneedswhat it does
GET /api/networknothingThe network in one call, for the protocol's home page and anyone else.
GET /api/network/statsnothingHow many members, records, boards and names the network has.

health

routeneedswhat it does
GET /api/healthnothing200 when this box is well, 503 with the reason when it is not. ?format=text answers HEALTHY or UNHEALTHY on the first line, for a monitoring service to watch.

version

routeneedswhat it does
GET /api/versionnothingDiagnostics: what version is actually running, and what does the index hold? Useful for telling "the fix is not deployed" apart from "the fix did not work".

collections

routeneedswhat it does
GET /api/collectionsnothingCollections the reader knows, or one creator's.
POST /api/collectionsa signatureCreate. Signed by the creator; stays a draft until published.
GET /api/collections/:idnothingOne collection and the pieces in it.
GET /api/collections/:id/can-mintnothingCan this identity mint to this address right now?
POST /api/collections/:id/deletea signatureDelete a collection that has minted nothing.
POST /api/collections/:id/minta signatureThe mint. The minter has already paid: one transaction with (at least) price to the creator and the market fee to #1.
GET /api/collections/:id/previewnothingA preview: what a given seed would produce.
POST /api/collections/:id/publisha signaturePublish: freeze the layers, open the mint. Every variant must be uploaded.
POST /api/collections/:id/varianta signatureUpload one variant image. PNG, same size as the collection, one call each. Signed by the creator. Drafts only.

chronovisor

routeneedswhat it does
GET /api/chronovisor/address/:addrnothingan address as Chronovisor knows it: who it is (user number, name, handle, picture), and every record it signed or inscription it was given
GET /api/chronovisor/block/:heightnothingone block: every Vulpine record Chronovisor has from it
GET /api/chronovisor/recordsnothingrecords, newest first; ?tag= ?author= to narrow, ?before=<id> to page back, ?after=<id> to catch up oldest first
GET /api/chronovisor/searchnothingone box for everything: a transaction id, an address, a block height, a #user number or a $handle
GET /api/chronovisor/statusnothing
GET /api/chronovisor/streamnothingnew records as they arrive, for anyone following along: ?tags=fwetch-post,fwetch-chat, ?after=<id> to resume
GET /api/chronovisor/tx/:txidnothing
GET /api/chronovisor/txinfo/:txidnothingone transaction as Chronovisor holds it: unconfirmed or confirmed and how deep, its block, whether it came with a proof, where its money came from and went, and the records…

ads

routeneedswhat it does
GET /api/adsnothingEvery booking, for the dashboard. Advertisers see their own; curators see all of them.
GET /api/ads/:txid/statsnothingHow an advert has done: views and clicks.
GET /api/ads/current/:slotnothingWhat is showing in a slot right now, and when it changes. Computed from the bookings and the clock, so any application reading the same records arrives at the same answer.
GET /api/ads/go/:txidnothingClicks are cheap to fake, so they buy nothing; they tell the advertiser whether the ad worked. /api/ads/go/:txid records one and redirects.
POST /api/ads/impressiona signatureImpressions: one per member per day per ad per board, and per post the ad sat beside.
GET /api/ads/ratesnothingWhat an advert costs, and how the money is split.
GET /api/ads/settlementsnothingPublished, so anyone can check the split against the transaction.

flags

routeneedswhat it does
GET /api/flagsnothingEvery flag that can be earned or awarded.
GET /api/flags/:addrnothingA member's flags: what they have earned, plus the country their posts came from.
POST /api/flags/awarda signatureAward or revoke. Curators only, checked against who actually holds #1 or #2 rather than anything the caller claims.
POST /api/flags/definea signatureCurators: add a flag or change how it is awarded.
POST /api/flags/deletea signatureCurators: remove a flag.
GET /api/flags/imagesnothingThe pictures a flag can be. Just what is in the folder, so adding a flag design is dropping a 50x35 PNG into public/flags/.
POST /api/flags/runa signatureRun every automatic rule now. Also runs on its own schedule; this is for a curator who has just written a rule and wants to see it take effect.

economic

routeneedswhat it does
GET /api/economicnothingFriends are fwetch-assert records of type fren, which the indexer already files, so this app invented no record and needs no new table beyond a few minutes' memory of what…
GET /api/economic/:whonothingOne person: their frens, what each holds, and the total. Named by number or address.
GET /api/economic/:who/addressesnothingWhich addresses this person is counted across, and what each holds. Asked when a total looks wrong: the answer is almost always an address the network has never been told about.

banners

routeneedswhat it does
GET /api/bannersnothingEvery banner this reader has, by theme.
GET /api/banners/randomnothingOne of a board's own banners, picked at random.
routeneedswhat it does
GET /api/featurednothingThe collections this reader puts forward, which is what the Library and the profile picker show.
GET /api/featured/mine/:addrnothingWhat a member holds from the FEATURED collections, across every address they have ever used.

frens

routeneedswhat it does
GET /api/frens/:whonothingA fwetch-assert of type fren, written into the protocol spec at 9.6.1.
GET /api/frens/:who/with/:othernothingIs this pair frens, and which way round? For a button that has to know what it says before anybody presses it.

mcp

routeneedswhat it does
GET /api/mcp/:namenothingSome clients look before they leap.
POST /api/mcp/:namea signatureYipnote as a tool an assistant holds. One address, added once, and the pasting stops.

members

routeneedswhat it does
GET /api/membersnothingEveryone. The same query the sidebar's New members uses, uncapped.
GET /api/members/newnothingNewest members, for the leaderboard on the right rail.

portraits

routeneedswhat it does
GET /api/portraitsnothingHow many portraits are ready for the numbers that have been minted.
GET /api/portraits/:numbernothingThe portrait that belongs to a user number.

presence

routeneedswhat it does
GET /api/presence/:roomnothingWho else is in that room right now. Never signed, so never proof of anything.
POST /api/presence/:rooma signatureSay where you are standing in Tartary. Kept in memory for twenty seconds and never written to the chain.

resolve

routeneedswhat it does
GET /api/resolve/:handlenothing
GET /api/resolve/:whonothingTurn what someone typed into an address. People know each other by number here, not by key.

tx

routeneedswhat it does
GET /api/tx-exists/:txidnothingdoes this txid exist on the network yet? (for honest "posted" confirmation)
GET /api/tx/:txidnothingraw transaction passthrough, used when signing a listing

wallet

routeneedswhat it does
GET /api/wallet/:addressnothingEverything an address holds: numbers, pictures, names, deeds and tods. ?fresh=1 skips the kept answer.
POST /api/wallet/warma signatureAsk the reader to look up an address before it is needed, so the wallet view opens at once.

whereami

routeneedswhat it does
GET /api/whereaminothingWhere the caller appears to be, so the client can show a flag without the member telling us anything. Country level, and it fails silently.
GET /api/whereami/debugnothingWhy is there no flag? Two different failures produce the same empty result: the real address never reaching us through nginx, or every lookup service refusing.

activity

routeneedswhat it does
GET /api/activitynothingDaily activity for the last N days, for charts.

apps

routeneedswhat it does
GET /api/appsnothingApplications for the desktop, published on chain by anyone.

b

routeneedswhat it does
GET /api/b/:hashnothingThe bytes of an inscription by its hash: pictures, videos and files are served from here.

balance

routeneedswhat it does
GET /api/balance/:addressnothingBSV balance for an address (confirmed + unconfirmed), in sats and BSV

broadcast

routeneedswhat it does
POST /api/broadcasta signatureWRITE: broadcast a client-signed tx, then index it immediately ----

content

routeneedswhat it does
GET /api/content/:outpointnothing

credits

routeneedswhat it does
GET /api/credits/:addrnothingA member's credit balance with the house.
routeneedswhat it does
GET /api/donatenothingGiving the network money on purpose. Everything here has been somebody paying for a thing: a name, a board, a listing, a year of Yipnote.

founders

routeneedswhat it does
GET /api/founders/settlementsnothingWhat the protocol has paid out to the founders, and when.

house

routeneedswhat it does
GET /api/house-adsnothingRead is public: every visitor's ad slots need it. Writes are curator-only, the same gate as everything else on the ads page.

id

routeneedswhat it does
GET /api/id/:addr.svgnothingthe ID card: who a key is on the network, drawn live

index

routeneedswhat it does
POST /api/index/:txida signature
routeneedswhat it does
POST /api/linka signatureLink addresses that demonstrably belong together.

mint

routeneedswhat it does
GET /api/mint/estimatenothingmint-cost estimate for the composer

notifications

routeneedswhat it does
GET /api/notifications/:addrnothingWhat has happened to you since you last looked.

owned

routeneedswhat it does
GET /api/owned/:addressnothingWhich numbers does this member hold? Index only, no chain calls, no rate limit, and it follows every link we know about.

people

routeneedswhat it does
GET /api/peoplenothingFind people as you type: a number, or the start of a name or $handle. It returns only what chat already shows publicly: name, number and picture.

rate

routeneedswhat it does
GET /api/ratenothingWhat a satoshi is worth in dollars right now, so a price can be shown in either.

rawtx

routeneedswhat it does
GET /api/rawtx/:txidnothingRaw hex for a transaction, used to build the inputBEEF a wallet needs before it will accept an input for an output it does not manage itself.

session

routeneedswhat it does
POST /api/sessiona signatureThe feed is a GET. A private board needs to know who is asking, and an address in the query string is a claim anyone could make.

sigil

routeneedswhat it does
GET /api/sigil/:txidnothingfull sigil metadata for one txid (incl. glbModel for 3D) — the unspent listing is lightweight; this fetches the rich per-inscription data on demand

snapshot

routeneedswhat it does
GET /api/snapshotnothingHow a new reader gets everything this one knows: the whole index as one SQLite file.

stream

routeneedswhat it does
GET /api/streamnothingThe live feed: new records pushed down an open connection as the indexer files them, so a wallet or a tod stops asking every few seconds.

utxos

routeneedswhat it does
GET /api/utxos/:addressnothing

verified

routeneedswhat it does
POST /api/verifieda signatureFor a list of outpoints, whether each is what it claims to be.

welcome

routeneedswhat it does
GET /api/welcomenothingWelcome foxes: a piece from the house's pocket to every new member. See lib/welcome.js.

For the people who run a reader

admin

routeneedswhat it does
POST /api/admin/ads/settlea curatorPreview or pay a settlement. Curators.
POST /api/admin/bannersa curatorCurators: switch one on or off, delete it, or add a new one.
POST /api/admin/boardsa curatorCurator dashboard: which boards are up front, in what order, and hidden.
POST /api/admin/creditsa curatorA curator loads a balance by hand (a friend paid you in cash; testing).
POST /api/admin/curatea curatorCurators: hide or restore a post, a listing or a picture.
POST /api/admin/featureda curatorCurators: put a collection forward, or take it back.
POST /api/admin/founders/settlea curatorProtocol revenue in a window — ads paid to the publisher, market fees, the house's mint cuts — and the founders' shares of it, paid from the house in one transaction, published…
POST /api/admin/house-adsa curatorCreate or update. Without an id it creates; with one it updates that row.
POST /api/admin/house-ads/deletea curatorCurators: remove one of the house's own adverts.
POST /api/admin/house/splita curatorCurators: split the house's fattest coin into many, so it can pay for several things at once.
GET /api/admin/housesa curatorReading is open: a house's address and balance are on the chain for anyone to see, and the status page has always shown house 0's.
POST /api/admin/housesa curatorAdd a house, switch one off, fund it from house 0 or sweep it back. Signed by the key that holds #0 or #1.
POST /api/admin/portraitsa curatorCurators: choose the collection portraits come from.
POST /api/admin/portraits/backfilla curatorCurators: draw portraits for numbers that have none.
POST /api/admin/reminta curatorA curator re-mints a retired founding number to a chosen address, paid by the house.
POST /api/admin/retirea curatorRetire a founding number from the site: the same thing scripts/retire.js --force --apply does, as a button.
GET /api/admin/status/:addra curatorWhether an address is a curator, and what it holds.
POST /api/admin/welcomea curatorCurators: choose the collection new members are given a fox from.
POST /api/admin/welcome/backfilla curatorCurators: give a welcome fox to members who joined before there was one.

mod

routeneedswhat it does
GET /api/mod/am-i/:addra curator
GET /api/mod/hiddena curatorWhat is hidden right now, and the log. For the janny desk.
POST /api/mod/hidea curatorHide or restore a post or a meme. The record stays; it stops being served. Logged with who and why, so curators can review what their jannies do.
POST /api/mod/stickya curatorSticky a thread to the top of its board. The board's owner, or a curator.

delegates

routeneedswhat it does
POST /api/delegatesa curatorLet another key post as your number, or take that back.
GET /api/delegates/:numbera curatorThe holder signs {number, add, remove}; the house writes it to chain as fwetch-delegate; the indexer applies it.
GET /api/delegates/for/:addra curatorWhich numbers may this address post as? Its own, plus every delegation.

reconcile

routeneedswhat it does
POST /api/reconcilea curatorForce a reconciliation. Useful after a transfer made elsewhere, and for telling "the index is behind" apart from "something is wrong".

debug

routeneedswhat it does
GET /api/debug/identity/:addra curatorDiagnostic: exactly what the index holds for one wallet. Built because "the profile does not show" kept being guessed at instead of observed.

indexer

routeneedswhat it does
GET /api/indexer/statusa curatorWhether the indexer is running, when each loop last beat, how stale each kind of item is, and why it is not running if it is not.

legacy

routeneedswhat it does
POST /api/legacy/scan/:addra signatureThese use the original 546-sat Sigil format that GorillaPool's address index only partially covers, so we trace them forward from their mint transactions.
GET /api/legacy/status/:addrnothingWhat an old Twetch or Twonk address still holds here.

Beyond /api

addresswhat it is
/embed/trollbox.jsThe troll box on any page in one line: <script src="https://fwetch.lol/embed/trollbox.js" async></script>.
/embed/trollboxThe same box as a page to frame; ?room= another open room.
/developers, /deeds, /protocol, /building, /tods, /gekker, /terminalThese guides.