The reader's API

Every route the reader answers, generated from the code (scripts/api-reference.mjs), so this page and the reader cannot disagree. 224 routes. Reads need nothing; writes carry a signature from the member's identity key, checked the way /building describes. Addresses api.vulpinenetwork.com and fwetch.lol answer the same. A blank cell is a route whose code has no comment yet; the comment is the documentation, so writing one there fills this in.

/api/activity

routewhat it does
GET /api/activityDaily activity for the last N days, for charts.

/api/admin

routewhat it does
POST /api/admin/ads/settlePreview or pay a settlement. Curators.
POST /api/admin/bannersCurators: switch one on or off, delete it, or add a new one.
POST /api/admin/boardsCurator dashboard: which boards are up front, in what order, and hidden.
POST /api/admin/creditsA curator loads a balance by hand (a friend paid you in cash; testing).
POST /api/admin/curate
POST /api/admin/featured
POST /api/admin/founders/settle---- Founders' settlement ---- Protocol 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 like everything else.
POST /api/admin/house-adsCreate or update. Without an id it creates; with one it updates that row. The image may be a site path, an https URL, or a data: URL from an upload — capped so nobody turns the ad table into a file host.
POST /api/admin/house-ads/delete
POST /api/admin/house/split
POST /api/admin/portraits
POST /api/admin/portraits/backfill
POST /api/admin/remintA curator re-mints a retired founding number to a chosen address, paid by the house. For the hanging chads: a coin stuck at a key its owner's wallet will not sign for, or no longer derives. Retire it with scripts/retire.js --force, then re-mint it here straight to the address the member controls now. The member does nothing. Same collection id, same number, same design; only the address is new. Below 22 only, and only a number that has been retired, same rules as the self-service re-mint.
POST /api/admin/retireRetire a founding number from the site: the same thing scripts/retire.js --force --apply does, as a button. The current coin's mint is ignored and its origin recorded as a duplicate, so it can never come back; the number is free to mint again. Curator only.
GET /api/admin/status/:addr
POST /api/admin/welcome
POST /api/admin/welcome/backfill

/api/ads

routewhat it does
GET /api/adsEvery booking, for the dashboard. Advertisers see their own; curators see all of them.
GET /api/ads/:txid/stats
GET /api/ads/current/:slotWhat 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/:txid---- Ad clicks: reporting for advertisers, never money ---- Clicks 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/impression---- Ad revenue for boards and posters ---- Impressions: one per member per day per ad per board, and per post the ad sat beside. Only signed sessions count — refreshing does nothing, and lurkers without a session do not move money.
GET /api/ads/rates
GET /api/ads/settlementsPublished, so anyone can check the split against the transaction.

/api/apps

routewhat it does
GET /api/appsApplications for the desktop, published on chain by anyone.

/api/assertion

routewhat it does
GET /api/assertion/:txid---- Assertions: the primitive, readable directly ----

/api/assertions

routewhat it does
GET /api/assertions

/api/b

routewhat it does
GET /api/b/:hash

/api/babel

routewhat it does
POST /api/babel/gallery/locate
POST /api/babel/locate---- The Library of Babel ---- The coordinate is computed, not stored: the same text gives the same address in a browser, a reader and here.
GET /api/babel/read/:coordinate
GET /api/babel/shelf/:prefixWhat else sits on this shelf: the "walk to the next page" query.

/api/balance

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

/api/banners

routewhat it does
GET /api/banners
GET /api/banners/random

/api/board

routewhat it does
GET /api/board/:slug.glb
GET /api/board/:slug.pngThe board coin's art: same generator as the number coins, board design.
GET /api/board/:slug.svgthe board's picture is its deed now, not a coin

/api/boards

