{
  "title": "SAM.gov notices - provide a key and search filters",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "apiKey": {
      "title": "SAM.gov Public API Key - required",
      "type": "string",
      "description": "Required. Free Public API Key: sign in at https://sam.gov, open Account Details, then Public API Key (re-enter your password to view it). An api.data.gov signup key is not a SAM key. Store as a secret. The SAM_API_KEY env fallback applies only to runs started by the Actor's owner. No keyless fallback.",
      "editor": "textfield",
      "isSecret": true,
      "sectionCaption": "1 · Your SAM.gov access",
      "sectionDescription": "Use a SAM.gov-issued Public API Key, not an api.data.gov signup key."
    },
    "keyword": {
      "title": "Title keyword",
      "type": "string",
      "description": "Opportunity keyword. Default: software",
      "editor": "textfield",
      "prefill": "software",
      "sectionCaption": "2 · Opportunity search",
      "sectionDescription": "Use a title keyword and a valid date window no longer than one calendar year."
    },
    "postedFrom": {
      "title": "Posted from (MM/DD/YYYY)",
      "type": "string",
      "description": "Valid MM/DD/YYYY date, on or before postedTo; the range cannot exceed one calendar year. Default: 30 days before today. Invalid date input fails before any API request.",
      "editor": "textfield"
    },
    "postedTo": {
      "title": "Posted to (MM/DD/YYYY)",
      "type": "string",
      "description": "Valid MM/DD/YYYY date, on or after postedFrom and at most one calendar year later. Default: today. A February 29 anniversary is February 28 in a non-leap year.",
      "editor": "textfield"
    },
    "maxResults": {
      "title": "Maximum opportunities",
      "type": "integer",
      "editor": "number",
      "default": 20,
      "minimum": 1,
      "maximum": 500,
      "description": "Maximum SAM.gov opportunity notices to return.",
      "sectionCaption": "3 · Run limits",
      "sectionDescription": "Bound the opportunities saved and the request time budget."
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "editor": "number",
      "default": 240,
      "minimum": 30,
      "description": "Hard wall-clock budget for the run in seconds."
    },
    "softFail": {
      "title": "Keep run successful on source failure",
      "type": "boolean",
      "description": "Default false: missing credentials or complete source failure fails the run. True: keep the run successful with zero dataset rows and an explicit blocked/source_failed SUMMARY status. Diagnostics never become billable results.",
      "editor": "checkbox",
      "default": false,
      "sectionCaption": "4 · Advanced failure handling",
      "sectionDescription": "Soft-fail changes termination behavior; always inspect SUMMARY before using the results."
    }
  },
  "description": "Enter your own SAM.gov Public API Key, choose a title keyword and valid posted-date window, then set an opportunity cap. Missing credentials and source failures are reported in SUMMARY, not as opportunity rows."
}
