{
  "title": "PDF revisions - choose documents and extraction limits",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "documents": {
      "title": "Public PDF URLs and document IDs",
      "type": "array",
      "editor": "json",
      "description": "Up to 20 URLs or objects {url,documentId,externalId}. documentId intentionally links changing source URLs to one report; default identity is the supplied URL. No passwords or private downloads.",
      "default": [
        {
          "url": "https://www.census.gov/retail/marts/www/marts_current.pdf",
          "documentId": "census-monthly-retail-release"
        }
      ],
      "prefill": [
        {
          "url": "https://www.census.gov/retail/marts/www/marts_current.pdf",
          "documentId": "census-monthly-retail-release"
        }
      ],
      "sectionCaption": "1 · PDF documents",
      "sectionDescription": "Supply public URLs and stable document identifiers."
    },
    "maxPagesPerDocument": {
      "title": "Maximum pages per document",
      "type": "integer",
      "editor": "number",
      "description": "Read from page 1 through this cap. Larger documents return a partial observation; no baseline update or removed-page assertion.",
      "default": 100,
      "minimum": 1,
      "maximum": 100,
      "sectionCaption": "2 · Extraction limits",
      "sectionDescription": "Bound pages, download size and extracted text before the run."
    },
    "maxFileSizeMb": {
      "title": "Maximum PDF download size (MiB)",
      "type": "integer",
      "editor": "number",
      "description": "Reject a larger response before parsing. Applies to every document; redirects and DNS destinations are checked.",
      "default": 10,
      "minimum": 1,
      "maximum": 20
    },
    "maxCharactersPerDocument": {
      "title": "Maximum extracted characters per document",
      "type": "integer",
      "editor": "number",
      "description": "Stop extraction at this bound and mark the observation partial. Partial text never replaces a complete baseline.",
      "default": 250000,
      "minimum": 1000,
      "maximum": 1000000
    },
    "comparePrevious": {
      "title": "Compare with previous complete observation",
      "type": "boolean",
      "editor": "checkbox",
      "description": "Opt in to named-store history. First complete run establishes a baseline. Unchanged checks still return and bill a real observation.",
      "default": false,
      "sectionCaption": "3 · Saved comparisons",
      "sectionDescription": "The first comparison establishes history. Reuse the same scope for later observations and avoid concurrent writers."
    },
    "baselineKey": {
      "title": "Saved baseline namespace",
      "type": "string",
      "editor": "textfield",
      "description": "One writer per namespace. A separate namespace starts independent history. Letters, digits, underscores and hyphens only.",
      "default": "default",
      "pattern": "^[-\\w]{1,80}$"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "editor": "number",
      "description": "Total work budget, also bounded by the platform deadline minus 25 seconds. Unfinished work is reported.",
      "default": 240,
      "minimum": 30,
      "maximum": 3600,
      "sectionCaption": "4 · Advanced run settings",
      "sectionDescription": "Adjust the time budget only when a larger collection needs it."
    }
  },
  "required": [],
  "description": "Supply public PDF URLs, set extraction bounds and optionally compare complete saved observations. Results cite source pages; failed or partial extraction does not establish that a document’s content disappeared."
}
