Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sacra.com/llms.txt

Use this file to discover all available pages before exploring further.

Every company profile returned by /api/v1/companies/ includes a company_datasets array — chart-ready time series data you can plot directly. Each dataset is a named series of {x, y} points covering revenue, valuation, fundraising, and share price history. This guide walks through a real response (Kraken) to show how the data is structured and how to turn it into charts.

When to use company_datasets

Use caseBest option
Drop-in chart with no custom UIEmbed endpoints
Chart-ready time series for custom chartscompany_datasets on /api/v1/companies/
Granular metrics with citations/api/v1/metrics/
Funding round details/api/v1/events/
company_datasets is the sweet spot when you want to build your own charts without having to aggregate raw metric rows yourself. The data comes pre-aggregated and sorted chronologically.

Fetch company datasets

Request Kraken’s company profile:
curl -H "Authorization: Token YOUR_API_KEY" \
  "https://sacra.com/api/v1/companies/?company_domain=kraken.com"
The company_datasets array lives inside the company object alongside financials, documents, and other fields:
{
  "company": {
    "id": 239,
    "name": "Kraken",
    "domain": "kraken.com",
    "financials": [ ... ],
    "company_datasets": [
      {
        "id": "0fcc2ca9-ba40-4301-95e6-807341de19dc",
        "name": "Kraken: Revenue ($M)",
        "data_type": "Revenue",
        "metric": "USD",
        "frequency": "Year",
        "x_label": "Time",
        "y_label": "Revenue",
        "data": [
          { "x": "2022-12-31T00:00:00.000Z", "y": 1010000000, "type": "historical" },
          { "x": "2023-12-31T00:00:00.000Z", "y": 696300000, "type": "historical" },
          { "x": "2024-12-31T00:00:00.000Z", "y": 1658800000, "type": "historical" },
          { "x": "2025-12-31T00:00:00.000Z", "y": 2204000000, "type": "historical" }
        ],
        "source_type": "Google Sheets",
        "start_date": "2022-12-31T00:00:00Z",
        "end_date": "2025-12-31T00:00:00Z"
      },
      ...
    ]
  }
}
A single company can have multiple datasets spanning different data types.

Dataset object reference

Each object in company_datasets has these fields:
FieldTypeDescription
idstringUnique dataset identifier (UUID)
namestringHuman-readable label, e.g. "Kraken: Revenue ($M)"
data_typestringWhat the dataset measures (see dataset types below)
metricstringUnit — "USD" or "Percent"
frequencystringGranularity — "Year" or "Month"
x_labelstringSuggested x-axis label
y_labelstringSuggested y-axis label
dataarrayArray of data points (see below)
source_typestringData provenance — "Google Sheets", "Filing", "AI Search"
source_urlstringLink to the underlying source
start_datestringEarliest data point date
end_datestringLatest data point date
statusstring"Active" for live datasets
created_atstringWhen the dataset was first created
updated_atstringWhen the dataset was last modified
companynumberCompany ID

Data points

