{
  "title": "Google Play App Intelligence - Ratings, Updates & Prices",
  "description": "Inspect exact app IDs or public app detail URLs. With no sources, the Actor reads com.duolingo. Each app/country/language combination produces at most one observation.",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "appIds": {
      "title": "Android package IDs to inspect",
      "type": "array",
      "editor": "stringList",
      "description": "Up to 100 package IDs, for example com.duolingo. Combined with appUrls; no demo app is added when either source list is populated.",
      "items": {
        "type": "string"
      },
      "prefill": [
        "com.duolingo"
      ],
      "maxItems": 100,
      "sectionCaption": "1 · Choose known app listings",
      "sectionDescription": "Package IDs and detail URLs are combined; a URL's country and language override the global settings."
    },
    "appUrls": {
      "title": "Google Play app detail URLs",
      "type": "array",
      "editor": "stringList",
      "description": "HTTPS play.google.com/store/apps/details URLs. A URL’s gl and hl parameters override country and language for that source. Other parameters are discarded.",
      "items": {
        "type": "string"
      },
      "maxItems": 100
    },
    "country": {
      "title": "Requested country",
      "type": "string",
      "editor": "textfield",
      "description": "Two-letter country context (gl). This is a requested listing context, not a claim of device or purchase eligibility.",
      "default": "US",
      "pattern": "^[A-Za-z]{2}$"
    },
    "language": {
      "title": "Requested language",
      "type": "string",
      "editor": "textfield",
      "description": "Language context (hl). Use en for full detail enrichment. Other languages return localized JSON-LD core fields; English-label enrichment is omitted with a warning.",
      "default": "en",
      "pattern": "^[a-zA-Z]{2,3}([-_][a-zA-Z]{2,4})?$"
    },
    "maxResults": {
      "title": "Maximum saved app observations",
      "type": "integer",
      "editor": "number",
      "description": "Stop after this many saved rows. Unchanged rows skipped by onlyChanges do not count. At most 100 distinct source combinations are accepted.",
      "default": 20,
      "minimum": 1,
      "maximum": 1000
    },
    "comparePrevious": {
      "title": "Compare against the last saved observation",
      "type": "boolean",
      "editor": "checkbox",
      "description": "Use a named key-value store. First observations are baseline rows; later rows include previous values and change flags. Run the same snapshot name sequentially.",
      "default": false,
      "sectionCaption": "2 · Optional saved listing comparisons",
      "sectionDescription": "First observations create baselines; unchanged repeats can be skipped when onlyChanges is enabled."
    },
    "onlyChanges": {
      "title": "Emit only baseline or changed observations",
      "type": "boolean",
      "editor": "checkbox",
      "description": "Also enables comparison. Repeats can legitimately save zero rows. The first observation still emits a baseline row.",
      "default": false
    },
    "snapshotName": {
      "title": "Snapshot namespace",
      "type": "string",
      "editor": "textfield",
      "description": "History store: google-play-apps-{snapshotName}; each app/country/language has independent history. Use a dedicated name per workflow and avoid concurrent runs sharing it.",
      "default": "default",
      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,39}$"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "editor": "number",
      "description": "The Actor also reserves 25 seconds before a platform timeout. Requests and retries are bounded by the remaining time.",
      "default": 240,
      "minimum": 30,
      "maximum": 3600,
      "sectionCaption": "3 · Run budget",
      "sectionDescription": "Public-page failures and incomplete source coverage are reported in SUMMARY."
    }
  }
}
