# Using the Recent Funding API

> A hands-on guide to the Recent Funding API. Filter recently funded startups, page through results, pull recent rounds with their sources, and handle errors, with curl and JavaScript examples.

- URL: https://recentfunding.com/blog/using-the-recent-funding-api/
- Published: 2026-09-25
- Updated: 2026-10-30
- Data snapshot: 2026-10-09
- Tags: api, developers, tutorial
- Publisher: Recent Funding (https://recentfunding.com/)

The Recent Funding API is a read-only JSON API of recently funded startups, their funding rounds (each amount with its source URL), investors, founders and acquisitions. Every request needs a [free API key](https://recentfunding.com/dashboard/?from=blog) sent as `Authorization: Bearer <key>`; it takes just an email and allows 50 requests a day.

The full reference is the [API documentation](https://recentfunding.com/docs/), generated from the [OpenAPI spec](https://recentfunding.com/openapi.json); agents can read it as Markdown at [/docs.md](https://recentfunding.com/docs.md) or start from [/llms.txt](https://recentfunding.com/llms.txt).

## Endpoints

| Endpoint | Returns |
| --- | --- |
| `GET /api/v1/companies` | Companies, filtered and sorted |
| `GET /api/v1/companies/{slug}` | One company and all its funding rounds |
| `GET /api/v1/rounds` | Recent rounds with an amount, newest first |
| `GET /api/v1/acquisitions` | Who bought whom, when, and the price when a source states it |
| `GET /api/v1/stats` | Counts by stage, industry and source |

Investors, founders, categories, accelerators and the market map have endpoints too ([docs](https://recentfunding.com/docs/)). Everything lives under `https://recentfunding.com`, CORS is open, and successful responses can be cached for 60 seconds.

## First request

Keep the key in an environment variable:

```sh
export RF_KEY=rf_live_…
curl -H "Authorization: Bearer $RF_KEY" "https://recentfunding.com/api/v1/companies?accelerator=yc&sort=raise&limit=1"
```

The response on October 9, 2026 (some fields left out):

```json
{
  "companies": [
    {
      "slug": "river-ai",
      "name": "River AI",
      "stage": "series-a",
      "industry": "ai",
      "amount_usd": "1100000000.00",
      "announced_at": "2026-08-11T00:00:00.000Z",
      "raise_source_url": "https://techcrunch.com/2026/08/11/general-catalyst-leads-1-1b-round-into-2-month-old-river-ai/",
      "raise_provider": "agent-review",
      "investors": ["General Catalyst", "Temasek", "Y Combinator", "…"]
    }
  ],
  "count": 1,
  "next_offset": 1
}
```

That is River AI's [$1.1B](https://techcrunch.com/2026/08/11/general-catalyst-leads-1-1b-round-into-2-month-old-river-ai/) Series A. `amount_usd` is a decimal string, so large values keep their precision; `raise_source_url` is where the amount came from; a non-null `next_offset` means more results. Every response reports what is left of the day's quota in `X-RateLimit-Remaining`.

## Filtering and sorting

| Parameter | Example | Meaning |
| --- | --- | --- |
| `stage` | `seed` | Company stage |
| `industry` | `ai-agents` | Industry slug (listed by `/api/v1/stats`) |
| `crypto` | `true` | Only crypto companies, or `false` to exclude them |
| `accelerator` | `speedrun` | Backed by an accelerator; `any` matches all |
| `q` | `prediction market` | Search over name, description, sector and investors |
| `min_raise` | `5000000` | Latest round of at least this many USD |
| `sort` | `raise` | `newest` (default), `oldest`, `raise`, `announced` or `name` |

```sh
curl -H "Authorization: Bearer $RF_KEY" "https://recentfunding.com/api/v1/companies?industry=ai-agents&min_raise=5000000&sort=raise"
```

## Paging

Pages hold up to 2000 companies (`limit`, default 100). Request again with `offset` set to the previous `next_offset` until it is `null`:

```js
const BASE = "https://recentfunding.com";
const headers = { Authorization: `Bearer ${process.env.RF_KEY}` };

async function allCompanies(filters = {}) {
  const out = [];
  for (let offset = 0; offset !== null; ) {
    const params = new URLSearchParams({ ...filters, sort: "oldest", limit: "500", offset: String(offset) });
    const res = await fetch(`${BASE}/api/v1/companies?${params}`, { headers });
    const body = await res.json();
    if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
    out.push(...body.companies);
    offset = body.next_offset;
  }
  return out;
}
```

`sort=oldest` puts newly found companies at the end, so they don't shift results across page boundaries during an export.

## One company, every round

Company objects carry only the latest round. The slug endpoint returns `{"company": {...}, "rounds": [...]}`, each round with `stage`, `amount_usd` (null when unknown), `announced_at` and its own `source_url`:

```sh
curl -H "Authorization: Bearer $RF_KEY" "https://recentfunding.com/api/v1/companies/river-ai"
```

## Rounds and acquisitions

`/api/v1/rounds` lists rounds with an amount, newest first, and also takes `stage`, `crypto`, `limit` (up to 500) and `offset`. `/api/v1/acquisitions` lists deals newest first; `scope=startups` keeps startup acquisitions, and a `price_usd` always comes with the `price_source_url` that states it. Acquisitions never appear as rounds. The same list is the [acquisitions](https://recentfunding.com/money-flow/?type=acquisitions) page.

```sh
curl -H "Authorization: Bearer $RF_KEY" "https://recentfunding.com/api/v1/rounds?since=2026-10-01&min_amount=10000000"
curl -H "Authorization: Bearer $RF_KEY" "https://recentfunding.com/api/v1/acquisitions?scope=startups&since=2026-10-01&limit=20"
```

## Errors

Every error has the same shape and a matching HTTP status:

```json
{"error": {"status": 400, "code": "invalid_parameter", "message": "\"limit\" must be an integer from 1 to 2000.", "param": "limit"}}
```

| Code | Status | Meaning |
| --- | --- | --- |
| `invalid_parameter` | 400 | A value is out of range, malformed or repeated |
| `unknown_parameter` | 400 | A parameter the API doesn't know, such as the typo `stag` |
| `api_key_required` | 401 | No key sent; the body says how to get one |
| `invalid_api_key` | 401 | Unknown or revoked key |
| `not_found` | 404 | Unknown slug or path |
| `method_not_allowed` | 405 | Anything other than GET, HEAD or OPTIONS |
| `rate_limited` | 429 | The day's 50 requests are used; `Retry-After` says when it resets (midnight UTC) |
| `unavailable` | 503 | Database temporarily unavailable; retry with backoff |

## Using the data

When you show an amount, link it to `raise_source_url` (or `source_url` on rounds), as Recent Funding does; [how we source and verify funding data](https://recentfunding.com/blog/how-recent-funding-sources-and-verifies-funding-data/) explains each provider. Cache responses for their `Cache-Control` lifetime, fetch the whole dataset at most a few times a day, and back off on `429` and `503` ([rate limits](https://recentfunding.com/docs/#rate-limits-and-fair-use)).

## Related on Recent Funding

- [Get a free API key](https://recentfunding.com/dashboard/?from=blog-related)
- [Money flow: raises, acquisitions and new funds](https://recentfunding.com/money-flow/)
- [AI investors: the VC firms and accelerators backing the most AI startups](https://recentfunding.com/blog/ai-investors/)
- [Game startups: the gaming startups that raised most recently](https://recentfunding.com/blog/game-startups/)
- [Green startups: the climate and clean energy startups that raised most recently](https://recentfunding.com/blog/green-startups/)
- [Recent Funding API docs](https://recentfunding.com/docs/): every endpoint behind this post; a [free API key](https://recentfunding.com/dashboard/?from=blog-related) takes just an email