routewhat it does
GET /api/boards
GET /api/boards/:slug
POST /api/boards/:slug/editThe owner may rename and describe their board.
POST /api/boards/:slug/flagA 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. Holding the flag makes you a member of the board, so a private board can be entered with a flag the way a club is entered with a pin. The flag shows on posts like any other.
POST /api/boards/:slug/flag/giveGive (or take back) the board's flag. Owner only.
GET /api/boards/:slug/members
POST /api/boards/:slug/settingsOwner settings: private on/off, members in and out.
POST /api/boards/buyBuy 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.

/api/broadcast

routewhat it does
POST /api/broadcast---- WRITE: broadcast a client-signed tx, then index it immediately ----

/api/cache

routewhat it does
POST /api/cache---- Cache: bury a document, dig it up by name ----
GET /api/cache/:name
GET /api/cache/:name/versions

/api/chat

routewhat it does
POST /api/chat/:roomSay something. Signed by the identity key; the signature is stored with the message so anyone can check it later.
POST /api/chat/:room/hideHide a chat message: jannies, curators, the board's owner.
GET /api/chat/:room/messages
POST /api/chat/:room/pinPin: 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/blockBlock and unblock. Registered before /chat/:room, which would otherwise take "block" for the name of a room.
GET /api/chat/blocks
GET /api/chat/dm/:whoStart a DM: resolve who, and hand back their identity key so the client can encrypt to it.
GET /api/chat/file/:nameChat images.
GET /api/chat/roomsThe rooms you can see: every board room you may enter, and your DMs.
GET /api/chat/streamLive. One SSE connection per tab; messages for any room you may see.

/api/classified

routewhat it does
GET /api/classified/:txid

/api/classifieds

routewhat it does
GET /api/classifieds

/api/coin

routewhat it does
GET /api/coin/:number.glb
GET /api/coin/:number.png
GET /api/coin/:number/inscribebase64 payloads the client inscribes on-chain when minting a Fwonk

/api/coins

routewhat it does
GET /api/coins/status/:addrWhich of a wallet's coins are the real ones. The same number was minted several times, so a holder can have three coins all claiming to be #6 with no way to tell them apart. Only the earliest is recognised; the others are inert. This reports the verdict per coin so nobody has to guess, and so nobody burns the wrong one. Answers for ANY address, not just your own, because the friends holding duplicates need to see this too.
GET /api/coins/verdicts

/api/collections

routewhat it does
GET /api/collections
POST /api/collectionsCreate. Signed by the creator; stays a draft until published.
GET /api/collections/:id
GET /api/collections/:id/can-mintCan this identity mint to this address right now? Asked BEFORE the wallet pays. Every refusal the mint route can give after payment — not live, minted out, wrong mode, "not your address" — is given here first, while no money has moved.
POST /api/collections/:id/deleteDelete a collection that has minted nothing. Once a piece exists the collection is part of somebody's wallet and stays; before that it is only the creator's draft, live or not, and theirs to throw away. Curators may delete too (spam). The images go with it.
POST /api/collections/:id/mintThe mint. The minter has already paid: one transaction with (at least) price to the creator and the market fee to #1. They send its txid, signed, with the address they want the piece at. The server checks the payment on chain, rolls the traits (from the payment txid for a random mint, or the chosen seed for a preview mint), composites, and the house inscribes to them. A payment can be used once. A free collection (price 0) still needs the market fee, which covers the inscription.
GET /api/collections/:id/previewA preview: what a given seed would produce. Free, off chain. The client rolls new seeds until the buyer is happy, then mints that seed. Cached by the browser; the server composites on every call, so it is rate limited.
POST /api/collections/:id/publishPublish: freeze the layers, open the mint. Every variant must be uploaded.
POST /api/collections/:id/variantUpload one variant image. PNG, same size as the collection, one call each. Signed by the creator. Drafts only.

/api/content

routewhat it does
GET /api/content/:outpointInscription content. An inscribed meme's bytes live inside its output, not in a B protocol transaction, so the B resolver cannot find them. Proxied rather than linked directly so the page keeps working if a gateway changes, and cached hard because inscription content is immutable by definition.

/api/credits

routewhat it does
GET /api/credits/:addr

