{
  "title": "Cloud Ninjas RAM Price & Stock Monitor",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "startUrls": {
      "title": "RAM collection or product URLs",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "prefill": [
        "https://cloudninjas.com/collections/branded-memory-ram-modules-collection"
      ],
      "description": "Up to 3 plain https://cloudninjas.com/collections/handle or /products/handle URLs. Empty uses the branded RAM collection. No query strings, tagged collection paths, other shops, credentials or proxies."
    },
    "productsPerSource": {
      "title": "Products to inspect per collection",
      "type": "integer",
      "default": 3,
      "minimum": 1,
      "maximum": 25,
      "description": "Read this many products from the first public collection page, then inspect all returned variants. Filters apply inside this window; they do not scan the whole catalog. Product URLs ignore this field."
    },
    "availability": {
      "title": "Availability filter",
      "type": "string",
      "editor": "select",
      "enum": [
        "all",
        "in_stock",
        "out_of_stock"
      ],
      "enumTitles": [
        "All advertised offers",
        "Available to order",
        "Unavailable to order"
      ],
      "default": "all",
      "description": "Merchant availability is an ordering flag, not a physical inventory count."
    },
    "memoryGeneration": {
      "title": "Memory generation filter",
      "type": "string",
      "editor": "select",
      "enum": [
        "all",
        "DDR3",
        "DDR4",
        "DDR5"
      ],
      "default": "all",
      "description": "Filter normalized generation inside the selected window. Ambiguous values do not match a specific generation."
    },
    "moduleType": {
      "title": "Module construction filter",
      "type": "string",
      "editor": "select",
      "enum": [
        "all",
        "RDIMM",
        "LRDIMM",
        "UDIMM",
        "SODIMM"
      ],
      "default": "all",
      "description": "Keep registered, load-reduced, unbuffered and small-outline DIMMs distinct. This is not a system-compatibility check."
    },
    "maxResults": {
      "title": "Maximum saved variant observations",
      "type": "integer",
      "default": 5,
      "minimum": 1,
      "maximum": 100,
      "description": "Hard cap on saved billable rows. A partially saved window does not advance history."
    },
    "comparePrevious": {
      "title": "Compare with previous complete observation",
      "type": "boolean",
      "default": false,
      "description": "Save a baseline only after all selected source windows succeed and all matching variants are handled. Produce price changes, restocked/soldOut and previous values. Missing listings are never inferred removed."
    },
    "onlyChanges": {
      "title": "Save only new or changed variants",
      "type": "boolean",
      "default": false,
      "description": "Enables comparison. An unchanged complete repeat can save zero rows with no dataset-item charge."
    },
    "snapshotName": {
      "title": "Comparison history name",
      "type": "string",
      "editor": "textfield",
      "default": "default",
      "description": "1–80 letters, numbers, underscores or hyphens. History is also separated by the URL list, selected window and filters."
    },
    "maxRunSeconds": {
      "title": "Shared time budget in seconds",
      "type": "integer",
      "default": 90,
      "minimum": 30,
      "maximum": 120,
      "description": "Bounded public requests, at least one second apart. Access refusal or rate limiting stops requests without bypass. Use fewer source URLs for faster runs."
    }
  }
}
