Pustaka Image Contribution API

Help us illustrate 10,000+ fairytale stories! Upload covers, character portraits, location backgrounds, and sprites. Use any model or draw by hand.

Total Stories
Covers Done
Covers Needed

API Base URL

https://pustaka.org/api/cover-queue

Endpoints

MethodPathDescription
GET/statsCover progress (total, done, pending, flagged)
GET/priority?limit=NCovers needing urgent regeneration (refined prompts, bad existing covers)
GET/flagged?limit=NCovers with text/frame/quality issues from audit
GET/jobs?limit=N&status=pendingList cover jobs. Filter: pending, done, or omit for all.
GET/lookup/:storyPathFull story info — cover, character, location prompts + image counts
POST/submit/:indexUpload cover by job index
POST/upload/:storyPathUpload any image type (cover, character, location, sprite)

Image Types

CategoryWhatStyle
coverBook cover illustrationPortrait, watercolor storybook
charactersCharacter portrait/full bodyWhite background, single figure
locationsLocation/scene backgroundLandscape, edge-to-edge
spritesCharacter game spriteTransparent background, pixel or vector
No claiming, no overwriting. Anyone can upload to any story. If images already exist, yours is saved as an alternative (e.g. cover_002.png, snow_white_002.png).
Any image format: PNG, JPEG, WebP, AVIF. Any resolution. Any model. Hand-drawn welcome.

Quick Start

1. Find stories that need images

# Get 5 stories needing covers
curl https://pustaka.org/api/cover-queue/jobs?limit=5&status=pending

# Get full details for a specific story (all prompts)
curl https://pustaka.org/api/cover-queue/lookup/english/grimm/household_tales/snow_white

2. Upload an image

# Upload a cover (by job index)
curl -X POST https://pustaka.org/api/cover-queue/submit/42 \
  -F "[email protected]"

# Upload a character (by story path)
curl -X POST https://pustaka.org/api/cover-queue/upload/english/grimm/household_tales/snow_white \
  -F "image=@snow_white.png" \
  -F "category=characters" \
  -F "name=Snow White"

# Upload a location
curl -X POST https://pustaka.org/api/cover-queue/upload/english/grimm/household_tales/snow_white \
  -F "[email protected]" \
  -F "category=locations" \
  -F "name=Dwarfs Cottage"

# Upload a sprite
curl -X POST https://pustaka.org/api/cover-queue/upload/english/grimm/household_tales/snow_white \
  -F "[email protected]" \
  -F "category=sprites"

Upload Fields

FieldRequiredDescription
imageYesImage file (max 20MB)
categoryFor /uploadcover, characters, locations, or sprites
nameNoUsed as filename (e.g. "Snow White" → snow_white.png)
workerNoYour name/bot name for attribution
providerNoModel used (e.g. "dall-e-3", "midjourney", "hand-drawn")

Sample Python Worker

#!/usr/bin/env python3
"""Fetch prompts and upload generated images."""
import requests

BASE = "https://pustaka.org/api/cover-queue"

# Get stories needing covers
jobs = requests.get(f"{BASE}/jobs", params={"limit": 5, "status": "pending"}).json()["jobs"]

for job in jobs:
    print(f"[{job['index']}] {job['story_path']}")
    print(f"  Prompt: {job['prompt'][:100]}...")

    # TODO: Generate image with your model
    # img_bytes = generate(job["prompt"])

    # Upload cover
    # requests.post(f"{BASE}/submit/{job['index']}",
    #     files={"image": ("cover.png", img_bytes, "image/png")},
    #     data={"worker": "my-bot", "provider": "my-model"})

# Get all prompts for a specific story
story = requests.get(f"{BASE}/lookup/english/grimm/household_tales/snow_white").json()

# Upload character images
for char in story["assets"]["characters"]:
    print(f"Character: {char['name']}")
    print(f"  Prompt: {char['prompt'][:100]}...")

    # TODO: Generate character image
    # img_bytes = generate(char["prompt"])

    # Upload character
    # requests.post(f"{BASE}/upload/{story['story_path']}",
    #     files={"image": (f"{char['name']}.png", img_bytes, "image/png")},
    #     data={"category": "characters", "name": char["name"]})

Response Examples

GET /lookup/:storyPath

{
  "story_path": "english/grimm/household_tales/snow_white",
  "assets": {
    "cover": 1,
    "characters": [
      { "name": "Snow-white", "prompt": "A young woman with skin as white as snow...", "images": 0 },
      { "name": "The Queen", "prompt": "A tall, slender woman in her late 40s...", "images": 0 }
    ],
    "locations": [
      { "name": "Dwarfs' Cottage", "prompt": "A cozy, tiny stone cottage...", "images": 0 }
    ],
    "sprites": 0
  },
  "cover_index": 80,
  "cover_prompt": "Seven-year-old Snow-white stands frozen in fear...",
  "cover_status": "done"
}

POST /upload/:storyPath

{ "success": true, "story_path": "...", "category": "characters", "filename": "snow_white.png", "total": 1 }

POST /submit/:index

{ "success": true, "story_path": "...", "filename": "cover.png", "is_alternative": false, "total_covers": 1 }

Errors

CodeMeaning
400No image file or invalid category
404Story or job index not found

Pustaka Fairytale Library — pustaka.org