API Documentation
Cookbook
Ten copy-paste recipes. Each runs on the free tier with your API key.
Recipes
- 1. Screen 42,000 stocks by fundamentals
- 2. DCF valuation in 30 lines
- 3. Portfolio tracker with live quotes
- 4. Summarize earnings calls with an LLM
- 5. AI research agent in Claude or Cursor (MCP)
- 6. Congress trading monitor
- 7. Dividend calendar as .ics file
- 8. Insider cluster-buying scanner
- 9. Macro dashboard with pandas
- 10. Google Sheets: =EULERPOOL() formula
Screen 42,000 stocks by fundamentals
PythonFind quality companies: P/E under 20, revenue growing, high AAQS quality score. One call against the screener endpoint, sorted by market cap.
from eulerpool import Eulerpool # pip install eulerpool
client = Eulerpool("eu_prod_...")
results = client.screener.screen(
peRatio_max=20,
revenueGrowth3Y_min=10,
aaqs_min=7,
sort="marketCap",
order="desc",
limit=25,
)
for stock in results:
print(f'{stock["ticker"]:6} {stock["name"][:32]:34} P/E {stock.get("peRatio")}')Endpoints used: Screener
DCF valuation in 30 lines
PythonPull free cash flow history and shares outstanding, project 5 years, discount back. A full discounted-cash-flow model from two endpoints.
from eulerpool import Eulerpool
client = Eulerpool("eu_prod_...")
ISIN = "US0378331005" # Apple
cashflows = client.equity.cashflowstatement(ISIN)
shares = client.equity.shares_outstanding(ISIN)
fcf = [y["freeCashFlow"] for y in cashflows[-5:]] # last 5 years
growth = (fcf[-1] / fcf[0]) ** (1 / len(fcf)) - 1 # historic CAGR
growth = min(growth, 0.15) # cap at 15%
WACC, TERMINAL = 0.09, 0.025
value = 0.0
projected = fcf[-1]
for year in range(1, 6):
projected *= 1 + growth
value += projected / (1 + WACC) ** year
terminal = projected * (1 + TERMINAL) / (WACC - TERMINAL)
value += terminal / (1 + WACC) ** 5
per_share = value / shares[-1]["value"]
print(f"Intrinsic value: \u0024{per_share:,.2f} per share")Endpoints used: Cash Flow Statement
Portfolio tracker with live quotes
JavaScriptValue a portfolio in real time. Fetches quotes for every holding in parallel and prints total value with day change.
import Eulerpool from 'eulerpool'; // npm install eulerpool
const client = new Eulerpool('eu_prod_...');
const holdings = [
{ ticker: 'AAPL', shares: 25 },
{ ticker: 'MSFT', shares: 10 },
{ ticker: 'ASML', shares: 4 },
];
const quotes = await Promise.all(
holdings.map(h => client.equity.quotes(h.ticker)),
);
let total = 0;
for (const [i, h] of holdings.entries()) {
const { price, changePercent } = quotes[i];
total += price * h.shares;
console.log(`${h.ticker.padEnd(6)} ${String(h.shares).padStart(4)} × ${price.toFixed(2)} (${changePercent > 0 ? '+' : ''}${changePercent.toFixed(2)}%)`);
}
console.log('Total:', total.toLocaleString('en-US', { style: 'currency', currency: 'USD' }));Endpoints used: Quotes
Summarize earnings calls with an LLM
PythonFetch the latest earnings-call transcript and have an LLM extract guidance, risks, and tone. The transcript endpoint returns full speaker-level text.
from eulerpool import Eulerpool
from openai import OpenAI # or anthropic
client = Eulerpool("eu_prod_...")
llm = OpenAI()
calls = client.earning_calls.list("AAPL", limit=1)
transcript = client.earning_calls.transcript(calls[0]["id"])
text = "\n".join(f'{t["speaker"]}: {t["text"]}' for t in transcript["segments"])
summary = llm.chat.completions.create(
model="gpt-5",
messages=[{
"role": "user",
"content": "Extract: 1) guidance changes 2) named risks 3) management tone "
f"(bullish/neutral/cautious). Be specific.\n\n{text[:100_000]}",
}],
)
print(summary.choices[0].message.content)Endpoints used: Earning Calls
AI research agent in Claude or Cursor (MCP)
JSONOne config block gives any MCP client — Claude Desktop, Claude Code, Cursor, Windsurf — 250+ financial data tools. Then just ask: "Compare the FCF margins of Apple, Microsoft and Google over 5 years."
{
"mcpServers": {
"eulerpool": {
"url": "https://api.eulerpool.com/mcp",
"headers": {
"Authorization": "Bearer eu_prod_..."
}
}
}
}
// Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json
// Cursor: ~/.cursor/mcp.json
// Claude Code: claude mcp add --transport http eulerpool https://api.eulerpool.com/mcp \
// --header "Authorization: Bearer eu_prod_..."Endpoints used: MCP Server docs
Congress trading monitor
PythonPoliticians disclose trades with up to 45 days delay — but the disclosures are alpha. Pull the latest congressional trades and filter for large purchases.
from eulerpool import Eulerpool
client = Eulerpool("eu_prod_...")
trades = client.alternative.congress_trading(limit=100)
buys = [t for t in trades
if t["type"] == "purchase" and t.get("amountMin", 0) >= 50_000]
for t in buys:
print(f'{t["transactionDate"]} {t["politician"]:28} bought {t["ticker"]:6} '
f'(\u0024{t["amountMin"]:,}+)')Endpoints used: Congress Trading
Dividend calendar as .ics file
PythonExport upcoming ex-dividend dates for your watchlist straight into Google Calendar or Apple Calendar.
from eulerpool import Eulerpool
client = Eulerpool("eu_prod_...")
WATCHLIST = ["US0378331005", "US5949181045", "NL0010273215"]
lines = ["BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//eulerpool//dividends//EN"]
for isin in WATCHLIST:
for div in client.equity.dividends(isin, upcoming=True):
date = div["exDate"].replace("-", "")
lines += [
"BEGIN:VEVENT",
f"DTSTART;VALUE=DATE:{date}",
f"SUMMARY:{div['ticker']} ex-dividend {div['currency']} {div['amount']}",
"END:VEVENT",
]
lines.append("END:VCALENDAR")
with open("dividends.ics", "w") as f:
f.write("\n".join(lines))
print("Wrote dividends.ics — import into any calendar app")Endpoints used: Dividends
Insider cluster-buying scanner
JavaScriptMultiple insiders buying the same stock within days is one of the strongest known signals. Scan recent SEC Form 4 filings for buy clusters.
import Eulerpool from 'eulerpool';
const client = new Eulerpool('eu_prod_...');
const tickers = ['NVDA', 'AMD', 'INTC', 'TSM', 'AVGO'];
const results = await Promise.all(
tickers.map(t => client.equity.insiderTrades(t, { limit: 50 })),
);
for (const [i, trades] of results.entries()) {
const recentBuys = trades.filter(t =>
t.type === 'P' && Date.now() - new Date(t.date) < 14 * 864e5,
);
const uniqueInsiders = new Set(recentBuys.map(t => t.insiderName)).size;
if (uniqueInsiders >= 2) {
console.log(`CLUSTER: ${tickers[i]} — ${uniqueInsiders} insiders bought in 14 days`);
}
}Endpoints used: Insider Trades
Macro dashboard with pandas
PythonFRED, ECB, Eurostat, IMF and World Bank series through one interface. Build a rates-vs-inflation DataFrame in a few lines.
import pandas as pd
from eulerpool import Eulerpool
client = Eulerpool("eu_prod_...")
series = {
"fed_funds": client.macro.fred_observations(series_id="FEDFUNDS"),
"us_cpi_yoy": client.macro.fred_observations(series_id="CPIAUCSL", units="pc1"),
"ecb_depo": client.macro.ecb_observations(series_key="FM.D.U2.EUR.4F.KR.DFR.LEV"),
}
df = pd.DataFrame({
name: pd.Series(
{obs["date"]: obs["value"] for obs in data["observations"]}
)
for name, data in series.items()
})
df.index = pd.to_datetime(df.index)
print(df.resample("QE").last().tail(8))Endpoints used: Macro
Google Sheets: =EULERPOOL() formula
Apps ScriptExtensions → Apps Script, paste, save. Then use =EULERPOOL("AAPL", "price") or =EULERPOOL("US0378331005", "marketCap") in any cell.
const API_KEY = 'eu_prod_...';
/**
* Fetch a field from a company profile or quote.
* @param {string} idOrTicker ISIN or ticker, e.g. "AAPL"
* @param {string} field e.g. "price", "marketCap", "peRatio", "sector"
* @customfunction
*/
function EULERPOOL(idOrTicker, field) {
const base = 'https://api.eulerpool.com/api/1';
const cache = CacheService.getScriptCache();
const key = idOrTicker + ':' + field;
const hit = cache.get(key);
if (hit != null) return isNaN(hit) ? hit : Number(hit);
for (const path of ['/market/quotes/latest/', '/equity/profile/']) {
const res = UrlFetchApp.fetch(base + path + encodeURIComponent(idOrTicker)
+ '?token=' + API_KEY, { muteHttpExceptions: true });
if (res.getResponseCode() !== 200) continue;
const value = JSON.parse(res.getContentText())[field];
if (value !== undefined) {
cache.put(key, String(value), 300); // 5 min — spreadsheets recalc a lot
return value;
}
}
return '#N/A';
}Endpoints used: Excel & Sheets guide
Get a free API key
Every recipe above runs on the free tier — 10,000 requests/month, no credit card.
Create free account