# Funding Rounds Scraper & News Monitor (`stefanie-rink/independent-funding-rounds`) Actor

Track company funding announcements from public news. Extract amounts, stages, investors and source links; deduplicate rounds and monitor new records.

- **URL**: https://apify.com/stefanie-rink/independent-funding-rounds.md
- **Developed by:** [Steafanie Braid](https://apify.com/stefanie-rink) (community)
- **Categories:** Lead generation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $60.00 / 1,000 funding rounds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Funding Rounds Scraper & News Monitor

Collect company funding announcements from public news. Get one deduplicated row per funding round, with company details, investors, amounts and source evidence. Use the archive to filter rounds, resume pages, or return only new records for a monitor.

The default sources are PR Newswire, Tech.eu, Entrackr and Disrupt Africa. Coverage depends on their current public listings and access rules. This Actor builds its own archive. It does not include a proprietary funding database or complete historical coverage.

### Quick start

1. Copy this input into Apify Console and start the Actor.
2. Open **Funding rounds** in Output, or open the default dataset.
3. Export the dataset as JSON, CSV or Excel. Check **SUMMARY** for source failures and coverage limits.

```json
{
  "maxItems": 10,
  "maxArticles": 14,
  "maxArticlesPerSource": 5,
  "enrichCompanyWebsites": false
}
```

Rules mode needs no provider key. `maxItems` limits returned matching rounds; it does not guarantee that many discoveries. The Actor saves collected rounds before it returns a filtered page.

### Use cases

- Find recent company funding announcements for investment research or sales prospecting.
- Filter an existing archive by date, funding stage, amount, country or known company attributes.
- Schedule repeated runs with `onlyNew: true` to deliver new IDs for a monitor.

### Inputs

| Field | Default and behavior |
| --- | --- |
| `maxItems` | 100; 1–10,000 matching archived rounds per page. The spending limit can reduce this. |
| `sources` | PR Newswire, Tech.eu, Entrackr, Disrupt Africa. `[]` disables discovery. Optional Wamda, FinSMEs and EU-Startups may be blocked. |
| `startUrls` | `[]`; up to 500 public article URLs, collected alongside the selected sources. |
| `maxArticles` | 40; 1–500 article attempts per fresh run. Discovery, FX and website requests are additional. A small budget can reduce article work. |
| `maxArticlesPerSource` | 15; 1–100 candidates per feed or listing. No deep archive crawl. |
| `requestDelaySeconds` | 1; 0.5–60 seconds per host, increased for robots crawl-delay. One request at a time; no access bypass or automatic retry. |
| `since` | Optional ISO date/time. Filters the announcement calendar date. Rules use publication date as a proxy. |
| `round` | `[]` means all. Examples: `seed`, `series-a`, `debt`, `grant`, `unknown`. |
| `minAmountUsd`, `maxAmountUsd` | Optional nonnegative amounts in USD. When set, missing or unconverted amounts are excluded. |
| `countries` | `[]`; ISO-2 codes or English country names. `unknown` includes missing country. Geography from rules is a heuristic. |
| `industryGroups`, `verticals`, `naicsCode` | Optional exact labels or NAICS prefix. Rules leave these unclassified; use `unknown` to include missing values. |
| `employeeBuckets` | Optional bands: `1-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+`, `unknown`. |
| `enrichedOnly` | `false`; requires domain, country and industry group. Rules alone normally cannot satisfy this. |
| `minimumConfidence` | 0.7; range 0–1. A heuristic score, not a probability of correctness. |
| `enrichCompanyWebsites`, `maxEnrichments` | `true`, 8; optional company-homepage JSON-LD, capped at 100 websites. Does not scrape LinkedIn. |
| `convertCurrencies`, `fxRates` | `true`, `{}`. Historical Frankfurter rates where available. Override with USD per currency unit, for example `{"INR":0.01055}`. Missing rates leave USD amounts null. |
| `onlyNew`, `monitorId`, `resetMonitor` | `false`, optional ID, `false`. Delivery history is separate for each monitor. Without `since`, only-new uses a rolling 30-day window. Reset clears delivery history, not the archive. |
| `cursor` | Optional saved `NEXT_CURSOR`. Reuse the same filters, monitor and state store. Expires after seven days; continuation reads the saved snapshot without collecting news. |
| `stateStoreName` | `independent-funding-rounds-v1`. Named key-value store for your persistent archive. Run only one writer per store. Choose a new name for an independent archive. |
| `maxStoredRecords` | 10,000; range 100–50,000. Stops at the cap without silently deleting records. Export and use a new store for larger archives. |
| `extractionMode`, `openaiApiKey`, `llmModel` | `rules`, no key, `gpt-4.1-mini`. Optional `llm` mode requires your OpenAI key. Provider fees are separate. Live LLM accuracy is not verified for this release. |

Omit optional fields instead of passing null. An empty filter list means no filter. Input validation occurs before collection. Invalid input writes `INPUT_ERROR` and `SUMMARY.outcome=INPUT_REJECTED`; for compatibility, the cloud run then ends successfully with no results.

### Outputs

The default dataset contains funding rounds. It contains no diagnostic or error rows. Each row includes:

| Fields | Meaning |
| --- | --- |
| `id` | Stable round identity. Use it to deduplicate downstream. |
| `company` | Stable company ID, name, domain, description, headquarters, industry, employee band and other available attributes. Missing facts are null or empty lists. |
| `round`, `investors` | Normalized stage and identified investors. An unknown stage is `unknown`. |
| `amountUsd`, `amountUsdCents` | USD amount in whole units and integer hundredths. Null when unavailable. |
| `amountOriginalCurrency`, `amountOriginalCents` | Original currency and integer hundredths, including INR. Divide cents by 100 for whole units. |
| `announcedAt`, `discoveredAt` | Announcement date or publication-date proxy, and first discovery timestamp. |
| `_meta` | Article links, supporting quotes, extraction method, confidence, FX source, inferred fields and warnings. |

For example, a verified CureBay article states Rs 100 Cr. Its extracted amount fields are:

```json
{
  "amountOriginalCurrency": "INR",
  "amountOriginalCents": 100000000000,
  "amountUsd": 10550000,
  "amountUsdCents": 1055000000
}
```

The historical conversion used 0.01055 USD per INR. Rates and evidence are retained in `_meta`.

The default key-value store contains `SUMMARY`, `NEXT_CURSOR` and `OUTPUT`. `SUMMARY.outcome` distinguishes `SUCCEEDED`, `PARTIAL`, `EMPTY`, `BUDGET_EXHAUSTED`, `INPUT_REJECTED` and `FAILED`. Partial source failures retain useful results. If all requested collection fails, the run fails and retains its summary. Empty results alone do not indicate complete coverage.

Use `https://api.apify.com/v2/datasets/DATASET_ID/items` for complete JSON. Add `?format=csv` for CSV. Private datasets require authentication. The Output links use the current run's dataset and storage IDs.

### Pricing and limits

The configured price is **$60 per 1,000 saved funding rounds**, plus **$0.001 per run start** at 256–1,024 MB. Platform usage is included. One result event applies to each funding round saved in the default dataset. The Actor-start event also applies to empty, invalid-input and failed runs. Empty results, rejected inputs and failed articles produce no result events. A failed or partial run can still contain paid results already saved before failure.

Returning the same archived round in a later run is another delivered result. Use `onlyNew: true` with a stable `monitorId` to avoid normal repeat delivery. A crash between dataset storage and monitor checkpoint can still repeat a row; downstream delivery is at least once. Cursor-only runs also charge for the results they deliver.

For 10 saved rounds, event charges total $0.601. For 100 rounds, they total $6.001. A run with no saved rounds costs only the $0.001 start event. Use a spending limit of at least $0.061 for a start and one result. The pricing configuration permits $0.001, but Apify can reject limits below one result's price before starting a run. These limits do not guarantee discovery.

Set a finite maximum charge and timeout for each run. A budget that cannot fund one result stops collection before source or provider calls. Optional LLM calls use your key and can incur provider charges even if an article yields no matching result. The Actor never replaces an invalid supplied key with an owner-funded key.

Public-source access, robots rules and extraction quality can change. No full-history, universal coverage or verified-contact-data guarantee applies. Review source evidence before making decisions. Monitoring and pagination require the same persistent store. Records from earlier versions are not automatically repaired; use a new store to recollect them.

### FAQ

#### How do I monitor new rounds?

Add `"onlyNew": true` and a stable `"monitorId": "my-funding-monitor"`. Reuse the same `stateStoreName`. Schedule the Actor in Apify Console. One writer per store avoids archive conflicts.

#### How do I query the archive without collecting more news?

Use `"sources": []` and `"startUrls": []`, plus your filters and the same state store. Follow `NEXT_CURSOR` with the original filters to retrieve further pages.

#### Why are some fields null?

Rules only retain facts that the extraction logic can identify. Industry groups, NAICS and LinkedIn numeric IDs are not inferred in rules mode. Optional website enrichment only reads public structured company data.

#### Why did I get no results?

Check SUMMARY. Filters may exclude all rounds, no matching announcement may be available, or source access may fail. `onlyNew` also removes already delivered IDs. All-source access failure is reported as a failed run.

### Operational telemetry

When enabled by the operator, Sentry records one bounded input snapshot and original error stacks with safe operation targets. Credentials and URL authentication are masked. Article bodies, generated answers, HTTP payloads and stack locals are excluded.

# Changelog

This Actor's version history is a separate document: https://apify.com/stefanie-rink/independent-funding-rounds/changelog.md

# Actor input Schema

## `maxItems` (type: `integer`):

Maximum matching stored funding rounds returned, not a guarantee of discovery volume.

## `since` (type: `string`):

YYYY-MM-DD or ISO-8601. Filtering uses the calendar date; rules mode uses publication date as the announcement-date proxy.

## `round` (type: `array`):

Empty means all. Use unknown or Not disclosed for undisclosed stages.

## `industryGroups` (type: `array`):

Exact case-insensitive labels. Rules mode leaves these null; use unknown to retain unclassified companies.

## `naicsCode` (type: `string`):

Hierarchical prefix; 31-33, 44-45 and 48-49 ranges supported. Rules mode does not invent NAICS codes.

## `verticals` (type: `array`):

Exact labels. Rules mode leaves these empty. Use unknown for unmapped companies.

## `minAmountUsd` (type: `number`):

Exclude undisclosed/unconverted amounts when set.

## `maxAmountUsd` (type: `number`):

Exclude undisclosed/unconverted amounts when set.

## `countries` (type: `array`):

ISO-2 codes or English names; unknown/Not disclosed includes missing countries. Rule-based geography is a heuristic.

## `employeeBuckets` (type: `array`):

Rules mode requires an explicit headcount. unknown includes missing sizes.

## `enrichedOnly` (type: `boolean`):

Require domain, country and industry group. Rules mode does not assign industryGroup, so this normally returns zero unless the archive was enriched by LLM mode.

## `onlyNew` (type: `boolean`):

Persist delivered IDs per monitor. If since is omitted, use a rolling 30-day window. Delivery is at-least-once across crashes; dedupe downstream by id.

## `monitorId` (type: `string`):

Optional; otherwise monitor identity is a hash of the filters. An explicit monitor ID shares delivered history across filter changes.

## `resetMonitor` (type: `boolean`):

Clear delivered IDs for this monitor, not the collected archive. Cannot be combined with cursor.

## `cursor` (type: `string`):

NEXT_CURSOR from a prior run using the same filters/onlyNew/monitorId/state store. Snapshots expire after 7 days. A continuation does not collect new articles.

## `sources` (type: `array`):

FinSMEs/EU-Startups are optional because access/robots checks may block them. Tech.eu uses its homepage, not its robots-disallowed feed.

## `startUrls` (type: `array`):

Optional articles for testing/backfill, used alongside selected sources. Public HTTP(S) only. robots.txt is always respected.

## `maxArticles` (type: `integer`):

Maximum article requests per fresh run, across all sources. Discovery and website/FX requests are additional.

## `maxArticlesPerSource` (type: `integer`):

Maximum candidates from each feed/listing. Latest listing/feed only; no deep archive crawl.

## `requestDelaySeconds` (type: `number`):

Minimum delay per host, increased if robots.txt specifies crawl-delay.

## `enrichCompanyWebsites` (type: `boolean`):

Read Organization JSON-LD on explicitly linked company domains, within maxEnrichments. Never bypass access controls.

## `maxEnrichments` (type: `integer`):

Maximum company website requests per run. No LinkedIn scraping.

## `convertCurrencies` (type: `boolean`):

Use historical Frankfurter rates where supported; missing rates leave USD values null.

## `fxRates` (type: `object`):

Optional object mapping ISO currency codes to USD per one original currency unit, e.g. {"INR":0.012}. These override historical rates and are recorded in provenance.

## `extractionMode` (type: `string`):

rules: deterministic extraction without a provider key. llm: use your OpenAI key; provider fees are separate, including articles that produce no result.

## `llmModel` (type: `string`):

Model used only in llm mode with your OpenAI key. Provider charges are additional. Live LLM accuracy has not been verified for this release.

## `minimumConfidence` (type: `number`):

Heuristic extraction score, not a calibrated probability.

## `stateStoreName` (type: `string`):

Named Apify key-value store shared across runs. Use one writer at a time. Local CLI uses --state instead.

## `maxStoredRecords` (type: `integer`):

Stop at this archive cap without evicting stored rounds. One KV record holds the archive; export and start a new store for larger collections.

## `openaiApiKey` (type: `string`):

Required only for llm mode in Apify. Charged directly by your provider. An invalid supplied key never falls back to an owner key. Rules mode needs no key.

## Actor input object example

```json
{
  "maxItems": 10,
  "round": [],
  "industryGroups": [],
  "verticals": [],
  "countries": [],
  "employeeBuckets": [],
  "enrichedOnly": false,
  "onlyNew": false,
  "resetMonitor": false,
  "sources": [
    "prnewswire",
    "tech_eu",
    "entrackr",
    "disrupt_africa"
  ],
  "startUrls": [],
  "maxArticles": 14,
  "maxArticlesPerSource": 5,
  "requestDelaySeconds": 1,
  "enrichCompanyWebsites": true,
  "maxEnrichments": 8,
  "convertCurrencies": true,
  "fxRates": {},
  "extractionMode": "rules",
  "llmModel": "gpt-4.1-mini",
  "minimumConfidence": 0.7,
  "stateStoreName": "independent-funding-rounds-v1",
  "maxStoredRecords": 10000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `nextCursor` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "maxArticles": 14,
    "maxArticlesPerSource": 5,
    "enrichCompanyWebsites": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("stefanie-rink/independent-funding-rounds").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "maxArticles": 14,
    "maxArticlesPerSource": 5,
    "enrichCompanyWebsites": False,
}

# Run the Actor and wait for it to finish
run = client.actor("stefanie-rink/independent-funding-rounds").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "maxArticles": 14,
  "maxArticlesPerSource": 5,
  "enrichCompanyWebsites": false
}' |
apify call stefanie-rink/independent-funding-rounds --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stefanie-rink/independent-funding-rounds"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cjyXNHTqwOcNJvWXw/builds/Yoomk6ixlA2hVzXPP/openapi.json
