Subscribe
Database/API

Valuation data API

Valuation ratios as JSON over HTTPS. Every endpoint is a plain GET, so anything that can fetch a URL can read the data — a browser, a spreadsheet, a notebook, a scheduled job.

There is a free tier with no key and no account. Paste one of the URLs below into a browser and it returns data immediately; modern browsers format JSON without any tooling.

This page is the reference. For what the API covers, code samples and how it compares with a company-level feed, see the financial data API overview.

The free tier

Try it without an account

These endpoints need no key. They carry a subset of the ticker universe and a handful of period-end snapshots rather than the full history — enough to write and test code against.

https://siblisresearch.com/api/v1/indices
https://siblisresearch.com/api/v1/NDX/pe-trailing
https://siblisresearch.com/api/v1/UKX/pe-trailing
https://siblisresearch.com/api/v1/DAX/pe-forward
https://siblisresearch.com/api/v1/N225/cape

/indices lists the tickers the free tier carries and /dates lists exactly which dates it returns. The response shape is identical to the subscriber API, so code written against the free tier keeps working when a key is added.

The subscriber API

Base URL

All subscriber calls go to:

https://siblisresearch.com/data-api/v1/

Replace the path after /v1/ to reach a different endpoint — /v1/indices, or /v1/NDX/cape.

The direct endpoint at siblisresearch.supabase.co/functions/v1/data-api/v1/ continues to work and returns exactly the same responses, so existing code needs no change. The address above is the one to use in anything new: it is ours, so the backend can move without breaking your code.

Authentication

Your API key is issued on subscription. It starts with sib_ followed by 16 lowercase hex characters. Keep it secret: anyone holding it can spend your daily quota.

Pass it as a header, which is the right choice for scripts and anything running in production:

x-api-key: sib_xxxxxxxxxxxxxxxx

Or as a query parameter, which is convenient for testing in a browser:

?api_key=sib_xxxxxxxxxxxxxxxx

Both produce identical results. The query-parameter form writes your key into browser history, server logs and any URL that gets shared, so it belongs in a scratch window rather than in code.

Rate limits

Every successful response carries the headers X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. The counter resets at 00:00 UTC. Hitting the cap returns a 429 naming the reset time; there is no automatic upcharge and no overage fee.

Endpoints

List the indices

GET /v1/indices

Returns the full ticker universe with metadata. Call this first to see what exists before asking for ratios.

curl -H "x-api-key: $KEY" \
  https://siblisresearch.com/data-api/v1/indices
{
  "indices": [
    { "ticker": "DAX",  "index_name": "DAX Index",       "currency": "Local", "frequency": "daily" },
    { "ticker": "NDX",  "index_name": "NASDAQ 100 Index", "currency": "Local", "frequency": "daily" },
    { "ticker": "FTSE", "index_name": "FTSE 100 Index",   "currency": "Local", "frequency": "daily" }
  ]
}

frequency is either daily, meaning one row per trading day, or monthly, meaning one row per month-end.

One ratio for one index

GET /v1/<TICKER>/<ratio>
URL slugWhat it returns
pe-trailingTrailing twelve-month P/E ratio
pe-forwardForward twelve-month P/E ratio
capeCyclically adjusted P/E
pbPrice-to-book ratio
dividend-yieldTrailing twelve-month dividend yield, as a percentage
ev-ebitdaEnterprise value over EBITDA — a monthly snapshot, not a daily calculation

Not every ratio exists for every index. The Monthly Dashboard is the quickest way to check what a given ticker carries.

Two optional parameters narrow the window: from=YYYY-MM-DD and to=YYYY-MM-DD, both inclusive. They default to the first and last available dates.

curl -H "x-api-key: $KEY" \
  "https://siblisresearch.com/data-api/v1/NDX/cape?from=2020-01-01&to=2024-12-31"
{
  "ticker":     "NDX",
  "index_name": "NASDAQ 100 INDEX",
  "currency":   "USD",
  "frequency":  "daily",
  "ratio":      "cape",
  "data": [
    { "trading_day (EOD)": "2020-01-02", "value": 30.81 },
    { "trading_day (EOD)": "2020-01-03", "value": 30.63 }
  ]
}

The date field is trading_day (EOD) — the exchange trading day the ratio is calculated on, using end-of-day prices. For monthly-frequency indices it is the month-end snapshot date. Where a ratio is not provided for a ticker on a date, value is null.

Statistical aggregates

GET /v1/<TICKER>/<ratio>/stats

Returns the current reading together with the historical distribution: mean, median, standard deviation, minimum, maximum, the 10th, 25th, 75th and 90th percentile breakpoints, and the percentile rank of today's value.

{
  "ticker": "NDX",
  "ratio":  "cape",
  "current": {
    "value":             37.42,
    "trading_day (EOD)": "2025-12-31",
    "percentile_rank":   89.4
  },
  "history": {
    "from":         "1999-12-31",
    "to":           "2025-12-31",
    "observations": 6543,
    "mean":         24.83,
    "median":       24.12,
    "stddev":       6.71,
    "min":          13.32,
    "max":          44.20,
    "percentiles":  { "p10": 17.40, "p25": 20.18, "p75": 28.95, "p90": 33.71 }
  }
}

