The CEORater API

Free, and there is no key to request. The same CEO records the site runs on — tenure, total stock return, the S&P 500's return over that same tenure, and compensation — available to any script, agent or terminal.

One request, no signup

curl https://api.ceorater.com/api/v1/ceo/NVDA
{ "ticker": "NVDA", "count": 1, "items": [ { "ticker": "NVDA", "company": "NVIDIA", "ceo": "Jensen Huang", "founder": true, "sector": "Information Technology", "industry": "Semiconductors", "tenure_years": 27.6, "total_return_pct": 545800, "spy_return_pct": 892, "compensation_musd": 36.3 } ] }

No Authorization header, no account, no rate-limit tier to choose. If you can reach the internet you can query it.

Every endpoint below hangs off one base URL:

https://api.ceorater.com

Copy one of these

Every command below was run against the live API before this page was published, and the output shown underneath is what it actually printed.

macOS and Linux — Terminal

curl -s https://api.ceorater.com/api/v1/ceo/NVDA
{"ticker":"NVDA","count":1,"items":[{"ticker":"NVDA","company":"NVIDIA", "ceo":"Jensen Huang","founder":true,"sector":"Information Technology", "industry":"Semiconductors","tenure_years":27.6,"total_return_pct":545800, "spy_return_pct":892,"compensation_musd":36.3}]}

Readable, if you have jq:

curl -s https://api.ceorater.com/api/v1/ceo/NVDA | jq .items[0]

Windows — PowerShell

