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.unicornprivate.com. All responses are JSON in UTF-8.
Quickstart · Authentication · Plans and limits · Errors · Endpoints · Webhooks · Widget · Daily exports · Data and sources · OpenAPI
Quickstart
- Choose a plan on the pricing page (paid plans: 14-day trial with card on Stripe, converting automatically into the paid plan unless cancelled), or sign in with an email link and activate the Start plan ($0/month, no card, business email address required) from the dashboard.
- Open the dashboard and create an API key (
ud_live_...). It is shown once. - Call the API:
curl
curl -s https://data.unicornprivate.com/v1/ipo/calendar \
-H "Authorization: Bearer $UNICORN_DATA_KEY"
JavaScript
const res = await fetch('https://data.unicornprivate.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.unicornprivate.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 |
|---|---|---|---|---|---|
| Start | $0/month, no card | 1,000 | /v1/companies, /v1/ipo/calendar, /v1/usage (no widget) | No | No |
| 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. Over the quota the API answers 429 quota_exceeded on every plan, Start included. The Start plan ($0/month) needs no card: one key per account, 1,000 calls per month on /v1/companies, /v1/ipo/calendar and /v1/usage, no webhooks, exports or widget; wherever you show the data you must show the attribution Data: Unicorn Watch with a link to https://watch.unicorn-club.com/. 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, Start included |
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, Start included |
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, Start included |
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.unicornprivate.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.unicornprivate.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.unicornprivate.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.unicornprivate.com/openapi.json. Import it in Postman, Insomnia or a code generator.