# Yahoo Finance Scraper - Quotes, History, Options, Financials (`dottti/yahoo-finance-reliable`) Actor

Yahoo Finance quotes, price history with dividends and splits, financial statements, key stats, analyst targets, options chains, news and ticker search. Stocks, ETFs, indices, crypto, FX, futures, Saudi and Gulf markets. Status per symbol; failed symbols are free.

- **URL**: https://apify.com/dottti/yahoo-finance-reliable.md
- **Developed by:** [Dottti](https://apify.com/dottti) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 data rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Yahoo Finance Scraper: Quotes, History, Options, Financials

Get Yahoo Finance data for any symbol in one run. You get quotes, price history, financial statements, key statistics, analyst targets, options chains, news headlines and ticker search. A watchlist mode tells you which prices moved since the last run.

It works for every kind of Yahoo symbol:

- US stocks and ETFs: `AAPL`, `MSFT`, `SPY`, `QQQ`
- Indices: `^GSPC` (S\&P 500), `^DJI`, `^IXIC`, `^TASI.SR` (Tadawul All Share)
- Crypto: `BTC-USD`, `ETH-USD`
- Currencies: `EURUSD=X`, `USDSAR=X`
- Futures: `GC=F` (gold), `CL=F` (crude oil)
- Saudi Exchange: `2222.SR` (Aramco), `1120.SR` (Al Rajhi), `2010.SR` (SABIC)
- UAE: `EMAAR.AE`, `DIB.AE`, `EMIRATESNBD.AE`
- Qatar: `QNBK.QA`, `IQCD.QA`
- Any other exchange Yahoo covers, with its own suffix

You can also paste a Yahoo quote page URL, such as `https://finance.yahoo.com/quote/2222.SR`.

### Who uses it

- **Analysts** who need statements and ratios for a list of companies in a spreadsheet.
- **Traders doing research** who want daily history, dividends and option chains for backtests.
- **Fintech builders** who need a daily price feed for an app or a dashboard.
- **AI agents** that look up a ticker, then read its price, fundamentals and latest headlines.

### What you get

Every row has a `type` field. Every row with a price or an amount also has `currency`. Every row has `exchangeTimezone`, except search results and news.

| Mode | Row types | One row is |
|---|---|---|
| quotes | `quote` | One symbol: price, change, volume, market cap, 52-week range, P/E, EPS, dividend, bid/ask |
| history | `bar`, `dividend`, `split` | One bar (open, high, low, close, adjusted close, volume), one dividend, or one split |
| fundamentals | `statement` | One statement period: income, balance sheet or cash flow; annual, quarterly or trailing 12 months |
| fundamentals | `keyStatistics` | Valuation, margins, growth, debt, share counts, short interest, dividend dates |
| fundamentals | `analyst`, `recommendationTrend` | Price targets, consensus, buy/hold/sell counts for the last 4 months |
| fundamentals | `earningsCalendar`, `earningsHistory` | Next earnings date with estimates; last 4 quarters of EPS actual versus estimate |
| fundamentals | `ratingChange` | Optional: recent upgrades and downgrades by firm |
| options | `option` | One call or put contract: strike, expiry, bid/ask, volume, open interest, implied volatility |
| news | `news` | One headline with publisher, link, time and related tickers |
| search | `searchResult` | One matching symbol with exchange, type, sector and industry |
| watchlist | `watch` | A quote, plus the saved price, the move in percent and an alert flag |

#### Status per symbol

A bad symbol never stops the run. When a symbol returns nothing for a mode, you get one free `status` row:

```json
{"type": "status", "symbol": "NOPE123XYZ", "mode": "quotes", "status": "not_found", "error": "Yahoo returned no quote for this symbol", "charged": false}
```

Status values:

- `not_found`: Yahoo does not know the symbol.
- `no_data`: the symbol exists, but Yahoo has nothing for this mode. Example: options for `2222.SR`.
- `blocked`: Yahoo refused every retry and every proxy tier.
- `bad_request`: Yahoo rejected the request and says why. Example: 1-minute bars for a full year.
- `skipped_cost_limit` or `cut_by_cost_limit`: your maximum cost for the run was reached.

The `RUN_SUMMARY` record in the key-value store lists the status of every symbol and mode. It also lists the requests made, the bytes moved, the retries and the proxy tier used.

### Examples from real runs (21 October 2026)

Quote for Saudi Aramco (fields shortened):

```json
{
  "type": "quote", "symbol": "2222.SR", "name": "Saudi Arabian Oil Company",
  "quoteType": "EQUITY", "exchange": "SAU", "exchangeName": "Saudi",
  "currency": "SAR", "exchangeTimezone": "Asia/Riyadh", "marketState": "POSTPOST",
  "price": 25.58, "change": 0.10000038, "changePercent": 0.3924662,
  "volume": 7499149, "marketCap": 6187991433216,
  "fiftyTwoWeekLow": 23.29, "fiftyTwoWeekHigh": 27.96,
  "trailingPE": 15.136094, "forwardPE": 15.317366,
  "dividendRate": 1.36, "dividendYieldPercent": 5.33,
  "earningsDate": "2026-11-03T12:00:00.000Z",
  "quoteTime": "2026-10-21T12:19:48.000Z", "dataDelayMinutes": 15, "quoteSource": "Delayed Quote"
}
```

Daily bar. `date` is the trading day at the exchange. `timestamp` is UTC:

```json
{"type": "bar", "symbol": "2222.SR", "currency": "SAR", "exchange": "SAU", "exchangeTimezone": "Asia/Riyadh", "interval": "1d", "timestamp": "2025-10-21T07:00:00.000Z", "date": "2025-10-21", "open": 25.06, "high": 25.08, "low": 24.95, "close": 25.04, "adjClose": 23.79937, "volume": 7062839}
```

Dividend:

```json
{"type": "dividend", "symbol": "AAPL", "currency": "USD", "exchangeTimezone": "America/New_York", "timestamp": "2025-11-10T14:30:00.000Z", "date": "2025-11-10", "amount": 0.26}
```

Income statement period (line items shortened). Values are in the reporting currency:

```json
{"type": "statement", "symbol": "2222.SR", "statement": "income", "frequency": "annual", "periodEnd": "2025-12-31", "periodType": "12M", "currency": "SAR", "operatingRevenue": 1671204000000, "ebit": 713951000000, "netIncome": 348042000000, "dilutedEPS": 1.44}
```

Analyst targets:

```json
{"type": "analyst", "symbol": "AAPL", "currency": "USD", "currentPrice": 339.5, "targetHighPrice": 405, "targetLowPrice": 215, "targetMeanPrice": 328.35025, "targetMedianPrice": 335, "recommendationMean": 2.25, "recommendationKey": "buy", "numberOfAnalystOpinions": 39, "strongBuy": 6, "buy": 18, "hold": 14, "sell": 3, "strongSell": 3}
```

Earnings calendar:

```json
{"type": "earningsCalendar", "symbol": "2222.SR", "currency": "SAR", "earningsDate": ["2026-11-03"], "isEarningsDateEstimate": false, "epsEstimateAverage": 0.392, "epsEstimateLow": 0.35, "epsEstimateHigh": 0.434, "exDividendDate": "2026-08-20"}
```

Option contract:

```json
{"type": "option", "symbol": "AAPL", "contractSymbol": "AAPL261021C00250000", "optionType": "call", "expiration": "2026-10-21", "strike": 250, "currency": "USD", "lastPrice": 90.22, "bid": 85.9, "ask": 90.85, "volume": 34, "openInterest": 23, "impliedVolatility": 3.68847734131, "inTheMoney": true, "underlyingPrice": 339.5, "exchangeTimezone": "America/New_York"}
```

News headline:

```json
{"type": "news", "symbol": "AAPL", "title": "Apple vs. Broadcom: Which Tech Stock Is a Better Buy in 2026?", "publisher": "Motley Fool", "link": "https://finance.yahoo.com/markets/stocks/articles/apple-vs-broadcom-tech-stock-125202039.html", "publishedAt": "2026-10-21T12:52:02.000Z", "relatedTickers": ["AAPL", "AVGO"], "mentionsSymbol": true}
```

Search result for "aramco":

```json
{"type": "searchResult", "query": "aramco", "rank": 1, "symbol": "2222.SR", "name": "Saudi Arabian Oil Company", "quoteType": "EQUITY", "exchange": "SAU", "exchangeDisplay": "Saudi Stock Exchange", "sector": "Energy", "industry": "Oil & Gas Integrated"}
```

### How to read the numbers

- Values are copied from Yahoo. A value Yahoo does not have is `null` or left out. The actor never fills a gap.
- `dividendYieldPercent` in quote rows is a percent (5.33 means 5.33%).
- Ratios in `keyStatistics` are fractions, as Yahoo sends them (0.0533 means 5.33%).
- `currency` is the trading currency. `financialCurrency` is the currency of the financial statements. They can differ for companies listed abroad.
- History prices keep 7 significant digits. Yahoo stores them as 32-bit numbers, which hold about that much.
- Statements come from the same data as the Financials tab on Yahoo Finance. Line items a company does not report are left out.
- Yahoo does not publish option greeks. Implied volatility is included.

### Input examples

Daily snapshot of quotes and one month of history (the default example):

```json
{ "symbols": ["AAPL", "2222.SR", "BTC-USD"], "modes": ["quotes", "history"], "historyRange": "1mo", "historyInterval": "1d" }
```

Fundamentals for Gulf banks:

```json
{ "symbols": ["1120.SR", "EMIRATESNBD.AE", "QNBK.QA"], "modes": ["fundamentals"], "statements": ["income", "balance"], "statementFrequencies": ["annual"] }
```

Weekly history for a fixed period:

```json
{ "symbols": ["^GSPC", "^TASI.SR"], "modes": ["history"], "historyStartDate": "2020-01-01", "historyEndDate": "2020-12-31", "historyInterval": "1wk" }
```

Option chain, next 3 expiries, puts only, at most 500 contracts:

```json
{ "symbols": ["SPY"], "modes": ["options"], "optionsExpirations": 3, "optionsType": "puts", "maxOptionContractsPerSymbol": 500 }
```

Find symbols first:

```json
{ "modes": ["search"], "searchQueries": ["emaar", "qatar national bank"] }
```

### Daily snapshots with a schedule

1. Save your input as a task in Apify Console.
2. Open **Schedules** and create a schedule for the task. Example: every weekday at 17:00 Asia/Riyadh, after the Saudi market closes.
3. Connect the dataset to Google Sheets, a webhook or the API. Each run is a dated snapshot.

For price alerts, use the watchlist mode on a schedule:

```json
{ "symbols": ["2222.SR", "1120.SR", "BTC-USD", "GC=F"], "modes": ["watchlist"], "watchlistThresholdPercent": 3, "watchlistOnlyChanged": true, "watchlistName": "my-alerts" }
```

- The first run outputs every symbol with `alert: "baseline"` and saves its price.
- Later runs output only symbols whose price moved more than the threshold. These rows have `alert: "moved_up"` or `alert: "moved_down"`.
- The saved price updates only when an alert fires. Slow moves add up across runs until they cross the threshold.
- Prices are saved in the named key-value store `yahoo-finance-watchlist`. Use a different `watchlistName` for each list.

### Pricing

You pay per data row: **$0.60 per 1,000 rows** ($0.0006 per row).

- One quote, one bar, one statement period, one option contract or one headline is one row.
- `status` rows are free. Symbols that fail are never charged.
- Set a maximum cost per run in Apify. The actor stops cleanly at that limit and marks the rest as `skipped_cost_limit`.

Typical costs:

| Job | Rows | Cost |
|---|---|---|
| Quotes for 50 symbols | 50 | $0.03 |
| 1 year of daily bars for one symbol | about 250 | $0.15 |
| Full fundamentals for one company | about 40-55 | $0.024-0.033 |
| Nearest option expiry for AAPL | about 90 | $0.054 |
| 10 headlines | 10 | $0.006 |

To keep costs low, choose only the modes you need. Use `maxBarsPerSymbol`, `maxOptionContractsPerSymbol` and the statement filters.

### Speed

Measured on a local machine, without a proxy, on 21 October 2026:

- The default example (3 symbols, quotes and 1 month of history) finished in 4-6 seconds.
- 52 symbols with quotes, 1 year of daily history and news: 13,505 rows in 28 seconds.
- 20 companies with full fundamentals: 1,063 rows in 23 seconds.

### Reliability

- The actor calls the same JSON endpoints the Yahoo Finance website uses. It sets up the cookie and crumb the site needs.
- A stale crumb (HTTP 401) gets a new crumb, then a new session.
- Rate limits (HTTP 429 or 403) get growing waits and a fresh session.
- If Yahoo keeps refusing, the actor moves to Apify datacenter proxy, then residential proxy. You can turn residential off, or set your own proxy.
- Requests are spaced out. By default 3 symbols run in parallel.

### Limits

- Data is delayed. Most exchanges are 15-20 minutes behind. Each quote row shows `dataDelayMinutes` and `quoteSource`.
- This data is for research. Do not use it for live trading or order decisions.
- Yahoo keeps 1-minute bars for about 8 days, 2-90 minute bars for about 60 days and hourly bars for about 2 years. Older requests return a `bad_request` status with Yahoo's message.
- Yahoo has few or no English headlines for many Gulf symbols. Those return `no_data` for news.
- Statements exist for companies only. Indices, currencies, crypto, futures and funds return key statistics only.
- Yahoo can change its endpoints at any time. A change can break a mode until the actor is updated.
- Respect Yahoo's terms of service. You are responsible for how you use and share the data.

### Input reference

| Field | Default | What it does |
|---|---|---|
| `symbols` | | Yahoo symbols or quote URLs |
| `modes` | `["quotes"]` | quotes, history, fundamentals, options, news, search, watchlist |
| `searchQueries` | | Words to search, for the search mode |
| `historyRange` | `1mo` | 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max |
| `historyInterval` | `1d` | 1m to 3mo |
| `historyStartDate`, `historyEndDate` | | YYYY-MM-DD, overrides the range |
| `includeDividendsSplits` | `true` | Adds dividend and split rows |
| `includePrePost` | `false` | Pre- and after-market bars, intraday only |
| `maxBarsPerSymbol` | `0` | 0 means no limit; keeps the latest bars |
| `statements` | all three | income, balance, cashflow |
| `statementFrequencies` | all three | annual, quarterly, trailing |
| `includeKeyStatistics`, `includeAnalyst`, `includeEarnings` | `true` | Parts of the fundamentals mode |
| `maxRatingChanges` | `0` | Recent upgrades and downgrades per symbol |
| `optionsExpirations` | `1` | Expiries per symbol, nearest first; 0 means all |
| `optionsDates` | | Exact expiry dates, YYYY-MM-DD |
| `optionsType` | `both` | both, calls, puts |
| `maxOptionContractsPerSymbol` | `0` | 0 means no limit |
| `newsPerSymbol` | `10` | Up to 100 |
| `searchResultsPerQuery` | `10` | Up to 25 |
| `watchlistThresholdPercent` | `2` | Alert threshold |
| `watchlistOnlyChanged` | `true` | Output only alerts |
| `watchlistName` | `default` | Keeps separate saved prices per list |
| `proxyConfiguration` | | Your own proxy; turns off the automatic fallback |
| `autoProxyFallback` | `true` | No proxy first, then datacenter, then residential |
| `allowResidentialFallback` | `true` | Allow the residential step |
| `maxConcurrency` | `3` | Symbols in parallel, 1-8 |
| `maxRetries` | `5` | Retries per request |

# Actor input Schema

## `symbols` (type: `array`):

Yahoo Finance symbols or quote page URLs. Examples: AAPL, SPY, ^GSPC (S\&P 500), BTC-USD, EURUSD=X, GC=F (gold futures), 2222.SR (Saudi Aramco), EMAAR.AE (Dubai), QNBK.QA (Qatar). Use the search mode to find a symbol.

## `modes` (type: `array`):

Pick one or more. Each mode adds its own rows. The 'type' field on every row says what it is.

## `searchQueries` (type: `array`):

For the search mode. Company names, tickers or keywords, for example 'aramco' or 'gold'.

## `historyRange` (type: `string`):

How far back. Ignored when a start date is set.

## `historyInterval` (type: `string`):

Bar size. Yahoo keeps 1m bars for about 8 days, 2m-90m bars for 60 days, 1h bars for about 2 years. Asking for more returns a clear error for that symbol.

## `historyStartDate` (type: `string`):

YYYY-MM-DD. Overrides the range.

## `historyEndDate` (type: `string`):

YYYY-MM-DD. Defaults to today. Used only with a start date.

## `includeDividendsSplits` (type: `boolean`):

Adds one row per dividend and per split in the period.

## `includePrePost` (type: `boolean`):

Intraday intervals only.

## `maxBarsPerSymbol` (type: `integer`):

0 = no limit. Keeps the most recent bars.

## `statements` (type: `array`):

One row per statement period.

## `statementFrequencies` (type: `array`):

Annual, quarterly and trailing twelve months. Balance sheets have no trailing version.

## `includeKeyStatistics` (type: `boolean`):

Valuation, margins, growth, debt, short interest, dividend dates.

## `includeAnalyst` (type: `boolean`):

Price targets, consensus, and the buy/hold/sell counts for the last 4 months.

## `includeEarnings` (type: `boolean`):

Next earnings date with estimates, and the last 4 quarters of EPS actual versus estimate.

## `maxRatingChanges` (type: `integer`):

0 = off. Number of most recent upgrades and downgrades per symbol.

## `optionsExpirations` (type: `integer`):

How many upcoming expiry dates to fetch, nearest first. 0 = all expirations. Each expiry is one request and often 50-300 contracts.

## `optionsDates` (type: `array`):

YYYY-MM-DD. Overrides the count above.

## `optionsType` (type: `string`):

Which side of the chain.

## `maxOptionContractsPerSymbol` (type: `integer`):

0 = no limit. Caps cost on large chains such as SPY.

## `newsPerSymbol` (type: `integer`):

Up to 100.

## `searchResultsPerQuery` (type: `integer`):

Up to 25.

## `watchlistThresholdPercent` (type: `number`):

Compared with the price saved at the last alert for this symbol.

## `watchlistOnlyChanged` (type: `boolean`):

On: only alerts are output (and charged). The first run outputs every symbol as a baseline.

## `watchlistName` (type: `string`):

Separate names keep separate saved prices, for example 'gulf-banks'.

## `proxyConfiguration` (type: `object`):

Leave off to use the automatic fallback below. If you set a proxy here, it is used for every request and the fallback is off.

## `autoProxyFallback` (type: `boolean`):

Starts without a proxy. If Yahoo keeps answering 429 or 403, switches to Apify datacenter proxy, then residential.

## `allowResidentialFallback` (type: `boolean`):

Turn off to never use residential proxy.

## `maxConcurrency` (type: `integer`):

Requests are still spaced out. Higher is faster and more likely to be rate-limited.

## `maxRetries` (type: `integer`):

Retries with growing waits and fresh sessions before a symbol is marked blocked.

## Actor input object example

```json
{
  "symbols": [
    "AAPL",
    "2222.SR",
    "BTC-USD"
  ],
  "modes": [
    "quotes",
    "history"
  ],
  "historyRange": "1mo",
  "historyInterval": "1d",
  "includeDividendsSplits": true,
  "includePrePost": false,
  "maxBarsPerSymbol": 0,
  "statements": [
    "income",
    "balance",
    "cashflow"
  ],
  "statementFrequencies": [
    "annual",
    "quarterly",
    "trailing"
  ],
  "includeKeyStatistics": true,
  "includeAnalyst": true,
  "includeEarnings": true,
  "maxRatingChanges": 0,
  "optionsExpirations": 1,
  "optionsType": "both",
  "maxOptionContractsPerSymbol": 0,
  "newsPerSymbol": 10,
  "searchResultsPerQuery": 10,
  "watchlistThresholdPercent": 2,
  "watchlistOnlyChanged": true,
  "watchlistName": "default",
  "autoProxyFallback": true,
  "allowResidentialFallback": true,
  "maxConcurrency": 3,
  "maxRetries": 5
}
```

# Actor output Schema

## `results` (type: `string`):

All rows. Filter by the type field.

## `runSummary` (type: `string`):

Status per symbol and mode, rows by type, requests, bytes, retries and proxy tier used.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "symbols": [
        "AAPL",
        "2222.SR",
        "BTC-USD"
    ],
    "modes": [
        "quotes",
        "history"
    ],
    "historyRange": "1mo"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dottti/yahoo-finance-reliable").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "symbols": [
        "AAPL",
        "2222.SR",
        "BTC-USD",
    ],
    "modes": [
        "quotes",
        "history",
    ],
    "historyRange": "1mo",
}

# Run the Actor and wait for it to finish
run = client.actor("dottti/yahoo-finance-reliable").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "symbols": [
    "AAPL",
    "2222.SR",
    "BTC-USD"
  ],
  "modes": [
    "quotes",
    "history"
  ],
  "historyRange": "1mo"
}' |
apify call dottti/yahoo-finance-reliable --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dottti/yahoo-finance-reliable"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2INB0aDAFg6WsQwiY/builds/9leFsD3SLQZjJWMTN/openapi.json