A percentile_rank of 89.4 means the current value is higher than 89.4% of all historical observations for that ticker and ratio.

Bulk CSV download

GET /v1/<TICKER>/download

Enterprise plans only. Returns a JSON envelope containing a signed URL valid for 60 minutes. Follow that URL to download the complete CSV for the ticker — every ratio, every date. The files are regenerated nightly at 23:30 UTC.

# Step 1 — get the signed URL
curl -H "x-api-key: $KEY" \
  https://siblisresearch.com/data-api/v1/NDX/download

# Step 2 — download the CSV
curl -o NDX.csv "<URL from step 1>"

CSV columns: ticker, trading_day (EOD), frequency, pe_trailing, pe_forward, cape, pb, dividend_yield, ev_ebitda.

Code samples

Python

import requests

BASE = "https://siblisresearch.com/data-api/v1"
KEY  = "sib_xxxxxxxxxxxxxxxx"

def fetch(ticker, ratio, from_=None, to=None):
    params = {}
    if from_: params["from"] = from_
    if to:    params["to"]   = to
    r = requests.get(f"{BASE}/{ticker}/{ratio}",
                     headers={"x-api-key": KEY},
                     params=params, timeout=30)
    r.raise_for_status()
    return r.json()["data"]

for row in fetch("NDX", "cape", from_="2020-01-01"):
    print(row["trading_day (EOD)"], row["value"])

JavaScript

const BASE = "https://siblisresearch.com/data-api/v1";
const KEY  = "sib_xxxxxxxxxxxxxxxx";

async function fetchRatio(ticker, ratio, from, to) {
  const url = new URL(`${BASE}/${ticker}/${ratio}`);
  if (from) url.searchParams.set("from", from);
  if (to)   url.searchParams.set("to",   to);
  const res = await fetch(url, { headers: { "x-api-key": KEY } });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  return (await res.json()).data;
}

Excel — Power Query

Data → From Web, and paste a URL carrying the key as a query parameter. Excel parses the JSON automatically; expand the data list into rows.

https://siblisresearch.com/data-api/v1/NDX/cape?from=2020-01-01&api_key=sib_xxxxxxxxxxxxxxxx

Google Sheets

=IMPORTDATA("https://siblisresearch.com/data-api/v1/NDX/cape?api_key=sib_xxxxxxxxxxxxxxxx")

IMPORTDATA returns the raw JSON in a single cell. For a proper table, use Apps Script or a JSON-parsing add-on.

Errors

Every error returns a JSON body with a code and a human-readable message.

HTTPCodeWhen it happens
400unknown_ratioThe ratio in the URL is not one of the six listed above
401unauthorizedMissing key, or the key is not recognised
403plan_restrictionYour plan does not include that endpoint
404unknown_tickerThe ticker does not exist — call /v1/indices
404ratio_unavailable_for_tickerThe ratio is not provided for that ticker
429rate_limit_exceededDaily call limit reached. Resets at 00:00 UTC
500server_errorUnexpected. Email support with the timestamp
{
  "error":    "rate_limit_exceeded",
  "message":  "Daily call limit of 1000 reached.",
  "reset_at": "2026-06-12T00:00:00Z"
}

Data semantics

Three things worth knowing before you build against it

End-of-day prices, end-of-month fundamentals. Trailing P/E, forward P/E, CAPE, price to book and dividend yield are calculated daily for daily-frequency indices, using the end-of-day index price and the most recent monthly fundamentals snapshot. That snapshot carries forward across every trading day until the next one lands, so intra-month movement in these ratios is price movement.

EV/EBITDA is a monthly snapshot. It is uploaded each month rather than calculated daily, and the same value carries across every trading day until the next month's snapshot.

Trading-day calendars vary by index. December 30 may be the last trading day in one market and December 31 in another. The API returns each ticker's actual last trading day for the month rather than forcing a common calendar.

Figures are point-in-time: if a company later restates its results, the historic reading is left as it was first published.

Support

The API guide is this page as a PDF, with the same endpoints, limits and samples — useful to keep next to the code.

Technical questions about the API go to support@siblisresearch.com. Include the exact request you ran and we will look into it.

Get a key

Every plan carries full API access and the complete history.

Pro

One analyst, the whole database.

$768/year

One payment a year — works out at $64 a month

  • 1 user
  • 1,000 API requests a day
  • Monthly Dashboard (Excel)
  • Complete history, back to 1970 on the longest series
  • Full API access, every trading day
  • Statistical aggregates endpoint
  • Priority support
Start annual subscription

Enterprise

A team, plus bulk delivery.

$3,840/year

One payment a year — works out at $320 a month

  • Up to 5 users
  • 50,000 API requests a day
  • Monthly Dashboard (Excel)
  • Complete history, back to 1970 on the longest series
  • Full API access, every trading day
  • Statistical aggregates endpoint
  • Bulk CSV download
  • Priority support
Start annual subscription

Custom

More seats, redistribution rights, or something the standard plans do not cover.

By quote

Usually a reply within one business day

  • 5+ users
  • Negotiable rate limits
  • Everything in Enterprise
  • Custom index coverage
  • Alternative file formats
  • Redistribution and white-label licensing (valuations data)
Ask for a quote

30-day money-back guarantee on everything here. Subscriptions can be cancelled or paused at any time — no hidden fees.