Each entry in the data array has this shape:
{
  "x": "2024-12-31T00:00:00.000Z",
  "y": 1658800000,
  "type": "historical",
  "meta": { ... }
}
FieldTypeDescription
xstringISO 8601 timestamp — the date for this data point
ynumberThe value — raw numeric, no pre-formatting
typestring"historical" for observed data
metaobject | nullOptional metadata that varies by dataset type
y values are always raw numbers. Revenue of 1.66Bisreturnedas1658800000,not1658.8or"1.66B is returned as `1658800000`, not `1658.8` or `"1.66B”`. Format values for display in your UI.
Date conventions for revenue data points follow the same rules described in the Revenue concepts page: December 31 dates are full-year figures, any other month-end date is year-to-date.

Dataset types

Here are the dataset types you’ll find in company_datasets, illustrated with Kraken’s data:

Revenue

Annual or year-to-date revenue figures in USD.
{
  "data_type": "Revenue",
  "metric": "USD",
  "data": [
    { "x": "2022-12-31T00:00:00.000Z", "y": 1010000000, "type": "historical" },
    { "x": "2023-12-31T00:00:00.000Z", "y": 696300000, "type": "historical" },
    { "x": "2024-12-31T00:00:00.000Z", "y": 1658800000, "type": "historical" },
    { "x": "2025-12-31T00:00:00.000Z", "y": 2204000000, "type": "historical" }
  ]
}

Revenue Growth Rate

Year-over-year revenue growth as a decimal. A value of 1.38 means 138% growth, -0.28 means a 28% decline.
{
  "data_type": "Revenue Growth Rate",
  "metric": "Percent",
  "data": [
    { "x": "2023-12-31T00:00:00.000Z", "y": -0.2796, "type": "historical" },
    { "x": "2024-12-31T00:00:00.000Z", "y": 1.3823, "type": "historical" },
    { "x": "2025-12-31T00:00:00.000Z", "y": 0.3287, "type": "historical" }
  ]
}
Growth rates are decimals, not percentages. Multiply by 100 for display: (y * 100).toFixed(1) + "%".

Valuation

Company valuation at each funding event. The meta object identifies the specific round.
{
  "data_type": "Valuation",
  "metric": "USD",
  "data": [
    {
      "x": "2019-06-25T00:00:00.000Z",
      "y": 4000000000,
      "type": "historical",
      "meta": {
        "name": "Growth 2019",
        "status": "closed",
        "event_id": "fr_ded4bbd8-86e5-4748-afa7-5cde4961a91a",
        "event_type": "funding_round",
        "event_subtype": "growth"
      }
    },
    {
      "x": "2025-07-29T00:00:00.000Z",
      "y": 15000000000,
      "type": "historical",
      "meta": {
        "name": "Series C 2025",
        "status": "closed",
        "event_id": "fr_982c6a4f-6d6b-4a1e-97c8-53351cf67ccb",
        "event_type": "funding_round",
        "event_subtype": "series_c"
      }
    }
  ]
}

Amount Raised

Total capital raised per year, aggregated across all rounds in that year. The meta object includes the aggregation method and number of events.
{
  "data_type": "Amount Raised",
  "metric": "USD",
  "data": [
    {
      "x": "2014-12-31T00:00:00.000Z",
      "y": 5000000,
      "type": "historical",
      "meta": { "year": 2014, "aggregation": "annual_sum", "event_count": 1 }
    },
    {
      "x": "2025-12-31T00:00:00.000Z",
      "y": 1000000000,
      "type": "historical",
      "meta": { "year": 2025, "aggregation": "annual_sum", "event_count": 2 }
    }
  ]
}

Price per Share

Share price at each funding round. The meta object links back to the specific event.
{
  "data_type": "Price per Share",
  "metric": "USD",
  "data": [
    {
      "x": "2013-01-31T00:00:00.000Z",
      "y": 0.03,
      "type": "historical",
      "meta": { "name": "Seed 2013", "event_subtype": "seed" }
    },
    {
      "x": "2025-09-25T00:00:00.000Z",
      "y": 61.47,
      "type": "historical",
      "meta": { "name": "Growth (2025)", "event_subtype": "growth" }
    }
  ]
}

Issue Price

Similar to Price per Share but sourced from filings. May contain the same values with different provenance.
{
  "data_type": "Issue Price",
  "metric": "USD",
  "data": [
    { "x": "2013-01-31T00:00:00.000Z", "y": 0.03, "type": "historical" },
    { "x": "2025-11-21T00:00:00.000Z", "y": 61.47, "type": "historical" }
  ]
}

Filtering datasets by type

To find a specific dataset, filter the array by data_type:
const datasets = company.company_datasets;

const revenue = datasets.find(d => d.data_type === "Revenue");
const growth = datasets.find(d => d.data_type === "Revenue Growth Rate");
const valuation = datasets.find(d => d.data_type === "Valuation");
const raised = datasets.find(d => d.data_type === "Amount Raised");
const sharePrice = datasets.find(d => d.data_type === "Price per Share");
Not every company will have every dataset type. Always check that the dataset exists before accessing its data.

Example: revenue chart

This React component fetches a company and renders a revenue bar chart using Recharts.
import { useState, useEffect } from "react";
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from "recharts";

function RevenueChart({ domain }) {
  const [chartData, setChartData] = useState(null);

  useEffect(() => {
    fetch(`/api/sacra/company?domain=${domain}`)
      .then((res) => res.json())
      .then(({ company }) => {
        const dataset = company.company_datasets.find(
          (d) => d.data_type === "Revenue"
        );
        if (!dataset) return;

        setChartData(
          dataset.data.map((point) => ({
            year: new Date(point.x).getFullYear(),
            revenue: point.y,
          }))
        );
      });
  }, [domain]);

  if (!chartData) return <div>Loading...</div>;

  const formatUSD = (value) =>
    `$${(value / 1e9).toFixed(1)}B`;

  return (
    <ResponsiveContainer width="100%" height={400}>
      <BarChart data={chartData}>
        <XAxis dataKey="year" />
        <YAxis tickFormatter={formatUSD} />
        <Tooltip formatter={(value) => formatUSD(value)} />
        <Bar dataKey="revenue" fill="#E8B84B" />
      </BarChart>
    </ResponsiveContainer>
  );
}
This renders a bar chart showing Kraken’s annual revenue from 2022 through 2025, with values formatted as billions.

Example: valuation timeline

Valuation datasets include meta with the funding round name, which you can use as data point labels.
import { useState, useEffect } from "react";
import {
  LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer,
  LabelList,
} from "recharts";

function ValuationTimeline({ domain }) {
  const [chartData, setChartData] = useState(null);

  useEffect(() => {
    fetch(`/api/sacra/company?domain=${domain}`)
      .then((res) => res.json())
      .then(({ company }) => {
        const dataset = company.company_datasets.find(
          (d) => d.data_type === "Valuation"
        );
        if (!dataset) return;

        setChartData(
          dataset.data.map((point) => ({
            date: new Date(point.x).toLocaleDateString("en-US", {
              year: "numeric",
              month: "short",
            }),
            valuation: point.y,
            label: point.meta?.name || "",
          }))
        );
      });
  }, [domain]);

  if (!chartData) return <div>Loading...</div>;

  const formatUSD = (value) =>
    `$${(value / 1e9).toFixed(0)}B`;

  return (
    <ResponsiveContainer width="100%" height={400}>
      <LineChart data={chartData}>
        <XAxis dataKey="date" />
        <YAxis tickFormatter={formatUSD} />
        <Tooltip formatter={(value) => formatUSD(value)} />
        <Line type="monotone" dataKey="valuation" stroke="#E8B84B" strokeWidth={2}>
          <LabelList dataKey="label" position="top" />
        </Line>
      </LineChart>
    </ResponsiveContainer>
  );
}
For Kraken, this plots two points: Growth 2019 (4B)andSeriesC2025(4B) and Series C 2025 (15B), each labeled with the round name from meta.

Example: fundraising history table

For fundraising data, a table is often more useful than a chart since the Amount Raised dataset is aggregated annually while Price per Share is per-round.
function FundraisingHistory({ company }) {
  const raised = company.company_datasets.find(
    (d) => d.data_type === "Amount Raised"
  );
  const sharePrice = company.company_datasets.find(
    (d) => d.data_type === "Price per Share"
  );

  const formatUSD = (value) => {
    if (value >= 1e9) return `$${(value / 1e9).toFixed(1)}B`;
    if (value >= 1e6) return `$${(value / 1e6).toFixed(1)}M`;
    return `$${value.toFixed(2)}`;
  };

  return (
    <div>
      {raised && (
        <table>
          <thead>
            <tr>
              <th>Year</th>
              <th>Amount Raised</th>
              <th>Rounds</th>
            </tr>
          </thead>
          <tbody>
            {raised.data.map((point) => (
              <tr key={point.x}>
                <td>{point.meta?.year ?? new Date(point.x).getFullYear()}</td>
                <td>{formatUSD(point.y)}</td>
                <td>{point.meta?.event_count ?? "—"}</td>
              </tr>
            ))}
          </tbody>
        </table>
      )}

      {sharePrice && (
        <table>
          <thead>
            <tr>
              <th>Date</th>
              <th>Round</th>
              <th>Price per Share</th>
            </tr>
          </thead>
          <tbody>
            {sharePrice.data.map((point) => (
              <tr key={point.x}>
                <td>
                  {new Date(point.x).toLocaleDateString("en-US", {
                    year: "numeric",
                    month: "short",
                  })}
                </td>
                <td>{point.meta?.name || "—"}</td>
                <td>{formatUSD(point.y)}</td>
              </tr>
            ))}
          </tbody>
        </table>
      )}
    </div>
  );
}
For Kraken, the share price table shows the progression from 0.03atSeed(2013)to0.03 at Seed (2013) to 61.47 at the Growth round (2025) — a ~2,000x increase.

Tips

  • Values are raw numbers. Revenue of $2.2B is returned as 2204000000. Always format for display.
  • Growth rates are decimals. A y of 1.38 on a Revenue Growth Rate dataset means 138% growth. Multiply by 100 for percentage display.
  • Not every company has every dataset type. Always check that find() returns a result before accessing .data.
  • Date conventions matter. December 31 dates are full-year figures; other month-end dates are year-to-date. See the Revenue concepts page for details.
  • meta varies by dataset type. Valuation and Price per Share datasets include funding round details (name, event_subtype, event_id). Amount Raised includes aggregation info (year, event_count). Revenue datasets typically have no meta.
  • Use /events/ for richer funding data. If you need investor names, round details, or secondary transactions beyond what meta provides, query the /api/v1/events/ endpoint.
  • Use /metrics/ for citations. Datasets don’t include citation sources. If you need to show where a revenue figure came from, use /api/v1/metrics/ which returns full citation chains.