/api/debug

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

/api/deed

routewhat it does
GET /api/deed/board/:slug.svg
GET /api/deed/land/:parcel.svg---- Artifacts: deeds and ID cards ---- Drawn on request from what the chain says, so they are true, and served as SVG so a wallet renders them on a 3D card.

/api/delegates

routewhat it does
POST /api/delegates
GET /api/delegates/:number---- Delegation: more than one person behind a number ---- The holder signs {number, add, remove}; the house writes it to chain as fwetch-delegate; the indexer applies it. From then on a delegate's signed posts may carry as: <number> and are shown as the number. Delegates cannot transfer the coin, change the profile, or delegate onward.
GET /api/delegates/for/:addrWhich numbers may this address post as? Its own, plus every delegation.
routewhat it does
GET /api/featured
GET /api/featured/mine/:addrWhat a member holds from the FEATURED collections, across every address they have ever used. The picker used to ask /api/wallet/:addr for a pieces field — which that endpoint has never returned — and it asked about one address when a member typically has a dozen linked. So it always answered "you hold none", even with six ducks sitting in a linked wallet. This asks the collections directly, which is the only place ownership of a piece is actually tracked.

/api/feed

routewhat it does
GET /api/feedfeed with a small peek of replies under each post

/api/flags

routewhat it does
GET /api/flags
GET /api/flags/:addrA member's flags: what they have earned, plus the country their posts came from. The geo flag is not stored against them, it is read off their posts, because where somebody was when they posted is not a fact about who they are.
POST /api/flags/awardAward or revoke. Curators only, checked against who actually holds #1 or #2 rather than anything the caller claims.
POST /api/flags/define
POST /api/flags/delete
GET /api/flags/imagesThe 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/runRun 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.

/api/founders

routewhat it does
GET /api/founders/settlements

/api/handle

routewhat it does
GET /api/handle/:number

/api/handles

routewhat it does
GET /api/handles/can-mint/:address
POST /api/handles/claim-mintClaim a number before minting it yourself. A wallet-paid mint never touched the server, so nothing could stop the same person minting twice — the site only found out when the coin turned up in the index, by which time there were two. The client claims first, signed by the identity key; the claim is what the gate reads. Claims that never produce a coin expire, so a cancelled or failed mint does not lock anyone out.
POST /api/handles/claim-mint/doneThe mint went through (or did not). Either finish the claim or drop it.
GET /api/handles/next---- HANDLES ----
GET /api/handles/recent
GET /api/handles/taken/:numberis a specific handle number already minted? (uniqueness guard before mint)

/api/house-ads

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

/api/id

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

/api/index

