{
  "openapi": "3.0.1",
  "info": {
    "title": "Grants.gov Funding Opportunity Alerts",
    "description": "Get new US federal grant and funding opportunities from Grants.gov by keyword, agency, eligibility or status, with a true monitoring mode that only returns and bills for opportunities new since your last run. Alerts to Slack, Discord or Telegram. Export federal grants to Google Sheets or n8n.",
    "version": "1.0",
    "x-build-id": "hNhfLFmUdiXUgXD4m"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~grants-gov-alerts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-grants-gov-alerts",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/accountable_eel~grants-gov-alerts/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-grants-gov-alerts",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/accountable_eel~grants-gov-alerts/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-grants-gov-alerts",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "keywords": {
            "title": "Keywords to search",
            "type": "array",
            "description": "Optional. One keyword per line — matched against the opportunity title and description (Grants.gov's own full-text search, OR-ish: several keywords widen the match, not narrow it). Leave empty to search by agency, eligibility or status alone. Accepted formats: climate, cybersecurity. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "oppStatuses": {
            "title": "Opportunity status",
            "type": "string",
            "description": "Pipe-joined (Grants.gov's own convention). One or more of: posted, forecasted, closed, archived. Verified server-side this build. Default posted|forecasted (new/upcoming opportunities, not history).",
            "default": "posted|forecasted"
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "includeKeywords": {
            "title": "Only keep rows containing",
            "type": "array",
            "description": "Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip rows containing",
            "type": "array",
            "description": "Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max opportunities per run",
            "type": "integer",
            "description": "Up to 1,000. Caps how many opportunities you get (and pay for) in one run.",
            "default": 50
          },
          "agencies": {
            "title": "Agencies (optional)",
            "type": "array",
            "description": "Optional. Grants.gov agency codes (e.g. NSF, DOE, USDA-AMS). Verified server-side with ONE code this build; with more than one, only the first is sent to Grants.gov (unverified multi-value syntax) — run one search per agency for a true OR across several. Leave empty for all agencies.",
            "items": {
              "type": "string"
            }
          },
          "eligibilities": {
            "title": "Eligibilities (optional)",
            "type": "array",
            "description": "Optional. Grants.gov eligibility codes (e.g. 12 = nonprofits with 501(c)(3) status, 25 = others). Verified server-side with ONE code this build; with more than one, only the first is sent to Grants.gov. See grants.gov's own Eligibility Category list for codes. Leave empty for all eligibility types.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted in the last N days",
            "type": "integer",
            "description": "How far back to search by posted date. 0 = no date filter.",
            "default": 30
          },
          "onlyNewSinceLastRun": {
            "title": "Only return opportunities new since the last run (monitoring)",
            "type": "boolean",
            "description": "On: only new opportunity IDs since your last run are returned and charged for — run this on a schedule as a funding alert. Off: every matching opportunity is returned every time. A revised/amended notice keeps its Grants.gov ID, so it will NOT alert again.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Optional. Name this search's monitoring memory so you can tell two schedules of this actor apart, or keep one memory across an input change. Leave empty to auto-derive one from your filters.",
            "default": ""
          },
          "quietRunOutput": {
            "title": "What a quiet monitoring run writes to the dataset",
            "enum": [
              "summary",
              "none"
            ],
            "type": "string",
            "description": "A quiet run is a search with no new opportunities. 'Nothing' writes zero items, so an integration never has to skip rows.",
            "default": "summary"
          },
          "notifyUrl": {
            "title": "Send alerts to (Discord or Slack webhook, Telegram bot link, or any URL)",
            "type": "string",
            "description": "Optional, needs monitoring on. After the opportunities are billed, each new one is posted here as one message: title, agency, open/close dates and a link. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON. Messages are free, and a message that fails never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results."
          },
          "notifyFormat": {
            "title": "Message format",
            "enum": [
              "auto",
              "discord",
              "slack",
              "telegram",
              "json"
            ],
            "type": "string",
            "description": "Leave on \"Detect from the link\": discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON.",
            "default": "auto"
          },
          "maxNotificationsPerRun": {
            "title": "Most alert messages per run",
            "type": "integer",
            "description": "Up to 100. Above this, one \"+N more\" message says how many more opportunities are in the run's dataset.",
            "default": 20
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "searchSummary",
                "opportunityCount",
                "opportunities",
                "id",
                "opportunityNumber",
                "title",
                "agencyCode",
                "agency",
                "openDate",
                "closeDate",
                "oppStatus",
                "docType",
                "cfda",
                "url",
                "matchedKeyword",
                "isNew",
                "firstSeenAt"
              ],
              "enumTitles": [
                "Search run",
                "Opportunities returned",
                "All opportunities (full list)",
                "Opportunity ID",
                "Opportunity number",
                "Title",
                "Agency code",
                "Agency",
                "Posted on",
                "Closes on",
                "Status",
                "Document type",
                "CFDA number",
                "Grants.gov notice page",
                "Matched keyword (best effort)",
                "Is this opportunity new?",
                "First seen on a run"
              ]
            },
            "default": [
              "searchSummary",
              "opportunityCount",
              "opportunities",
              "id",
              "opportunityNumber",
              "title",
              "agencyCode",
              "agency",
              "openDate",
              "closeDate",
              "oppStatus",
              "docType",
              "cfda",
              "url",
              "matchedKeyword",
              "isNew",
              "firstSeenAt"
            ]
          },
          "expandRows": {
            "title": "One row per opportunity (recommended) — turn off for one row per search instead",
            "type": "boolean",
            "description": "When on, each opportunity found gets its own row instead of being grouped under its search. You're still only charged once per search, no matter how many rows it produces.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 1,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 1
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}