{
  "title": "OFAC actions - choose announcement coverage",
  "description": "Monitor a bounded window of official OFAC recent-action announcements. No login, API key or proxy required.",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "category": {
      "title": "Official category",
      "type": "string",
      "description": "OFAC classification. Sanctions-related content can also occur in general licenses or guidance; all reads every category.",
      "editor": "select",
      "enum": [
        "all",
        "sanctions-list-updates",
        "general-licenses",
        "regulations-and-guidance",
        "enforcement-actions",
        "miscellaneous"
      ],
      "enumTitles": [
        "All recent actions",
        "Sanctions list updates",
        "General licenses",
        "Regulations and guidance",
        "Enforcement actions",
        "Miscellaneous"
      ],
      "default": "all",
      "sectionCaption": "1 · Official announcement scope",
      "sectionDescription": "Choose the published category you need."
    },
    "titleKeywords": {
      "title": "Words or phrases in the title (any match)",
      "type": "array",
      "description": "Optional case-insensitive literal substrings matched only against the announcement title. Maximum20 phrases,100 characters each; no inferred country or program classifications.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "maxItems": 20,
      "sectionCaption": "2 · Title and date filters",
      "sectionDescription": "Apply literal title terms and announcement dates."
    },
    "startDate": {
      "title": "Start date",
      "type": "string",
      "description": "Optional inclusive official publication date in YYYY-MM-DD. Filtering happens within the scanned page window; increase maxPages for older records.",
      "editor": "textfield"
    },
    "endDate": {
      "title": "End date",
      "type": "string",
      "description": "Optional inclusive official publication date in YYYY-MM-DD, not earlier than startDate.",
      "editor": "textfield"
    },
    "maxResults": {
      "title": "Maximum saved announcements",
      "type": "integer",
      "description": "Stop after this many confirmed saved records. Unchanged rows skipped by onlyChanges do not consume this limit.",
      "default": 10,
      "minimum": 1,
      "maximum": 500,
      "sectionCaption": "3 · Collection and detail limits",
      "sectionDescription": "Bound listing pages, saved announcements and optional source text."
    },
    "maxPages": {
      "title": "Maximum listing pages",
      "type": "integer",
      "description": "OFAC normally lists10 announcements per page. This selected window is explicit in SUMMARY; reaching it is not a source outage. New announcements outside it are not observed.",
      "default": 1,
      "minimum": 1,
      "maximum": 50
    },
    "includeDetails": {
      "title": "Include announcement text and resource links",
      "type": "boolean",
      "description": "Fetch each selected announcement page for its text, a full-text hash, and up to200 linked resources. Slower; linked PDFs/pages are referenced but not downloaded. Source text may contain public listed-party details.",
      "default": false
    },
    "maxTextChars": {
      "title": "Maximum announcement text characters",
      "type": "integer",
      "description": "Used when includeDetails is true. Text is truncated with an explicit flag, while contentHash covers the complete fetched announcement text.",
      "default": 10000,
      "minimum": 500,
      "maximum": 100000
    },
    "comparePrevious": {
      "title": "Compare with saved history",
      "type": "boolean",
      "description": "Opt in to persistent named-store history. First saved observations are baseline; later rows show new, changed or unchanged. History advances only for confirmed saved rows. Same snapshotName must run sequentially.",
      "default": false,
      "sectionCaption": "4 · Saved comparisons",
      "sectionDescription": "The first comparison establishes history. Reuse the same scope for later observations and avoid concurrent writers."
    },
    "onlyChanges": {
      "title": "Save only new or changed announcements",
      "type": "boolean",
      "description": "Also enables comparison. A first baseline emits rows; later unchanged observations are skipped. A bounded window never establishes removals. Leave false for a nonempty recurring sample.",
      "default": false
    },
    "snapshotName": {
      "title": "Snapshot name",
      "type": "string",
      "description": "1–40 letters, digits, hyphens or underscores. Comparison scope also includes category, keywords, dates and includeDetails. Use a dedicated namespace and run it sequentially.",
      "editor": "textfield",
      "default": "default"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "description": "Own runtime budget; the Actor also reserves25 seconds before its platform deadline. Source failures and incomplete runs are recorded in SUMMARY.",
      "default": 240,
      "minimum": 30,
      "maximum": 3600,
      "sectionCaption": "5 · Advanced run settings",
      "sectionDescription": "Adjust the time budget only when a larger collection needs it."
    }
  }
}
