{"openapi":"3.0.0","info":{"title":"AppListingLab Developer API","description":"Programmatic access to supported AppListingLab workflows. Authenticate with an API key (mm_live_…).","version":"0.0.1"},"servers":[{"url":"https://api.applistinglab.com/api/v1"}],"tags":[],"paths":{"/developer/publishing/google/sessions":{"post":{"operationId":"DeveloperPublishingController_create","parameters":[{"name":"Idempotency-Key","in":"header","description":"Unique 20–200 character retry key for this exact request.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperGooglePublishDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishSessionDto"}}}}},"security":[{"api-key":[]}],"summary":"Prepare a Google Play publish with exact text, selected parts and explicit review policy. No store writes yet.","tags":["Developer API"]}},"/developer/publishing/sessions/{id}/artifacts":{"post":{"operationId":"DeveloperPublishingController_stage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishArtifactDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishStagedDto"}}}}},"security":[{"api-key":[]}],"summary":"Stage an owned artifact into a locale and ordered slot. Identical retries are safe; a different artifact in an occupied position conflicts.","tags":["Developer API"]}},"/developer/publishing/sessions/{id}/icon":{"post":{"operationId":"DeveloperPublishingController_stageIcon","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishIconDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishIconStagedDto"}}}}},"security":[{"api-key":[]}],"summary":"Stage an existing 512 × 512 PNG icon in the selected locale. Identical normalized bytes recover the same slot; different bytes conflict. No store writes yet.","tags":["Developer API"]}},"/developer/publishing/google/apps/{id}/icon":{"get":{"operationId":"DeveloperPublishingController_icon","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperGoogleIconDto"}}}}},"security":[{"api-key":[]}],"summary":"Read Google Play icon SHA-256 hashes for one locale. Does not commit an edit or expose provider URLs.","tags":["Developer API"]}},"/developer/publishing/sessions/{id}/start":{"post":{"operationId":"DeveloperPublishingController_start","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishStartedDto"}}}}},"security":[{"api-key":[]}],"summary":"Start the prepared Google Play publish once. Repeated requests recover the existing operation.","tags":["Developer API"]}},"/developer/publishing/google/apps/{id}/listing":{"get":{"operationId":"DeveloperPublishingController_listing","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperGoogleListingDto"}}}}},"security":[{"api-key":[]}],"summary":"Read the connected Google Play listing for one locale; returns only safe metadata fields.","tags":["Developer API"]}},"/developer/publishing/sessions/{id}":{"get":{"operationId":"DeveloperPublishingController_state","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperPublishStateDto"}}}}},"security":[{"api-key":[]}],"summary":"Read safe publish status and confirmed field/image counts. done means committed to Play, not approved or publicly live. uncertain requires reconciliation, never blind retry.","tags":["Developer API"]}},"/developer/apps":{"get":{"operationId":"PublicApiController_listApps","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicAppListItemDto"}}}}}},"security":[{"api-key":[]}],"summary":"List the App profiles owned by this account, most recently updated first. Reuse the one whose store link matches before importing again.","tags":["Developer API"]},"post":{"description":"Send name and description: the main way in, and the only one for an app that is not released yet. For an already published app, iosUrl/androidUrl optionally pull in its listing; the fields you send always take priority, an unreadable listing falls back to them, and importedFrom says which stores were read. Links sent without name must each open a published listing, otherwise 422 STORE_LISTING_UNAVAILABLE and nothing is created. Each successful call creates a new profile.","operationId":"PublicApiController_createApp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOnboardDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAppCreatedDto"}}}}},"security":[{"api-key":[]}],"summary":"Create an App profile from your app's details and return its public identifier.","tags":["Developer API"]}},"/developer/apps/{id}":{"get":{"operationId":"PublicApiController_getApp","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAppResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Read the safe summary of an owned App profile.","tags":["Developer API"]}},"/developer/apps/{id}/screenshots":{"get":{"operationId":"PublicApiController_listSources","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperSourceDto"}}}}}},"security":[{"api-key":[]}],"summary":"List opaque source handles for an owned App profile.","tags":["Developer API"]},"post":{"operationId":"PublicApiController_uploadSource","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperSourceUploadDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperSourceDto"}}}}},"security":[{"api-key":[]}],"summary":"Upload a source screenshot. Identical bytes and platform safely recover the same source handle.","tags":["Developer API"]}},"/developer/screenshots/devices":{"get":{"operationId":"PublicApiController_devices","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperDeviceDto"}}}}}},"security":[{"api-key":[]}],"summary":"List supported screenshot targets. This does not enable generation.","tags":["Developer API"],"x-screenshot-targets":[{"device":"iphone-69","store":"apple","width":1320,"height":2868,"maxScreenshots":10},{"device":"iphone-67","store":"apple","width":1290,"height":2796,"maxScreenshots":10},{"device":"iphone-65","store":"apple","width":1242,"height":2688,"maxScreenshots":10},{"device":"ipad-pro","store":"apple","width":2048,"height":2732,"maxScreenshots":10},{"device":"android-phone","store":"google","width":1080,"height":1920,"maxScreenshots":8},{"device":"android-tablet","store":"google","width":1280,"height":800,"maxScreenshots":8},{"device":"iphone-duo-outer","store":"apple","width":1398,"height":2034,"maxScreenshots":10},{"device":"iphone-duo-inner","store":"apple","width":2007,"height":2853,"maxScreenshots":10},{"device":"android-phone-landscape","store":"google","width":1920,"height":1080,"maxScreenshots":8},{"device":"android-phone-tall","store":"google","width":1080,"height":2160,"maxScreenshots":8},{"device":"android-tablet-10-portrait","store":"google","width":1440,"height":2560,"maxScreenshots":8},{"device":"android-tablet-10-landscape","store":"google","width":2560,"height":1440,"maxScreenshots":8}]}},"/developer/screenshots/captions":{"post":{"operationId":"PublicApiController_planCaptions","parameters":[{"name":"Idempotency-Key","in":"header","description":"Reuse the same key and body to recover the original text-planning operation.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperCaptionPlanDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGenerationAcceptedResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Prepare editable captions without rendering images.","tags":["Developer API"]}},"/developer/screenshots/designs":{"get":{"operationId":"PublicApiController_designs","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperDesignDto"}}}}}},"security":[{"api-key":[]}],"summary":"Discover available versioned screenshot designs. Browsing is optional.","tags":["Developer API"]}},"/developer/screenshots/prepare":{"post":{"operationId":"PublicApiController_prepareScreenshots","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScreenshotsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperDesignPreparationDto"}}}}},"security":[{"api-key":[]}],"summary":"Validate a screenshot request and preview the recommended design without charging or generating.","tags":["Developer API"]}},"/developer/screenshots":{"post":{"description":"AppListingLab chooses and resolves its internal layout/render pipeline server-side. The Developer API returns only finished artifact metadata and opaque download handles.","operationId":"PublicApiController_createScreenshots","parameters":[{"name":"Idempotency-Key","in":"header","description":"Create this key before the first paid submission. Reuse the same key and unchanged body to recover the original operation without another charge.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScreenshotsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGenerationAcceptedResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Generate finished store screenshot artifacts for an owned App profile.","tags":["Developer API"]}},"/developer/feature-graphics":{"post":{"operationId":"PublicApiController_createFeatureGraphic","parameters":[{"name":"Idempotency-Key","in":"header","description":"Reuse the same key and request to recover the original banner operation.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicFeatureGraphicDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGenerationAcceptedResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Render one opaque 1024x500 Google Play feature graphic using a design's banner companion (dev preview).","tags":["Developer API"]}},"/developer/jobs/{id}":{"get":{"operationId":"PublicApiController_getJob","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicJobResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Retrieve a Developer API operation and its final public result.","tags":["Developer API"]}},"/developer/aso":{"post":{"operationId":"PublicApiController_createAso","parameters":[{"name":"Idempotency-Key","in":"header","description":"Reuse the same key and unchanged body to recover the original operation without another charge.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAsoDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGenerationAcceptedResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Generate final en-US listing fields for one store.","tags":["Developer API"]}},"/developer/aso/localize":{"post":{"operationId":"PublicApiController_localizeAso","parameters":[{"name":"Idempotency-Key","in":"header","description":"Reuse the same key and source job/locales to recover the original operation without another charge.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAsoLocalizeDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGenerationAcceptedResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Localize a finished en-US ASO result into supported markets.","tags":["Developer API"]}},"/developer/artifacts/{id}/file":{"get":{"operationId":"PublicApiController_file","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Download a finished screenshot artifact through an owner-scoped AppListingLab proxy. On the Free plan, screenshots carry a \"Made with applistinglab.com\" mark (X-AppListingLab-Watermark: free-plan); paid plans and feature graphics download clean, and the same artifact downloads clean after an upgrade.","tags":["Developer API"]}}},"components":{"securitySchemes":{"api-key":{"scheme":"bearer","bearerFormat":"API key","type":"http","description":"AppListingLab Developer API key (mm_live_…)"}},"schemas":{"DeveloperGoogleTextDto":{"type":"object","properties":{"locale":{"type":"string","enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"]},"title":{"type":"string","maxLength":30},"shortDescription":{"type":"string","maxLength":80},"fullDescription":{"type":"string","maxLength":4000}},"required":["locale","title","shortDescription","fullDescription"]},"DeveloperGooglePublishDto":{"type":"object","properties":{"appId":{"type":"string"},"locales":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"string","enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"]}},"parts":{"type":"array","items":{"type":"string","enum":["aso","screenshots","feature-graphic","icon"]}},"replaceImages":{"type":"boolean","description":"Whether to replace existing images in the selected slots."},"reviewPolicy":{"type":"string","enum":["manual","submit"],"description":"manual asks Play to hold eligible changes; submit sends for review. Google may publish approved changes unless managed publishing is enabled. Existing reviews are never replaced."},"imageCount":{"type":"number","minimum":0,"maximum":100,"description":"Exact total number of images across all languages. A partial batch cannot start."},"metadata":{"description":"Required for aso: the exact immutable Google Play text for every selected locale.","type":"array","items":{"$ref":"#/components/schemas/DeveloperGoogleTextDto"}}},"required":["appId","locales","parts","replaceImages","reviewPolicy","imageCount"]},"DeveloperPublishSessionDto":{"type":"object","properties":{"sessionId":{"type":"string"}},"required":["sessionId"]},"DeveloperPublishArtifactDto":{"type":"object","properties":{"artifactId":{"type":"string","description":"Owned, unexpired Developer API artifact from this App profile."},"locale":{"type":"string","enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"]},"target":{"type":"string","enum":["phoneScreenshots","featureGraphic"]},"position":{"type":"number","minimum":0,"maximum":7,"description":"Zero-based position. Feature graphic always uses zero."}},"required":["artifactId","locale","target","position"]},"DeveloperPublishStagedDto":{"type":"object","properties":{"staged":{"type":"number","minimum":0}},"required":["staged"]},"DeveloperPublishIconDto":{"type":"object","properties":{"locale":{"type":"string","enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"]},"dataUrl":{"type":"string","description":"Existing 512 × 512 PNG icon as a base64 data URL, at most 1 MiB decoded. Alpha is preserved. No generation or external URL fetching.","maxLength":1398126}},"required":["locale","dataUrl"]},"DeveloperPublishIconStagedDto":{"type":"object","properties":{"staged":{"type":"number","minimum":0},"sha256":{"type":"string","description":"SHA-256 of the normalized PNG staged for Google Play. Compare with icon readback after commit."}},"required":["staged","sha256"]},"DeveloperGoogleIconDto":{"type":"object","properties":{"appId":{"type":"string"},"locale":{"type":"string"},"storeLocale":{"type":"string"},"available":{"type":"boolean"},"sha256":{"description":"SHA-256 hashes returned by Google Play for this locale's icon. No provider URLs or credentials.","type":"array","items":{"type":"string"}}},"required":["appId","locale","storeLocale","available","sha256"]},"DeveloperPublishStartedDto":{"type":"object","properties":{"sessionId":{"type":"string"},"jobId":{"type":"string"}},"required":["sessionId","jobId"]},"DeveloperGoogleFieldsDto":{"type":"object","properties":{"title":{"type":"string"},"shortDescription":{"type":"string"},"fullDescription":{"type":"string"}},"required":["title","shortDescription","fullDescription"]},"DeveloperGoogleListingDto":{"type":"object","properties":{"appId":{"type":"string"},"locale":{"type":"string"},"storeLocale":{"type":"string"},"available":{"type":"boolean"},"fields":{"$ref":"#/components/schemas/DeveloperGoogleFieldsDto"}},"required":["appId","locale","storeLocale","available","fields"]},"DeveloperPublishFailureDto":{"type":"object","properties":{"code":{"type":"string","enum":["STORE_OUTCOME_UNCERTAIN","GOOGLE_LISTING_NOT_FOUND","GOOGLE_REVIEW_IN_PROGRESS","STORE_AUTHENTICATION_FAILED","STORE_PERMISSION_DENIED","STORE_REQUEST_REJECTED","PUBLISH_FAILED"]},"message":{"type":"string"},"action":{"type":"string","enum":["reconcile-in-store","check-locales","inspect-in-store","check-connection","inspect-in-studio"]}},"required":["code","message","action"]},"DeveloperPublishLocaleDto":{"type":"object","properties":{"locale":{"type":"string"},"status":{"type":"string"},"fieldsSent":{"type":"array","items":{"type":"string"}},"imagesSent":{"type":"number","minimum":0}},"required":["locale","status","fieldsSent","imagesSent"]},"DeveloperPublishStateDto":{"type":"object","properties":{"sessionId":{"type":"string"},"appId":{"type":"string"},"status":{"type":"string","enum":["staging","claimed","running","done","partial","error","uncertain","cleaning"]},"jobId":{"type":"string","nullable":true},"runId":{"type":"string","nullable":true},"stagedImages":{"type":"number","nullable":true},"expectedImages":{"type":"number","nullable":true},"canStart":{"type":"boolean"},"reviewRequired":{"type":"boolean"},"failure":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DeveloperPublishFailureDto"}]},"locales":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperPublishLocaleDto"}}},"required":["sessionId","appId","status","jobId","runId","stagedImages","expectedImages","canStart","reviewRequired","failure","locales"]},"PublicAppListItemDto":{"type":"object","properties":{"appId":{"type":"string","description":"Opaque App profile identifier."},"name":{"type":"string"},"category":{"type":"object","nullable":true},"artworkUrl":{"type":"object","nullable":true},"iosUrl":{"type":"object","nullable":true,"description":"App Store link of this profile, if any."},"androidUrl":{"type":"object","nullable":true,"description":"Google Play link of this profile, if any."},"locked":{"type":"boolean","description":"The plan keeps fewer projects open than the account has. A locked profile refuses work with 402 until a project is deleted or the plan allows more."}},"required":["appId","name","iosUrl","androidUrl","locked"]},"PublicOnboardDto":{"type":"object","properties":{"iosUrl":{"type":"string","example":"https://apps.apple.com/us/app/example/id1234567890","pattern":"^https://(?:apps|itunes)\\.apple\\.com/(?:\\S*/)?id\\d+(?:[/?#]\\S*)?$","description":"Optional, for an app already on the App Store: a link containing the app id, whose listing is read in. Keep the country path for an app not sold in the US."},"androidUrl":{"type":"string","example":"https://play.google.com/store/apps/details?id=com.example.app","pattern":"^https://play\\.google\\.com/store/apps/details\\?(?:\\S*&)?id=[A-Za-z]\\w*(?:\\.[A-Za-z]\\w*)+(?:[&#]\\S*)?$","description":"Optional, for an app already on Google Play: its listing is read in."},"name":{"type":"string","maxLength":100,"description":"The app's name. Required unless a store link is sent; always takes priority over the store's name, and lets the profile be created even when a listing cannot be read."},"description":{"type":"string","maxLength":10000,"description":"What the app does and who it is for, in your words. Captions and ASO text are written from it; takes priority over the store description."},"category":{"type":"string","maxLength":100,"example":"Health & Fitness","description":"Store category; takes priority over the store's."},"extraContext":{"type":"string","description":"Free-text context to seed generation."}}},"PublicAppCreatedDto":{"type":"object","properties":{"appId":{"type":"string","description":"Opaque App profile identifier."},"name":{"type":"string"},"category":{"type":"object","nullable":true},"artworkUrl":{"type":"object","nullable":true},"iosUrl":{"type":"object","nullable":true,"description":"App Store link of this profile, if any."},"androidUrl":{"type":"object","nullable":true,"description":"Google Play link of this profile, if any."},"importedFrom":{"type":"array","description":"Stores whose listing was read into the profile. A store link missing here could not be read; the profile uses your own details instead. Empty for a profile created from details alone.","items":{"type":"string","enum":["apple","google"]}}},"required":["appId","name","iosUrl","androidUrl","importedFrom"]},"PublicAppResponseDto":{"type":"object","properties":{"appId":{"type":"string","description":"Opaque App profile identifier."},"name":{"type":"string"},"category":{"type":"object","nullable":true},"artworkUrl":{"type":"object","nullable":true},"iosUrl":{"type":"object","nullable":true,"description":"App Store link of this profile, if any."},"androidUrl":{"type":"object","nullable":true,"description":"Google Play link of this profile, if any."}},"required":["appId","name","iosUrl","androidUrl"]},"DeveloperSourceDto":{"type":"object","properties":{"sourceId":{"type":"string"},"platform":{"type":"string","enum":["ios","android","unknown"]},"width":{"type":"object","nullable":true},"height":{"type":"object","nullable":true}},"required":["sourceId","platform","width","height"]},"DeveloperSourceUploadDto":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android"]},"dataUrl":{"type":"string","description":"PNG, JPEG or WebP base64 data URL; at most 10 MiB decoded."}},"required":["platform","dataUrl"]},"DeveloperDeviceDto":{"type":"object","properties":{"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"]},"store":{"type":"string","enum":["apple","google"]},"width":{"type":"number"},"height":{"type":"number"},"maxScreenshots":{"type":"number"}},"required":["device","store","width","height","maxScreenshots"]},"DeveloperCaptionPlanDto":{"type":"object","properties":{"appId":{"type":"string","description":"App id returned by POST /developer/apps."},"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"],"example":"iphone-67"},"count":{"type":"number","minimum":1,"maximum":10},"captionStyle":{"type":"string","enum":["aso-expert","search-intent","outcome","emoji","direct","friendly","inspire","persuasive"],"default":"aso-expert","description":"Style for AI-generated captions; does not rewrite supplied captions."},"captionLength":{"type":"string","enum":["short","long"],"default":"short","description":"Length for AI-generated captions; supplied captions retain their own copy."}},"required":["appId","device","count"]},"PublicCreditUsageDto":{"type":"object","properties":{"cost":{"type":"number","description":"Quoted credit cost for this accepted operation; debited when processing starts. Treat returned values as runtime usage, not a pricing formula."},"remaining":{"type":"number","description":"Projected spendable balance including purchased credits and subtracting accepted waiting work; not proof that a debit has already settled."}},"required":["cost","remaining"]},"PublicGenerationAcceptedResponseDto":{"type":"object","properties":{"jobId":{"type":"string","description":"Opaque identifier for the long-running operation. Use it with GET /developer/jobs/{id}."},"credits":{"$ref":"#/components/schemas/PublicCreditUsageDto"}},"required":["jobId","credits"]},"DeveloperDesignCategoryDto":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]},"DeveloperDesignDeviceDto":{"type":"object","properties":{"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"]},"minimumScreenshots":{"type":"number"},"maximumScreenshots":{"type":"number"}},"required":["device","minimumScreenshots","maximumScreenshots"]},"DeveloperDesignDto":{"type":"object","properties":{"designId":{"type":"string"},"designVersion":{"type":"number","minimum":1},"name":{"type":"string"},"description":{"type":"string"},"categories":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperDesignCategoryDto"}},"theme":{"type":"string","enum":["light","dark","colourful"]},"features":{"type":"array","items":{"type":"string"}},"devices":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperDesignDeviceDto"}},"textFields":{"type":"array","items":{"type":"string"}},"previewUrls":{"description":"Illustrative raster samples, including both halves of a panoramic opening.","type":"array","items":{"type":"string"}}},"required":["designId","designVersion","name","description","categories","theme","features","devices","textFields","previewUrls"]},"DeveloperScreenshotFrameDto":{"type":"object","properties":{"title":{"type":"string","maxLength":100,"description":"Visible headline. Optional [[emphasis]] markers are not printed and count toward the length limit; emphasis depends on the design accent style."},"subtitle":{"type":"string","maxLength":160,"description":"Supporting line. Empty means no subtitle."},"sourceId":{"type":"string","description":"Owned sourceId returned by the App profile source upload/list endpoints."}},"required":["title","sourceId"]},"DeveloperCaptionDto":{"type":"object","properties":{"title":{"type":"string","maxLength":100,"description":"Visible headline. Optional [[emphasis]] markers are not printed and count toward the length limit; emphasis depends on the design accent style."},"subtitle":{"type":"string","maxLength":160,"description":"Supporting line. Empty means no subtitle."}},"required":["title"]},"PublicScreenshotsDto":{"type":"object","properties":{"appId":{"type":"string","description":"App id returned by POST /developer/apps."},"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"],"example":"iphone-67"},"count":{"type":"number","minimum":1,"maximum":10,"description":"Required for automatic captions or captions[]. With frames, omitted count is derived from frames.length; a supplied count must match."},"captionStyle":{"type":"string","enum":["aso-expert","search-intent","outcome","emoji","direct","friendly","inspire","persuasive"],"default":"aso-expert","description":"Style for AI-generated captions; does not rewrite supplied captions."},"captionLength":{"type":"string","enum":["short","long"],"default":"short","description":"Length for AI-generated captions; supplied captions retain their own copy."},"frames":{"minItems":1,"maxItems":10,"description":"Ordered source and copy bindings, exactly count entries. Cannot be combined with captions. Repeating a source requires repeating its sourceId explicitly.","type":"array","items":{"$ref":"#/components/schemas/DeveloperScreenshotFrameDto"}},"designId":{"type":"string","description":"Public design identifier from GET /developer/screenshots/designs. Omit for automatic recommendation.","maxLength":80},"designVersion":{"type":"number","description":"Pin the current content revision of designId. Requires designId.","minimum":1,"maximum":9007199254740991},"captions":{"minItems":1,"maxItems":10,"description":"Ordered captions, exactly count entries. Skips AI text planning; use your own copy or edit a captions job result. Omit for automatic planning and rendering.","type":"array","items":{"$ref":"#/components/schemas/DeveloperCaptionDto"}}},"required":["appId","device"]},"DeveloperDesignPreparationDto":{"type":"object","properties":{"design":{"$ref":"#/components/schemas/DeveloperDesignDto"},"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"]},"count":{"type":"number"}},"required":["design","device","count"]},"PublicFeatureGraphicDto":{"type":"object","properties":{"appId":{"type":"string"},"designId":{"type":"string","description":"Public screenshot design ID with a feature graphic companion."},"designVersion":{"type":"number"},"sourceIds":{"minItems":1,"maxItems":2,"description":"One or two owned portrait Android source IDs, in visual order.","type":"array","items":{"type":"string"}},"headline":{"type":"string","maxLength":80},"subtitle":{"type":"string","maxLength":140},"altText":{"type":"string","maxLength":140,"description":"Preserved for manual Play Console entry; the Google images API has no alt-text field."}},"required":["appId","designId","sourceIds","headline"]},"DeveloperCaptionResultDto":{"type":"object","properties":{"kind":{"type":"string","enum":["screenshot-captions"]},"appId":{"type":"string"},"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"]},"count":{"type":"number","minimum":1,"maximum":10},"captions":{"description":"Ordered editable copy. Submit the edited array as captions to POST /developer/screenshots.","type":"array","items":{"$ref":"#/components/schemas/DeveloperCaptionDto"}}},"required":["kind","appId","device","count","captions"]},"PublicScreenshotArtifactDto":{"type":"object","properties":{"artifactId":{"type":"string","description":"Opaque finished-artifact identifier."},"index":{"type":"number","minimum":0},"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"]},"width":{"type":"number"},"height":{"type":"number"},"format":{"type":"string","enum":["png"]},"fileName":{"type":"string"},"downloadExpiresAt":{"type":"string","description":"UTC deadline for authorized download access","format":"date-time"},"downloadUrl":{"type":"string","description":"AppListingLab download URL. It proxies the private artifact after API-key owner checks; no storage URL is exposed."}},"required":["artifactId","index","device","width","height","format","fileName","downloadUrl"]},"PublicScreenshotSetResultDto":{"type":"object","properties":{"kind":{"type":"string","enum":["screenshot-set"]},"device":{"type":"string","enum":["iphone-69","iphone-67","iphone-65","ipad-pro","android-phone","android-tablet","iphone-duo-outer","iphone-duo-inner","android-phone-landscape","android-phone-tall","android-tablet-10-portrait","android-tablet-10-landscape"]},"designId":{"type":"string","description":"Public design selected when this operation was accepted. Absent on older operations."},"designVersion":{"type":"number","minimum":1,"description":"Pinned content revision of the selected design."},"screenshots":{"type":"array","items":{"$ref":"#/components/schemas/PublicScreenshotArtifactDto"}}},"required":["kind","device","screenshots"]},"PublicFeatureGraphicResultDto":{"type":"object","properties":{"kind":{"type":"string","enum":["feature-graphic"]},"appId":{"type":"string"},"designId":{"type":"string"},"designVersion":{"type":"number"},"altText":{"type":"string","maxLength":140,"description":"Alt text for manual Play Console entry."},"artifact":{"$ref":"#/components/schemas/PublicScreenshotArtifactDto"}},"required":["kind","appId","designId","designVersion","altText","artifact"]},"PublicAppleFieldsDto":{"type":"object","properties":{"name":{"type":"string"},"subtitle":{"type":"string"},"promotionalText":{"type":"string"},"keywords":{"type":"string"},"description":{"type":"string"}},"required":["name","subtitle","promotionalText","keywords","description"]},"PublicGoogleFieldsDto":{"type":"object","properties":{"title":{"type":"string"},"shortDescription":{"type":"string"},"fullDescription":{"type":"string"}},"required":["title","shortDescription","fullDescription"]},"PublicAsoResultDto":{"type":"object","properties":{"kind":{"type":"string","enum":["aso-listing"]},"listingId":{"type":"string"},"appId":{"type":"string"},"locale":{"type":"string","enum":["en-US","es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"]},"store":{"type":"string","enum":["apple","google"]},"fields":{"oneOf":[{"$ref":"#/components/schemas/PublicAppleFieldsDto"},{"$ref":"#/components/schemas/PublicGoogleFieldsDto"}]}},"required":["kind","listingId","appId","locale","store","fields"]},"PublicAsoLocalizationResultDto":{"type":"object","properties":{"kind":{"type":"string","enum":["aso-localization"]},"sourceJobId":{"type":"string"},"appId":{"type":"string"},"store":{"type":"string","enum":["apple","google"]},"listings":{"minItems":1,"maxItems":10,"type":"array","items":{"$ref":"#/components/schemas/PublicAsoResultDto"}}},"required":["kind","sourceJobId","appId","store","listings"]},"PublicJobResponseDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending","running","done","error"],"description":"Current operation status. `pending` covers accepted work that has not started yet, including time waiting for capacity."},"result":{"nullable":true,"oneOf":[{"$ref":"#/components/schemas/DeveloperCaptionResultDto"},{"$ref":"#/components/schemas/PublicScreenshotSetResultDto"},{"$ref":"#/components/schemas/PublicFeatureGraphicResultDto"},{"$ref":"#/components/schemas/PublicAsoResultDto"},{"$ref":"#/components/schemas/PublicAsoLocalizationResultDto"}],"description":"Customer-facing output when status is done, including editable captions. Internal construction and strategy data is never returned."},"error":{"type":"object","nullable":true,"description":"Human-readable failure message when status is error."}},"required":["id","status"]},"PublicAsoDto":{"type":"object","properties":{"appId":{"type":"string","description":"Owned App profile identifier."},"store":{"type":"string","enum":["apple","google"]},"campaignFocus":{"type":"string","description":"Campaign focus for this listing.","maxLength":1000}},"required":["appId","store"]},"PublicAsoLocalizeDto":{"type":"object","properties":{"jobId":{"type":"string","description":"Completed Developer API en-US ASO generation job identifier."},"targetLocales":{"type":"array","minItems":1,"maxItems":10,"uniqueItems":true,"items":{"type":"string","enum":["es-ES","es-MX","fr-FR","de-DE","pt-BR","it-IT","nl-NL","ja","ko","zh-Hans","ru","tr","pl","bn-BD","ca","zh-Hant","hr","cs","da","en-AU","en-CA","en-GB","fi","fr-CA","el","gu-IN","hi","hu","id","kn-IN","ms","ml-IN","mr-IN","no","pt-PT","pa-IN","ro","sk","sl-SI","sv","ta-IN","te-IN","th","uk","vi"]}}},"required":["jobId","targetLocales"]}}}}