{
  "openapi": "3.0.1",
  "info": {
    "title": "Financial Press Release Scraper (All In One)",
    "description": "Scrapes corporate press releases from PR Newswire, GlobeNewswire and Business Wire into one unified schema. Query by stock ticker, keyword or URL. Detected tickers, ISO 8601 UTC timestamps, and release bodies as clean Markdown — AI-ready for sentiment analysis.",
    "version": "0.1",
    "x-build-id": "yxYYkvfn1BnpfhUMB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~newswire-press-releases-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-newswire-press-releases-scraper",
        "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/scrapyx~newswire-press-releases-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-newswire-press-releases-scraper",
        "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/scrapyx~newswire-press-releases-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-newswire-press-releases-scraper",
        "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": {
          "tickers": {
            "title": "Stock tickers",
            "type": "array",
            "description": "Stock symbols to track — e.g. `AAPL`, `TSLA`, `NASDAQ:NVDA`. Each is queried against every newswire you enable.\n\n**How matching works differs by wire, and the difference is real:**\n\n- **PR Newswire** runs a genuine server-side search, so it reaches the full archive.\n- **GlobeNewswire** and **Business Wire** are matched by *scanning recent news* and reading the ticker out of each release — because GlobeNewswire's robots.txt disallows its search endpoint and Business Wire exposes no reachable search at all. Those two therefore find recent mentions, not history.\n\nEvery query writes a `QUERY_SUMMARY` row saying which mode it used and how many releases it inspected.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Free-text phrases to search for — e.g. `quarterly results`, `FDA approval`, `merger`. Same per-wire matching rules as tickers.\n\nOn PR Newswire an unmatched keyword returns a clean zero rather than a full unfiltered list, so an empty result genuinely means 'no matches'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Newswire URLs",
            "type": "array",
            "description": "Specific URLs to scrape directly. Accepts:\n\n- **A press release** — `https://www.prnewswire.com/news-releases/<slug>-<id>.html`, `https://www.globenewswire.com/news-release/2026/08/21/<id>/0/en/<slug>.html`\n- **A news list** — `https://www.prnewswire.com/news-releases/all-public-company-news/`, `https://www.globenewswire.com/news/energy`\n\nBusiness Wire article URLs are **not** fetchable: that site denies its own `/news/home/` pages to every HTTP client at the CDN edge. Reach Business Wire through tickers or keywords instead, which read its sitemap-declared feed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Newswires",
            "type": "array",
            "description": "Which wires to query. Defaults to all three.\n\nNote that **Business Wire returns headline + opening paragraph only** — its full article pages are closed to automated clients, so those rows carry `contentComplete: false`.",
            "items": {
              "type": "string",
              "enum": [
                "prnewswire",
                "globenewswire",
                "businesswire"
              ],
              "enumTitles": [
                "PR Newswire",
                "GlobeNewswire",
                "Business Wire"
              ]
            },
            "default": [
              "prnewswire",
              "globenewswire",
              "businesswire"
            ]
          },
          "includeContent": {
            "title": "Fetch full release body",
            "type": "boolean",
            "description": "Fetch each release's body and convert it to clean Markdown (`contentMarkdown`), with share bars, multimedia widgets and tracking pixels stripped out first.\n\nTurning this off keeps headlines, tickers, timestamps and URLs while skipping the body — but note that on GlobeNewswire the ticker is only printed in the body, so ticker matching there needs this on.",
            "default": true
          },
          "maxItems": {
            "title": "Max releases per query",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many releases per query. 0 means no cap.",
            "default": 0
          },
          "maxPages": {
            "title": "Max listing pages per query",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How deep to page through each news list or search result.\n\nPR Newswire returns up to 100 releases per page; GlobeNewswire is fixed at 10 per page by upstream. Raising this is the main way to reach further back in time.",
            "default": 2
          },
          "scanCap": {
            "title": "Scan cap (GlobeNewswire / Business Wire)",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound on how many releases are fetched and inspected when matching a ticker or keyword on the two wires that cannot be searched server-side.\n\nThis is a cost control: those wires require reading each release to find the ticker. 0 disables the cap.",
            "default": 60
          },
          "globenewswireCategories": {
            "title": "GlobeNewswire categories",
            "type": "array",
            "description": "Restrict the GlobeNewswire scan to specific sections. Leave empty to scan all six.\n\nNarrowing to the relevant sector makes ticker matching far cheaper — a biotech ticker will not appear under Energy.",
            "items": {
              "type": "string",
              "enum": [
                "banks-financial-services",
                "consumer-products-services",
                "energy",
                "heathcare",
                "industrials-utilities",
                "technology-telecom"
              ],
              "enumTitles": [
                "Banks & Financial Services",
                "Consumer Products & Services",
                "Energy",
                "Healthcare",
                "Industrials & Utilities",
                "Technology & Telecom"
              ]
            },
            "default": []
          },
          "pageSize": {
            "title": "Page size (PR Newswire)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Releases per listing request on PR Newswire, which is the only wire with an honest page-size parameter. Capped at 100, its real ceiling.\n\nGlobeNewswire ignores this (fixed at 10) and Business Wire's feed is a fixed rolling window.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Upper bound on requests in flight across the whole run — listing pages and article fetches share this budget.",
            "default": 5
          },
          "minRequestInterval": {
            "title": "Minimum interval between requests",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Seconds between the START of one request and the next. These are large ad-supported publisher sites, so the default paces politely rather than sprinting.\n\nThis, not concurrency, is the honest speed control: once a rate cap binds, extra concurrency buys nothing.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "PR Newswire and GlobeNewswire answered every TLS fingerprint tested from a plain residential connection, so a proxy is not a bot-wall bypass here.\n\nResidential is still the default on the platform, because a cloud run shares datacenter egress with every other Actor and large publisher CDNs rate-limit by IP long before they fingerprint.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}