Grab a free key at /dashboard (GitHub login, one click). Pass it as a bearer token on every request.
Authorization: Bearer fapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
◉ No key? Public endpoints (/v1/startups, /v1/stats, /v1/investors, /v1/startups/:id) work anonymously — limited to 60 calls/hour per IP.
Zero-dependency TypeScript client. Works on Node 18+, Bun, Deno, and Cloudflare Workers. Handles 429 rate limits, JSON parsing, and typed responses for you.
npm install @getfundedapi/client # or: pnpm add @getfundedapi/client # or: bun add @getfundedapi/client
import { FundedAPI } from "@getfundedapi/client";
const api = new FundedAPI({ apiKey: process.env.FUNDED_API_KEY });
// Typed filters, typed response
const { startups } = await api.listStartups({
niche: "AI",
hiring: true,
limit: 25,
});
// Natural-language search
const { filters, results } = await api.aiSearch({
query: "Seed-stage AI infra startups hiring in Europe",
});
// Webhook signature verification (HMAC-SHA256, timing-safe)
import { verifyWebhookSignature } from "@getfundedapi/client";
const ok = await verifyWebhookSignature({
secret: process.env.FUNDED_WEBHOOK_SECRET,
payload: rawBody,
signature: req.headers["x-fundedapi-signature"],
});◉ Source: github.com/.../packages/client · @getfundedapi/client on npm
First-party Model Context Protocol server at https://fundedapi.com/mcp. Claude Desktop, Cursor, and any MCP-compatible agent can call our tools directly — no self-hosting.
// In ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"fundedapi": {
"url": "https://fundedapi.com/mcp",
"headers": {
"Authorization": "Bearer fapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}Exposed tools: search_startups, get_startup, ai_search, list_investors, stats.
Full setup guide: /mcp/claude
Paginated, filterable list of funded startups.
| limit | int | 1-500. Default 50 |
| offset | int | Pagination offset (max 100000) |
| niche | enum | AI | SaaS | Crypto | Fintech | DevTools | HealthTech | Cybersecurity | Ecommerce | EdTech | CleanTech |
| round | string | Seed | Series A | Series B | ... |
| hiring | bool | true = only actively hiring |
| country | string | ISO country name (e.g. United States) |
| investor | string | Startups backed by this investor (exact match) |
| min_amount | int | Min funding in USD |
| since | ISO date | Only startups scraped on/after this date |
| sort | enum | priority | recent | amount | funded. Default priority |
◆ Example
curl "https://fundedapi.com/v1/startups?hiring=true&niche=AI&limit=10" \ -H "Authorization: Bearer $FUNDED_API_KEY"
◆ Response
{
"startups": [
{
"id": "clx1a2b3c4d5e6f7g8h9i0j1k",
"name": "NovaLabs",
"website": "https://novalabs.io",
"linkedinUrl": "https://linkedin.com/company/novalabs",
"niches": ["AI", "DevTools"],
"industries": ["developer tools"],
"fundingRound": "Seed",
"fundingAmount": 5000000,
"fundingDate": "2026-03-15",
"hiringSignal": true,
"openRoles": 12,
"city": "San Francisco",
"country": "United States",
"investors": ["Sequoia Capital", "Y Combinator"],
"priorityScore": 87,
"confidenceScore": 94,
"scrapedAt": "2026-04-17T08:12:03.000Z",
"contacts": [
{ "id": "cly...", "name": "Jane Doe", "title": "Co-founder, CEO",
"role": "ceo", "email": "jane@novalabs.io",
"linkedinUrl": "https://linkedin.com/in/janedoe" }
]
}
],
"pagination": { "total": 1247, "limit": 10, "offset": 0, "hasMore": true }
}Full detail for one startup, including all contacts.
curl https://fundedapi.com/v1/startups/clx1a2b3c4d5e6f7g8h9i0j1k \ -H "Authorization: Bearer $FUNDED_API_KEY"
CSV download for bulk workflows (HubSpot sync, BI imports, etc.). Requires an API key. Accepts the same filters as the list endpoint.
curl "https://fundedapi.com/v1/startups/export?hiring=true&since=2026-04-01" \ -H "Authorization: Bearer $FUNDED_API_KEY" > startups.csv
◉ Returns up to limit × 10 rows, capped at 5000 per request. Use since to pull incremental deltas.
Natural-language search. Converts a plain-English query into structured filters + returns matching startups in one call. Powered by Perplexity Sonar with a heuristic fallback.
curl -X POST https://fundedapi.com/v1/search/ai \
-H "Authorization: Bearer $FUNDED_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "Seed AI infra startups hiring in Europe" }'◆ Response
{
"startups": [ /* up to 20 matches */ ],
"rationale": "Filtered to niche=AI, round=Seed, hiring=true, country=Europe",
"filters": { "niche": "AI", "round": "Seed", "hiring": true },
"source": "perplexity"
}◉ Plan quotas: free 10/day · pro 200/day · scale unlimited (in addition to base rate limit).
Aggregated directory of VCs computed from our funded-startup dataset. Same data that powers /investors.
| min_deals | int | Min deals to qualify. Default 2 |
| hiring_only | bool | Only investors with ≥1 hiring portfolio co |
| limit | int | 1-500. Default 100 |
◆ Example
curl "https://fundedapi.com/v1/investors?min_deals=3&hiring_only=true&limit=50"
◆ Response
{
"investors": [
{
"name": "Sequoia Capital",
"slug": "sequoia-capital",
"deals": 18,
"hiring": 12,
"niches": ["AI", "SaaS", "Fintech"],
"topRound": "Series A",
"url": "/investors/sequoia-capital"
}
],
"pagination": { "total": 240, "returned": 50, "limit": 50, "minDeals": 3 },
"sampledStartups": 2843
}Public aggregate stats. No auth needed. Cached 30 min.
curl https://fundedapi.com/v1/stats
{
"total": 1247,
"last24h": 32,
"hot": 87,
"hiring": 412,
"niches": [{ "name": "AI", "count": 289 }, ...],
"rounds": [{ "round": "Seed", "count": 543 }, ...]
}Register a URL to receive real-time startup.created events when new rows match your filters. HMAC-SHA256 signed. SSRF-safe at delivery time.
◆ Subscribe · POST /v1/webhooks
curl -X POST https://fundedapi.com/v1/webhooks \
-H "Authorization: Bearer $FUNDED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhook",
"filters": { "niche": "AI", "hiring": true, "minAmount": 1000000 }
}'
# Response — the secret is shown ONCE
{ "webhook": { "id": "cl...", "url": "...", "secret": "whsec_...", "active": true } }◆ Delivery payload
POST https://your-app.com/webhook
Content-Type: application/json
X-FundedAPI-Signature: sha256=abc123...
X-FundedAPI-Timestamp: 1745000000
X-FundedAPI-Event: startup.created
User-Agent: FundedAPI-Webhook/1.0
{
"event": "startup.created",
"timestamp": "2026-04-17T10:00:00.000Z",
"data": { "id": "clx...", "name": "NovaLabs", "niches": ["AI"], ... }
}◆ Verify signature (Node)
import { createHmac, timingSafeEqual } from "crypto";
// Signature covers `timestamp.body` (not just body). Check both
// the HMAC AND the freshness of the timestamp to reject replays.
const TOLERANCE_SEC = 300; // 5 min
function verify(rawBody, headers, secret) {
const sigHeader = headers["x-fundedapi-signature"] || "";
const ts = headers["x-fundedapi-timestamp"] || "";
if (!sigHeader || !ts) return false;
// Freshness — defeats replay attacks.
const skew = Math.abs(Date.now() / 1000 - Number(ts));
if (!Number.isFinite(skew) || skew > TOLERANCE_SEC) return false;
const expected = createHmac("sha256", secret)
.update(ts + "." + rawBody)
.digest("hex");
const received = sigHeader.replace("sha256=", "");
if (expected.length !== received.length) return false;
return timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(received, "hex")
);
}◆ Lifecycle
| GET /v1/webhooks | List | All webhooks on your account |
| DELETE /v1/webhooks/:id | Delete | Cascades to delivery log |
| POST /v1/webhooks/:id/test | Test fire | Synthetic event, 1 per 60s cooldown |
| POST /v1/webhooks/:id/rotate-secret | Rotate | New secret, old one invalid immediately. 10s cooldown |
◉ We retry on failure. After 10 consecutive failures the webhook auto-disables. Return any 2xx to acknowledge. After ~5 consecutive failures your endpoint is circuit-broken per-host for 60s so we don't hammer it.
| X-RateLimit-Limit | int | Your daily quota |
| X-RateLimit-Remaining | int | Calls left today |
| X-RateLimit-Reset | unix | Epoch seconds when quota resets |
| X-Auth-Via | key | ip | How you were authenticated |
| X-Plan | string | free | pro | scale |
| Cache-Control | string | public/private with max-age |
| Anonymous (IP) | 60/hr | No key. Public endpoints only. |
| FREE (auth) | 100/day | GitHub OAuth. Forever free. |
| PRO | 10K/day | Stripe checkout coming soon. |
| SCALE | 100K/day | Stripe checkout coming soon. |
◉ Handle 429 by sleeping until X-RateLimit-Reset. Our Python + Node recipes do this automatically.
| 400 | Bad Request | Invalid query params or body |
| 401 | Unauthorized | Bad or missing API key (for protected endpoints) |
| 403 | Forbidden | Plan limit reached (max webhooks, etc.) |
| 404 | Not Found | Resource ID doesn't exist |
| 413 | Payload Too Large | Request body exceeded 32KB |
| 429 | Too Many Requests | Rate limit or cooldown hit — check Retry-After |
| 500 | Server Error | Our bad. Retry with backoff. |
| 502 | Bad Gateway | Webhook endpoint returned non-2xx |
All errors return JSON: { "error": "human-readable message" }
Hosted API covers 99% of use cases. For regulated industries (finance, healthcare, govt) that can't call external APIs: our Enterprise plan ships a containerized deployment into your own VPC or on-prem. Same API contract. Contact hello@fundedapi.com.