99 packs · 455 images · read-only, public, CORS enabled.
GET /api/health | service status |
GET /api/stats | counts, tiers, top theme tags |
GET /api/packs | list packs — ?tier=scene&limit=50&offset=0 |
GET /api/packs/{pack_id} | one pack with all images + captions |
GET /api/search?q= | search titles, tags, captions |
GET /api/verse?book=Luke&chapter=15&verse=11 | packs covering a verse |
GET /api/images/{pack_id}/{file} | PNG image (1360×768) |
| — text → image — | |
POST /api/generate | generate from a prompt → JSON with an image URL |
GET /i/{id}.png | the generated image (random id, add ?download=1) |
GET /api/generate/status | is the GPU worker ready? |
GET /create | web page: type a prompt, generate, download |
curl -X POST https://spark-9f46.tail1917c3.ts.net/api/generate \
-H 'Content-Type: application/json' \
-d '{"prompt":"Moses parting the Red Sea"}'
Returns JSON with a random-id URL (your prompt never appears in the link):
{
"id": "9f2c7a1b4e8d3506",
"url": "https://spark-9f46.tail1917c3.ts.net/i/9f2c7a1b4e8d3506.png",
"download_url": "https://spark-9f46.tail1917c3.ts.net/i/9f2c7a1b4e8d3506.png?download=1",
"seed": 1332545595, "steps": 28,
"render_seconds": 78.4, "width": 1360, "height": 768, "bytes": 1797421
}
Body: prompt (required), styled (default true — applies the
library oil-painting style), width/height (aspect ratio only),
steps (4-40, the speed control), seed,
format (set to png to stream raw bytes instead of JSON).
Steps drive the time: roughly 23s + 2s per step. Images are kept for the most recent 1000 generations.
Rate limits: 240 requests / 60s per IP. Generation is unlimited; images render one at a time (~1 GPU-minute each), so concurrent requests queue.
Try: /api/packs?limit=5 · /api/search?q=prodigal · /api/stats