api · for builders

Ship store screenshots from CI.

One HTTPS endpoint. Multipart upload, JSON status poll, signed zip download. No SDK lock-in. Drop it into a GitHub Action, a Fastlane lane, or a cron — every release ships with fresh, multilingual store assets.

auth

One header, one key

Send X-API-Key. Plaintext shown once at create time, sha256 at rest. Revoke instantly from the dashboard — no token refresh, no OAuth dance.

queue

FIFO queue, no 409s

Hammer the endpoint from a matrix build. Submissions are persisted, the worker pulls them in order. Polling shows progress; submitter never blocks.

idempotency

Safe retries

Pass Idempotency-Key once and the same job comes back on every retry within 24 hours. Survives flaky CI runners and dropped connections without double-billing render time.

i18n

Up to 15 locales / call

Send per-locale captions in one request and the renderer fans them out across iOS 6.9 / 6.7 / 6.5 / Play. Output zip is fastlane- or framework-shaped on demand.

translate

Auto-translate, self-hosted

POST /v1/translate to fan out source copy into every locale you ship. Backed by our own LibreTranslate instance — no third-party MT service, no data hand-off, results cached for free repeats. Pro only.

two minutes from key to zip

# 1. POST your shots
curl https://api.appscreen.co/v1/render \
  -H "X-API-Key: $APPSCREEN_KEY" \
  -F 'theme=paper' \
  -F 'sizes=["ios-6.9"]' \
  -F 'langs=["en","de","tr"]' \
  -F 'screens=@./shot1.png' \
  -F 'screens=@./shot2.png'
# → { "jobId": "…", "status": "queued" }

# 2. Poll until done
curl https://api.appscreen.co/v1/render/$JOB \
  -H "X-API-Key: $APPSCREEN_KEY"
# → { "status": "done", "downloadUrl": "https://api.appscreen.co/r/…" }

# 3. Pull the zip
curl -o screens.zip "$DOWNLOAD_URL"

drop into a fastlane lane

# Fastfile
lane :appscreen do
  job = sh(%(
    curl -fsS https://api.appscreen.co/v1/render \
      -H "X-API-Key: $APPSCREEN_KEY" \
      -F 'theme=paper' \
      -F 'sizes=["ios-6.9","ios-6.7"]' \
      -F 'langs=["en","de","tr"]' \
      -F 'screens=@fastlane/screenshots/shot1.png' \
      -F 'screens=@fastlane/screenshots/shot2.png'
  )).strip
  job_id = JSON.parse(job).fetch("jobId")

  loop do
    sleep 5
    res = JSON.parse(sh("curl -fsS https://api.appscreen.co/v1/render/#{job_id} -H 'X-API-Key: $APPSCREEN_KEY'"))
    break if res["status"] == "done"
    UI.user_error!(res["error"]) if res["status"] == "failed"
  end

  sh("curl -fsSL -o fastlane/appscreen.zip '#{res["downloadUrl"]}' && unzip -o fastlane/appscreen.zip -d fastlane/screenshots")
  deliver(skip_metadata: true, skip_app_version_update: true)
end

Bundle layout matches fastlane deliver and fastlane supply — locale and device folders, no reshuffle.

limits

  • 200 screens / job
  • 500 renders / month (Pro)
  • 30 requests / minute / key
  • 20 min server-side timeout
  • 10 MB / file
  • 1 hr download URL TTL

Need higher caps, outbound webhooks, or per-render billing? Drop a line at hello@appscreen.co — these are on the roadmap and we ship the first request that asks for them.