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.
Recent Funding's data is available as a read-only JSON API. You don't need a key or an account. This guide walks through the endpoints with real requests. The API reference and the OpenAPI spec cover every parameter and field.
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/stats | Counts by stage, industry, and source |
All endpoints live under https://recentfunding.com. Responses are JSON. CORS is open, so you can call the API from a browser. Successful responses can be cached for 60 seconds, or 5 minutes for stats.
Your first request
curl "https://recentfunding.com/api/v1/companies?accelerator=yc&sort=raise&limit=1"
The response looks like this (some fields and the long source URL are shortened):
{
"companies": [
{
"slug": "shepherd",
"name": "Shepherd",
"stage": "pre-seed",
"industry": "infra-devtools",
"crypto": false,
"amount_usd": "42000000.00",
"announced_at": "2026-08-07T00:00:00.000Z",
"raise_source_url": "https://news.google.com/rss/articles/…",
"raise_publisher": "PR Newswire",
"raise_provider": "google-news",
"investors": ["Y Combinator"]
}
],
"count": 1,
"next_offset": 1
}
That record is Shepherd's $42M round. Three details are worth noting:
amount_usdis a decimal string, not a number, so large values never lose precision. Convert it withNumber()when you need arithmetic.raise_source_urlis where the amount came from. If you display an amount, link to it.next_offsetis not null, so there are more results.
Filtering and sorting
/api/v1/companies takes these filters, and you can combine them:
| Parameter | Example | Meaning |
|---|---|---|
stage | seed | Company stage |
industry | ai-agents | Industry slug (see /api/v1/stats for the list) |
crypto | true | Only crypto companies, or false to exclude them |
accelerator | speedrun | Backed by an accelerator; any matches all of them |
q | prediction market | Text 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 |
For example, AI agent companies whose latest round was 5 million USD or more, largest first:
curl "https://recentfunding.com/api/v1/companies?industry=ai-agents&min_raise=5000000&sort=raise"
Paging through everything
Pages hold up to 2000 companies (limit, default 100). Keep requesting with offset set to the previous next_offset until it comes back null:
const BASE = "https://recentfunding.com";
async function allCompanies(filters = {}) {
const out = [];
let offset = 0;
while (offset !== null) {
const params = new URLSearchParams({ ...filters, limit: "500", offset: String(offset) });
const res = await fetch(`${BASE}/api/v1/companies?${params}`);
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;
}
const crypto = await allCompanies({ crypto: "true" });
console.log(crypto.length, "crypto companies");
Offsets are positions in a list that grows as Recent Funding finds new companies, and the default newest sort puts new ones first. If you page slowly, a company can shift across a page boundary. For a consistent export, page quickly, or sort with sort=oldest so that new companies land at the end.
One company, every round
Company objects carry only the latest round. To get the full history, fetch the company by its slug:
curl "https://recentfunding.com/api/v1/companies/shepherd"
This returns {"company": {...}, "rounds": [...]}. Each round has stage, amount_usd (null when unknown), announced_at, and its own source_url, source_publisher, and source_provider. An unknown slug returns a 404.
A feed of recent rounds
/api/v1/rounds lists rounds that have an amount, newest first. Use it for a "who raised this week" digest:
curl "https://recentfunding.com/api/v1/rounds?since=2026-09-18&min_amount=10000000"
It also accepts stage (the round's own stage), crypto, limit (up to 500), and offset. Each round names the company (slug, name) and lists the investors linked to that round.
Stats
curl "https://recentfunding.com/api/v1/stats"
This returns total, crypto, and with-amount counts, plus by_stage, by_industry, and by_source arrays of {key, count}, largest first. They are computed from the same rows /api/v1/companies returns, so the numbers agree. Use by_industry to build a filter menu.
Errors
Every error has the same shape and a matching HTTP status:
{
"error": {
"status": 400,
"code": "invalid_parameter",
"message": "\"limit\" must be an integer from 1 to 2000.",
"param": "limit"
}
}
The possible codes are:
invalid_parameter(400): a value is out of range or has the wrong format, or a parameter is repeated.unknown_parameter(400): the API does not recognise a parameter, so a typo like?stag=seedfails loudly instead of returning unfiltered data.not_found(404): unknown slug or path.method_not_allowed(405): anything other than GET, HEAD, or OPTIONS.unavailable(503): the database is temporarily unavailable. Retry with a backoff.
Showing amounts responsibly
Amounts come from source listings, news headlines, company websites, and manual review. The raise_provider field (or source_provider on rounds) says which. Some sources call a round seed when others would not, and a few amounts are later corrected. When you show a figure, link it to raise_source_url, as Recent Funding does:
const amount = c => c.amount_usd && c.raise_source_url
? `<a href="${c.raise_source_url}">$${(Number(c.amount_usd) / 1e6).toFixed(1)}M</a>`
: "undisclosed";
(Escape the values if you build HTML from them.) How Recent Funding sources and verifies funding data explains each provider and the review process.
Fair use
There is no key and no hard rate limit today. Please keep automated traffic modest: cache responses for at least as long as their Cache-Control header says, and fetch the whole dataset at most a few times a day. Any future limits will be documented in the API docs.