{
  "openapi": "3.0.1",
  "info": {
    "title": "Crypto News Scraper — 30+ Outlets, SEC/CFTC, Reddit",
    "description": "Crypto headlines from CoinDesk, Cointelegraph, Decrypt, The Block, Blockworks, DL News, The Defiant and 20+ more outlets, plus SEC/CFTC releases, project blogs and r/CryptoCurrency, in one deduped JSON feed with coins mentioned. Keyword/coin/category filters, time window, full text where available.",
    "version": "0.1",
    "x-build-id": "DGnga4fw18QD7gRiM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~crypto-news/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-crypto-news",
        "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/yadroo~crypto-news/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-crypto-news",
        "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/yadroo~crypto-news/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-crypto-news",
        "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": {
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Feed ids or group names from the list (README → Sources has the table). Groups: all = every outlet except topic feeds and Reddit; default = coindesk, cointelegraph, decrypt, theblock; news; tier1; regulators = SEC + CFTC; blogs; community = Reddit (opt-in); topics = 7 Cointelegraph tag feeds. ambcrypto is paused (it blocks automated requests): naming it fetches nothing. Values outside the list are refused by Apify before the run.",
            "items": {
              "type": "string",
              "enum": [
                "all",
                "default",
                "news",
                "tier1",
                "regulators",
                "blogs",
                "community",
                "topics",
                "coindesk",
                "cointelegraph",
                "decrypt",
                "theblock",
                "blockworks",
                "dlnews",
                "thedefiant",
                "bitcoinmagazine",
                "cryptoslate",
                "cryptobriefing",
                "protos",
                "unchained",
                "cryptopotato",
                "newsbtc",
                "bitcoinist",
                "utoday",
                "ambcrypto",
                "cryptonews",
                "bitcoincom",
                "coingape",
                "coinjournal",
                "cryptodaily",
                "cryptonewsz",
                "watcherguru",
                "bankless",
                "krakenblog",
                "ethereumblog",
                "solananews",
                "sec",
                "cftc",
                "reddit-cryptocurrency",
                "cointelegraph-bitcoin",
                "cointelegraph-ethereum",
                "cointelegraph-solana",
                "cointelegraph-defi",
                "cointelegraph-nft",
                "cointelegraph-regulation",
                "cointelegraph-ai"
              ],
              "enumTitles": [
                "Group: all outlets (no topic feeds, no Reddit)",
                "Group: default 4 (CoinDesk, Cointelegraph, Decrypt, The Block)",
                "Group: news outlets",
                "Group: tier-1 outlets",
                "Group: regulators (SEC, CFTC)",
                "Group: blogs & research",
                "Group: community (Reddit, opt-in)",
                "Group: Cointelegraph topic feeds",
                "CoinDesk",
                "Cointelegraph",
                "Decrypt",
                "The Block",
                "Blockworks",
                "DL News",
                "The Defiant",
                "Bitcoin Magazine",
                "CryptoSlate",
                "Crypto Briefing",
                "Protos",
                "Unchained",
                "CryptoPotato",
                "NewsBTC",
                "Bitcoinist",
                "U.Today",
                "AMBCrypto (paused: blocks automated requests)",
                "Cryptonews.com",
                "Bitcoin.com News",
                "CoinGape",
                "CoinJournal",
                "Crypto Daily",
                "CryptoNewsZ",
                "Watcher.Guru",
                "Bankless",
                "Kraken Blog",
                "Ethereum Foundation Blog",
                "Solana News",
                "U.S. SEC press releases",
                "U.S. CFTC press releases",
                "Reddit r/CryptoCurrency (opt-in, not in \"all\")",
                "Cointelegraph — Bitcoin",
                "Cointelegraph — Ethereum",
                "Cointelegraph — Solana",
                "Cointelegraph — DeFi",
                "Cointelegraph — NFT",
                "Cointelegraph — Regulation",
                "Cointelegraph — AI"
              ]
            }
          },
          "customFeeds": {
            "title": "Custom feed URLs",
            "type": "array",
            "description": "Extra RSS 2.0 / Atom feed URLs to include (any crypto blog, Substack, project announcements). Source id becomes custom:<host>.",
            "items": {
              "type": "string"
            }
          },
          "query": {
            "title": "All of these words",
            "type": "string",
            "description": "Words that must ALL appear (AND). Example: etf approval. Empty = no filter."
          },
          "anyKeywords": {
            "title": "Any of these words",
            "type": "string",
            "description": "Words of which at least ONE must appear (OR). Example: hack* exploit* drained lawsuit."
          },
          "excludeKeywords": {
            "title": "Exclude words",
            "type": "string",
            "description": "Drop items containing any of these words (checked in title, summary and the full text the feed provides). Example: sponsored \"press release\" giveaway."
          },
          "keywordScope": {
            "title": "Match keywords in",
            "enum": [
              "titleSummary",
              "title",
              "fullText"
            ],
            "type": "string",
            "description": "Where \"All words\" / \"Any words\" must appear. Title + summary (default) = the text you see in the output. Full text also searches the article body when the feed carries one, which finds more but also stories that only mention the word in passing (\"breach of duty\", \"Hacksaw Gaming\").",
            "default": "titleSummary"
          },
          "requireCryptoContext": {
            "title": "Crypto stories only",
            "type": "boolean",
            "description": "Keep only items whose title or summary mentions crypto: coins, tokens, stablecoins, DeFi/DEX, wallets, exchanges like Binance/Coinbase, on-chain security firms. Drops AI-security, stock and casino stories that crypto outlets also publish. Recommended for incident alerts (hack*, exploit*). Leave off for SEC/CFTC feeds without keywords: most of their releases are not about crypto.",
            "default": false
          },
          "coins": {
            "title": "Coins mentioned",
            "type": "array",
            "description": "Keep only items that mention at least one of these coins. Tickers or names, any letter case: BTC, eth, Solana, polygon. 124 tickers are known (README → Coin dictionary); an unknown one stops the run with a \"did you mean\" hint, so a typo never turns the filter off. Every item gets coinsMentioned either way. For other assets use query or anyKeywords.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Feed categories contain",
            "type": "string",
            "description": "Keep items whose feed categories/tags contain any of these words, e.g. \"markets regulation\". Categories differ per outlet (see README)."
          },
          "sinceHours": {
            "title": "Since N hours",
            "minimum": 0,
            "maximum": 8760,
            "type": "integer",
            "description": "Only items published in the last N hours. 0 = no time filter (returns whatever the feeds currently hold, usually 10-100 items per outlet). Ignored when \"from\" is set.",
            "default": 24
          },
          "from": {
            "title": "From (ISO date)",
            "type": "string",
            "description": "Earliest publish time: YYYY-MM-DD (start of that day, UTC) or YYYY-MM-DDTHH:MM:SSZ; a time without a zone is UTC. Overrides sinceHours. RSS feeds hold only their latest 10-200 items, so old dates return nothing. Other formats stop the run with an error."
          },
          "to": {
            "title": "To (ISO date)",
            "type": "string",
            "description": "Latest publish time, inclusive: YYYY-MM-DD means the END of that day (23:59:59.999 UTC), or give an exact time as in \"from\"."
          },
          "limit": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of items to return after filtering and dedupe. Your max cost per run can stop the run earlier; the status then says so.",
            "default": 100
          },
          "maxPerSource": {
            "title": "Max items per source",
            "minimum": 0,
            "type": "integer",
            "description": "Cap items per outlet to balance the digest (0 = no cap).",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "newest",
              "oldest",
              "source"
            ],
            "type": "string",
            "description": "Ordering of the output.",
            "default": "newest"
          },
          "dedupe": {
            "title": "Dedupe by URL",
            "type": "boolean",
            "description": "Drop repeated URLs (tracking params stripped) — happens when an outlet is selected twice via a group and a topic feed.",
            "default": true
          },
          "dedupeTitles": {
            "title": "Dedupe near-identical titles",
            "type": "boolean",
            "description": "Also drop stories with the same normalized title across outlets (syndicated/duplicate coverage). Keeps the newest.",
            "default": false
          },
          "includeContent": {
            "title": "Include full text",
            "type": "boolean",
            "description": "Add a content field with the full article text when the feed provides it (content:encoded / Atom content). Many outlets only publish a summary.",
            "default": false
          },
          "fields": {
            "title": "Fields to output",
            "type": "array",
            "description": "Output only these fields, in this order (id is always kept). Available: source, sourceName, sourceKind, feedUrl, title, url, summary, content (needs includeContent), publishedAt, author, categories, image, coinsMentioned, fetchedAt. Letter case and snake_case are fine; an unknown name is left out and named in the run status, and a list with no known field stops the run.",
            "items": {
              "type": "string"
            }
          },
          "timeoutSecs": {
            "title": "Per-feed timeout (s)",
            "minimum": 5,
            "maximum": 60,
            "type": "integer",
            "description": "Per-feed timeout. Feeds slower than this are skipped and named in the run status.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}