routewhat it does
POST /api/index/:txid---- index a specific txid on demand (e.g. a post signed via wallet extension that we didn't broadcast ourselves) ----

/api/indexer

routewhat it does
GET /api/indexer/statusHow the indexer is doing, for anyone to see: when each loop last finished a pass, and how long ago the least recently checked item of each kind was asked about. A dead loop was invisible until something looked wrong.

/api/legacy

routewhat it does
POST /api/legacy/scan/:addr---- legacy Twonk finder (Egg, Tendie, Taco, Lock, FVG, Rare Hat) ---- These use the original 546-sat Sigil format that GorillaPool's address index only partially covers, so we trace them forward from their mint transactions. Runs in the background; poll /legacy/status/:addr for progress.
GET /api/legacy/status/:addr
routewhat it does
POST /api/linkLink addresses that demonstrably belong together. A wallet knows its own derived addresses; the server cannot derive them. This accepts that claim ONLY when the evidence already exists on our side: the identity must have a profile, and each address being linked must currently be unclaimed. First claim wins and nothing is ever re-pointed, so a later caller cannot steal an address another member already linked. It exists because requiring a profile save per wallet was too much friction for something the app can observe on its own the moment you connect.

/api/market

routewhat it does
GET /api/market
POST /api/market/checkoutCheckout 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/:numbereverything about one number: who owns it, is it for sale, what has it sold for
GET /api/market/fee
GET /api/market/listing/:txid
GET /api/market/listings
GET /api/market/mine/:addresswhat the connected wallet owns and could sell
POST /api/market/offerPresigned 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. Kept in sqlite, not in memory. It used to be a Map, which meant every deploy and every pm2 restart wiped every offer. The listing survived, because listings are a table, so a coin still looked for sale while the signature needed to buy it no longer existed. The seller signs once and is not expected to come back, so that lost the sale outright.
GET /api/market/offer/:outpoint
GET /api/market/order/:txid
GET /api/market/orders/:addr
GET /api/market/quote/:txidThe 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/sales
GET /api/market/seller/:addr
GET /api/market/shop/:txid
POST /api/market/stripe/onboardSeller onboarding: one Stripe-hosted page. We keep only the account id.
GET /api/market/stripe/status/:addr

/api/members

routewhat it does
GET /api/membersEveryone. The same query the sidebar's New members uses, uncapped.
GET /api/members/newNewest members, for the leaderboard on the right rail.

/api/meme

routewhat it does
GET /api/meme/:txidOne entry, with everything known about it: who made it, who put it on chain, and how many times it has been inscribed since.

/api/memes

routewhat it does
GET /api/memesSearch the library. Everything is optional, so a bare call is the front shelf. Combine them to narrow: ?q=pepe&tag=reaction&shelf=classics&minter=1Abc... A library nobody can search is a pile, so title, description, author and tags are all matched.
GET /api/memes/bulkRarity 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. One call, cached by the client.
GET /api/memes/claimed/:txid/:addrHas this member already claimed an edition of this meme? One each.
POST /api/memes/discoverFind library entries we have never been told about. A meme is an ordinal mint carrying no fwetch OP_RETURN, so if the browser never told us the transaction existed, nothing else would. Searching the ordinals index for our library id finds every entry wherever it was inscribed, including ones made by other applications, which is the whole point of an open protocol.
GET /api/memes/dupesDuplicate inscriptions, and the entry each one stands for. A duplicate is a re-inscription of an image already in the library. It is a real ordinal that someone paid for and owns, so nothing is done to it automatically: this only reports which txids are duplicates so a holder can decide to tidy their own wallet. The canonical entry is listed separately and must never be offered for burning — burning it would destroy the library entry itself and leave the duplicates as the only copies.
GET /api/memes/held/:addrMemes this member holds: masters they hold, and editions they claimed (only claims inside the supply count). For the wallet's Memes section, and the same answer ownership enforcement gives.
GET /api/memes/may-post/:txid/:addrMay 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/:shaIs this image already in the library? Asked by the composer BEFORE it spends anything. Anyone can inscribe any bytes, so this cannot stop a duplicate from another app; but every one of the first ten duplicates was made through this composer, and this is what would have stopped nine of them. Answers with the entry so the composer can offer to post it.
GET /api/memes/shelves
GET /api/memes/tagsThe shelves and tags that actually exist, so browsing does not depend on guessing what someone might have typed.

/api/mint

routewhat it does
GET /api/mint/estimatemint-cost estimate for the composer

/api/mod

routewhat it does
GET /api/mod/am-i/:addr---- Jannies ----
GET /api/mod/hiddenWhat is hidden right now, and the log. For the janny desk.
POST /api/mod/hideHide 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/stickySticky a thread to the top of its board. The board's owner, or a curator.

/api/name

routewhat it does
GET /api/name/:name---- $handles ----
GET /api/name/resolve/:name---- Naming: .fox ---- name.resolve is the one every reader and the gateway calls.

/api/names

routewhat it does
GET /api/names
GET /api/names/for/:addr
GET /api/names/owned/:addrname.list_owned — what this wallet holds, for the wallet's own panel.
POST /api/names/reindexRecovery: 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 was throttling. Index whatever is not known.

/api/network

routewhat it does
GET /api/networkThe network in one call, for the protocol's home page and anyone else.
GET /api/network/stats

/api/notifications

routewhat it does
GET /api/notifications/:addrWhat has happened to you since you last looked. Every item is derived from a record already on chain, so a notification is never a claim: each one points at a transaction anyone can verify. Covers every address the member has linked, because a reply to a post signed by one address and a coin sent to another are both theirs.

/api/owned

routewhat it does
GET /api/owned/:addressWhich numbers does this member hold? Index only, no chain calls, no rate limit, and it follows every link we know about. This is the "who am I" question, and it used to be answered by /handles/can-mint, which makes two gateway calls and is rate-limited to twelve an hour per connection. After a few page loads it returned 429, the client got nothing, and the member turned into a numberless persona with no picture. That was "the pfp is gone again". A question asked on every page load must be cheap and unlimited; the mint check keeps its limit.

/api/pay

routewhat it does
POST /api/pay/checkoutStripe 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/webhook

/api/people

routewhat it does
GET /api/peopleFind 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.

/api/piece

routewhat it does
GET /api/piece/:txidOne piece, by the txid of its inscription: what the profile click shows.

/api/pieces

routewhat it does
POST /api/pieces/verdictsWhich 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 card when it is the name's inscription, a meme claim when the index filed it. Anything else of those kinds is a duplicate or an orphan from testing, and the wallet may burn it. The wallet sends what each piece says it is (from its map); the answer is the database's alone, so this is cheap. Pieces of other kinds are 'unknown' and kept.

/api/poll

routewhat it does
GET /api/poll/:txid
GET /api/poll/:txid.csvCSV for the spreadsheet people.
POST /api/poll/:txid/ballotAn 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/encrypted
POST /api/poll/:txid/token
GET /api/poll/:txid/verifyVerify one sealed vote yourself: does sha256(choice:salt) match the commitment on chain?

/api/polls

routewhat it does
GET /api/polls
POST /api/polls/ceremonyBefore 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/bindOnce the poll post exists, bind its ceremony to the txid.

/api/portraits

routewhat it does
GET /api/portraits
GET /api/portraits/:number

/api/post-no

routewhat it does
GET /api/post-no/:board/:no>>412 on /K/ — which post is that? For quote-links.

/api/post

routewhat it does
GET /api/post/:txid

/api/posts-by

routewhat it does
GET /api/posts-by/:addrposts by wallet address — identity is the ADDRESS, not the number

/api/presence

routewhat it does
GET /api/presence/:room
POST /api/presence/:room

/api/profile-addr

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

/api/profile

routewhat it does
GET /api/profile/:handle---- PROFILES ----

/api/rate

routewhat it does
GET /api/rate

/api/rawtx

routewhat it does
GET /api/rawtx/:txidRaw 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.

/api/reconcile

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

/api/replies-by

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

/api/resolve

routewhat it does
GET /api/resolve/:handle---- IDENTITY: resolve a Twetch user number to an address (bootstrap) ----
GET /api/resolve/:whoTurn what someone typed into an address. People know each other by number here, not by key. Every "give this to ..." field used to demand a base58 address, which meant asking someone for theirs first. Now #7, 7, @7 and a raw address all work.

/api/session

routewhat it does
POST /api/session---- Sessions: prove who you are once, then read as yourself ---- The 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. So the member signs one request, gets a token, and sends the token with reads.

/api/sigil

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

/api/snapshot

routewhat it does
GET /api/snapshot---- the snapshot ---- How a new reader gets everything this one knows: the whole index as one SQLite file. JungleBus replays coins and posts from the chain, but names, profiles, tripcodes, boards, ads and curation arrived over months through the live loop and are not in any subscription; a reader that starts from the chain alone shows addresses and nothing else. The protocol host serves its index here; npm run seed -- https://vulpinenetwork.com <key> on the new box pulls it. Public chain data only — no keys live in the database. Set FWETCH_SNAPSHOT_KEY to turn it on; the key is the only gate.

/api/sponsor

routewhat it does
POST /api/sponsor/anonAn anonymous post from somebody with no wallet at all. Nothing to verify, so the only guard is the address of the browser: a handful an hour. The post carries anon:1 and no key; it renders as any other anonymous post.
POST /api/sponsor/claim-forA 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 recorded as the claimer. Harmless by construction — the worst case is that somebody hands you a meme. Limited editions are still one per recipient and still stop at the supply. Rate-limited per IP.
POST /api/sponsor/inscribeA meme entry or a claim: a 1-sat ordinal to the member's own address, paid by the house. The request is signed so only the member can ask for it, and the ordinal may only go to the signer's own addresses.
POST /api/sponsor/mintA 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 the whole profile pointless. So the house mints for them. The coin goes to the member's own address; the house pays. The same gate as every mint applies — one per member, the next number in line — and the request is signed so only the member can ask for their own coin.
POST /api/sponsor/opreturnA post, reply, like, repost or profile. The server rebuilds the OP_RETURN itself from the payload — it never accepts a ready-made script.
GET /api/sponsor/status
POST /api/sponsor/transfer/finish
POST /api/sponsor/transfer/prepare
POST /api/sponsor/uploadA picture on chain, for listings and shops: signed request, bytes as a data URL, the house writes a B file and returns its reference.

/api/tartary

routewhat it does
GET /api/tartary/deedsWho 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/derivationThe derivation itself, published: the constants a renderer must match.
GET /api/tartary/district/:heightdistrict.info — everything about one district, derived.
GET /api/tartary/founded-mapFounded parcels per district over a range, so a map can colour what is bought and what is not without fetching every district's parcels. With ?addr= the count of the caller's own (their linked addresses included).
GET /api/tartary/founded/:addrWhat this founder holds.
GET /api/tartary/mapThe map: a window of districts. Everything already surveyed comes back at once; a few missing ones are fetched now, the rest by the surveyor. The response says how many are still coming, so a renderer can ask again.
POST /api/tartary/messagesWhat this host knows about a handful of transactions. A district's corridors are its transactions, and a corridor with something written in it is worth walking down. Fetching every transaction to look for an OP_RETURN would be thousands of requests for one room, so this asks a cheaper question: of these txids, which ones are records this network already indexed, and what did they say? Posts, wiki pages, listings and library entries answer; everything else is a blank corridor, which is the truth — most transactions are money moving and have nothing to say.
GET /api/tartary/parcel/:idparcel.owner, plus what stands on it and any live lease.
GET /api/tartary/parcels/:height

/api/tip

routewhat it does
GET /api/tip/quote/:postTipping a post: exactly what to pay, to whom.

/api/tips

routewhat it does
GET /api/tips/:post

/api/tod

routewhat it does
GET /api/tod/:name

/api/tods

routewhat it does
GET /api/tods

/api/tx-exists

routewhat it does
GET /api/tx-exists/:txiddoes this txid exist on the network yet? (for honest "posted" confirmation)

/api/tx

routewhat it does
GET /api/tx/:txidraw transaction passthrough, used when signing a listing

/api/utxos

routewhat it does
GET /api/utxos/:address---- UTXOs for the client to build a tx ----

/api/verified

routewhat it does
POST /api/verified

/api/version

routewhat it does
GET /api/versionDiagnostics: 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".

/api/wallet

routewhat it does
GET /api/wallet/:address
POST /api/wallet/warm

/api/welcome

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

/api/whereami

routewhat it does
GET /api/whereamiWhere 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/debugWhy 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. This says which, so the next person does not have to guess. Shows only the caller's own address, which they already know.

/api/wiki

routewhat it does
GET /api/wiki/:subject
GET /api/wiki/edges/:subjectsnapshot.query — the graph as it stood at a moment.
GET /api/wiki/frontier
GET /api/wiki/snapshot/:tsThe 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/:txidOne version of a page, by its record: what the timeline reads to show an old version's text (its coordinate is the text).