Documentation
Everything behind sendit.
sendit turns a sentence into a hosted web app, gives every app a tiny cloud backend, and lets you give it a pump.fun coin when you're ready. These docs cover the AI builder, the window.sendit SDK, the public API and how launches are verified.
- AI models
- 18
- SDK modules
- 3
- public endpoints
- 5
- API keys needed
- 0
Get started
Quickstart
From idea to a live, coin-paired app. No code, no API keys, no deploy step.
- 1
Describe the app
Open the studio and type what you want. Attach a screenshot if you have a look in mind. Pick a model, or keep the default.
- 2
Watch it build
The build starts right away and streams into the live preview. It is hosted at its own URL the moment it finishes. No wallet needed.
- 3
Keep sending updates
Ask for changes in plain English. Every version is saved; restore, compare or remix any of them.
- 4
Launch a coin (optional)
When you’re ready, the AI suggests a name, ticker and icon. Edit anything, connect your wallet and sign once. You are the creator on pump.fun.
Get started
Writing great prompts
Models build what you describe. Say what it does, how it feels, and what should be shared between visitors.
A tiny space shooter.
- Arrow keys or drag to move, auto-fire
- Enemies speed up every 20 seconds
- Neon on black, chunky pixel font
- Global leaderboard: ask for a name once, show the top 10| Instead of | Try |
|---|---|
| "a game" | "a one-button jumping game, gets faster, global top 10" |
| "make it better" | "bigger tap targets, a pause button, smoother death animation" |
| "fix it" | Click Fix with AI. It sends the real runtime errors from the preview. |
| "add a database" | "save every visitor’s guestbook entry and show the latest 20" |
The AI builder
How a build runs
Every prompt goes through the same six steps. Nothing reaches your app URL until the model has produced a complete document.
- 01Your promptText, plus an optional screenshot and your last 6 prompts.
- 02Builder briefStrict output rules, a quality bar and the sendit SDK reference.
- 03AI GatewayVercel AI Gateway routes the request to the model you picked.
- 04Model streamsHTML arrives token by token. Cut off? It continues, up to 3 passes.
- 05Checked + savedOnly a complete document is saved as a new version. Never half a page.
- 06Live at its URLHosted sandboxed at /p/id, which is also the coin’s website.
The AI builder
Models
13 frontier and fast models through OpenRouter, plus 5 free models through Vercel AI Gateway. Switch models per prompt from the studio composer.
Best for real apps
Frontier coders. Slower, far more complete apps.Claude Sonnet 5.5DefaultBest for appsanthropic/claude-sonnet-5.5
Claude Fable 5.1PremiumSmartestanthropic/claude-fable-5.1
- GPT-6 AstraPremiumDeep thinkeropenai/gpt-6-astra
Claude Opus 5.5PremiumCarefulanthropic/claude-opus-5.5
- GPT-6.1 SolNewest GPTopenai/gpt-6.1-sol
GLM 5.3 PrimeStrong open modelz-ai/glm-5.3-prime
Qwen 3.8 Max PrimeBig + detailedqwen/qwen3.8-max-prime
- Grok 4.7Boldx-ai/grok-4.7
Fast + cheap
Quick drafts and small tweaks.Gemini 3.8 FlashFast + visualgoogle/gemini-3.8-flash
- GPT-6 LunaFast, very cheapopenai/gpt-6-luna
GLM 5.3 FlashCheapz-ai/glm-5.3-flash
DeepSeek V4.1 FlashCheapdeepseek/deepseek-v4.1-flash
North Mini CodeFreeFreecohere/north-mini-code:free
Free
- DefaultKimi K2.7 CodeMoonshot AI
The default. Strongest at long, complete files: games, tools with real logic, careful layouts.
moonshotai/kimi-k2.7-codespeedReads screenshots - Gemini 2.5 FlashGoogle DeepMind
Bold, playful visuals and reading screenshots. Great for "make it look like this".
google/gemini-2.5-flashspeedReads screenshots - GPT-4.1 miniOpenAI
Balanced and dependable. Clean structure, good at following detailed specs.
openai/gpt-4.1-minispeed - GLM 4.7 FlashZ.ai
Quick drafts and small edits when you want to iterate fast.
zai/glm-4.7-flashspeed - GPT-OSS 120BOpenAI
Open-weight and the fastest of the set. Good for simple apps and rapid tweaks.
openai/gpt-oss-120bspeed
| Rule | Detail |
|---|---|
| Default | Claude Sonnet 5.5 when OpenRouter is on, otherwise Kimi K2.7 Code |
| Premium models | 6 builds per hour per visitor, so one person cannot drain the budget |
| Vision | Screenshots go to a model that can read images |
The AI builder
The builder brief
Each request starts with the same system instructions. They set the output format, a quality bar, and teach the model the SDK.
You are the app builder inside "sendit". You turn a user's idea
into ONE complete, working, beautiful web app delivered as a single
self-contained HTML file.
Output rules (strict):
- Reply with ONLY the HTML document, starting with <!doctype html>.
- Everything lives in this one file: markup, <style> and <script>.
- You MAY load Tailwind, Google Fonts, and libraries from jsdelivr/unpkg.
- Never use external images. Draw with CSS, inline SVG or canvas.
- The app MUST work immediately with no setup, no API keys.
Built-in cloud SDK (already loaded as window.sendit):
- sendit.db.get / set / incr / list shared by every visitor
- sendit.scores.submit / top global leaderboards
- sendit.coin(wallet?) live coin + holder checkOn follow-up prompts the model also receives the current HTML and your last six prompts, so it edits the existing app instead of starting over. The result is always one self-contained file, which is what makes every app downloadable, remixable and safe to sandbox.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Star Dash</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-black text-white">
<canvas id="game" class="block h-dvh w-full"></canvas>
<ol id="board" class="fixed right-4 top-4 font-mono text-sm"></ol>
<script>
async function gameOver(score) {
if (!window.sendit) return
const name = localStorage.getItem('pilot') || prompt('Pilot name?') || 'anon'
localStorage.setItem('pilot', name)
const { rank } = await sendit.scores.submit(name, score)
const top = await sendit.scores.top({ limit: 10 })
board.innerHTML = top
.map((r) => `<li class="${r.me ? 'text-green-300' : ''}">#${r.rank} ${r.name} ${r.score}</li>`)
.join('')
}
// ...game loop
</script>
</body>
</html>The AI builder
Streaming + continuation
Output streams into the preview as it is written. Long apps can exceed a single response, so the builder keeps going.
import { streamText } from 'ai'
const result = streamText({
model: 'moonshotai/kimi-k2.7-code', // routed by Vercel AI Gateway
instructions: BUILDER_INSTRUCTIONS,
messages: buildMessages({ prompt, currentHtml, history, image }),
maxOutputTokens: 24_000,
abortSignal,
})
for await (const delta of result.textStream) {
send(delta) // straight into the live studio preview
}
// Cut off mid-file? Ask the model to continue from where it stopped,
// overlap-join the two halves, and try again (max 3 passes).
if (!isComplete(extractHtml(text))) continueFrom(text)| Behaviour | Detail |
|---|---|
| Max output | 24,000 tokens per pass |
| Continuation | Up to 3 passes, overlap-joined so repeated lines are trimmed |
| Stop | Abort any time. An aborted run is never saved |
| Save | Only when the document is complete. Each save is a new version |
The AI builder
Screenshots + fixes
Two inputs make the model much better than a text box alone.
Screenshot to app
Paste or drop an image into the composer. It is downscaled in your browser, sent with the prompt, and stored with that version so you can see what inspired it.
Fix with AI
The studio preview listens for runtime errors inside your app. When one appears, one click sends the exact messages back to the model with the current file.
App SDK
window.sendit
Every hosted app gets a tiny cloud backend with zero setup. No keys, no accounts, no imports. It is injected before your code runs.
// Hosted apps always have window.sendit. Guard anyway so the
// file still works if someone downloads it and opens it locally.
if (window.sendit) {
try {
await sendit.db.incr('plays')
} catch (err) {
console.warn('offline, skipping', err)
}
}App SDK
sendit.db
Key-value storage shared by every visitor.
// Shared by every visitor of this app
await sendit.db.set('motd', 'gm builders')
const motd = await sendit.db.get('motd') // 'gm builders'
// Atomic counters
const visits = await sendit.db.incr('visits') // 1, 2, 3...
await sendit.db.incr('likes', 5)
// Prefix scans for lists
await sendit.db.set('guestbook:' + Date.now(), { name: 'ava', text: 'love it' })
const entries = await sendit.db.list('guestbook:')
// [{ key, value, updatedAt }, ...]| Method | Returns | Notes |
|---|---|---|
| get(key) | value | null | Any JSON value |
| set(key, value) | value | Up to 8 KB of JSON |
| incr(key, n = 1) | number | Atomic. Starts from 0 |
| list(prefix) | { key, value, updatedAt }[] | Newest first |
App SDK
sendit.scores
Global leaderboards. Each player keeps their best score per board.
// Each player keeps only their best score
const { best, rank } = await sendit.scores.submit('ava', 4200)
const top = await sendit.scores.top({ limit: 10 })
// [{ rank: 1, name: 'ava', score: 4200, me: true }, ...]
// Lower is better? Use order: 'asc' (speedruns, reaction tests)
await sendit.scores.submit('ava', 9.81, { board: 'speedrun', order: 'asc' })
await sendit.scores.top({ board: 'speedrun', order: 'asc' })App SDK
sendit.coin
Live market data for the app's coin, and an optional holder check for any wallet.
const { coin } = await sendit.coin()
// { name, symbol, marketCapUsd, priceUsd, url } or null
// Unlock extras for holders of this app's coin
const wallet = input.value.trim()
const { holder } = await sendit.coin(wallet)
if (holder?.holds) unlockGoldSkin()Reference
REST API
The SDK is a thin wrapper over public, CORS-enabled endpoints. Call them from anywhere.
/api/sdk/{appId}/kv?key={key}?prefix= instead to list keys./api/sdk/{appId}/kv{ key, value } to write or { key, increment } to add./api/sdk/{appId}/scores?board=main&limit=10&order=asc for lowest-wins boards./api/sdk/{appId}/scores{ board, name, score, order? }. Returns your best and rank./api/sdk/{appId}/coin?wallet={address}# Read one key
curl "https://www.usesendit.app/api/sdk/bammv4mriq/kv?key=visits"
# List keys by prefix
curl "https://www.usesendit.app/api/sdk/bammv4mriq/kv?prefix=guestbook:"
# Write a value
curl -X POST "https://www.usesendit.app/api/sdk/bammv4mriq/kv" \
-H "content-type: application/json" \
-d '{"key":"motd","value":"gm"}'
# Increment a counter
curl -X POST "https://www.usesendit.app/api/sdk/bammv4mriq/kv" \
-H "content-type: application/json" \
-d '{"key":"visits","increment":1}'curl "https://www.usesendit.app/api/sdk/bammv4mriq/scores?board=main&limit=10"
curl -X POST "https://www.usesendit.app/api/sdk/bammv4mriq/scores" \
-H "content-type: application/json" \
-d '{"board":"main","name":"ava","score":4200}'Errors return a non-2xx status with { "error": "message" }. The app id is the last part of its studio URL, /build/{appId}.
Reference
Live console
Call the real public endpoints for an app on the site, right from your browser.
/api/sdk/bry3zdvafb/scores?board=main&limit=5Press Send to call the real endpoint from your browser.
Reference
Embeds
Drop a playable app with its live price and a Buy button into any website.
<iframe
src="https://www.usesendit.app/embed/7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"
width="420"
height="560"
style="border:0;border-radius:16px"
loading="lazy"
title="Play on sendit"
></iframe>Copy a ready-made snippet from any coin page or from the Share menu in the studio.
Reference
Share cards
Every card in the card generator is a URL, so you can create images programmatically.
curl -o card.png "https://www.usesendit.app/api/card?kind=milestone&value=10000&label=plays&format=square"| Param | Values |
|---|---|
| kind | prompt, launch, top, stats, milestone, update, models, challenge, quote, announce |
| format | wide (1600 x 900), square (1080 x 1080), story (1080 x 1920) |
| tone | green, yellow, white |
| ...fields | Each kind has its own text fields. Build one in the generator and copy the link. |
Reference
Coins + launches
Any app can get its own real pump.fun coin on Solana mainnet, whenever you are ready. You sign; sendit verifies.
- 01
Prepare
The server pins your coin metadata (website = the app URL) and builds the create transaction with you as creator. An optional first buy goes in the same signature.
- 02
Sign
Your wallet signs everything in one approval. The mint key co-signs on the server.
- 03
Verify
Before relaying, the signed bytes are checked: you pay the fee, every signature is valid, and every instruction matches what was built. Anything modified is refused.
- 04
Relay
The transaction is sent and confirmed, and the coin is linked to the app. Its pinned website is the app page, permanently.
Reference
Security model
| Surface | Protection |
|---|---|
| Hosted apps | Served with a CSP sandbox and an opaque origin, so an app cannot read sendit cookies or other apps. |
| Editing | Only the browser holding the private build key can prompt or restore. Everyone else can remix. |
| Launches + trades | Signed bytes are re-verified on the server before relay. Programs are allowlisted. |
| Comments, follows, dev updates | Signed by your wallet with a timestamp, so nobody can post as you or replay old messages. |
| Moderation | Apps reported by 5 different people are hidden from the site and their URL. |
Reference
Limits
| Limit | Value |
|---|---|
| Builds | 20 prompts per 10 minutes per visitor |
| Prompt length | 2,000 characters |
| SDK keys per app | 500 |
| Key length | 64 characters: letters, numbers, . : - / _ |
| Value size | 8 KB of JSON |
| SDK writes | 60 per minute per visitor per app |
| SDK reads | 240 per minute per visitor per app |
| Score submissions | 20 per minute per visitor per app |
| Leaderboard size | Top 100 per request |
Reference
Infrastructure
sendit is built on production infrastructure, end to end.
- Vercel AI GatewayRoutes every build to the model you pick, with failover and usage limits.
- OpenRouterA second route to frontier and free models, picked from the same composer.
- AI SDKStreams the model output token by token into the studio preview.
- Next.jsThe studio, coin pages, API and app hosting at /p/[id].
- Neon PostgresStores every app, version, dev update, score and SDK key.
- SolanaEvery coin is a real mainnet token, signed by your own wallet.
pump.funCoins launch on the pump.fun bonding curve and trade like any other.- Tailwind CSSGenerated apps can style themselves with Tailwind from its CDN.
- TypeScriptThe whole platform is typed end to end.
Ready to build something?
Describe it in a sentence. You will have a live app and a backend before your coffee cools, and a coin whenever you want one.