v1 · REST Screenshot infrastructure for mobile teams

Generate App Store screenshots from an API.

Upload raw captures, get back store-ready screenshots in every size and locale — framed, localized, and zipped. Built for CI, Fastlane, and AI coding agents.

No editor. No templates gallery. POST → .zip
// drops into the pipelines you already run
Fastlane GitHub Actions Bitrise Xcode Cloud Codemagic
~/app — appshot generate 200 OK
# one call, every store size + locale
curl https://api.appscreenshotapi.com/v1/screenshots \
  -H "Authorization: Bearer $APPSHOT_KEY" \
  -F source=@captures/*.png \
  -F devices=iphone_6_7,ipad_13,pixel_8 \
  -F locales=en-US,de-DE,ja-JP \
  -F frame=true -F format=fastlane_zip

# → 202 Accepted · job queued
{ "id": "job_8Fq2", "status": "processing" }

# → webhook fires when ready
"output": "screenshots.zip" → 54 assets 
v1 · REST Screenshot infrastructure for mobile teams

Generate App Store screenshots from an API.

Built for CI, Fastlane, and AI coding agents. Upload captures, get store-ready, localized, framed screenshots back as a ZIP.

No editor. No templates gallery. POST → .zip
POST /v1/screenshots 202 Accepted
curl https://api.appscreenshotapi.com/v1/screenshots \
  -H "Authorization: Bearer $APPSHOT_KEY" \
  -F source=@captures/*.png \
  -F devices=iphone_6_7,ipad_13,pixel_8 \
  -F locales=en-US,de-DE,ja-JP \
  -F format=fastlane_zip  
Screenshot API · v1

The screenshot pipeline,
as an endpoint.

Stop opening a screenshot-maker website before every release. POST your captures, get back framed, localized, store-ready assets — wired straight into CI and Fastlane.

.github/workflows/screenshots.yml
- name: Generate store screenshots
  uses: appscreenshotapi/action@v1
  with:
    api_key: ${{ secrets.APPSHOT_KEY }}
    source: build/captures
    devices: iphone_6_7, ipad_13, pixel_8
    locales: en-US, de-DE, ja-JP, fr-FR
    frame: true
    output: fastlane/screenshots 

// what comes back

DevicesiPhone · iPad · Android
Sizes6.7" · 6.5" · 13" · Pixel
Locales40+ supported
Framingdevice + template
Outputfastlane_zip
Deliverywebhook / poll
The request

One request in. A store-ready ZIP out.

Send raw captures with the device sizes and locales you need. appscreenshotapi frames, resizes, localizes, and returns a Fastlane-ready archive. No UI step in the loop.

POST /v1/screenshots
request.sh
curl -X POST https://api.appscreenshotapi.com/v1/screenshots \
  -H "Authorization: Bearer $APPSHOT_KEY" \
  -F source=@captures/home.png \
  -F source=@captures/search.png \
  -F devices=iphone_6_7,ipad_13,pixel_8 \
  -F locales=en-US,de-DE,ja-JP \
  -F frame=true \
  -F template=minimal-dark \
  -F format=fastlane_zip
import appscreenshotapi from "appshot";
const client = new appscreenshotapi(process.env.APPSHOT_KEY);

const job = await client.screenshots.create({
  source: ["captures/home.png", "captures/search.png"],
  devices: ["iphone_6_7", "ipad_13", "pixel_8"],
  locales: ["en-US", "de-DE", "ja-JP"],
  frame: true,
  template: "minimal-dark",
  format: "fastlane_zip",
});
from appshot import appscreenshotapi

client = appscreenshotapi(os.environ["APPSHOT_KEY"])

job = client.screenshots.create(
    source=["captures/home.png", "captures/search.png"],
    devices=["iphone_6_7", "ipad_13", "pixel_8"],
    locales=["en-US", "de-DE", "ja-JP"],
    frame=True,
    template="minimal-dark",
    format="fastlane_zip",
)
200 application/json
response.json
{
  "id": "job_8Fq2yK",
  "status": "completed",
  "assets": 54,
  "matrix": {
    "devices": 3, "locales": 3, "frames": 6
  },
  "output": {
    "format": "fastlane_zip",
    "url": "https://cdn.appscreenshotapi.com/job_8Fq2yK.zip",
    "bytes": 18460212,
    "expires_at": "2026-06-09T00:00:00Z"
  },
  "webhook": "delivered"
}
Async by default — poll /v1/jobs/:id or receive a webhook Idempotent — safe to retry in CI fastlane_zip, flat_zip, json+urls
The output

Every size each store demands, framed and ready to upload.

appscreenshotapi returns the exact dimensions App Store Connect and Google Play require — one source capture fans out across devices and locales.

iPhone 6.7" · 1290 × 2796
SCREEN 01
Track every habit in one tap
Localized headline · en-US
drop UI screenshot
1290 × 2796
iPhone 6.5" · 1242 × 2688
SCREEN 02
See your streaks build
Localized headline · en-US
drop UI screenshot
1242 × 2688
iPad Pro 13" · 2064 × 2752
SCREEN 01
Built for the big screen
Localized headline · en-US
drop UI screenshot
2064 × 2752
iPhone 6.7" · ja-JP
SCREEN 01
ワンタップで習慣を記録
Localized headline · ja-JP
drop UI screenshot
ja-JP locale
54 assets generated · 3 devices × 3 locales × 6 frames Naming en-US/iphone_6_7/01_home.png
Built for pipelines

Infrastructure, not a screenshot editor.

Everything a mobile team needs to keep store listings current — exposed as primitives you call from code.

Store-ready sizes

Exact App Store Connect and Google Play dimensions for every device class — validated before they ever hit review.

iphone_6_7 · ipad_13 · pixel_8 · +12

Fastlane-compatible ZIPs

Output drops straight into deliver — correct folder structure, locale subdirs, and ordered filenames.

format=fastlane_zip

Localized screenshot sets

Pass a locale list and per-locale headline strings; get a complete set per language, RTL-aware, in one job.

40+ locales · RTL support

Device frames & templates

Wrap captures in accurate device bezels or branded layout templates — background, caption, and gravity all controllable.

frame=true · template=minimal-dark

Webhooks & async jobs

Large matrices run async. Poll the job or subscribe to a webhook — no holding a build agent open while frames render.

POST /v1/jobs · signed webhooks

BYOK AI optional

Bring your own model key to auto-draft localized captions and alt copy. Off by default — no model runs unless you enable it.

opt-in · bring_your_own_key
CI / CD

Screenshots that regenerate on every release.

Wire appscreenshotapi into the pipeline you already run. Captures go in on build; fresh, localized store assets come out — committed or uploaded automatically.

.github/workflows/screenshots.yml
name: Store Screenshots
on:
  push:
    tags: ["v*"]

jobs:
  screenshots:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate via appscreenshotapi
        uses: appscreenshotapi/action@v1
        with:
          api_key: ${{ secrets.APPSHOT_KEY }}
          source: build/captures
          devices: iphone_6_7,ipad_13,pixel_8
          locales: en-US,de-DE,ja-JP
          output: fastlane/screenshots
      - run: git add fastlane/screenshots && git commit -m "chore: refresh store screenshots"
# fastlane/Fastfile
lane :screenshots do
  appscreenshotapi(
    api_key: ENV["APPSHOT_KEY"],
    source: "build/captures",
    devices: ["iphone_6_7", "ipad_13", "pixel_8"],
    locales: ["en-US", "de-DE", "ja-JP"],
    frame: true,
    output: "fastlane/screenshots"
  )

  # hand the localized set straight to App Store Connect
  deliver(
    screenshots_path: "fastlane/screenshots",
    skip_binary_upload: true,
    skip_metadata: true
  )
end
# install
npm i -g @appscreenshotapi/cli

# authenticate once
appscreenshotapi login --key $APPSHOT_KEY

# generate the full matrix → ./screenshots
appscreenshotapi generate \
  --source ./captures \
  --devices iphone_6_7,ipad_13,pixel_8 \
  --locales en-US,de-DE,ja-JP \
  --frame --template minimal-dark \
  --out ./screenshots

# → 54 assets written · 18.4 MB 
Pricing

Priced per render, not per seat.

Start free. Scale by the number of screenshots you generate. Every plan includes the full API, CI integrations, and Fastlane output.

Free
For trying the API and personal projects.
$0/mo
Get API Key
  • 50 renders / mo
  • Full REST API
  • 3 locales · device frames
  • appscreenshotapi.com watermark
Starter
For indie devs shipping a few apps.
$19/mo
Start Starter
  • 1,000 renders / mo
  • No watermark
  • 10 locales · all templates
  • Webhooks & async jobs
Most popular
Pro
For studios with continuous releases.
$49/mo
Start Pro
  • 10,000 renders / mo
  • Unlimited locales
  • BYOK AI captions
  • Priority render queue
  • Custom templates
Agency
For teams shipping client apps at scale.
$149/mo
Start Agency
  • 50,000 renders / mo
  • Unlimited projects & keys
  • Team roles & SSO
  • SLA & priority support

Overages billed at $0.004 / render. Annual billing saves 2 months. See full limits →

FAQ

Questions teams ask before wiring it in.

Built specifically for app store screenshot automation, Fastlane screenshots, and Google Play screenshot generation from CI.

app store screenshot API Fastlane screenshots Google Play screenshot automation CI screenshot generation
Yes. appscreenshotapi is an API-first app store screenshot generator. You POST source captures with the device sizes and locales you need to /v1/screenshots and receive a Fastlane-ready ZIP back — no manual screenshot-maker website in the loop. It's designed to run from GitHub Actions, Bitrise, Xcode Cloud, or any shell, including an AI coding agent's tool calls.
Request format=fastlane_zip and the output matches the folder structure deliver expects — locale subdirectories and ordered filenames. Call appscreenshotapi from a lane, point deliver at the extracted folder, and your localized screenshots upload to App Store Connect with no extra glue code.
It does. Add Android device targets such as pixel_8 or pixel_tablet and appscreenshotapi returns Play-store-correct dimensions alongside your iOS sizes in the same job. Pair it with your existing upload step or supply to push to the Play Console.
All current App Store Connect classes (6.7", 6.5", 5.5", iPad 13" and 12.9") and Google Play phone/tablet sizes, plus 40+ locales with RTL support. One source capture fans out across the full matrix — a 3-device × 3-locale request returns 54 assets in a single ZIP.
No. appscreenshotapi does not fabricate app UI. It frames, resizes, and localizes the real captures you upload. AI is strictly opt-in (BYOK) and only drafts caption copy when you enable it — there are no fake-magic claims and no model runs unless you ask for one.
Jobs run asynchronously. You get a job ID immediately, then either poll /v1/jobs/:id or receive a signed webhook when the ZIP is ready — so CI never blocks a build agent waiting on a large render matrix. Requests are idempotent and safe to retry.