fundid. / docs

For developers

Docs

One script tag puts the gauge in your app’s footer. One tiny JSON API underneath it. Zero dependencies on our side; none required on yours.

Bring your app

  1. Request an invite. The waitlist on the landing page is the queue. v1 is deliberately small.
  2. Submit the intake — or hand this prompt to your agent; every step in it is a real endpoint:

    For your agent

    Put my app on fundid — a public fuel jar that pays its server bill, so the people who love an app can keep it running. API notes: https://fundid.app/llms.txt
    
    1. Ask me for: my invite code (from the waitlist at https://fundid.app/#waitlist), the app's name, a short slug, a one-line tagline, a link, its estimated hosting cost in USD per month, and a contact email.
    2. Submit the intake: POST https://fundid.app/api/intake with JSON {"inviteCode": "...", "appName": "...", "slugRequest": "...", "url": "...", "burnTier": "<usd per month, as a string>", "contactEmail": "..."}.
    3. A human reviews it (reply lands at the contact email). Once approved, add the live fuel gauge to my app's footer: <script src="https://fundid.app/widget.js" data-app="<slug>" async></script>
    4. Point me at https://fundid.app/<slug> to seed the jar. The app is born hibernating — the first top-up wakes it. From then on https://<slug>.fundid.run answers for the jar: JSON for agents, 402 Payment Required while asleep.
    By hand, it’s one POST:
    curl -X POST https://fundid.app/api/intake -H "Content-Type: application/json" -d '{"inviteCode": "fnd-…", "appName": "Zine Archive", "slugRequest": "zine-archive", "url": "https://zine.example", "burnTier": "7", "contactEmail": "you@anywhere.fm"}'
  3. A human reviews it. The invite is only consumed if you’re approved. Approved apps are born hibernating, wired to a real machine.
  4. Seed the jar to go live. There’s no free tier, on purpose. Your first top-up is the wake-up call.

Agents can read the whole surface at https://fundid.app/llms.txt.

Embed the gauge — one line

<script src="https://fundid.app/widget.js" data-app="your-slug" async></script>

returns Renders the gauge in the correct state, links to your jar page, and honors the two-exposure quiet rule on its own. Plain-image fallback available.

No-JavaScript fallback — the share card is a plain image that always shows the current state:

<a href="https://fundid.app/your-slug"><img src="https://fundid.app/your-slug/card.svg" alt="fuel gauge" width="600"></a>

The API in three curls

Read a jar

curl https://fundid.app/api/jar/chess-pairings

returns { "state": "healthy", "balanceUsd": 14.00, "burnRateUsdMo": 6, "runwayDays": 70, "fundedThroughDate": "2026-09-28", "funderCount": 14, "recentFunders": [ … ], "reviveUsd": 6 }

Start a top-up (guest checkout)

curl -X POST https://fundid.app/api/checkout/chess-pairings -H "Content-Type: application/json" -d '{"amountUsd": 10}'

returns A Stripe Checkout URL. $5 card minimum; the 20% platform cut is taken here, at top-up, and shown before payment.

Read your funnel (admin)

curl -H "Authorization: Bearer $ADMIN_TOKEN" https://fundid.app/api/metrics/chess-pairings

returns Impressions, jar views, checkout starts, and top-ups — split by gauge state, so you can see whether the countdown converts.

Every public endpoint

RouteAccessWhat it does
GET /api/jar/:slugpublic · CORS openThe jar as JSON — state, balance, burn rate, runway, funded-through date, recent funders. What the widget reads.
POST /api/checkout/:slugpublic{"amountUsd": 10, "funderName": "maya"} → a Stripe Checkout URL. Add "revive": true to wake a sleeping app.
GET /api/statspublicThe landing page’s numbers — jars, days of uptime funded, revivals — straight from the ledger.
GET /:slug/card.svgpublicA live 1200×630 share card in the jar’s current state. The jar page’s og:image points here.
GET /llms.txtpublicThis whole surface as plain text, for agents.
GET https://:slug.fundid.run/publicThe run host. Browsers → the jar page; agents → the jar as JSON — 402 Payment Required while asleep, with the checkout call that wakes it.
POST /api/notify/:slugpublicThe hibernation page’s “notify me — once” form. One wake email, ever, sent by a human.
POST /api/waitlistpublic · rate-limited{"email": "…", "note": "…", "url": "…"} → the invite list.
POST /api/intakeinvite-gated{"inviteCode": "…", "appName": "…", "slugRequest": "…", "burnTier": "…", "contactEmail": "…"} → a pending intake row.
POST /api/jar/:slug/impressionwidget-internalSampled impression ping the widget sends on its own. You never call this.
GET /api/metrics/:slugadmin tokenFunnel counts split by gauge state — the countdown-conversion experiment, readable.

Honest v1 limits

Next rail

x402 + USDC: machine-payable top-ups from $1 — no card minimum, agents welcome — are the next rail. Card checkout ($5 minimum) is the only rail today.

terms · every jar