Unicorn Data API v1
Private market and IPO data over HTTPS: the largest private companies with reported valuations (each with date and source), funding rounds, SEC filings, IPO pipeline and calendar, lock-ups and aggregate community forecasts. Base URL https://data.unicorn-club.com. All responses are JSON in UTF-8.
Quickstart · Authentication · Plans and limits · Errors · Endpoints · Webhooks · Widget · Daily exports · Data and sources · OpenAPI · Disclaimer
Quickstart
- Choose a plan on the pricing page (14-day trial with card).
- Open the dashboard and create an API key (
ud_live_...). It is shown once. - Call the API:
curl
curl -s https://data.unicorn-club.com/v1/ipo/calendar \
-H "Authorization: Bearer $UNICORN_DATA_KEY"
JavaScript
const res = await fetch('https://data.unicorn-club.com/v1/companies?limit=10', {
headers: { Authorization: 'Bearer ' + process.env.UNICORN_DATA_KEY },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { data, meta } = await res.json();
for (const c of data) console.log(c.name, c.valuationUsdBn, c.valuationDate, c.sourceName);
Python
import os, requests
r = requests.get("https://data.unicorn-club.com/v1/events",
params={"since": "2026-10-01T00:00:00Z", "type": "filing,round"},
headers={"Authorization": f"Bearer {os.environ['UNICORN_DATA_KEY']}"},
timeout=20)
r.raise_for_status()
for e in r.json()["data"]:
print(e["date"], e["companyName"], e["type"], e["title"], e["sourceUrl"])
Authentication
Send your key in the Authorization: Bearer ud_live_... header. Keys are stored only as a hash: if you lose it, rotate it from the dashboard (the old key stops working immediately). Never put the API key in a web page: for websites use the widget and its public key. CORS is open (Access-Control-Allow-Origin: *) for server and widget use.
Plans and limits
| Plan | Price | Calls per month | API | Webhooks | Exports |
|---|---|---|---|---|---|
| Widget | $99/month or $990/year | 10,000 | /v1/companies, /v1/ipo/calendar, /v1/usage, widget | No | No |
| Pro | $499/month or $4,990/year | 250,000 | All endpoints | Yes | No |
| Business | $1,999/month or $19,990/year | 2,000,000 | All endpoints | Yes | Yes |
The annual price includes 2 months. Quotas reset on the 1st of each month (UTC). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix time). Widget loads count as calls. Business includes a license to redistribute the data inside your customers' apps with the attribution Data: Unicorn Watch (see terms).
Errors
Errors use HTTP status codes and a JSON body: {"error": {"code": "...", "message": "...", "status": 401, "docs": "..."}}.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter, invalid_json, invalid_url | Check the parameter named in the message. |
| 401 | invalid_api_key, invalid_widget_key | Missing, wrong or rotated key. |
| 402 | subscription_inactive | No active plan: renew it from the dashboard. |
| 403 | plan_upgrade_required, domain_not_allowed | Endpoint not in your plan, or widget used on a domain not allowed. |
| 404 | not_found, company_not_found, export_not_found | Unknown path or id. |
| 429 | quota_exceeded | Monthly quota reached; see resetAt. |
| 503 | data_unavailable | Temporary; retry with backoff and check status. |
Endpoints
Every list response is {"data": [...], "meta": {...}}. meta.note repeats that valuations are reported figures, not market prices; meta.attribution is the attribution to show when you display the data. Add ?lang=xx (en it fr de es pt ru zh ja hi ko tr id ar vi pl) to translate sectors, countries, notes and event titles.
| Method and path | Description | Plans |
|---|---|---|
GET /v1/companies | Tracked companies ordered by reported valuation. Filters: sector, country, ipo_status, q, limit (max 200), offset. | All |
GET /v1/companies/{id} | Profile, full valuation history with source, events, IPO details, aggregate community forecast. | Pro, Business |
GET /v1/events | Events recorded after since (ISO 8601; default 30 days). Filters: type (round, valuation, secondary, ipo, filing, news), company, limit (max 1000). Poll with since=meta.nextSince. | Pro, Business |
GET /v1/ipo/calendar | IPOs in the last 90 days and upcoming, with stage, date and lock-up. | All |
GET /v1/ipo/pipeline | Companies by IPO stage: rumored (press reports), confidential, public_filing (S-1/F-1), priced; meta.stages has the counts. | Pro, Business |
GET /v1/lockups | Lock-up end dates, with upcoming. | Pro, Business |
GET /v1/forecasts | Aggregate community forecasts per company: median expected IPO month and value, quartiles, share within 12 months. Shown only from 5 votes; individual votes are never shared. | Pro, Business |
GET /v1/usage | Calls used this month and limit (not counted). | All |
GET/POST /v1/webhooks, DELETE /v1/webhooks/{id}, POST /v1/webhooks/{id}/test | Manage webhook endpoints. | Pro, Business |
GET /v1/exports, /v1/exports/{day}.json, /v1/exports/{day}/{table}.csv | Daily files; day is YYYY-MM-DD or latest; tables: companies, valuations, events. | Business |
GET /v1/status | Service status, no key. | Public |
Example: company profile
curl -s https://data.unicorn-club.com/v1/companies/anthropic -H "Authorization: Bearer $UNICORN_DATA_KEY"
{
"data": {
"id": "anthropic", "name": "Anthropic", "sector": "Artificial intelligence", "country": "United States",
"valuationUsdBn": 965, "valuationDate": "2026-05", "valuationKind": "round",
"sourceName": "...", "sourceUrl": "https://...",
"ipo": { "status": "public_filing", "date": "...", "sourceUrl": "https://...", "lockupEnd": null },
"history": [ { "date": "2026-05", "valuationUsdBn": 965, "kind": "round", "sourceName": "...", "sourceUrl": "https://..." } ],
"events": [ { "type": "filing", "date": "2026-10-26", "title": "...", "sourceUrl": "https://www.sec.gov/..." } ],
"community": { "votes": 0, "enough": false, "minVotes": 5 }
},
"meta": { "note": "Reported valuations ...", "attribution": { "text": "Data: Unicorn Watch", "url": "https://watch.unicorn-club.com/?src=data-api" } }
}
The values above show the shape of the response; read the live figures, each with its own date and source, from the API.
Webhooks
Add an HTTPS endpoint in the dashboard or with POST /v1/webhooks {"url": "https://...", "types": ["filing", "round"]} (types are optional). The response contains the signing secret whsec_... once. For every new event we POST:
{
"id": "evt_e_1a2b3c4d5e6f7a8b",
"type": "event.created",
"created": "2026-10-29T10:15:00.000Z",
"data": { "id": "e_...", "companyId": "...", "companyName": "...", "type": "filing", "date": "2026-10-29",
"title": "...", "summary": "...", "sourceName": "SEC EDGAR", "sourceUrl": "https://www.sec.gov/...", "valuationUsdBn": null,
"createdAt": "2026-10-29T10:14:31.000Z" }
}
Headers: Unicorn-Data-Signature: t=<unix>,v1=<signature> and Unicorn-Data-Event-Id. The signature is the hex HMAC SHA-256 of <t>.<raw body> with your secret. Reply 2xx within 10 seconds. Failed deliveries are retried after 1, 5, 30, 120, 360, 720 and 1440 minutes (8 attempts). Deliveries can arrive more than once: deduplicate on id.
Verify in Node.js
import crypto from 'node:crypto';
export function verify(rawBody, header, secret, toleranceSec = 300) {
const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
const t = Number(parts.t);
if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 || ''));
}
Verify in Python
import hmac, hashlib, time
def verify(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
t = int(parts.get("t", "0"))
if not t or abs(time.time() - t) > tolerance:
return False
expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts.get("v1", ""))
Widget
One line of script, no API key in the page: use the public widget key from the dashboard (ud_pub_...) and optionally restrict it to your domains.
<script src="https://data.unicorn-club.com/widget.js" data-key="ud_pub_..." data-view="ipos" data-lang="en" data-theme="auto" data-limit="8" async></script>
| Attribute | Values |
|---|---|
data-view | ipos (upcoming IPOs) or largest (largest private companies) |
data-theme | light, dark, auto (follows the visitor's system) |
data-lang | en it fr de es pt ru zh ja hi ko tr id ar vi pl (Arabic right to left); default: browser language |
data-limit | 1 to 25 rows (default 8) |
The widget shows the attribution Data: Unicorn Watch with a link; it must stay visible (required in the Widget plan). Each load counts as one call.
Daily exports
Business plan: a full snapshot is generated every day at 06:00 UTC and kept for 90 days. JSON: companies with full valuation history, IPO calendar, events of the last 12 months. CSV: companies, valuations, events.
curl -s -o companies.csv https://data.unicorn-club.com/v1/exports/latest/companies.csv -H "Authorization: Bearer $UNICORN_DATA_KEY"
Data and sources
The data comes from Unicorn Watch (watch.unicorn-club.com): company announcements, SEC EDGAR filings (checked every 15 minutes) and press reports, each figure with its date and a link to the public source. Valuations are reported figures (latest round, press estimates or indicative secondary prices), not market prices. Community forecasts are aggregate statistics only. The data is information, not investment advice, and is provided without warranty; see the terms and data license.
OpenAPI
OpenAPI 3.1 specification: https://data.unicorn-club.com/openapi.json. Import it in Postman, Insomnia or a code generator.
Disclaimer
Information is provided for informational purposes only, as is, based on public sources as of the date shown. Unicorn Private LLC assumes no legal responsibility for the accuracy, completeness or timeliness of the information.
Responses that return data (companies, events, IPO calendar and pipeline, lock-ups, forecasts, exports list), the widget data and the daily JSON export carry this text in the top level disclaimer field, in the language of the lang parameter (16 languages). The widget shows a short link to it. See section 4 of the Terms.