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)
endBundle 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.