Add .items. A bare Invoke-RestMethod prints the wrapper and collapses the CEO record to {@{ticker=NVDA; company=NVIDIA…, truncated. You will see no returns, no tenure and no compensation.

(Invoke-RestMethod https://api.ceorater.com/api/v1/ceo/NVDA).items | Format-List
ticker : NVDA company : NVIDIA ceo : Jensen Huang founder : True sector : Technology industry : Semiconductors tenure_years : 27.6 total_return_pct : 545800 spy_return_pct : 892 compensation_musd : 36.3

Many CEOs as a table. Naming the columns keeps it inside the console width:

(Invoke-RestMethod "https://api.ceorater.com/api/v1/ceos").items | Format-Table ticker, ceo, tenure_years, total_return_pct, spy_return_pct, compensation_musd -AutoSize
ticker ceo tenure_years total_return_pct spy_return_pct compensation_musd ------ --- ------------ ---------------- -------------- ----------------- A Padraig McDonnell 2.4 4 55 12.8 AAPL John Ternus 0 0 -1 58 ABBV Robert A. Michael 2.2 58 42 32.5

Every CEO, every field. This is the one that never depends on your window size — each CEO prints as a block, so nothing is ever cut off:

(Invoke-RestMethod "https://api.ceorater.com/api/v1/ceos").items | Format-List
ticker : A company : Agilent Technologies ceo : Padraig McDonnell founder : False sector : Health Care industry : Life Sciences Tools & Services tenure_years : 2.4 total_return_pct : 4 spy_return_pct : 55 compensation_musd : 12.8 ticker : AAPL company : Apple Inc. ...and so on, for all 513.

The same 513 in a sortable window instead of the console:

(Invoke-RestMethod "https://api.ceorater.com/api/v1/ceos").items | Out-GridView

Or straight into Excel — all 513 rows, all ten columns:

(Invoke-RestMethod "https://api.ceorater.com/api/v1/ceos").items | Export-Csv "$env:USERPROFILE\Downloads\ceorater.csv" -NoTypeInformation

Windows — Command Prompt

curl.exe -s https://api.ceorater.com/api/v1/ceo/NVDA

Use curl.exe, not curl. In PowerShell, curl is an alias for Invoke-WebRequest and takes different arguments.

Python

import requests r = requests.get("https://api.ceorater.com/api/v1/ceo/NVDA") for c in r.json()["items"]: for field, value in c.items(): print(f"{field:18} {value}")
ticker NVDA company NVIDIA ceo Jensen Huang founder True sector Technology industry Semiconductors tenure_years 27.6 total_return_pct 545800 spy_return_pct 892 compensation_musd 36.3

JavaScript — browser or Node

const r = await fetch("https://api.ceorater.com/api/v1/search?q=founder"); const { items } = await r.json(); console.table(items);

The API sends Access-Control-Allow-Origin: *, so this runs from a page on any domain.

Filtering by sector or industry

Exact match, case-insensitive, and they combine.

curl -s "https://api.ceorater.com/api/v1/ceos?sector=Energy" curl -s "https://api.ceorater.com/api/v1/ceos?industry=Semiconductors" curl -s "https://api.ceorater.com/api/v1/ceos?sector=Information%20Technology&founder=true"

The vocabulary itself, so nothing has to be guessed:

curl -s https://api.ceorater.com/api/v1/sectors
{"standard":"GICS, as published by S&P for the S&P 500","count":11, "items":[{"sector":"Industrials","companies":80}, {"sector":"Financials","companies":78}, {"sector":"Information Technology","companies":77}, {"sector":"Health Care","companies":60}, ... ]}

In PowerShell:

(Invoke-RestMethod "https://api.ceorater.com/api/v1/ceos?sector=Energy").items | Sort-Object total_return_pct -Descending | Format-Table ticker, ceo, industry, total_return_pct -AutoSize
ticker ceo industry total_return_pct ------ --- -------- ---------------- TPL Tyler Glover Oil & Gas Exploration & Production 1324 TRGP Matthew J. Meloy Oil & Gas Storage & Transportation 915 COP Ryan M. Lance Oil & Gas Exploration & Production 286 EQT Toby Z. Rice Oil & Gas Exploration & Production 268

Download the whole dataset

No parameters needed — /ceos returns all 513. One request beats 513.

curl -s https://api.ceorater.com/api/v1/ceos -o ceorater.json

The same numbers the site shows

Every value is exactly what www.ceorater.com prints for that CEO, rounded the same way. Jensen Huang's row reads 545,800% on the site, and total_return_pct is 545800. Nothing to convert, nothing to scale.

FieldAPI returnsSite displays
total_return_pct545800545,800%
spy_return_pct892892%
tenure_years27.627.6 yrs
compensation_musd36.3$36.3M

Fields ending _pct are already percentages. Compensation is in millions of US dollars.

Four routes

GET/api/v1/ceos

Every CEO — all 513 — with no parameters at all. Optional ?limit= and ?offset= page through instead. Filter with ?sector=, ?industry= or ?founder=true, which are exact, case-insensitive and combinable. Returns total, offset, limit, filters and items.

GET/api/v1/ceo/:ticker

One company. Case-insensitive. Returns ticker, count and items — always an array, for the reason below.

GET/api/v1/search?q=

Substring match across company, ticker, sector, industry and CEO name. Loose by design — q=Technology also matches Align Technology and every Biotechnology company. For an exact sector or industry, use the filters on /ceos instead.

GET/api/v1/sectors

The 11 GICS sectors with the number of companies in each. Use it to build a filter rather than guess at spellings.

GET/api/v1/industries

All 128 GICS sub-industries, each with its parent sector and company count. ?sector= narrows it to one sector.

GET/api/v1/meta

Record count, the field list, and when the data was last refreshed. Cheap to poll if you want to know whether anything has changed.

Ten fields, and only ten

These are exactly the columns www.ceorater.com displays. The API deliberately publishes nothing the site does not show.

FieldMeaning
tickerstringExchange ticker symbol.
companystringRegistrant name as filed.
ceostringChief executive. Co-CEOs are carried as separate records.
founderbooleanWhether this CEO founded the company.
sectorstringSector classification.
industrystringIndustry classification.
tenure_yearsnumber, 1 decimalYears in the role.
total_return_pctnumber, percentTotal stock return across the tenure. 147 means +147%.
spy_return_pctnumber, percentThe S&P 500's return over that same period, so a CEO's record can be read against the market they ran in.
compensation_musdnumber, 1 decimalReported CEO compensation, in millions of USD.

A field may be null where the underlying figure has not been reported.

A ticker can return two people

Oracle, KKR, Globe Life, Lululemon and Netflix each run a co-CEO structure, and each executive gets their own record with their own start date. Netflix is the clearest case: Ted Sarandos and Greg Peters were appointed years apart, so their tenures and their returns genuinely differ.

/api/v1/ceo/:ticker therefore always returns items as an array, even when it holds one person. Your code never has to branch on the shape.

Sectors and industries are S&P's, not a vendor's

Every company carries its GICS sector and sub-industry — the same classification S&P publishes for the S&P 500 — matched company by company on SEC CIK rather than on ticker, because tickers get reassigned and CIKs do not.

That means exactly 11 sectors and 128 sub-industries, with no second spelling of anything. Both fields are constrained at the source, so a new value cannot be invented by accident.

Companies no longer in the index — ASML, Shopify, Atlassian and others — are classified into the same GICS vocabulary so a filter never returns a partial answer.

How current the data is

Records are refreshed on a fifteen-minute cycle. /api/v1/meta reports last_updated and cache_age_seconds so you can see exactly how old the response you just received is.

Requests are limited to 100 per fifteen minutes per IP address. Responses carry RateLimit-Limit and RateLimit-Remaining headers. If you need the whole dataset, one call to /api/v1/ceos returns all 513 and is far kinder than 513 lookups.

What failure looks like

{ "error": "No CEO found for ticker ZZZZ", "code": "NOT_FOUND" }

An empty result is never returned as a success. If CEORater cannot load its data you will get a 503, not a 200 with an empty list — so your code can tell "no data" apart from "no matches".

Terms

The API is free to use, including commercially. Attribution to CEORater is appreciated but not required. It is offered as-is with no uptime guarantee — if you are building something that depends on it, cache your own copy.

CEORater publishes reported figures and makes no investment recommendations. See the Terms of Service.