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

  1. 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.
  2. Open the dashboard and create an API key (ud_live_...). It is shown once.
  3. 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

PlanPriceCalls per monthAPIWebhooksExports
Start$0/month, no card1,000/v1/companies, /v1/ipo/calendar, /v1/usage (no widget)NoNo
Widget$99/month or $990/year10,000/v1/companies, /v1/ipo/calendar, /v1/usage, widgetNoNo
Pro$499/month or $4,990/year250,000All endpointsYesNo
Business$1,999/month or $19,990/year2,000,000All endpointsYesYes

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": "..."}}.

StatusCodeMeaning
400invalid_parameter, invalid_json, invalid_urlCheck the parameter named in the message.
401invalid_api_key, invalid_widget_keyMissing, wrong or rotated key.
402subscription_inactiveNo active plan: renew it from the dashboard.
403plan_upgrade_required, domain_not_allowedEndpoint not in your plan, or widget used on a domain not allowed.
404not_found, company_not_found, export_not_foundUnknown path or id.
429quota_exceededMonthly quota reached; see resetAt.
503data_unavailableTemporary; 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 pathDescriptionPlans
GET /v1/companiesTracked 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/eventsEvents 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/calendarIPOs in the last 90 days and upcoming, with stage, date and lock-up.All, Start included
GET /v1/ipo/pipelineCompanies by IPO stage: rumored (press reports), confidential, public_filing (S-1/F-1), priced; meta.stages has the counts.Pro, Business
GET /v1/lockupsLock-up end dates, with upcoming.Pro, Business
GET /v1/forecastsAggregate 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/usageCalls used this month and limit (not counted).All, Start included
GET/POST /v1/webhooks, DELETE /v1/webhooks/{id}, POST /v1/webhooks/{id}/testManage webhook endpoints.Pro, Business
GET /v1/exports, /v1/exports/{day}.json, /v1/exports/{day}/{table}.csvDaily files; day is YYYY-MM-DD or latest; tables: companies, valuations, events.Business
GET /v1/statusService 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>
AttributeValues
data-viewipos (upcoming IPOs) or largest (largest private companies)
data-themelight, dark, auto (follows the visitor's system)
data-langen it fr de es pt ru zh ja hi ko tr id ar vi pl (Arabic right to left); default: browser language
data-limit1 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.